みずぴー日記

人間の再起動ボタンはハワイのビーチにある

🎍2018年

晦日なので2018年を振り替える。今年はこれまでやってきたことを深くする年だった。

🛠やったこと

技術書典出展

今年の前半は技術書典に出す本を書いていた。 組版や書体、ブックデザインは以前から興味あったので楽しかった。予算が限られているので装丁は凝れなかったが、好きな書体が使えてよかった。

f:id:mzp:20180422102944j:plain

当初は入力メソッドの解説本だけを出すつもりが途中で思いついたので、工場実習の思い出についての本も書いた。工場実習日記のほうが評判がよく、新卒退職本3に引用された。

関連エントリ:

入力メソッド

技術書典に出す本のために入力メソッドを調べていたら文字に関する興味がでてきたので何冊か本を読んだ。いろいろな文字を眺めるのは楽しかった。

関連エントリ:

WebKit

WebKitと入力メソッドにまつわる不具合をいくつかあったので調査した。 何もわからないところから試行錯誤しながら構造を読み取っていく作業は好きだが、この規模のプロジェクトはビルドに時間がかかるので大変。

f:id:mzp:20180809234355p:plain

報告したバグは修正され、Safariにも反映されたので最高の気分。

関連エントリ:

美少女出社

f:id:mzp:20180516124821j:plain

Misocaではリモート勤務中はzoomに参加していることが奨励されていたので、アバターによる出社を試していた。転職したので辞めてしまったが、それがなければ今も継続していると思う。この前、オフィスに遊びにいったら@k0matatsuさんがかわいい姿で勤務してた。共演したかった。

既存ソフトをそのまま使う→独自ソフト+既存モデルを使う、という進化をしてたので、この先には独自アバターを使った勤務やボイスチェンジャーを使った勤務をしている世界もあったのかもしれない。

関連エントリ:

GitHub

f:id:mzp:20181231174248p:plain

GitHub contributionsはパッとしない。さみしい。

🎤カンファレンス

参加したカンファレンスは以下の通り。

RubyKaigiとWWDCがほぼ日程が被ってて移動が大変だったことが印象深い。

💼仕事

転職 & 引越しをした。

タンボー田中さんが退職エントリを会社のブログに投稿*1してて、いいなーと思ったので、真似した。 最後だし、エモいタイトルにしようと思ったが、迷走の果てにAIRのED曲の名前になった。

tech.misoca.jp

引越し直後はカーテンも本棚もなくて大変だった。最近やっとすべてのダンボールを捨てれた。カーテンの裾が足りてないのは気にしないことにした。

f:id:mzp:20180820214200j:plain

🎤ライブ

何人かに誘ってもらえたので参加できた。 ライブは感情が揺さ振られるのでよい。ラブライブ!サンシャイン!!のDay2がダブルアンコールですごかったという話がしたい。

f:id:mzp:20181110145840j:plain

f:id:mzp:20181117151639j:plain

f:id:mzp:20181201195525j:plain

✈️旅行

今年もいろいろ行けた。macOSのPhotosアプリの位置情報が国際色豊かになっている。

f:id:mzp:20181231182543p:plain

2月: 富山

BuriKaigiに参加するために行った。観光するつもりだったが雪がすごすぎて断念した。富山ブラックラーメンはおいしかった。

f:id:mzp:20180204053536j:plain

f:id:mzp:20180204071916j:plain

関連エントリ: 🌨富山 - みずぴー日記

2月: 島根

富山の翌週くらいに島根にいった。 カニ小屋に行きたかった、行った。

f:id:mzp:20180208101106j:plain

飛行機が欠航したので、急遽陸路で向うことになった。翌日は陸路もダメになり、@corocn鳥取で立ち往生してた。

f:id:mzp:20180206012558j:plain

冬の温泉宿は最高の景色だった。

f:id:mzp:20180207224019j:plain

関連エントリ:

3月 宮城県 蔵王

f:id:mzp:20180319013502j:plain

キツネに会いにいった。かわいい。冬毛のうちにいくぞ、という日程だったはず。

この帰りに工場実習日記のアイデアを思いついた。

関連エントリ: 🦊キツネ村 - みずぴー日記

5月 仙台

RubyKaigiのために行った。

f:id:mzp:20180530121727j:plain

念願のSKKの石碑が見れて感無量。

f:id:mzp:20180530142657j:plain

関連エントリ: 💎RubyKaigi 2018 - みずぴー日記

6月 サンノゼ

WWDCのために行った。日程的に名古屋に戻ってられなかったので、仙台から東京経由で出国した。

道路が広いし、空が青い。

f:id:mzp:20180521130427j:plain

サンフランシスコ観光もできてたのしかった。

f:id:mzp:20180609131425j:plain

関連エントリ: 🍎WWDC - Misoca開発者ブログ

7月 富山

退職の話が社内にオープンになったので、富山でリモートワークしているメンバーに会いにいった。

f:id:mzp:20180716222359p:plain

AirBnbで借りた宿が格好よくて最高だった。

f:id:mzp:20180716224028p:plain

関連エントリ: ⛰富山ワーク - みずぴー日記

7月 シンガポール

ANASFC修行を意識しはじめたので、率がいいと評判のシンガポールにいった。退職して時間があったので、入国即帰国ではなくて2泊ほどして観光も楽しんだ。

f:id:mzp:20180725093244j:plain

ホーカーズ(屋台?)のご飯がめっちゃおいしくて、びびる。

関連エントリ: 🇸🇬シンガポール - みずぴー日記

8月 北海道 稚内

修行目当て、その2。

稚内はいったことがなかったので北の果ての岬を見にいった。

f:id:mzp:20180730180717j:plain

北海道はスケールがでかくて見ていて楽しい。

f:id:mzp:20180731125806j:plain

うにとうにが載った丼を食べた。当然うまい。

f:id:mzp:20180801113333j:plain

関連エントリ: 🛤北の果て - みずぴー日記

11月 台湾

修行を終わらせるつもりで台湾にいった。計算ミスしてたので終わらなかった。

f:id:mzp:20181123143140j:plain

メシがうますぎる。

f:id:mzp:20181122191816j:plain

関連エントリ: 🇹🇼台湾 - みずぴー日記

12月 鳥取

台湾では修行が終わらなかったので、あわてて鳥取にいった。

カニが推されまくってたので食べた。

f:id:mzp:20181215141923j:plain

@k0matatsuさんにめっちゃうまいハンバーガー屋さんにつれてもらった。

f:id:mzp:20181216120651j:plain

関連エントリ: 🦀鳥取 - みずぴー日記

🙈できなかったこと

目標に掲げていたができなかったことがいくつかある。

  • iOS/AndroidアプリのUIをトレースして勉強する
  • 税金や貯蓄のことをちゃんと考える

🎯来年に向けて

今年はやってきたことを深くする一年だった。 悪くないが、来年は周辺領域に手を出す、あるいはまったく新しいことやるなどして幅を広げていきたい。

せっかく東京に引っ越したので、東京の観光をしたい。あるいは名古屋からは行きづらかった地域に旅行に行きたい。具体的には東北に行きたい。

🔖最近読んだ本

f:id:mzp:20181223203302j:plain

冬は本を読みたくなる。なるべく電子書籍で済ませている。

🚀SF

巨人たちの星 (創元SF文庫 (663-3))

巨人たちの星 (創元SF文庫 (663-3))

ガニメデの優しい巨人」までは読んでいたので続きを読んだ。 最初の「星を継ぐもの」が一番好きだなという感想を払拭できない。

続編の「内なる宇宙」も買ってあるが読んでない。

🔍ミステリー

深追い (新潮文庫)

深追い (新潮文庫)

影踏み (祥伝社文庫)

影踏み (祥伝社文庫)

この作者はハズレがないので安心して読める。

👻ホラー

夜市 (角川ホラー文庫)

夜市 (角川ホラー文庫)

Amazonが勧めてきたので読んだ。 本筋とはさほど関係ないが「地面に刺さっている剣は植物の一種で、抜いた直後は使えるがいずれ使えなくなる。 ばらばらになった剣を土にまくと、再び剣が生えてくる」というエピソードが気にいっている。こういう滅茶苦茶な話好き。

今までホラーはあまり読んでいなかったが、楽しく読めることがわかった。AmazonのカテゴリはSFとホラーが一緒にされているので、Amazonにとっては既知なのかもしれない。

秋の牢獄 (角川ホラー文庫)

秋の牢獄 (角川ホラー文庫)

滅びの園 (幽BOOKS)

滅びの園 (幽BOOKS)

夜市がよかったので、同じ作者の本を2冊読んだ。両方ともよかった。

黒い家 (角川ホラー文庫)

黒い家 (角川ホラー文庫)

別の作者のホラーも読んだ。登場人物が携帯電話もってなかったりして違和感を覚えたが、1998年に出た本らしい。どうりで。

生まれた年が同じ登場人物が殺されてて悲しかった。

🦔ノンフィクション

絶滅できない動物たち 自然と科学の間で繰り広げられる大いなるジレンマ

絶滅できない動物たち 自然と科学の間で繰り広げられる大いなるジレンマ

タイトルに魅かれて読んだ。結局「無理に保護してまで、絶滅を防ぐのはどうなのか」という話が実例つきで書いてあっておもしろいが、逆にいうとそれ以上の情報はない。

🛠技術書

peaks.cc

ブロックチェーンが流行っているので基礎知識を身につけようと思って読んだ。

小説形式になっててウッとなったが、読み進めるうちにさほど気にならなくなった。あんまり得意な形式ではない。

ハードウェアハッカー ~新しいモノをつくる破壊と創造の冒険

ハードウェアハッカー ~新しいモノをつくる破壊と創造の冒険

積ん読になってたので読んだ。文体も軽妙だし、話題の幅も広くておもしろい。Chumby好きだったし、開発の話が読めてよかった。

が、ハードウェアを大量生産するためのノウハウが役にたつ予定はない。

【新版】UI GRAPHICS 成功事例と思想から学ぶ、これからのインターフェイスデザインとUX

【新版】UI GRAPHICS 成功事例と思想から学ぶ、これからのインターフェイスデザインとUX

  • 作者: 安藤剛,水野勝仁,萩原俊矢,ドミニク・チェン,菅俊一,鹿野護,有馬トモユキ,渡邊恵太,須齋佑紀/津?将氏,庄野祐輔,藤田夏海,塚田有那,増川草介??栂木一徳
  • 出版社/メーカー: ビー・エヌ・エヌ新社
  • 発売日: 2018/10/19
  • メディア: 単行本
  • この商品を含むブログを見る

格好いいiPhoneアプリのデザインがたくさん載っててよい。iPad Pro 9.7インチでも若干狭かったので、iPad Pro12.9インチで読むか、紙で買ったほうがよさそう。

Coq/SSReflect/MathCompによる定理証明:フリーソフトではじめる数学の形式化

Coq/SSReflect/MathCompによる定理証明:フリーソフトではじめる数学の形式化

積ん読になってたので読んだ。その2。

Coqの部分は概説レベルでSSReflectやMathcompにページ数が割かれててよかった。

zip書庫の展開方法は「右クリックした上で"送る"を選び...」というレベルで丁寧に書かれているのに、群の定義はさっとすませてるのがおもしろい。たぶんそういう読者層を想定してるのだと思う。

🦀鳥取

台湾旅行だけではANA解脱に至らなかったので、鳥取に行った。

f:id:mzp:20181215222429j:plain

🦀カニ

空港にカニのだし汁がでる蛇口がある。終了してたけど。

f:id:mzp:20181215135726j:plain

@k0matatsu大漁市場なかうらまで連れってもらってかにトロ丼を食べた。めっちゃうまい。

f:id:mzp:20181215141922j:plain

夕飯にもカニをがつがつ食べてたら「カニ好きなんですね〜〜^^」と言われた。 カニがあったら食べるでしょ??

f:id:mzp:20181215184829j:plain

⚓️境港

境港/鬼太郎ロードにいった。

f:id:mzp:20181216111416j:plain

電車がラッピングされててすごい。

f:id:mzp:20181215153053j:plain

急に金の話がでてくる。一兆円ほしい。

f:id:mzp:20181216111134j:plain

砂場コーヒーのトレーラーを見つけたので行ったが、店員さんがいなかった。妖怪なのかもしれない。

f:id:mzp:20181215154146j:plain

街灯に迫力がある。夜みたら泣くかもしれない。

f:id:mzp:20181216111350j:plain

カニの被り物や妖怪の像があってたのしい。

🏢水木しげる記念館

鬼太郎ロードの端にある水木しげる記念館に行った。

ねずみ男のプロフィールに「転職を繰り返す」と書いてあって、謎の共感を覚える。 よく見ると博士号を取った上で別の学部を卒業してて学歴がすごい。

f:id:mzp:20181215161005j:plain

一反もめんの解説は単位の説明になっている。

f:id:mzp:20181215161144j:plain

基本的に迫力があって怖い。

f:id:mzp:20181215162428j:plain

🛏ドーミイン

境港の前にあるドーミインに泊まった。

夜に食堂に行くとラーメンがもらえる。すごい。

f:id:mzp:20181215221856j:plain

朝食は海鮮盛り放題のバイキングだった。

f:id:mzp:20181216065647j:plain

イクラカニとブリの海鮮丼を作った。

f:id:mzp:20181216071243j:plain

✈️ANA

この失敗をリカバーして、プラチナメンバーになった。よっしゃ。

f:id:mzp:20181224092203p:plain

🇹🇼台湾

勤労感謝の日による3連休に台湾に行った。 勤労に感謝している。

f:id:mzp:20181129224749p:plain

👣観光

九份

九份を見にいった。これが一番の目的。

雨がふっててつらかった。

f:id:mzp:20181123143140j:plain

途中の道がせまくて歩きづらかった。

f:id:mzp:20181129223714p:plain

AppleStore台北

台北のAppleStoreの様子を見にいった。

f:id:mzp:20181123123151j:plain

台北101

AppleStoreは台北101という高層ビルにはいってるので、展望台も見にいった。

雨が降ってる日だったので、ほぼ白みないな景観だった。わりといい値段はらったのに...。

f:id:mzp:20181123103015j:plain

🎯看板

看板が漢字でなんとなく読めるが、ちょっと違う。

明朝体の電光掲示板、あまり見ない気がする。書体もちょっと違う気がする。

f:id:mzp:20181123093249j:plain

Exitと出口のタイポグラフィが美しい。

f:id:mzp:20181123094204j:plain

東京最強らしい。

f:id:mzp:20181124094235j:plain

🍜食事

夜市

夜市に行ってみたかったので行った。

f:id:mzp:20181122224329j:plain

が、雨がふってたので、普通の店にはいった。台湾料理セットみたいなもの。

f:id:mzp:20181122191816j:plain

そのあとは他の店でワンタン麺を食べた。おいしい。

f:id:mzp:20181122222649j:plain

さらに、豆花という豆乳プリンを豆乳につけたデザートも食べた。うまい。

f:id:mzp:20181122195259j:plain

小籠包

鼎泰豐にいって小籠包を食べた。

f:id:mzp:20181123114206j:plain

カニミソ小籠包を頼んだら、カニの形にきった皮がはいっててかわいかった。

f:id:mzp:20181123115143j:plain

いっしょに頼んだチャーハンもおいしい。

f:id:mzp:20181123114635j:plain

タピオカミルクティー

タピオカミルクティーも飲んだ。 なぜかビールの容器にはいってる。

f:id:mzp:20181123104016j:plain

しょうがないので、そのあとビールも飲んだ。

f:id:mzp:20181123114046j:plain

18才以上は飲酒可能らしく異文化を感じた。

f:id:mzp:20181123104813j:plain

火鍋

火鍋を食べにいった。からいけどおいしい。

f:id:mzp:20181123195422j:plain

具の半分が以上が何か分からないので、明るい闇鍋みたいになっている。食べてもなにか分からなかった。

f:id:mzp:20181123194024j:plain

📱eSIM

iPhoneXSにしたので、GigSkyを契約して使っていた。

現地でプリペイドSIMを買うのと比べて、抜いたSIMカードをどこにしまうかを考えなくていいのが楽。

f:id:mzp:20181122164121j:plain

🚃移動

移動はMTR(地下鉄)とUberを使った。

MTRは券売機で一回切りのトークンが買える。 改札機にタッチすると通れる。

f:id:mzp:20181123091557j:plain

Uberはいつも通りの利用感で安心できる。割り勘機能がうまく使えなかった気がする。

その他

ANAのPP修行は失敗しました。(5万ポイントを貯めるつもりだった)

💨呼吸時間の記録

Apple Watchには「呼吸」アプリがある。深呼吸によるリラックスを支援をするアプリである。(参考: 呼吸 App を使う)

呼吸した時間をPixelaに記録し始めた。

f:id:mzp:20181125120710p:plain

🎯一覧性と継続のモチベーション

呼吸した時間はヘルスケアアプリに記録される。 しかし、継続日数が読み取りづらく、毎日続けるモチベーションになりづらい。

✨Pixela

Pixelaは任意のデータをGitHubのコントリビューショングラフ(通称: 草)にするサービスである。

f:id:mzp:20181125121617p:plain

commit以外の数値でも草を生やせる、PixelaというAPIサービスを作った! - えいのうにっき

⏫ショートカットを用いた呼吸時間の記録

ショートカット(旧: WorkFlow)で呼吸時間をPixelaに記録する。

ショートカットを不特定多数に公開する方法はないので、画像を貼っておく。

(オリジナルサイズで表示)

おもに次の処理を行なっている。

  1. ヘルスケアから呼吸時間を取得する
  2. 合計時間を計算する
  3. Pixelaに記録する
  4. 1〜3を過去n日分に繰替えす

最初は作成したのち更新する、という流れにしたが、更新のみでできるように pixe.la の仕様が変更された。(最高!!)

💓所感

iPhoneアプリを書かずにiPhoneの情報を扱えるショートカットは便利。ただ版管理機能や共有機能が弱いのは厳しい。

Pixelaは手軽でいい。見慣れた見た目になる、簡単なAPIで使えるので使い出がありそう。ただ、データを確認するときに、いちいちcurlを叩くのは大変だったのでPawを使った。

f:id:mzp:20181125123625p:plain

🔐二要素認証

Twitterなどの二要素認証では、二要素認証用のアプリで生成した認証コードを使う。

認証コードをどのように生成しているのか、Twitterとは無関係のアプリで生成した認証コードが利用できるのか、クラウドで同期できるのかが疑問だったので実装した。

🔍調査

なにから調べていいか分からなかったので、普段使っているAuthyのサイトを見ていたら、二要素認証の種類について説明しているページがあった。

f:id:mzp:20181103234308p:plain Authy features

これによると「TOTP(Time-based One-Time Password)」という方式らしい。

あの6桁の数字はワンタイムパスワードなのかと気づいた。

📕 TOTPアルゴリズム

TOTPというキーワードをもとに検索すると、RFCまで辿りつく。

TOTPは以下の式で計算される。

 \displaystyle
\mathrm{TOTP}(K) = \mathrm{HOTP}(K, C_T)

時刻T(Unix秒)におけるC_Tは以下の式であたえられる。 T_xワンタイムパスワードが有効な秒数であり、通常は30である。

 \displaystyle
C_T = \lfloor \frac{T}{T_x} \rfloor

Swiftで書くとこのようになる。

public final class TOTPGenerator {
    private let hotp: HOTPGenerator

    public init(secret : [UInt8]) {
        self.hotp = HOTPGenerator(secret: secret)
    }

    public func generate(at date : Date, format: OTPFormat) -> String? {
        let count = UInt64(date.timeIntervalSince1970) / 30
        return hotp.generate(at: count, format: format)
    }
}

📒HOTPアルゴリズム

TOTPはHOTP(HMAC-based One-time Password)のパラメータを時刻にしたものなので、メインのアルゴリズムはHOTPで定義される。

 \displaystyle
\mathrm{HOTP}(K, C) = \mathrm{Truncate}(\mathrm{HMAC-SHA1}(K, C))

Truncateはハッシュ値を指定の桁までに切りつめる操作だが、数式で書くとつらいのでSwiftで書くとこのようになる。 ほぼこのままの式がRFCにのっている。

func truncate(hash : [UInt8]) -> Int {
    let offset = Int(hash[19] & 0x0f)
    return Int(hash[offset] & 0x7f) << 24
                | Int(hash[offset + 1]) << 16
                | Int(hash[offset + 2]) << 8
                | Int(hash[offset + 3])
}

これを使いうとHOTPは以下のコードで生成できる。

import class CryptoSwift.HMAC

class HOTPGenerator {
    private let hmac: HMAC

    init(secret : [UInt8]) {
        self.hmac = HMAC(key: secret, variant: .sha1)
    }

    func generate(at count : UInt64, format: OTPFormat) -> String? {
        guard let hash = try? hmac.authenticate(Array(uint64: count)) else {
            return nil
        }
        // 先頭6文字のみを使う
        return String(String(truncate(code)).suffix(6))
    }
}

🤝秘密鍵の交換

TOTP/HOTPでは秘密鍵を共有する必要がある。

秘密鍵はBase32でエンコードされてやりとりされる。 二要素認証の設定画面に表示される「7nx ofic ...」がそれにあたる。QRコードにも同様の内容が含まれている。

f:id:mzp:20181104001820p:plain

🛠サンプルアプリ

アルゴリズムだけ調べても正しいか不安なので、Swiftでコマンドラインツールを作った。

http://github.com/mzp/totp

Mastodonの二要素認証に表示されるSecret keyを入力して、二要素認証に使えることを確認した。

f:id:mzp:20181103233300p:plain

Swift Package Managerを使ったが、プレインテキストでプロジェクトの構成を管理できてよかった。

👀参考にしたサイト

💕感想

普段、使ってるものの仕組みをちゃんと調べるのはたのしい。

🖥43インチモニタ

43インチの4Kモニタを購入した。 体験がいい。

f:id:mzp:20181021214220p:plain

🛒購入したもの

🍖焼き肉寿司

@izmさんに誘われて焼き肉寿司を食べにいった。

f:id:mzp:20181021222449p:plain

うまいうまいと食べてたら、テンションがあがって4Kモニタを注文してしまった。 もともと欲しいと思ってたので、「ボク使っていますが最高ですよ」と言われて背中を押されてしまった。

@izmさんはiPhoneXSを買っていた。

📦設置

数日後に届いた。 「二人以上で作業しろ」と書いてあった。そんなこと言われても困る。

そこまで重くなかったので、見なかったことにして一人で取り出した。

机に置けないかなと思って挑戦したが、まったく置ける気配がなかった。さらにドライバーがなかったので台の取り付けもできなかった。

とりあえず壁に立て掛けて、MacBookProをつないだ。Netflix言の葉の庭を再生したら最高になった。

🔧モニタアーム

最高だけど床に置いたままにはできないのでモニタアームを注文した。ドライバーのセットも買った。

到着したあと説明書を見ながらアダプタを取り付けたり、モニタアームをデスクに装着したりした。2回くらい取り付け方向をミスったがなんとかなった。

f:id:mzp:20181021215811p:plain

怖かったので、ベッドの位置をずらして、万が一落下しても頭にあたらないようにした。

🔌HDMI変換アダプタ

使ってたHDMI変換アダプタが4K解像度に対応しておらずフルHD解像度しかでなかった。

フルHDはつらいので変換アダプタを注文した。コンセントまで電源ケーブルが届かなかったのでOAタップも買った。あわせ買い対象商品のため、金額調整のために洗濯用洗剤も買った。

これで4K解像度で出力できるようになったので、最高になった。

f:id:mzp:20181021222337p:plain

ばしばしウインドウ開いても狭くならないので最高。若干もてあましている。

f:id:mzp:20181021221437p:plain

🗑今後の課題