2016年振り返り

f:id:banjun:20161230000558p:plain:w261

GitHub(などなど)で振り返る2016年

1月

HanekeへのPRがマージされた https://github.com/Haneke/HanekeSwift/pull/270

2月

movファイルからLive Photoを生成するLoveLiverにGUIをつけた - ツバメになったバリスタ https://github.com/mzp/LoveLiver/pull/3

3月

Swift静的解析試したかった https://github.com/banjun/bansan

関連Qiita: http://qiita.com/banjun/items/3f22b4951bca07cc55c7

Swiftらしく鳥類の名前をつけたライブラリをつくった https://github.com/banjun/Toki

LoveLiverのLive Photo切り出し専用UIをつくった - ツバメになったバリスタ

4月

RSDayFlowにPRするも別経路で解決となった https://github.com/ruslanskorb/RSDayFlow/pull/103

RSDayFlowにPRするもworkaroundを提案された https://github.com/ruslanskorb/RSDayFlow/pull/104

5月

合宿でありす判別学習アプリをつくった https://github.com/banjun/arisu-in-fact mzp.hatenablog.com

RSDayFlowにPRするも別経路で解決となった again https://github.com/ruslanskorb/RSDayFlow/issues/107

6月

WWDCに最小クラッシュ例を持っていき,Swiftバグレポの上げかたを教えてもらった https://bugs.swift.org/browse/SR-1813

その後,Swiftラボで対応してくれた人が直してくれた https://github.com/apple/swift/pull/3093

もうひとつあったので自分で上げた https://bugs.swift.org/browse/SR-1939

7月

SVProgressHUDにPRするも,あまりイケてない別解で対応された https://github.com/SVProgressHUD/SVProgressHUD/pull/646

8月

FlickSKKがiOS 10b5から重くなったので回避した https://github.com/codefirst/FlickSKK/issues/152

9月

FlickSKK 1.4.3 App Storeリリースした https://github.com/codefirst/FlickSKK/releases/tag/1.4.3-3

スタージュエル tumblr をはじめた http://⭐?.tumblr.com

デレステ SKK辞書,が製作されるのを応援していた https://github.com/mlny/skk-dict-imascgss

10月

とくになく,Xcode 8対応とかしていたらしい。まぁ忙しい月なので。。

11月

Eurekaのレアなバグを調査したのでPRしてマージされた https://github.com/xmartlabs/Eureka/pull/786

Eurekaで,振り返ってみると,ライブラリはSwift 2.3飛ばしてSwift 3が正解だなぁ,というような話をしていた https://github.com/xmartlabs/Eureka/issues/687

WSDL2ObjCというロストテクノロジーをメンテしたくないのでSwift版をフルスクラッチでつくった https://github.com/banjun/WSDL2Swift

Touch Barで卯月をつんつんした

12月

FlickSKK 1.5.0 App Storeリリースした https://github.com/codefirst/FlickSKK/releases/tag/1.5.0-2

デレマス曲名がついたライブラリをつくった https://github.com/banjun/JetToTheFuture

アイマスハッカソンで無限LivePhotoをつくった https://github.com/banjun/LivePhotoShow

GitHub上でコミットする仕事(アイマスP的には副業)だけしていたらめずらしく12 days streaksになった

f:id:banjun:20161229212012p:plain

WWDC

WWDC 2016に行ってきた。 WWDCWWDCラボの話は別途上げたほうがいいですね(とずっと思っている)。 シリコンバレー企業観光よかった。ここでは簡単にまとめだけ。

ラボの成果(見込み含む)

ATS必須化について

LAN(主にオンプレミス)での対策を聞いた。 結果,AppleのATSポリシー自体(どこをスコープとするか)が変更されることとなる。 「アプリによるHTTP通信」ではなく「インターネットに対して行なわれるHTTP通信」をスコープとするようにドキュメントが書き直される。 さらに,謎のATS必須化の期限不明延期がなされる(不穏)。

Live Photoについて

LoveLiverの手法が技術的に正しいことを確認。 https://github.com/mzp/LoveLiver

iOS 10正式版では60fps Live Photoのクラッシュが修正される。 iOS 10.2ではAppleカメラで生成されるLive Photoのfpsが上がる。 ラボエンジニアとの話の内容はアイマスハッカソンLT発表資料を参照

カスタムキーボードについて

外部キーボード対応(iPad Proのとか)はまだうまくいかない感じ。 マーカー(疑似でないインラインモード)もまだな感じ。 「いまはプライベートAPIで実現しているこのTaptic Engineフィードバック感がほしい」というものは,iPhone 7で実現された。(新ハードウェア固有の話だったので,6月時点ではすっきりした回答が得られなかったのだろう)

Swift 3のコンパイラクラッシュについて

あげたバグレポぶんのSwift 3コンパイラは修正されている。上記GitHubの6月参照。 XcodeをつかってSwiftコンパイラデバッグするやりかたと,一次解析するところまでを,Swiftラボのエンジニアにやってみせてもらった。

Apple Developer Program(個人)によるチーム開発について

githubとかでアプリを共同開発するのはつらいよね,という話。Appleはまだ意識が低い。継続的に要望を出していかないといけない。

アイマスハッカソン

imas.connpass.com

LoveLiverの話をどこかでしたいが,アイマスPに届くようなところはあるのだろうか‥?というところでいいイベントを見つけてしまった。 ハッカソンもLTも初めてだったが,楽しくLTできて大変よかった。そして初めてニコ生に出た。 Slackも用意されてやりやすいし,今後につなげていきたい。

LoveLiverについては同日にNGK2016BでmzpがLTしていた。 そもそもLive Photoでなにをしたらいいのか?APIは解析しうるのか?という背景からやがて繋がるデレステ縦MVの話がある。

mzp.hatenablog.com

2016年参加したイベント・行ったところなど

東京に引越してからちょうど1年が経った。 いろんなイベントごとには本当に行きやすくなり,実際にもたくさん行けてよかった。 職場もかわり,OSS的な活動もしやすくなった。 2017年も継続していきたい。やや加速できるとなお良い。

LoveLiverのLive Photo切り出し専用UIをつくった

3月に更新するつもりだったが月末に東京ドームでラブライブ!をみていたので遅くなった。

banjun.hatenablog.com

前回の残された課題のうち,いくつかを完了させ,LoveLiver 1.2.0 としてリリースした。

  • [ ] 3秒以外の長さを指定する
  • [x] 切り出しをプレビューする
  • [x] UIをなんとかする
  • [x] Sketchを体験版から正式版にする(31日以内)

出来上がりイメージ

vimeo.com

LoveLiver 1.2.0のダウンロードはこちら
Release Dedicated UI for Live Photos Trimming · mzp/LoveLiver · GitHub

今回のUIによって狙い通りのLive Photoを次々生成できるようになり,Photos.appにLive Photoがたくさん登録されるようになった。 せっかくなので作成したUIについて解説したい。

動画のOverview

f:id:banjun:20160419004030j:plain

開いた動画のプレイヤーの下に,サムネイル付きシークバー(MovieOverviewControl)を新規に作って置いた。動画の各位置の絵がなんとなく分かるコントロールなので,Overviewと呼んでいる。下記のような動機からつくった。

  • AVPlayerViewの標準コントローラではシークにその他の操作に限界があるので,独自のコントローラビューが必要
  • 主にデレステの縦MVをコンテンツとして使っているので,動画ウインドウ自体が縦長でも,それより横長のシークバーを出したい
  • QuickTime PlayerのTrimはわりとかっこいい(あとiOSの写真の動画再生とか)

プレイヤーウインドウの移動についてくるために親子のウインドウにしたが,リサイズあたりは少し不思議な動きをするかもしれない。

Live Photo切り出しフロー

動画から(3秒の)切り出しを指定するUIはいくつか考えられるが(前回バージョンもそのひとつではある),ここでは 「ベストショットのフレームを指定する」 を第一に考えることにした。

まずはAVPlayerViewでベストショットのフレームをシークして探す。その位置で止めて, Live Photo With This Frame ボタンを押す。 するとそのフレームをポスターフレームとするLive Photoの作成用のPopoverが表示されるので,そこで切り出し位置を調整してPhotos.appに書き出す,というフローになる。

Live Photo切り出しPopover

ポスターフレームを決めると,Live Photo生成用のPopoverが表示される。これをSandboxと呼んでいる。 Live Photoは標準で3秒なので,ポスターフレームを決めた場合,デフォルトでは前後1.5秒をLive Photoの動画部分とする。

f:id:banjun:20160419004110j:plain

実際の動画には,カメラ・シーン切り替え等があり,切り出し位置を調整したいことがよくある。 そこで,さらに前後1.5秒まで,切り出し位置をスライドできるようにする。スライド位置によって切り出される動画は変わるが,最初に選んだベストショットであるポスターフレームは必ず含まれる。

ここでもシークバーとして作ったOverviewを再利用することができる。さらにスコープを設けて,選択されている3秒間を明るく表示する。明るい部分を左右にスライドして調整する操作になる。 動画の最初や最後に,意図しないシーンチェンジ前後のフレームが入っているか確認しやすいように,最初と最後のフレームは最下段に別に表示している。 最上段をクリックすることで,調整後の切り出しでのLive Photo再生をプレビューできる。

不要になったもの

メインウインドウでの動画プレイヤー + ポスターフレームの2枚表示UI

今回のUIフローでは最初の画面は動画プレイヤーのみでよくなり,すっきりした。

Command Line Interface

GUIが便利すぎるので,Swift 2.2対応するときにフェードアウトした。 GUICLIの上位互換ではないが,コアのJPEG.swiftとQuickTimeMov.swiftがあるので,必要なら細かいこともできるはず。

UIこぼれ話

  • 動画ファイルの全体から1点を決める
  • → 周辺6秒が拡大表示され,そのなかから3秒をどこにするか決める
  • → 切り取られた3秒がPhotos.appに読み込まれ,iPhoneで再生できる

というフローは,全体からみえる一点,その拡大,という一方向のズーミングなインターフェースになっている。 もし先に切り出し開始・終了位置を決めるフローになると,そうではなくなる。 ズーミング感を出すために,Popoverの吹き出し位置はポスターフレームの位置に合わせている。

f:id:banjun:20160419004131j:plain

せっかくiPad ProとApple Pencilがあるので,今回はメモアプリで絵を描いてから作ってみた。

おわりに

LoveLiverを使えば動画からすぐにLive Photoを作成できるので,ロック画面を1枚絵だけではなくLive Photoにして楽しんでほしい。卯月はピンクなので,ローズゴールドのiPhoneのロック画面によく合う。背景も揃うとなお良い。

movファイルからLive Photoを生成するLoveLiverにGUIをつけた

f:id:banjun:20160213202915p:plain
Release OSX GUI Application · mzp/LoveLiver · GitHub

インドアLive Photo業界には mzp/LoveLiver というLive Photo生成ツールがある。

mzp.hatenablog.com

これを使って下記のような手順を踏めば,好きな動画の一部をiPhoneのLive Photo壁紙に設定できて便利。

しかし何度もやっていると,QuickTimeで3秒選んでトリムして保存して,LoveLiverのコマンドライン引数を書いて,というのが意外と手間に感じる。 というわけでOSXアプリケーションにすべく,GUIをつくった。

リリースしたGUIアプリはここの LoveLiver-1.0.0.zip からダウンロードできる。
Release OSX GUI Application · mzp/LoveLiver · GitHub

f:id:banjun:20160213203953j:plain

GUIにより,3秒動画を切り出して保存する必要はなくなり,単に使いたい動画をGUIで開けばよくなった。 Live Photoを生成するには,ポスターフレームを設定し,Live Photoを開始したい位置へシークし, Create Live Photoする。 コマンドライン版と同じようにLive Photo用のJPGとMOVを保存したあとは,Photos.appで自動的に開くようにしたので,Photos.app側でImportを押せばフローが完了するようになっている。

これで日々溜まっていく手持ちの動画のLive Photo化が捗るはずだ。

今後の課題

just worksな感もまだあるので,ざっくりと考えていること:

  • 3秒以外の長さを指定する
  • 切り出しをプレビューする
  • UIをなんとかする
  • Sketchを体験版から正式版にする(31日以内)

開発ネタ・雑感

今回のぶんのPull Requestはこちら。
github.com

  • もともとiOSで開発した NorthLayout※ikemenOSXアプリに適用してみた。
  • デフォルトのMainMenu.xibの編集は,メインウインドウの削除のみ。xibはあまり触りたくないがデフォルトのメニューは殺したくなかった。
  • 動画ファイルごとにウインドウを出すのであれば,NSDocumentControllerに任せてしまうのが早そう。ウインドウを閉じずにアプリを終了したときのResumeで再オープンも自動的に対応する。
  • NSDocumentControllerに登録するDocument Typesについては,Swiftクラス名はモジュールプレフィックスが必要だった。アプリ側ターゲットにいると意識しないが, LoveLiver.MovieDocument とする必要がある。あるいは @objc(MovieDocument) class MovieDocument とかにしてobjcに同名でエクスポートする。
  • 最近はNSWindowControllerとNSViewControllerがある程度いけるので,ドキュメントごとのxibは不要で,NorthLayoutのみでいけた。
  • AVPlayerViewとAVAssetExportSessionのおかげで,再生と切り出しはわりと簡単にできた。
  • キャプチャは requestedTimeToleranceBefore = kCMTimeZero requestedTimeToleranceAfter = kCMTimeZero しないとずれたフレームのキャプチャになる。デフォルトだとダメ。
  • fastlane/gymOSXアプリでも使えた。
  • アプリアイコンはSketchで描いてみた。色はデレステのデフォルトステージ衣装から拾った。操作に慣れたい。

WeakStreaks カンスト

前回のエントリで49週だったweak streaksをカンストしました。

www.instagram.com

githubからは1年分のcontributionsを取得しているのですが,53週目は丸々一週間は無いため,ここだけ日単位で気を使わないと53週連続が取れないというプレッシャーがありました。 しかも,Apple Watchのグランス用WeakStreaksの実装は52週までしか出ないようになっていて,どうやら1年が52週だと思っていたフシがあります。

https://github.com/codefirst/WeakStreaks/blob/e7950117f2f10af61a1198f664ed510b525bce9e/Common/WeekStreaks.swift#L19

縦一列灰色というのが無い状態に。

f:id:banjun:20160131234656p:plain

ともあれweak streaksチャレンジはこれで一段落になります。

退職のお知らせと2015年振り返り

f:id:banjun:20151230235924j:plain

退職

banjunです。 新卒から5年目になる会社を退職しました。ここ4年くらいはiOSアプリをやっていました。2014年には念願のWWDCにも参加していました。 小さい会社ではないのですが,そこでのiOSエンジニアとしてはトップレベルになってしまったこと,そういう状況において組織のなかでのポジションや展望が5年経って見えてきてしまったことから,新しいチャレンジをすることにしました。

就職

年明けから東京にある会社で働きます。iOSアプリをやる予定です。

ほしいものリストはこちらです。就職祝いいただけると嬉しいです。 http://www.amazon.co.jp/registry/wishlist/NRGJ2Y9E71GR

引越し・無職期間

転職にともない,長野県から東京都へ引越しました。 有給もそれほど残っていなかったこともあり,2週間ほど準備期間ということで無職になってみました。 国民健康保険に加入する等の,就職していると普段はできない手続きとかができました。 いくつかのスケジュール制約から,長野と東京を何往復かしていて,さらに最後には車も手放したので,ばたばたしているうちに暮れになってしまいました。

2015年はなにをしていたのか(で,誰?)

メインプロダクトとしては,iOSSKK入力キーボードのFlickSKKのバージョンアップの続きを。

FlickSKK

FlickSKK

  • JUN BAN
  • ユーティリティ
  • 無料
https://github.com/codefirst/FlickSKK

サブでAsakusaSatelliteのiOSアプリを書いていたのですが, https://github.com/codefirst/AsakusaSatellite-ios

ちょうどそこで使っているsocket.ioの公式Swiftライブラリが出たので,CocoaPods対応を。 https://github.com/socketio/socket.io-client-swift/pull/7

iOSアプリでコードでレイアウトするときの最速のプラクティスをpod化。 https://github.com/banjun/NorthLayout

今年後半はコードでのautolayoutが再度活発化してきてますが,制約をひとつひとつ書くよりVisual Format Languageで一気通貫に書くのがラクです。 これは洞爺湖で天体のメソッド巡礼をしつつSHIROBAKO一挙をみながらやりました。ちなみにSHIROBAKO巡礼のほうは松本近辺はほぼ自力で特定して行きました。

ちなみにNorthLayout方式はtvOSでもほぼそのまま動くのですが,tvOSのUIとしていいのかどうかはまだこれからです(これはtvOS発表日にやりました)。 https://github.com/banjun/PartyPlay-ios/pull/1

前職でGitBucketを導入・担当していたのでbugfixとか。 https://github.com/gitbucket/gitbucket/pull/697

CocoaPodsのレガシーソースコード対応とか・・・。 https://github.com/CocoaPods/Xcodeproj/pull/239

f:id:banjun:20151230235944p:plain

Apple Watchではgithub contributionを描くグランスを作りました。 私には通常のstreaksを伸ばすのは難易度が高かったので(プロデューサー業もあるので・・),日数のstreaksではなく週単位のstreaksであるweak streaks(弱者の)を導入してカウントしました。49週まで続いたのでそろそろカンストできそうです。

f:id:banjun:20151231000007j:plain

他に今年行った開発合宿先,イベントなど

それから,ここ10年くらいはブログ書かない暮らしだったのですが始めました。