2019年の誕生日を迎えた抱負とか課題感とか

あけましておめでとうございますには、もう遅い時期だけど、2019年最初のブログ

誕生日を迎えた

先週の1/19 (土) に誕生日を迎えまして、26歳になった。

お祝いくださった皆様、ありがとうございます!!!

抱負

26歳の抱負は「人、チームとの向き合い方の再考」

背景

2019年の年明けから、チームメンバーが推してくれたこともあり、所属チームのモバイルアプリ側のテックリード (以下、TL) に近いロールを拝命した。
近いと濁したのは、チームレベルのTLは別でいて、自分はあくまでその中のモバイルアプリ側を担当することから。

はてなに於いてのTLはポジションではなく、ロールとして位置づけられている。

形式的には、テックリードにはチームの技術的な窓口となってもらっています。

はてなにおけるテックリード、そしてサービスプラットフォームチームのテックリードについて - Hatena Developer Blog

また、テックリードには、ディレクターなど非エンジニアとエンジニアとの橋渡し役になることも期待しています。技術的な事情に関する説明責任を果たしたり、技術的な側面から意思決定の手助けをしたりと、チームのエンジニアを代表する存在でもあります。

はてなにおけるテックリード、そしてサービスプラットフォームチームのテックリードについて - Hatena Developer Blog

実は自分にこういった役割が回って来たのは、アプリケーションエンジニア人生初めての経験。
はてな入社前は、だいたいの場面でiOS1人/Android1人/他サーバーサイド/フロントエンドみたいな環境にいることが多かった。
たまにiOS2人という時期も自分はサポートだったし、そもそもスマホアプリが3人以上ということに出会わなかった気がする。

今回、いろいろなタイミングが重なって、モバイルアプリメンバー内にも必要になるフェーズだと思っていたけれど、なんとなく別の人がやるもんだと思っていた。

課題感

まだ今年は1ヶ月も経っていないけど、すでに課題感は感じている。

経験

前述の通り、こういうロールの経験がないことで、歯がゆい気持ちになることが起きている。

  • チームビルディング
  • ソフトウェア工学の知識
    • プログラミング全般
    • 見積もり
  • 他メンバーのケア
  • TLとしての立ち振舞

やってみて、今更ながら足りない部分が見えてきた。
そもそもでエンジニア組織自体のメンタリングの経験もないので、無勉強で突入したのがよくなかった。
本を読むだとか、単純に知識をインプットすることで緩和できることもあるはずなので、おすすめのトレーニングがあれば、知りたい。
新しい言語を学ぶ時と同じように、チュートリアルをやって、ドキュメントを読むべき。

人間的面

それとは別で、人間性の部分もネックになっていると思う。
元からの自分を知っている人ならわかると思うけど、恥を忍んで言うと、基本的に自分は口調が強いし、イライラを態度に出しがち。
前々から自覚はあるので、最大限の注意を払って気をつけてはいたのだけど、去年晩秋くらいから度々反省することがあった。

これの解消に効く薬はないとは思うものの、今現在の自己分析では心の余裕が足りないからかなと思っている。

まとめ

そんな26歳の抱負と滑り出しだった。
相談乗るよという人がいたら、いつでも声をかけてください。

今年に限らない目標だと、「挑戦」
はてなバリューズの一つに挑戦が好きというのがあるし、 はてなのエンジニアのバリューズ - Hatena Developer Blog を支えるのも挑戦だし、まだまだやれてないこと、やりたいことは無数にあるので、今年もいろいろやっていきたい。

去年の誕生日は有給消化期間で、転職や京都に来る直前だったので、そういった環境変化への不安だったので、たいぶ様変わりした。
もうすぐ、はてなに入社して、そして京都に移住して1年になるので、それもまたよきタイミングでまとめを書く。

apple/swift-syntax超々入門 UIColor編

これは Swift Advent Calendar 2018 24日目の記事です。
昨日23日目は @uounɹɐʇの「Conditional Conformanceで遊ぼう」でした。

前説

先日福岡で行われた 第5回 HAKATA.swift ~福岡でSwiftの勉強会~ でLTとして話した内容です。

apple/swift-syntax とは

github.com

READMEの冒頭には

SwiftSyntax is a set of Swift bindings for the libSyntax library. It allows for Swift tools to parse, inspect, generate, and transform Swift source code.

とあり、Swiftの

  • 解析
  • 検査
  • 生成
  • 変換

に用いることができ、所謂、メタプログラミングに使用できます。

メタプログラミングについてはこちらがおすすめ

speakerdeck.com

お題

iOSで色を扱う場合にお馴染み、UIKitデフォルトAPIとして提供されるイニシャライザ

UIColor.init(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)

ですが、これには以下のような不満点があります。

  • RGB1~255表現を0~1の少数値に変換して表現するため、直感的ではない
  • 特にデザイナーはHexColor (16進トリプレット) で知りたい

ということで、swift-syntaxをを用いて、コメントでHexColorを入れてみようと思います。

想定はこんなコード

Contents.swift

import UIKit

let string = "ABCDE"
let color1 = UIColor(red: 0.55, green: 0.0, blue: 0.0, alpha: 1.0)
let array = [1, 2, 3, 4, 5]
let color2 = UIColor(red: 0.0, green: 1.0, blue: 0.0, alpha: 1.0)
let dictionary = ["foo": 1,
                  "bar": 2,
                  "baz": 3]
let color3 = UIColor.init(red: 0.0, green: 0.0, blue: 1.0, alpha: 1.0)

用意したツールは こちら

github.com

$ swift run swift-color-detector help
dump \(path): Dump code
rewrite \(path): Add HexColor Comments and Save

まずは使ってみる

dump

これをdumpしてみると

$ swift run swift-color-detector dump Contents.swift
import UIKit

let string = "ABCDE"
let color1 = UIColor(red: 0.55, green: 0.0, blue: 0.0, alpha: 1.0) /* #8C0000 */
let array = [1, 2, 3, 4, 5]
let color2 = UIColor(red: 0.0, green: 1.0, blue: 0.0, alpha: 1.0) /* #00FF00 */
let dictionary = ["foo": 1,
                  "bar": 2,
                  "baz": 3]
let color3 = UIColor.init(red: 0.0, green: 0.0, blue: 1.0, alpha: 1.0) /* #0000FF */

と出力されます。

rewrite

$ swift run swift-color-detector rewrite Contents.swift

とすると、与えたpathのコードの書き換えも行います。

swift-syntaxを扱う主要なコード

今回のサンプルでswift-syntaxをメインで扱う部分は、以下ファイルの60行強で実現されています。

swift-color-detector/ColorSyntaxRewriter.swift at master · yutailang0119/swift-color-detector · GitHub

段階としては

  1. ColorSyntaxRewriter
    • イニシャライザに該当するコードを検査
  2. ColorInitializerSyntaxRewriter
    • UIColor.init(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) を検査
  3. ColorLiteralSyntaxRewriter
    • Trivial (コメント) を追加

という3ステップで実現しています。

まとめ

いかがでしたでしょうか?
簡単に扱えそうな気がしてきませんか?

そもそも自分もメタプログラミングは挑戦を始めたばかりで、 apple/swift-syntax も手探りなため、最適解とは限りません。
ぜひ、アドバイスをもらえるとありがたいです。

ゲームコントローラーとPCとスマートフォンでの横移動

www.smashbros.com

発売、めでたいですね。
この為にゲームキューブコントローラー (以下、GCコン) とタップも準備して、早速繋いで準備した。

数年ぶりにGCコンを持ってみると、とてもしっくりきて、千数時間 (?) と握った感覚が蘇ってきた。
そこで最近の身の回りのデバイスと比較して考えることがあったので、何度も書かれていることだろうけど、備考録的に書いておく。

自分のことを知らない人が読んだ時のエクスキューズになるように一応書いておくが、自分の本業はスマートフォン、とりわけiOSのアプリケーションエンジニアで、UI/UXに造詣が深い訳ではないということを踏まえて、読んでもらいたい。

ゲームコントローラ

前述の通り、ここではGCコンをイメージしている。
GCコンでの横移動はメインはスティックでの操作が、一般的だと思う。
昨日GCコンを持ってみてスティックをいじると、頭の中ではキャラクターを操作するようなイメージだった。
まだスマブラSPは起動できていないが、きっとそういう操作を想像するだろう。
スティックに限らず、十字キーでも同じく、1コマずつキャラクターが動くイメージだ。

なにが言いたいかというと、自然と 「主観的に (自分が) 動いている 」という感覚になったということだ。

PC

PCにも十字キーはある。
ただ、これを操作しても、キャラクター (≒自分) が動くイメージはなく、動くのはモニターに映るカーソルであろう。

十字キーを押した方向に、カーソルが動く。
つまり、これは「 客観的に (モノを) 動かしている 」という感覚になる。
同じ十字キーなのに、カーソルを自分だと思えない原因は、コントローラーという物理デバイスを握っているかどうかなのかな。
ただ、ゲームのメニュー画面は、カーソルを動かすそのままの体験だとも思うので、自分がどうやって区別しているのか難しい。

トラックパッドはちょっと特殊で、設定によって後述するスマートフォンのような動きにもなり得る。*1

スマートフォン

スマートフォンには十字キーは基本的なく、スワイプがその操作に該当する。
スワイプは、どういう感覚かと言うと、タッチ面のモノを物理的に動かす感覚に似ている。
スマートフォンアプリ、特にiOSのUIの話では「スキューモーフィズム」が大切にされてきた。*2
要するにメタファー表現。
電子書籍でよくある、ページをめくる感覚が、横移動と言えるだろう。
これは前述のPCトラックパッドも同様で、ブラウザのページ送りも、本をめくる感覚だ。

そう考えると、「(モノを) 動かしている感覚ではあるものの、主観的に見ている」のではないだろうか。
「いやいや、PCのカーソル操作と何が違うんだ。」という意見もわかるのだけど、少なくとも自分は、スマートフォンの場合は身体の延長にある気がしている。

まとめ

ゲームコントローラ

コントローラーの操作と連動して、動いている感覚

PC

十字キーの操作と連動して、動かしている感覚 トラックパッドの操作で、動かしている感覚

スマートフォン

スワイプ操作で、動かしている感覚



まとめられてないとは思うものの、朝になんとなく頭に浮かんだことをできる限り言語化してみた。
最近新しいアプリを見たり、UI考察をあまりできていなかったので、【新版】UI GRAPHICS 成功事例と思想から学ぶ、これからのインターフェイスデザインとUX も読もうと思う。

それはそれとして、GCコンは本当によくできたコントローラーだなと惚れ惚れした。

*1:自分はmacOS端末をほぼ100%使うので、ものによっては違うかもしれない

*2:それもスキューモーフィズム -> フラットデザイン -> Fluid Interfacesと変遷してきてはいる UI GRAPHICS新版に寄稿しました - Appleが目指す「流れるインターフェース」|Go Ando / THE GUILD|note

niwatakoがはてなを旅立って49日が経ちました #niwatako四十九日

早いもので、iOSアプリケーションエンジニアとして天寿を全うされた id:niwatako さんが、株式会社はてなを旅立ちメルペイに入社して2ヶ月弱経ちました。
今日が仏教でいうところの 四十九日 にあたるので、お祈りブログを書くことにします。

そんな今日は、セブンイレブン練乳ミルククリームの香ばしいフランスパン を買って、袋に入れずに手に持ったまま、出社しました。 *1

前回のあらすじ

yutailang0119.hatenablog.com

前説

仲悪くなってないです。
そもそも扱いは元からこんな感じだったし、むしろ、自分の入社前後のがひどかったと思う。
前々日くらいに「京都行くから泊めてー」みたいな感じでしたし。

id:niwatako が東京勤務になった時の方が、接点減った感じがします。
今も普通に社外のSlackで会話してるしね。

id:niwatako に頂いた iPhone Core Audio プログラミング は大切に読んでいます。

id:niwatako の現在

ブロックチェーンエンジニアとして転生されて、第二の人生を歩んでいる模様。
今日から上海に言っているらしいです。

ただ、iOSの勉強会にも出没しているらしい。
成仏したはずでは?🤔

id:yutailang0119 の現在

はてなブックマークのチームで、なぜか業務の半分をPerl読み書きして過ごしています。
id:niwatako から誘われた時と話が違う、おかしい🤔

日本酒飲み仲間が減って、日本酒を飲む量が減りました。

まとめ

そろそろおでんの時期ですね。
京都でお待ちしています。*2

結局、転職祝いを送っていないので、何がほしいか教えてください。
それと早く一人暮らしして、東京に行った時の宿をください。

*1: id:niwatako の出社風景

*2: id:niwatako に限らず

Y8 in 城でDepthカメラの話をしました #shiro929

y8-20180929-shiro.hachiojipm.org

@uzullaさんが主催された岡山城でのイベントに登壇した。

uzulla.hateblo.jp

天守閣でLTができる!!! (かも) 」とのことで、人生で何度も訪れるチャンスではないだろうと、すぐに応募した。
スタッフ枠で応募したけど、事前準備は全く手伝えなくて、当日お手伝い程度だけど、手伝えた。

LT

speakerdeck.com

youtu.be

アプリ

f:id:yutailang0119:20181019103051p:plain

Depthを使ったカメラアプリを作った。

github.com

基本的に人間が写る写真を加工するものなので、デモの写真をリポジトリのREADMEに貼りづらい...

やっていることは、

  1. iPhoneのカメラからinputを取得
  2. 人間 (前面) を取り出す
  3. それ以外 (背面) を飛ばす
  4. カメラロールから画像を選択して、背景に差し込む
  5. アプリで用意しているカバー画像をかぶせる

みたいなことをしている。

リアルタイムと静止画両方に対応しているが、静止画はiOS 12で追加された Portrait Matte というAPIを使用しているので、人間部分を取り出す処理が凄まじい。
これはぜひは使ってみてほしい機能。

Depthの機能に初めて触れたり、初めてMetalを使ったりと、初めて尽くしでとてもおもしろかったし、岡山城LTでもかなり反響を得られた。
そもそも前職ではカメラ機能を使うアプリを作ってたけど、ちょっとしたフィルタを追加するぐらいだったので、いいお題だった。

謝辞

@shu223さん

アプリのリポジトリにも書いているけど、このアプリのほとんどを@shu223さんが作られているshu223/iOS-Depth-Samplerを参考にさせてもらった。
報告したところ、喜んでもらえてよかった。

f:id:yutailang0119:20181018184212p:plain

本当にありがとうございました!🙇‍♂️

github.com

shu223.hatenablog.com

余談

また別の話ですが、僕はGitHubでいろいろとOSSを公開していて、合計で約23,000スターを獲得しています。もちろんスター数が絶対的な価値を持つわけではありませんが、しかしソースコードを公開してエンジニアコミュニティに多少なりとも貢献をしているとはいえると思います。 そんなGitHubpaypal.meのお布施リンクを置いてみてはいますが、いまのところトータル収益はゼロ円です

技術書でご飯は食べられるのか? #技術書典 - その後のその後

とおっしゃって、本当に微々たるものだけど投げ銭させてもらった。*1
みんないいものには、感謝を伝えて行こうね。

@uessy_akrさん、@lestrratさん

アプリ内で使用しているカバー画像を作ってもらった。

Cover 1 Cover 2
f:id:yutailang0119:20181018183319p:plain:w200 f:id:yutailang0119:20181018183333p:plain:w200

そもそもこのアプリは、builderscon tokyo 2018フォトブースからインスパイアされている。
buildersconのSlack/#randomで、「これやりたいんだけど」と話したら、わいわい作ってくれた。
ありがとうございました!

*1:自分はこの記事が出る前に

builderscon tokyo 2018のスタッフ & LT登壇しました #builderscon

iOSDCの翌週だったので、そのまま東京に残って、builderscon tokyo 2018*1

去年に続いてのスタッフだったけど、去年までと環境が全く変わっていて、いろいろ大変だった。

スタッフ

やったこと

  • 準備
    • パンフレット作成
      • 編集
      • 校正
    • スポンサーノベルティ
      • スポンサー企業とのやり取り
      • 袋詰業者とのやり取り
    • スピーカーディナー
      • ほとんどを @kiko_tw に巻き取ってもらった 🙇‍♂️
  • 当日
    • 何でも屋
      • 買い出し
      • 弁当出し
      • 荷物運び
      • 各部屋のヘルプ

実は開催前日に、本当に大変なミスがあって、 本当にやばかった。
@uzullaに助けてもらえなければ、当日ボクの姿は無かったかもしれない...
本当にありがとうございました 🙇‍♂️

2017が終わった時には、当たり前に来年もやるものだと思っていたし、そうなった。
@kiko_twをスタッフに引き込んだりもした。

ただ、はてなに転職が決まった次のスタッフミーティングで、 @lestrrat さんを始めとするメンバーに、「2月に京都に行くことになった、それでもスタッフを続けたい。」と正直に話した。
どうなるかなと思ったけど、不安は杞憂で、「大丈夫、遠隔でもやりやすいタスクを拾っていってもらうから」と言われ、やるぞ!となった。

それでも遠方にいることのデメリットはある。
毎月のミーティングには出れないし、打ち上げに参加できないことに寂しい気持ちはある。

PyCon JP

ここでちゃんと説明しておかなければいけないのは、PyCon JPとの関わりだと思う。
2016、2017と関わってきたPyCon JPだが、2018は残念ながら途中リタイアした。
理由は2点ある。

1. 開催時期

  • iOSDC 8/30(木) - 9/2(日)
  • builderscon 9/5(水) - 9/8(土)
  • PyCon JP 9/16(日) - 9/18(火)

と実質3週連続は、仕事的にも体力的にも厳しい。
自分の仕事や関心を鑑みて3つの内から1つを選ぶとすると、PyCon JPの優先度を下げざるを得なかった。

2. 文化

※あくまで、今の自分の状況には合わなかったという個人のケースだという前置き
buildersconのコミュニケーションはSlackがあれば、大体のことは事足りた。
PyCon JPの場合は、月1のミーティングで合意を取ったり、作業日を設定して、集まってタスクをガッと進めるという文化がある。
遠隔でスタッフをできている人もいるが、自分は月1でリモートで同期的にコミュニケーションを取るということがなかなかできなかった。
リモートでのミーティングよりも、オフラインで人と会ったり、自分のことを優先していた。
※あくまで、今の自分の状況には合わなかったという個人のケースだという前置き

以上、2点で、今年はPyCon JPは断念した。

LT

会の4日前くらいに、LTに出ないかと提案されて、二つ返事でやることとした。
ネタとしては結構前から考えていたんだけど、普段Swiftを触ることがない人がターゲットの話なので、出す場所を伺っていた。

speakerdeck.com

www.youtube.com

いい写真撮ってもらった

f:id:yutailang0119:20181019104441j:plain
CC-BY-NC 4.0 (c) builderscon

まとめ

そんなこんなで、なんとかbuilderscon tokyo 2018は無事に終了できた。
かなり不安があったので、打ち上げや帰りの新幹線で涙腺が崩れかけてた。

前述の通り、遠方にいるデメリットは確かにある。
それでも来年もスタッフをやろうと思っているし、また少し新しいことにも挑戦しようと思っているので、続報をお待ち下さい。

f:id:yutailang0119:20181019104700j:plain
CC-BY-NC 4.0 (c) builderscon

*1:間の期間は、東京オフィスに出社して、カンファレンス中の宿泊費をはてなから出してもらえたりと、かなりサポートしてもらえ、大変助かった

iOS Japan 2018に参加 & LT登壇しました #iosdc

遅くなりましたが、iOSDC Japan 2018に参加、LT登壇してきた。

参加前のブログはこちら yutailang0119.hatenablog.com

参加

去年はスタッフ側だったけど、転職したり、転居したり、身の回りの変化で、残念ながらスタッフはできず。
去年は設計の話が多かったけど、今年はそれを実装に落とし込んだりとか、インターフェイス周りの話が多かった印象 *1
来年はテストとか、Packaging周りが流行らないかなぁ...
今年は Swift Package Manager話のプロポーザル 出したけど、通らなかった。

スポンサー紹介ムービー、ほんとよいよね

www.youtube.com

見た中でもよかったもの

~~ †††† 漆黒の魔法 Objecitve-C Runtime API †††† ~~

おもしろいんだけど、実際使い所が...
終わった後に おもち とバグってるの見つけてしまった。

MicroViewControllerで無限にスケールするiOS開発

さすがベストトーク1位だよねというトークだった。
mercari/Mew は本当によくできてて、感動した。
トーク後に、@tarunon と一緒になって、コード読んだり、PR投げたりしたのはいい思い出。

宣言的UICollectionView

自分は差分計算にInstagram/IGListKitというのを使ったことがあるけど、dataとcellのマッピングがイケてなくて、うーむと思っていた。
ishkawa/DataSourceKitは、Swiftのいいところを使っていてよさそう。
どっかで使いたい。

スマホアプリエンジニアだから知ってほしいブロックチェーンと分散型アプリケーション

元同僚の id:niwatakoトーク
この日が退職日だったので、ギリギリ同僚だったのだけど、満席で見れず...

f:id:yutailang0119:20181019105822j:plain
id:ikesyo と写真だけ撮って退出した

あとでniwatako追悼式典したので許して (後述する)

他にもいろいろあったけど、時間がなくなったので割愛。
アンカンファレンスで行われたわいわいswiftcも、めっちゃ楽しかった。

LT

weak vs unowned by Yutaro Muta | プロポーザル | iOSDC Japan 2018 - fortee.jp

speakerdeck.com

youtu.be

がっちりテックトークするの、結構久々でめちゃくちゃ緊張してた。
絶対5分おさまらないとわかってたので、無理やりねじ込んだ。
Twitterでの反応も多くてよかった。

あと、初めて気づいてもらえて嬉しかった。

当日に公開した yutailang0119/ProgressSpinnerKit もよろしくお願いします 🙇‍♂️

yutailang0119.hatenablog.com

いい写真撮ってもらった

f:id:yutailang0119:20181019105002j:plain
CC-BY-NC 4.0 (c) iOSDC

余談

途中で少し出てきた、selfのshadowing問題に

guard let self = self else {
    return
}

が追加されて、どうしましょうね

swift-evolution/0079-upgrade-self-from-weak-to-strong.md at master · apple/swift-evolution · GitHub

niwatako追悼式典

会期中に niwatakoがはてなを旅立つことに寄せて #niwatako追悼式典 - がんばってなんか書く を投稿したので、これについて話しかけられることも多かった。

せっかく最後の瞬間をみんなで迎えられるよねということで id:niwatako, id:ikesyo はもちろん、スピーカーディナー後の方々に参加頂いて、盛大に祝えた。
ご参加ありがとうございました @takasek, @_bannzai_, @d_date, @itaru_sugimoto, @hironytic, @rikusouda, @dchn2904, @tatsuhama50

全体フィードバック

今年は3.5日という超長丁場で、全日参加した感想は「もう少し短くてもよくない?」。
日程が伸びると枠が増えて、門戸が広がって、って感じはするけど、その分濃度の薄まりが否めないなぁという感じ。
WWDCとかはもっと長い期間だけど、実際ダラダラできる時間もそれなりにあるし、セッション自体の濃度も濃い。
カンファレンスの規模が大きくなると生まれる壁なのかなと感じた。

まとめ

実はCfP段階で、ちょっと思うところはあったのだけど、参加するとやっぱりおもしろいし、モチベーションも上がったし、参加してよかった。
来年も是非よろしくお願いします!!!

*1:これはiOSDCに限らず、トレンドとして