ゲームコントローラーと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:間の期間は、東京オフィスに出社して、カンファレンス中の宿泊費をはてなから出してもらえたりと、かなりサポートしてもらえ、大変助かった

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

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

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

参加

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

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

https://www.youtube.com/watch?v=Wy6XCIDJRIU&t=0s&list=PLod2oSGQp3W6Qw5RFipf6N5YY80InTQPX&index=4www.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 #iosdc - 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に限らず、トレンドとして

macOS Mojaveが最高なんだけど、もっと最高になるアプリ Gray のご紹介

[追記]

注意点 1 に書いた、Systemに揃える設定が選択できないのは、0.9.0で解決されました 🎉

Release 0.9.0 · zenangst/Gray · GitHub

---追記終わり---

macOSを使用している皆さん、Mojave最高ですよね?

Mojaveにまだアップデートできてない方、ぜひアップデートしましょう
アップデートして1週間立ちましたが、開発環境面で問題は起こっていません

ですが、1点だけ、どうしても気になることがある

Dark appearance最高なんです
最高なんですけど、これアプリケーション毎に切り替えるGUIがないんです
アプリケーションによってDarkは見づらかったり、Safariは通常のブラウザとプライベートブラウザの目視区別がしづらい...

f:id:yutailang0119:20181012145237p:plain
左: 通常、右: プライベート

そんなあなたに朗報です

github.com

ポチポチするだけで、アプリケーション毎にAppearanceが切り替わります

SafariだけLightにしたりできる

f:id:yutailang0119:20181012145511p:plain
左: 通常、右: プライベート

インストール

https://github.com/zenangst/Gray#gray の下のリンクを押すと、ビルド済みのアプリがダウンロードできます
コードを読むと、アップデート確認も実装されてた

内部でやっていること

READMEに書いてあります https://github.com/zenangst/Gray#how-it-works
macOSにはアプリケーション毎の設定ファイルがあって、これを defaults というコマンドで書き換えることができます

$ defaults write com.apple.dt.Xcode NSRequiresAquaSystemAppearance -bool YES

その設定ファイルの NSRequiresAquaSystemAppearance をポチポチtoggleするだけ

一度設定すれば、再起動しても、Grayを削除してしまっても大丈夫
でも、できれば消さないでねとのこと

So when you are done configuring, you can toss Gray in the trash if you like (I hope you don't :) )

注意点

1. Grayで一度Appearance変更をすると、Systemに揃える設定に戻すことが、GUI上からはできなくなります -> 0.9.0でResetが追加された🎉

[追記]
0.9.0で、アイコンを右クリック (今右クリックって言うのかな🤔) することで、リセットする機能が実装されました。
以下の操作も使えますが、難しいと思うでの、仕組みを理解できる人以外には推奨しません。

---追記終わり---

そんな時は、ターミナルで、

$ defaults read 

と入力して、タブを押しながら、戻したいアプリを探します
アプリが見つかったら、

$ defaults read com.apple.SafariTechnologyPreview(ここがアプリ名) NSRequiresAquaSystemAppearance

とかとすると 0 or 1 と表示されるかと思います
表示されたら、再度ターミナルで、

$ defaults delete com.apple.SafariTechnologyPreview(ここがアプリ名) NSRequiresAquaSystemAppearance

確認すると

$ defaults read com.apple.SafariTechnologyPreview(ここがアプリ名) NSRequiresAquaSystemAppearance
The domain/default pair of (/Users/yutailang0119/Library/Containers/com.apple.SafariTechnologyPreview/Data/Library/Preferences/com.apple.SafariTechnologyPreview, NSRequiresAquaSystemAppearance) does not exist

とエラーになっていれば、成功です
もう一度Grayを開き直すと、Systemになっているはず

2. Mail、Messages、Safari、Homeのようなアプリは、Full Disk Accessパーミッションが必要

ボクは許可していません
「最初のSafariのプライベートブラウザの話どこいった」と思われるかと思いますが、普段 SafariのTechnology Preview版を使っていて、これはFull Disk Accessを要求しません
便利ですね

@_monoさんのツイートで知りました

活発に開発されていそうなので、watchしていきたいですね

ProgressSpinnerKitというSwift CLI用ライブラリを作った

github.com

発端

yutailang0119.hatenablog.com

というエントリで xcopen というCLIツールを作っている話をしたが、Swift製CLI向けのライブラリに、いわゆるSpinnerがなく、困っていた

swift-package-manager/Utilityには ProgressBarは存在するが、パーセンテージ表示で、開始時点で終了状態がわからないタスクには使えない。

無いなら作ろうということで作った。

使い方

READMEを読んでもらえればわかると思うが、

  • ProgressSpinnerKit.createProgressSpinner(forStream: _, header: _) で初期化
  • start()
  • stop()

という、極めてシンプルな作りにした。

Demoも用意したので、ぜひ手元でも実行してみて頂きたい。

f:id:yutailang0119:20180917022559g:plain
Demo

まとめ

少し前に完成していたのだが、iOSDCの登壇タイミングで公開にしようと思い、温めていた。
そのかいあって、すでに25starついていて、自分としては嬉しい限りである。

自分のようにSwiftでCLIツールを作りたいというような奇特な方向けだが、ぜひ使ってみてフィードバックがほしい。

ということで、あまり言わないが、スターください。

github.com