ninjinkun's diary

ninjinkunの日記

Netflixループの夢

異なる高校の生徒を集めた合宿中に、謎の怪生命体が発生して、生徒が襲われる。生命体は怪獣のようなロボットのような質感で、最初は人間ほどの大きさだが最終的にはビルくらいになる。様々な形になることができ、手足や触手をナイフやハンマーの形にして人を襲う。

我々はビルや橋を乗り越えて、本州からの脱出を目指す。

しかし合宿のチームメイト(さっき会ったばかりの男1女2)が死んでしまい、自分だけが残される。そこでループが発生して、時間が怪獣発生前に戻る。2ループ目からは怪獣を避けるように行動するが、もちろんまたみんな死んでしまう。

ループが発生する度にNetflixロゴが出る。

毎回チームメイトの天才少女と元気少女の掛け合いがあったような気がするが、内容はうろ覚え、もう一人の男子は何か居たような…というくらいの印象。

何回かループした後に、うまいことループの外側のメタ世界に移動することができ、脱出できた。

なぜか最後は実家に戻っていて、大学受験のためにZ会か予備校に行かせてくれと頼んで終わる。春から高三だしこのままじゃ浪人だ!と必死な気持ちで目が覚めた。

Web+DB総集編にiOSアプリ黎明期にお世話になったモジュールの記事を書いた

先日発売されたWeb+DB Press総集編に記事を寄稿した。お題が「記憶に刻む、あのコード」ということだったので、自分がiOSアプリ開発を始めた際にお世話になったImageStoreというOSSの画像ダウンローダーについて書いている。自分の記事は「初見で動きがわかるコード」という地味なタイトルだが、このソフトウェアが今の自分のコーディングに与えている影響を考えてみた結果、これがしっくりきた。

内容の詳細は誌面に譲るが、この記事を執筆するためにImageStoreの作者のPsychs氏にコンタクトを取り、当時のスクリーンショットの掲載許諾をお願いした。氏にはスクリーンショットの使用を快諾していただき、その後も献本などの関係で何通かメールのやりとりをした。

そのやりとりの中、Psychs氏からの返信メールにとても印象に残る言葉があったので、許可をいただいて引用する。

ぼくはコードを書くときに
「全体の動きを把握しやすくて、誰でもあとからハックしやすい」
ようになるように心がけているので、コードからそういうぼくの考えが少し
伝わったのかなと思ってすごくうれしかったです。
そういう風にしたほうが、どんなプロジェクトでも
・長期的なメンテナンスコスト
・問題が起きたときの原因究明のコスト
・新しいメンバーが入ったときの学習コスト
といろんな面でコストが小さくなると思うんですよね。
今でもこの考え方は変わっていません。

自分はこれを読んだ瞬間頷いてしまった。これは自分にとっても目指すコードの形そのものである。

そして自分は10年前にImageStoreのコードから既にこのメッセージを受け取っていて、氏の言葉で今それが追認されたのだ…と一人納得したのだった。

自分の原点を振り返る機会をいただいた、Web+DB PressとPsychs氏に感謝したい。

WEB+DB PRESS総集編[Vol.1~102] (WEB+DB PRESS plusシリーズ)

WEB+DB PRESS総集編[Vol.1~102] (WEB+DB PRESS plusシリーズ)

鴨川花見ラン

毎年鴨川の桜を楽しみにしている。今年は五条付近からランニングで上流の方まで行ってみた。

f:id:ninjinkun:20180331142428j:plain f:id:ninjinkun:20180331143834j:plain f:id:ninjinkun:20180331155752j:plain f:id:ninjinkun:20180331144722j:plain

北大路あたりの藤棚みたいなエリアが一番見応えがあった。 f:id:ninjinkun:20180331154617j:plain f:id:ninjinkun:20180331154340j:plain

上流まで走って上がって、ビールを飲みながら下った。 f:id:ninjinkun:20180331164845j:plain

家レモンサワー

  • ウォッカ: 30cc〜好きなだけ
  • ポッカレモン: たくさん入れるとおいしい
    • でかいやつを買っておくと良い
  • 炭酸: グラスいっぱい
  • 氷: 適当に

ポッカサッポロ ポッカレモン100 450ml

ポッカサッポロ ポッカレモン100 450ml

アルゴリズム・クイックリファレンス第2版を読んだ

現場プログラマーアルゴリズム再入門本(勝手に付けた副題)、アルゴリズム・クイックリファレンス第2版を読んだ。今年の2月に訳者の @hydrakecat さんから献本いただいていたのだが、感想を書くのが遅くなってしまって申し訳ない。

ちなみにこの本を読んでいる自分の背景を説明すると、一応大学は情報系だが、アルゴリズムや理論寄りの話は苦手。仕事ではスマートフォンアプリのコードを書くことが多く、アルゴリズムに直接触る機会はほとんど無いという人間である。

内容

第1版をぱらぱら読んだことはあり、コンパクトで読みやすい本だなと感じていた。第2版では赤黒木が削られたり、Pythonのコードが追加されたりしたようだが、受ける印象はそんなに変わってなかった(と言いつつ第1版と比較してみると、C言語の箇所が減っている)。

前の版から引き続き、とにかく実際に動くコード、実際の計算機での動き方にページが割かれている。アルゴリズムの性能比較についても、計算量の表記に加えて、実際に動かしたベンチマーク結果が付いているのは、この手の本としては珍しいのではないかと思う。

原題の Algorithms in a Nutshell をそのまま訳するとたぶん「アルゴリズムのかいつまんだ説明」という感じになると思うが、解説は本当に簡潔で、証明はほぼ省かれている*1

一方で、AIにおける経路探索(ここで言うAIはゲームの敵キャラクターの移動ルーチン)や計算幾何学は一般的なCSの教科書には含まれないものだと思う(ゲーム作りの教科書には書いてあるかもしれないが)。全体を貫いている簡潔さの方針からすると、ここを削ってもっとコンパクトにする手もあったと思うので、これはあえて入れているのだろう。アルゴリズムの多様性を知って欲しいという著者の意思を感じる。

最後の「12章 結び: アルゴリズムの諸原則」には実際にコードを書く上で大事なことがコンパクトに詰まっているので、ここだけでも読む価値があると思う。「汝のデータを知れ」「空間と時間のトレードオフを使え」「問題を別の問題に帰着させよ」という節のタイトルだけでもはっとさせられる。

おわりに

自分は定期的にCSの基礎を復習することには、思わぬ再発見があったり、書くコードに自信が持てる効果があると感じている。「このような強固な基盤の上に自分の仕事がある」と再確認できることは、ソフトウェア製品を作る自信を高めてくれると思うのだが、他のソフトウェアエンジニア諸兄はどうお考えですか。

何にせよ、アルゴリズムの勉強は競技プログラマーにはほど遠い自分のような人間にも楽しい。これからも時々本書を取り出して、ぱらぱらめくって楽しみたい。

アルゴリズムクイックリファレンス 第2版

アルゴリズムクイックリファレンス 第2版

*1:アルゴリズムの教科書としてはアルゴリズム・イントロダクションが有名だと思うが、かなりボリュームがある上に証明が多くて難しいので、自分にとっては正直に言って日常的に読むには重い。本書はアルゴリズム・インロトロダクションのさらにイントロダクション版というか、抜粋版としても機能すると思う。

iOSDC2017で「ディープリンクの設計と実装」について発表した

9/15-17に開催されたiOSDC2017に参加し、9/16の1日目に「ディープリンクの設計と実装」というタイトルで発表を行った。一休レストランアプリディープリンク対応を例にして、ユーザー体験から実装まで含めた話題を取り上げた。

Universal Linksの実装方法自体は既によく知られているので、自分の発表では実際にサービスに適用する際に困るポイントなど、できるだけ生々しい現場の話をするという方針で内容を組み立てた。スライドを見ていただければわかるが、自社アプリの宣伝も兼ねている。

また今回の発表後に、参加者からの投票で選ばれるベストスピーカー賞の2位を受賞した。発表で賞をいただくのは初めてのことで、とても嬉しい。「あるある」を詰め込んだのが良かったのかもしれない。

イベント中に各社のiOSエンジニアとディープリンク対応について話をしたが、皆共通して今のディープリンク体験はまだ微妙、うまく設計するのが難しいしパーツも足りていないという認識を持っているようだった。これは自分も同意で、現在のディープリンクは1ユーザーとして不自然に感じる点が多い。Webの文脈とアプリの文脈を繋げること自体、かなり無茶なことなのではとも思う。

事業者として見るとWebからアプリに誘導できるメリットは多いが、この流れを今後ユーザーが支持するのかどうかは注意深く見守っていきたい。

他のセッションも面白く、色々な人と話して大変楽しかった。参加者の皆様、iOSDC運営の皆様、ありがとうございました。

就職

6月中旬に株式会社一休に入社した。一休レストランという飲食店予約サービスを運営するレストラン事業部で、iOSアプリの開発を行っている(やっていることはコーディングとプロダクトマネジメント的な仕事を半々ずつくらい)。

一休はIT系としては比較的歴史が長い会社だが、

  • アプリの伸びしろの大きさ
  • 経営陣の面白さ
  • 自分で使って楽しいサービス

という点で、総合的に見て面白い経験ができそうと感じて入社を決めた。事前に二週間お試しで働いてみて、一緒に働くメンバーとも楽しく仕事ができそうなのがわかっていた点も大きかった。

元々飲みに行ったり外食することは好きだったのだが、一休では自社のサービスを自分で使ってご飯を食べに行き、その体験をまた製品にフィードバックして改善できる。自分の生活をサービスに反映できるところが面白い。

他にも、社長(金融工学、CS、コンサル系のバックグラウンド)が検索のおすすめ順やリコメンデーションのロジックを書いていたり、ユニークな点が色々ある。

一休の開発は東京のみなので、平日は東京、週末は京都という単身赴任的な生活をしている。東京では築地で友人とシェアハウスを始めた。

というわけで、東京と京都の皆さん、一休レストランを使って飲みに行くぞ。

無職の振り返り

今年に入ってから半年ほど無職をしていたのだが、最初は意識高くCourseraなどやっていたものの、Nintendo Switchゼルダを始めてしまい、結局ゲーム(ゼルダペルソナ5)ばかりして過ごしていた。

前回の退職時の一番の目的であった、妻の忙しい時期をサポートするというのは何とかこなしたものの、自分は仕事がなければ特に生産的なことはしないということがわかった半年だった。次に無職をやる機会があれば、コワーキングスペースを契約するなどしたい。

ちなみに、平均的な一日はこのような感じだった。

  • 朝7時に起きて朝食を作る
  • 妻を送り出して8時からハイラルを駆け回る
  • 昼食を作って食べる
  • ハイラルを駆け回る
  • 16時くらいに意識が高まればプールに行って泳ぐ
  • 夕食の買い物
  • お酒を飲みながら夕食作り
  • 帰宅した妻ともう一回飲み直す
  • 23時就寝

builderscon 2017に行ってきた

8/4-6に開催されたbuilderscon 2017に行ってきたので、印象に残ったセッションのメモを書いておく。

DeepLearningによるアイドル顔識別を支える技術

  • LINEのエンジニアすぎゃーんさんの発表
    • 元々は仕事と関係なく始めたけど、最近はAIプラットフォームClovaの部署に居るとのこと
  • やはりデータセットがキモ
    • まずこれだけのデータセットを作っているのがすごすぎる
    • 1年半分類し続けているとのこと。これだけ続けられるのがすごい
    • 最初からこれくらいやろうとは思っていなかった
    • 最初は5人のアイドルグループを識別するところから始めた
  • DCGANを使って非実在アイドルを生成するなど、データセットがあると分類以外にできることが広がる
  • 正面顔にこだわったりしているのが精度の高さの秘訣なのではないかと思った
    • OpenCVで顔の角度を出してデータを選定しているとのこと

複雑なJavaScriptアプリケーションに立ち向かうためのアーキテクチャ

  • このテーマについてここ数年情報発信をしているしんぺいさんの発表
  • 本当に重要なのはMVVMかどうかではなく、Presentationとビジネスロジックが分かれていること というのがよかった
  • 休憩時間にしんぺいさんとMVVMは一番難しいパターンなのではないかという話をした

真のコンポーネント粒度を求めて

  • CodeGridの中の人
  • CSSのクラスの命名どうするの?という話からコンポーネント
  • Object Oriented CSS、BEM、Atomic Designなど、最近の流れが一通り追えて勉強になった
  • 個人的にはEnduring CSSが衝撃的で、自分の考え方にしっくりきた
    • コンポーネントを共通化しない、不要になったらすぐに捨てられるようにする
    • 継承でパーツ作るの嫌いなので、個人的にはこれはしっくりくる。冗長でもええやん
  • フロントエンドエンジニア、デザイナーであればこの辺りの話は一通りフォローしておく必要がありそう

感想

昨年に続き今年も参加したが、大変楽しかった。インフラからフロントエンド、ネイティブアプリまでこれだけ広い領域のエンジニアが集まるイベントは他にないのではないか。ネイティブアプリエンジニアの自分がフロントエンドエンジニアとアプリの設計を比較して話をしたりできるのが、自分が感じるこのイベントの醍醐味である。

また来年もぜひ参加したい。