TAMINIF’s blog

大阪在住のプロダクトマネージャー。元エンジニア(Web/iOS)

エンジニア学ぶこと多すぎ問題

最近技術に関わらずいろんなジャンルの本を読んで勉強しているのですが、技術だけでも覚えることいっぱいあるなあと思うことがあるので言語化してブログにしようと思いました。あまりまとまってないけど雑に書きます。

学ぶことが多い

一口にエンジニアと言っても、インフラ・ネットワーク・アプリ・Web・IoTなどなど種類がありますよね。Webサービスを出したいってなったときに多少はインフラの知識が必要だとか、アプリ作るにしてもWebAPIも作らないといけないとかでなかなか一人で全部やることって難しいと思います。
一つのことだけで働き続けるのって可能ではあるけどできることなら多方面に強いエンジニアの方が小回りはきくと思っていて、自分もそっち方面で目指してます。
覚えること多いのって昔からではあると思うんですけど、やっぱり昔より増えてるんじゃないかと思うんですよね。言語とか分野とか。

全てを網羅するエンジニアは少ないと思う

で、全て網羅している人ってほぼいないレベルだと思います。やっぱり、どれだけ賢くてどれだけ優秀でもここちょっと弱いとか、ここまだキャッチアップできてないとか、今勉強中とかってのはあると思ってます。ない人はごめんなさい。私の認識不足です。

エンジニア同士で話すとき、自分の話が相手の知らないことである可能性

簡単なものからその技術に精通していないと知らないような技術まで、自分が知ってて相手が知らないことってほぼ絶対あると思います。例えばエスケープシーケンスは改行しか知らないとか、HTMLの特殊文字で書く必要があるとか。小さいことなんですけどその時どうするかというと、自分が知らないときはすんなり受け入れて覚えようとするんですけど、相手が知らない時にどう反応するかってのは、意識しておかないとまずいなと思うことがあります。

その時どうするか

自分はよく「あ、これ知らないんだ。ふーん」と思ってしまうんですけど、これってちょっとマウント取りが入ってると思うんです。悪くいうと下に見てしまう。これとてもよくないと思っていて、日々直そうと努力中です。
自分自身も知らない時期ってのはあったはずで、それを覚えた経緯とかはもう全く覚えてないですけど、そのときに知ったというのは多少なり嬉しい気持ちはあったと思います。
サービスって大きくしようとすればするほど一人ではできないし、チームで動くのに同じ人が10人いるよりも違う力を持った人が10人いる方が多分捗るし、そのときお互いが知ってること知らないことってのが出来上がるので、そこでドヤ顔して良いこと一つもないなと思うわけです。 勉強会が初参加者を歓迎するのも同じだと思っていて、もしかしたら初めてくるその人は自分の知らないことを知っているかもしれない、教えてくれるかもしれないです。そんな初心を忘れないようにしたいなって話です。

初心を忘れないようにしよう

今年もう一ヶ月終わっちゃいましたけど、初心を忘れないようにするってのも今年の目標の一つです。自分が知ってて相手が知らないことがわかったら「ええやん!」って思うようにしたい。
また、今日同僚に「taminifさんはまだ下回りというか、プロトコルというか、ネットワークの仕組みについて弱いと思う。というのが僕の評価。」って言われたんですけど、こういうこと言ってもらえるのもありがたいと思うし、実際その通りだと思うので、せっかく教えてもらったので低レイヤー層の勉強もしようと思います。 自分の思考を言語化する技術の向上も目標ですね。もっとブログとか書いて磨いていければ。

iOSアプリでSkyWay使うときはBitcodeを含まないようにしよう

はじめに

いつも忘れるのでブログに備忘録として残して置きたいと思います。 iOSアプリでSkyWayのライブラリを入れた場合、Bitcodeを含まないようにしましょう。

TL;DR

TARGETS -> Build Settings -> Enable Bitcode -> No

経緯

CocoapodsでSkyWayのライブラリを入れた後Buildすると、Apple Mach-O Linker (id) Error が出ます。
このエラー自体はあまり情報を含んでいないので好きではないのですが、ログを見ると You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE) と出ます。
SkyWayのライブラリを入れるとBitcodeは含まないようにする必要があるのですが、毎回忘れるのでブログに残して置きます。

まとめ

SkyWayのライブラリとBitcodeはセットで設定するようにしましょう。

SkyWayのSFUを使用したサンプルを作成しました。

はじめに

ソースコード

github.com

概要

WebRTCのSFUを一度使ってみたくて、iOSアプリのリハビリも兼ねてSwiftで書いてみました。
SkyWayのiOSのサンプルはObjective-cで書かれているのと、ダウンロードしただけでは動かないこともあって
すぐ動くものを意識して作ってみました。

SkyWayとは

webrtc.ecl.ntt.com

NTTコミュニケーションズさんが運営する、WebRTCに必要なサーバーを提供してくれるサービスです。
一定の通信量までは無料で使えるのでまず登録して使ってみるのが良いと思います。
WebRTCやる上でサーバーに手を出すとその先は沼らしいのでもしサーバーを自分で立てるなら覚悟を決める必要があります。

SFUとは

WebRTCはP2Pで端末同士を繋ぎますが、それだと接続する端末ごとにコネクション数がどんどん増えていき、端末のCPUの負担が倍々になります。
そのため、最初から多人数を接続するために中継サーバーのようなものを置き、各端末はその中継サーバーにP2Pで接続、中継サーバーは各端末に受診している映像を送信します。
そうすることで受診は端末数分のコネクションが必要ですが、送信は中継サーバー一本で対応できることになります。
その仕組みがSFUです。

実装方法

ライブラリのインストール

Cocoapodsを使用して、SkyWayライブラリをインストールします。

pod 'SkyWay'

peerの接続、ルームの入室

peerを接続し、自身のpeerIDを取得します。

// peer connection
let options: SKWPeerOption = SKWPeerOption.init()
options.key = apiKey
options.domain = domain
options.debug = .DEBUG_LEVEL_ALL_LOGS
peer = SKWPeer.init(options: options)

SFUモードでルームを作成し、ルームに入室します。

// join SFU room
let option = SKWRoomOption.init()
option.mode = .ROOM_MODE_SFU
option.stream = self.localStream
sfuRoom = peer?.joinRoom(withName: roomNamePrefix + roomName, options: option) as? SKWSFURoom

受信した映像を表示します。

sfuRoom?.on(.ROOM_EVENT_STREAM, callback: {obj in
    let mediaStream: SKWMediaStream = obj as! SKWMediaStream

    self.lock.lock()

    // add videos
    self.arrayMediaStreams.add(mediaStream)
    self.collectionView.reloadData()

    self.lock.unlock()
})

今回は、映像の表示のためにCollectionViewを使用しました。

つまづいた点

plistの設定

いつも忘れるのですが、自分の映像を取得するためにはカメラとマイクを使用する必要があります。
SkyWayを使う場合でも例に漏れず、カメラとマイクを使うためにplistに設定が必要です。

<key>NSCameraUsageDescription</key>
<string>Use Camera</string>
<key>NSMicrophoneUsageDescription</key>
<string>Use Microphone</string>

離脱した映像の処理

誰かが退室した場合、その映像の受信が止まるだけで映像の削除は自分で対応する必要があります。
そうしないと、動かない映像がどんどん溜まることになります。

まとめ

実装期間約2日、時間にして5〜6時間で作成することができました。
どちらかと言うとCollectionViewに時間を取られたこともあるので、ビデオチャット自体はすぐできると思います。 非常に簡単でWebRTCを深く知らなくても実装できますので、興味ある方はぜひ登録してやってみてください。

Osaka Mix Leap Study #1 - Android / iOSで登壇して来ました

概要

ヤフー株式会社さんの大阪グランフロントオフィスでOsaka Mix Leapが開催されました。今回のテーマは Android / iOS です。 そこで「Mac1台でアプリを作る時代再び」というタイトルで登壇してきました。

経緯

Osaka Mix Leap - Grand Opening!!で登壇のお話をいただき、イベントが公開されたタイミングですぐ申し込みさせていただきました。 正直話すネタは決まってなかったし、最近は仕事でiOSをやってなかったのでどうしようというところはありましたが 勢い任せに資料作って話して来ました。

続きを読む

WebRTC Meetup Osaka#2で発表してきました。

概要

WebRTC Meetup Osaka#2が開催されました。今回は大阪単独開催です。 そこで「iOS11は本当にWebRTCに対応したのか」というタイトルで発表してきました。

謝罪

発表の中で「React NativeはWebRTCに対応していない」と言いましたが、正式にはreact-native-webrtcを入れれば対応可能です。 失礼いたしました。

github.com

TL;DR

iOS11がWebRTCに対応したのではなく、Safari11がWebRTCに対応しました。 Safari以外のブラウザではビデオ通話はできませんが、 DataChannelを使ってデータ送信が可能です。

続きを読む

iOS11でWebRTCに対応されたので詳細な調査を行った。

概要

iOS11でSafariがWebRTCに対応し、iOSでもP2P通信ができるようになりました。ところで、iOSにはSafari以外にもアプリ内で実装できるブラウザが存在します。
そのブラウザではどうなのか、調査しました。

TL;DR

Safari以外のブラウザでは対応していませんでした。

WebRTCに必要なもの

WebRTCを行うためには、最低でも以下二つのAPIが必要です。

  • RTCPeerConnection
    • P2P通信を行うためのAPIです。
  • getUserMedia
    • ブラウザが映像や音声を取得するためのAPIです。

そもそもWebRTCとは、これらを含むAPI(やプロトコル)の総称です。

iOS11のブラウザ

iOSには、Safari以外に三つのアプリ内実装用ブラウザが存在します。

  • WKWebView
  • SafariViewController
  • UIWebView
    • iOS11ではdeprecated

調査結果

全てのアプリ内実装用ブラウザで、RTCPeerConnectionは存在しましたがgetUserMediaは存在しませんでした。 よって、iOS11ではSafari以外ではWebRTCを使用することはできません。 アプリ内で実装する場合は、今まで通りネイティブで実装する必要があります。 時間があれば、DataChannelによる通信はできるのか調査してみたいと思います。

iOSDC 2017に参加と登壇してきました

表題にある通り、iOSDC 2017に参加してきました。ブログを書きたいけど今まで使っていたBloggerはエンジニア向けのブログではないのでずっと変えたいと思っていて、別のブログサービスを考えていたところ、昔に作ったはてなブログが残っていたのでこの機会に移転してきました。京都住まいだし。
なお、今後継続するかはわかりません。
iosdc.jp

続きを読む