面白きことは良きことなり

拙く未熟なiOSエンジニアの備忘録と戯言

iOS 11の写真アプリがアニメーションGIF対応

今更感のアニメーションGIF対応

support.apple.com

AppleiOS 11の変更点が記載されているページに、 iOS 11の写真アプリがアニメーションGIFに対応した記述があります。

iMessagesやTwitter等のSNSで、多く投稿されることもあってか、 対応したのだと思いますが、凄い今更感がある対応です。

ならばアニメーションPNG(APNG)はどうなのか

アニメーションGIFは軽量・軽快ではあるもののインターネット黎明期の産物です。

ジャギーとか目立つこともあり最近はアニメーションPNG(APNG)にブラウザが対応進んでいるので、アニメーション画像の形式はAPNGが主流になるのも遠くないと思っています。

aryzae.hatenablog.com


iOS 11の対応やサポートした記載はないものの、 もしかしたら写真アプリにAPNGを保存したら動くかも…と試したところ、

アニメーションしませんでした!!

iOSDC JAPAN 2017に参加してきた話

iOSDC JAPAN 2017について

  • 2017/09/15 (Fri) - 17 (Sun)の2.5日間開催(09/15のみ夕方からの半日開催)
  • 去年に続き2回目の開催
  • iOSエンジニアが集まり、知見を5min/15min/30minで話したり、親睦深める文化祭のようなもの
  • 開催から1週間以上経ち、いろんなところでブログとかQiitaでまとめやら記事化が落ち着いて来たと思うので、そろそろ自分も来年への記しとして残しておこうかと。

経緯

ここ数ヶ月で転職活動や自分の幅を広げたり、コミュニティを広げることを目的に勉強会に参加するようになり、最初こそ乗り気ではなかったがiOSエンジニアとして働いているので、参加することで得られるものがあるかもと思い、開催2週間前に申し込んだ。

あとは、まだ経験が少なく色々聞いてみたいテーマとかもあったこと、8000円ほどとtry Swiftに比べて出費のハードルの低さも申し込み安かったので良かった。

参加セッション

基本セッションを常時見に言っており、完全にお客さんと化していた。 以下、参加して印象的だったセッションと簡単な感想 スライド等は検索すれば出てくるので、ここでは貼らない。

2日目朝一の内容で、数学がごりごり出て来て参加者の半数くらいは置いてけぼり感あった重めな内容。自分も途中からよくわからなくなっていた。

  • 具体例とクイズで学ぶ、Swiftの4種類のエラーの使い分け

エラーハンドリングはよく悩むので、koherさんの記事を読んだことあったものの参加。 今回たぶん唯一のクイズ形式で視聴者参加型で面白かった。 設計と開発としてどう扱いたいかでエラーのハンドリングも変化するため、一概これが正解というのはない。

  • RxSwiftのObservableとは何か

RxSwiftやRxCocoaを軽く触ったことがあるので、話している内容はとっつきやすかった。 説明自体もRxSwift触っていない人に優しい説明で、今後よりRxSwiftがスタンダードライブラリーとして使われていくであろうことから、1番聞いて良かったと内容だったと思う。

  • 第3の課金形態「寄付モデル」ってどうなの?

自ら検証のためにアプリの課金方式を実装して申請してリジェクトされ、と試行錯誤Appleと戦った記録で面白かった。海外は割と寄付モデルはよくあるスタイルらしいが、登壇者は寄付されなかったもよう。

  • クラス名に個人の名前を含めるとこうなる

開発で実際にやってしまった結果、起こったその後の話。 名前が含んでいるせいで、バグったさい最初に疑われる等大変な思いをするも、最終的にはネタとして登壇して笑いにしていたので報われた?

  • 新しい画像フォーマットHEIFを用いたiOSアプリの通信量削減

iOS11から扱えるようになったHEIFを検証したお話。 エンコードできるソフトがほとんどないのがネックだったり、あっても権利問題があって業務ではつらみがある。 なぜかHigh Sierraではエンコードがサポートもされていない。 HEIFは自分も使って見たいので触ってみようかと思った。

  • 結婚式を支えた技術 Firebaseを活用したサーバレスiOSアプリケーション開発

自身の結婚式で各々が取る写真を共有できるように1ヶ月未満でインスタグラムみたいなものを開発し、iOS所持の参加者にサポートしつつ入れてもらって話。 事前調査で半数以上iOSユーザだったこともあり、Androidは対応なし。 機能を絞った割に、撮影やらアップロードやらと機能そこそこありつつ、結婚式の準備で忙しいであろうにプライベート時間の合間を縫って短期間で作っており凄いなーと思った。本人曰く結婚式ハック。エンジニアならちょっと似たような感じでアプリ絡めてやりたいと思った人も多いのでは?

  • App Transport Securityは作れる

CF系の低レベルなところまでさわればATSの同じようなことはできるけど、そこまでして作る意味は薄くATSの挙動の理解を深めるのがいいところ。 でもアプリ作る上で必ずATSは絡んでくるので知識としてはあって損ない。 ただ、自分は割と業務でガッツリやってた時があったので7割くらいは知っている内容だったことと他のセッションに行くつもりが間違えて参加してしまい…。

  • 飛び道具ではないMetal

iOS界隈では知らない人はいないと言っても過言ではない堤さんのセッション。 UIKitも下ではMetalが使われており、Metalを使ってUIImageViewを作成できるお話だった。ただ、Appleが優秀すぎるのかMetalで作成したUIImageViewはUIKitのUIImageViewよりパフォーマンスが悪かった模様。 決してMetalが無関係な存在じゃないことを知って、俄然興味が湧いたので手を出してみたいと思った。Obj-Cに引っ張られてSwiftでは使いにくいと言われてるUIKitもMetalでSwift用の独自開発も可能かもしれない?

  • Rangeと仲良くなる15分

StringでRangeが意外と鬼門になり、NSStringの時は比較的扱いやすかったのに、Swiftで扱いにくくなって辛かったのでセッションに参加。 Swift4からはかなり扱いやすく改善されたり、組み合わせてできる絵文字も思い通りに扱えるようになっているので、基本的であるものの大事な部分のお話。

  • 実践CloudKit

CloudKit使ってみたいけど、大変そうだなーと思っていたので参加。 考慮することは結構あるが、作成自体はそう大変ではなさそうだった。

  • 5分でわかるServer-side Swift Vaporの魅力

意外と簡単にAPIが作れる感じだったので、テスト用のAPIとか作るとこから始めてみようかと思った。

  • iOSDC Japan 2016 の賞金を放置しておくと1年でどうなったか?!

昨年に賞を貰い、賞金としてBitcoinが配られたものを放置した結果の顛末。 2017年の8月9月あたりで急激な価格高騰し、数万が化けた。 登壇者よりも賞金が多かったベストスピーカーさらに大金を得たかも?!

まとめ

正直参加するまで、どういう集まりで何をするのかも知らず、ただただセッションを聞くだけの状態で有意義な参加はできたと言えなかった。 一方で、自分がもっと知識として蓄えたり突き詰めたい方向性は見えたので、そっちに突き進んで来年あたりに登壇を目指すのも一興かなと思っている。

あとはもっと交流するべきだったと思う。 人見知りなんて言い訳してないで、輪に入っていけばなーという気持ちだった。 終始1人〜同僚含めた3人ぐらいでクローズな状態だったのでそこは反省。

ちなみに同じ会社の人間とは一切遭遇や見かけることはなかった。


来年は、申し込みを初期から行う!

USB3.0と2.4GHz帯電波の干渉によるネットワーク不安定化とその弊害(主にSwitch)

2.4GHz帯の電波について

2.4GHz帯の電波を使用する主な普及品として下記は割と知られていると思う。

無線LANに関しては、2.4GHzと5GHzの2種あるが、障害物に強く遠くまで飛ぶという理由や
無線LAN(b/g)が普及したタイミングで導入した名残もあって2.4GHzがよく使われている印象がある。

また、iPhone7等スマホの音楽再生をBluetooth経由で聞く人も今となっては珍しくないと思う。

先ほど2.4GHz帯の特徴として、障害物に強い等上げたが、一方で下記のマイナス面もある。

  • 2.4GHzを使用した製品が多く狭い空間では干渉しやすい
  • 電子レンジを使用するともろに2.4GHzに干渉する

USB3.0について

こちらは最近やっと世間的にも普及し始めてきた印象。
青色端子で、USB3.0が対応している機器を対応しているケーブルで接続すると、
従来の10倍程の速度でやりとりができる便利な代物。

今では、Nintendo SwitchPS4にも搭載されている。

f:id:aryzae:20170829124401j:plain
※画像はBuffaloのサイトから拝借: これからは新規格 超高速USB3.0 | BUFFALO バッファロー

USB3.0のノイズ問題

USB3.0は速度がパワーアップしただけでなく、ノイズもパワーアップしている。
詳しくは下記の記事参照
USB3.0機器から発生するノイズは、2.4Ghz無線LANに悪影響を与えるらしい。 - ぼくんちのTV 別館

USB3.0と2.4GHz帯電波の干渉によるネットワーク切断

先ほど貼った記事の中でも記載があるが、USB3.0はノイズが酷いことで2.4GHz帯の電波に干渉する問題がある。

これの何が一番問題になるかというと、Nintendo Switchを2.4GHz帯でネットに繋いで
Splatoon2やMonsterHunterXXをプレイするユーザーがオンラインプレイすることで
電波干渉が発生し、ネットワークが不安定になりラグや切断を生みやすくなることである。

Nintendo Switchはドックに設置することでTVに映し出してプレイできるのだが、
このドックにUSB3.0端子がついているため、非常に干渉しやすい作りになっている。

しかし、USB3.0端子からノイズが出るのは使用している時のため、開梱してそのまま設置した人であれば、
USB3.0を使用していないこともあるので、一概にネットワークが不安定になっているわけではない。

まとめ

Nintendo Switchでネットワークが切断されたり、不安定に感じるのであれば、
USB3.0端子や他に2.4GHzの電波を発生する機器を使用していないか確認して欲しい。

個人的に一番好ましいのは5GHzの無線LAN(a/n/ac)を使用すること!
というか、よっぽどのことがない限り、2.4GHzなんて使わないで欲しい。
いっそ2.4GHzの無線LANを駆逐してもいいのでは?

これで快適なイカライフやハンターライフが楽しめるね。

RxSwift+MVVMで出てくるサイトのコードの備忘録

RxSwift+MVVMで上位に引っかかるRealm

academy.realm.io

RxSwiftとMVVMを勉強しようとした際、上記サイトが上位にくるものの、記載されているコードを今写経してもエラーがでるのみで正常に動かなかった。
調べたり試行錯誤して動くようにできたので記録しておく。

というかほぼStackOverflow先生に答えがあったようなものだった。

動作環境

  • Xcode8.3.3
  • RxSwift 3.6.1

コード

// View(ViewController)
import UIKit
import RxCocoa
import RxSwift

class LoginViewController: UIViewController {

    @IBOutlet var usernameTextFiled: UITextField!
    @IBOutlet var passwordTextFiled: UITextField!
    @IBOutlet var confirmButton: UIButton!
    
    var viewModel = LoginViewModel()
    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        usernameTextFiled.rx.text.orEmpty.bind(to: viewModel.username).disposed(by: disposeBag)
        passwordTextFiled.rx.text.orEmpty.bind(to: viewModel.password).disposed(by: disposeBag)
        
        viewModel.isValid.map { $0 }.bind(to: confirmButton.rx.isEnabled).disposed(by: disposeBag)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}
// ViewModel
import Foundation
import RxSwift

struct LoginViewModel {

    var username = Variable<String>("")
    var password = Variable<String>("")

    var isValid: Observable<Bool> {
        return Observable.combineLatest(self.username.asObservable(), self.password.asObservable()) { (username, password) in
            return username.characters.count > 0 && password.characters.count > 0
        }
    }
}

Swift2からSwift3への移行期にもよくあったけど、RxSwiftも古い情報がひっかかりやすく、最新のVersionでの書き方がわからず四苦八苦する状態に陥っている。

参考サイト

ios - UITextField binding to ViewModel with RxSwift - Stack Overflow

Carthageでversion指定の書き方を忘れるのでメモ

ふとした時、書き方を忘れ、色々漁って探し直すのが大変なので、ここにメモとして残す。 基本 ~> で書くか == で書くことが多いと思う。

# コメント

# ~> 互換性のある最大のversion指定
# ex. 3.0以上かつ4.0未満の最大のversion
github "ReactiveX/RxSwift" ~> 3.0

# >= 指定以上の最大のversion
# ex. 3.0以上の最大のversion
github "ReactiveX/RxSwift" >= 3.0

# == 指定のversion
# ex. 3.0固定
github "ReactiveX/RxSwift" == 3.0

記述が終わったら下記コマンドを叩く

$ carthage update