文字っぽいの。

文字を書いています。写真も混ざります。

#iOSDC Japan 2018 に参加して、発表もして、感情になりました。

f:id:FromAtom:20180907223345j:plain

iOSとその周辺技術に関するエンジニアのためのカンファレンスである、iOSDC Japan 2018(iOS Developers Conference Japan 2018)に参加・発表してきました。

iosdc.jp

参加者として

去年初めて参加してとても楽しかったので、今年も参加しました!もちろん、とても楽しかったです!

昨年もとても素晴らしいホスピタリティを誇るカンファレンスだったのですが、今年もレベルアップして最高のホスピタリティに満ちあふれていました。

今年も美味しいランチが待っていました。去年は少し物足りないなぁという感じていたのですが、今年はガッツリとご飯もの!味も美味しいし、お腹もいっぱいで幸せでした。

f:id:FromAtom:20180901120759j:plain

そして食後は、無限コーヒー。ホットだけではなくアイスもあって最高ですね。しかもこのコーヒー美味いんですよ。最高。 食後に美味いコーヒーを飲みながらトーク開始を待てるなんて、なんて贅沢なんでしょう。ここは国際学会か?

f:id:FromAtom:20180902154655j:plain

懇親会ではビールに日本酒と最高の銘柄が揃っておりました。毬花はうまいぞ。いい感じの枡もあったんですが、入手に失敗しました。くやしいー。

f:id:FromAtom:20180901185327j:plainf:id:FromAtom:20180901185305j:plain

また、会場全体には無線LANが飛んでおり、いつでもどこでも快適なインターネット環境を得ることができました。 これもひとえにネットワークスタッフのみなさまのおかげです。ありがとうございます! 来年はグローバルIPを使って、Server Side SwiftなWebアプリが公開できる準備をしていきたいと思いました。

スピーカーとして

こちらの内容を話をしました。iOSDC1日目、朝イチ、Track Cという夜型人間に厳しい枠でした。 内容のニッチさと、時間帯、そして裏番組が

の2つでかなり強かったので、あまり人は来ないだろうと安心しきっていたのですが、なんと満員御礼。 わずかですが立ち見も出ており、嬉しいやら申し訳ないやら。

時間の都合上、AVPlayerの基本的な使い方をすべてカットしたため、本当に初心者の人には何もわからない内容だったと思います。 ただ、発表中でもお話したとおり、この内容は「複数HLSを同期再生する時の手助けになる資料」を目指して作りました。 もしどこかの誰かが、 EXT-X-PROGRAM-DATE-TIME タグを利用して、複数のHLS動画を同期再生したくなった際には、とても役に立つと思います。 いったいなにがどうなると、そんな状況に陥るのか全く分かりませんが。むしろ陥らないほうが幸せなのでは。

ちなみに、たくさんの人に聞きに来て頂いたので「すごい!複数HLS同期再生仲間がいるかもしれない!」と内心すごいわくわくしていたんですが、 誰一人としてHLS同期仲間に出会えませんでした。かなしい。ただ、AVPlayer仲間には出会え、動画再生の知見を交換したり、 「AndroidのExoPlayer便利じゃね?」という話をしたりできたのは、とても楽しかったです。

感情

去年参加した時もとても楽しかったんですが、スピーカーではなかったので、どうにも物足りない気持ちでした。 「来年は絶対にCfP大量に出してスピーカーで参加するぞ!」という強い意気込みをもち、 今年は全部で4つのCfPを出し、無事にスピーカーとして参加することが出来ました。

これは不思議なんですが、スピーカーとして参加すると「圧倒的当事者意識」が高まることに気づきました。 「せっかく採択してもらったし、ちゃんと発表準備しないとな」、「わざわざ聞きに来てもらうのだから、役に立つ情報をわかりやすく伝えないとな」と思い、何度も資料の構成を練り直しました。 iOSDCという参加するだけで楽しいイベントを、スピーカーという立場から盛り上げるためにはどうすればいいだろうかと考えながら作った資料なので、だれかが楽しんでもらえていると嬉しいです。

ちなみに、会社として用意したノベルティである「LGTM扇子」や「iOSできますよ。Tシャツ」も、そんな「参加者の人達の楽しみをもっと増やしたい」という気持ちから生まれたものだったりします。(もちろん自分一人で考えたわけではないですが)

さいごに

これが本当によくて、あまりの良さにちょっとウルッとしていました。

www.youtube.com

「俺たち、ビジネスでは敵かもしれないけど、審査やXcodeやAutoLayoutに苦しめられながらも、iOSアプリ開発を楽しむ仲間じゃん?」

#iOSDC Japan 2018 で『複数のライブ映像を同期再生するのが大変だったので知見をお伝えします』というお話をします。

f:id:FromAtom:20180830152940p:plain

今年もiOSDC Japanの季節がやってきましたね!ありがたいことに15分トークが採択されたので、登壇します!

プロポーザルには、

ライブ配信サービスが流行っている中、WWDC2017で EXT-X-PROGRAM-DATE-TIME タグのサポートが発表されました。これにより、複数のAVPlayerに表示されるライブ映像を同期することが可能になりました。

このトークでは、

・複数のライブ映像をズレなく同期再生するノウハウ

・ハマりどころ

・設計のコツ

を実際にプロダクション環境で運用した経験をもとにお話します。

https://fortee.jp/iosdc-japan-2018/proposal/ea691c74-27ed-45ca-9961-287004c2a2e0

と書きました。内容はほぼこの通りですが、完成した資料の目次としては

f:id:FromAtom:20180830151626p:plain

となりました。

このトークは将来「複数のライブ映像の同期再生を実装するだれか」が困った際に、手助けになることを目指してデザインしました。また、同期再生をする予定がない方でも、動画の再生やAVPlayerに興味がある方にも楽しめる内容になっているかと思います。

登壇は、

  • 日時:2018年08月31日(金) 10時50分〜
  • 会場:Track C

となっています。朝イチかつ1発目という非常に緊張する枠ですが、やっていきます。動画再生が得意・興味がある皆さんはぜひ聞きに来てください!そしていろいろお話しましょう!

iOSDC 楽しむぞ〜〜〜。

Swift 4.1 で多重配列を Flatten する。

環境

  • Swift version 4.1.2
  • Xcode 9.4.1

背景

※この記事は Sequence.flatMap を使って多重配列をFlattenしていた人向けの記事です。

Swift4.1になってから Sequence.flatMap がDeprecatedになり、かわりに mapcompactMap を使うようになりました。これらの使い方や導入経緯はこちらが詳しいです。

qiita.com

さて、 .flatMap { $0 } を使ってFlattenをしていた人からすると、多重配列をFlattenする方法がなくなってしまいました。

解決策

joined() を使えば良いです。

let multiDimensionalArray: [[Int]] = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
let joinedArray = Array(multiDimensionalArray.joined())
print(joinedArray) // => [1, 2, 3, 4, 5, 6, 7, 8, 9]

よかったですね。

備考

Swift3で flatten()joined() になっていたらしい。知らんかった。

github.com

ErgoDox EZに馴染めなかった男の末路

ErgoDox EZ買ってウキウキしてたんですよ。

ergodox-ez.com

でも完全に馴染めずに埃をかぶり、前から使っていたHHKB Pro2を使い続けることになりました。馴染めなかった理由としては、

  • そんなに手がでかくないから完全に死ぬキーが生まれる
  • 仕事で使いたいのに使ったらまともにキータイプできないから進捗が死ぬし、使わなかったら慣れないから使わなくなるジレンマ
  • キーマップ設定するのがめんどい
  • キーマップ設定するのがめんどい
  • キーマップ設定するのがめんどい

というわけでこうなりました。

同じもの2個買えばええんや!キーマップは普通だし、分離式をやめたくなっても1個ずつで使えるしで最強!コスパもErgoDoxよりちょっと高いだけ!勝ったな!

Swiftでクソコードを認める文法をつくった

はじめに

ジョークです

文脈

これのF#実装が出てきた

せっかくなのでSwiftで書いてみた。

実行環境

  • Xcode9.4.1
  • Swift 4.1.2

実装

import Foundation

@available(iOS, deprecated: 1, message: "[KUSO] これはクソコードです")
func kuso(_ block: () -> Void) {
    block()
}

使うときは

kuso {
    // ここにクソコードを書く
}

こうやって書きます。

実行結果

f:id:FromAtom:20180705212933p:plain

ちゃんと警告がでて便利ですね。

余談

Warningを出したいと思って色々調べてたんだけど、Swift4.2から

#warning("this is incomplete")

と書けば警告を出してくれることがわかった。

ただ、この方法だと #warning を書いた場所に警告が出てしまって kuso {} を利用している場所では警告が出せない。なのでDeprecated警告をだす文法を利用して表示しました。

まとめ

明日から業務で使えない情報でした。

参考文献

qiita.com

CocoaPodsで入れたライブラリのWarningを消す方法

困りポイント

CocoaPodsを利用してライブラリの管理をしている人は多いと思いますが、ビルド時にLibraryのWarningも大量にでて困ることがあると思います。こんな感じで

f:id:FromAtom:20180625174340p:plain

これでは、自分の開発しているアプリのWarningが埋もれてしまいますね。

解決方法

inhibit_all_warnings! を指定してあげれば良いです。公式のドキュメントはこちら

guides.cocoapods.org

実際に指定しているPodfileはこんな感じです。

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'sample-app' do
  use_frameworks!
  inhibit_all_warnings! # <= この指定を追加する
  
  pod 'DTCoreText'

  target 'sample-appUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end

inhibit_all_warnings! を追加した後に

$ pod install

をしたあとでXcodeでビルドを実行してみると

f:id:FromAtom:20180625174804p:plain

すごい!なにも表示されなくて、まるでビルドしていないかのようです。実際に開発していれば、ここにはSwiftLintやコンパイラが吐いてくれるWarningが表示されるので便利です。

iOS 12でOpenGL ESがDeprecatedになったので、Metalを使うにはiOSいくつ以降をサポートすれば良いのか調べた。

結論

  • iOS 11以降のサポートにすればよい
  • iPhone 5, iPhone 5c, iPad(4th) がMetal非対応だがiOS 10がインストール可能になっている
  • Apple公式的には最新2つのメジャーバージョンのサポートを推奨している
  • iOS 12が落ち着いたらiOS 10のサポート終了を準備しながらMetalの実装をすると良さそう
  • もしくはiOS 10をサポートしつつ、特定デバイスでは「ごのデバイスではこのアプリはご利用いただけません」的な表示をする手もある

各デバイス便利表

iPhone

バイス 発売年 Metal 解像度 @Nx iOS 8 iOS 9 iOS 10 iOS 11 iOS 12
iPhone 4S 2011 × 640 x 960 @2x × × ×
iPhone 5 2012 × 640 x 1136 @2x × ×
iPhone 5c 2013 × 640 x 1136 @2x × ×
iPhone 5s 2013 640 x 1136 @2x
iPhone 6 2014 750 x 1334 @2x
iPhone 6 Plus 2014 1242 x 2208 @3x
iPhone 6s 2015 750 x 1334 @2x -
iPhone 6s Plus 2015 1242 x 2208 @3x -
iPhone SE 2016 640 x 1136 @2x -
iPhone 7 2016 750 x 1334 @2x - -
iPhone 7 Plus 2016 1242 x 2208 @3x - -
iPhone 8 2017 750 x 1334 @2x - - -
iPhone 8 Plus 2017 1242 x 2208 @3x - - -
iPhone X 2017 1125 x 2436 @3x - - -

iPad

バイス 発売年 Metal 解像度 @Nx iOS 8 iOS 9 iOS 10 iOS 11 iOS 12
iPad 2 2011 × 768 x 1024 @1x × × ×
iPad mini 2012 × 768 x 1024 @1x × × ×
iPad (3rd) 2012 × 1536 x 2048 @2x × × ×
iPad (4th) 2012 × 1536 x 2048 @2x × ×
iPad Air 2013 1536 x 2048 @2x
iPad mini 2 2013 1536 x 2048 @2x
iPad Air 2 2014 1536 x 2048 @2x
iPad mini 3 2014 1536 x 2048 @2x
iPad mini 4 2015 1536 x 2048 @2x - ◯|◯
iPad Pro (12.9 1st generation) 2015 2048 x 2732 @2x -
iPad Pro (9.7) 2016 1536 x 2048 @2x -
iPad Pro (10.5) 2017 1668 x 2224 @2x -
iPad Pro (12.9 2nd generation) 2017 2048 x 2732 @2x -
iPad (2017) 2017 1536 x 2048 @2x - -
iPad (2018) 2018 1536 x 2048 @2x - - - ◯|◯

iPod Touch

バイス 発売年 Metal 解像度 @Nx iOS 8 iOS 9 iOS 10 iOS 11 iOS 12
iPod touch (5th) 2012 × 640 x 1136 @2x × × ×
iPod touch (6th) 2015 640 x 1136 @2x