#86 某SNSを作った話 & docker moby project

どうも、esuiです。

皆様はGWはいかがだったでしょうか?
自分は1年ぶりにスクーターで旅行をしまして、各地で某位置情報ゲームをやりながら走り回ってリフレッシュできました。




某SNSアプリを作った話



第一部は、業務で某SNSアプリを作った際に行ってきた内容などの紹介でした。
受託案件のためその一部のみしか紹介出来ないですが、ご了承を…。

担当内容


iOS/Android UIとUXデザイン、iOS実装

要件定義から実装完了まで3ヶ月ちょっとしかないという恐ろしいスケジュールの中、
さらに深刻なデザイナー不足の中で時間も無かった事から、
アプリの実装だけではなくデザインも担当する事になってしまったそうです。

使用アプリ(デザイン)


## Sketch
- AutoLayoutプラグインを導入してレスポンシブにレイアウトを構成->Androidの移植が容易に
- Fluid for Sketchを使用、今後はAutoLayout for Sketchを使うのがいい

## Flinto
- 早い段階でプロトタイプを作り、定期的に更新をかけてデザインの手戻りを減らすように

## InVision
- 画面全体を俯瞰するために使用、構成書作るの楽になったとのこと

## Zeplin
- Androidの画面指示書を作る必要があり、Sketchプラグインを使って自動的に指示

開発環境と使用サービス


- Xcodeは最新のもの
- Swift 3.0
- Cocoapods と Carthage
- SwiftLint
- fastlane
- Bitrise CI

使用アプリ(実装)


## Paw
- HTTP Client 、APIの確認に使用

## Charles
- iOSシミュレータと実機からAPI間のSSL通信のトラフィックのデバッグに使用

## Reveal
- UIViewのデバッグに使用

はじめにやったこと


- CocoapodsとCarthageを設定
- Bitriseでgit pushをトリガーにさせてアーカイブ作成を自動化
- マニュアルでアーカイブ作成するためにfastlaneでビルドスクリプトを作成 -> ストア申請に役立っている
- AWS SNSでプッシュ通知の疎通確認(iOS10からAPI変わったので調査な意味もある)

代表的な使用ライブラリ


- Alamofire
- SwiftyJSON
- KeychainAccess
- Kingfisher
- PromiseKit
- SwiftyBeaver
- SnapKit
UIの要件が強く、他にも多くのライブラリを使用している、とのことです。

Carthageライブラリを作成


Githubからライブラリをforkして、自分のリポジトリをCarthageライブラリ化して組み込むみたいな対応をしたそうです。
プロジェクトに直接組み込んだライブラリもあり、こういった場合はきちんと責任を持つ事が大事とのことです。

Modelの実装


ネットワークレイヤーとモデルクラスを共通フレームワーク化したEmbedded Frameworkを作成したそうです。
今回の要件では必要性は低いが、watchOSやExtension系の実装がある場合は重要とのこと。

マッピングの実装


- Pawを使いながら、AlamofireとSwiftyJSONでAPIから取得したJSONをモデルに落とし込むマッピングを実装
- サービスクラスとモデルクラスはXCTestでテストを作成
- try! Swift の発表スライドWriting your App Swiftly を参考に実装するといい、との事です。(状態の曖昧さをなくす)

ViewとControllerの実装


- MVVMにチャレンジ、リアクティブプログラミングの要素の導入に失敗(時間に余裕がなかった)

ViewModelの実装


- APIからデータの取得と送信と、モデルのデータをViewコントローラーに渡すような実装に

TableViewの実装


- UIの要件によって、Storyboard、nib、コードからViewの作成を組み合わせた実装に
- 基本的にTableView共通のCellをnibで作ってコードで呼び出し
- 複数のCellセクションをenumで定義して、Cellを切り替えるような実装
- ここら辺は、IGListKitを検討するといいかも

最後にViewとController実装のつらみ


- インタラクティブなViewを作るのにひたすら頭をかかえる(NavigationBarのカスタマイズ案件はしぬ)-> 時間がない
- Viewの調整に多くの時間を使う
- Controllerが巨大化していく
- アプリのサイズが大きくなるにつれ、Bitriseのビルドに45分以上かかかるようになり失敗してしまうようになる -> GitにCarthageでビルドされたバイナリを含めるようにした
- 動作環境をiOS8以降に -> iOS9以降前提で作っていたのでStackViewの実装を書き直した

まとめ


結構短期間のハードワークだったので、趣味の筋トレとデザイン、コードの調査と収集する時間が取れなく長く苦しい戦いだったそうですが、久しぶりの実装だったので、感を取り戻すには良かったそうです(以前はブログアプリのデザインを作っていたので)
Bitriseの稟議が通ったそうなので、ぜひ使って欲しい、とのことでしたw




第二部は、

Dockerのmoby project



ということで、先日のDockerCon17で発表になった、
moby projectと、その重要コンポーネントであるlinuxkitについての紹介でした。

Moby Projectとは


もうこれは
Dockerが「Moby Project」を発表。すべてをコンテナで組み立てる世界を目指す。DockerCon 2017
【参考訳】Mobyプロジェクトのご紹介(dockercon17での発表)
https://www.slideshare.net/AkihiroSuda/moby-project
などを参考にしていただい方が早くて良いのですが、
元々はDockerのロゴになっているクジラの愛称がmobyというらしいのですが、
このmoby projectの方はコンテナ環境を組み立てるためのフレームワークということのようです。
様々なコンポーネントを組み合わせることによって、システムを構築できるようにしていく、とのことです。

スクリーンショット 2017-06-11 01.53.35.png

このプロジェクト発足に合わせて、GitHubのdocker/dockerリポジトリがmoby/mobyリポジトリに移動しました。
https://github.com/docker/docker

https://github.com/moby/moby

OSSとしてのDocker自体の名前が消えるわけではないようで、

Moby = open source development
Docker CE = free product release based on Moby
Docker EE = commercial product release based on Docker EE.

dockerコマンドなども現時点では続行のようです。
Dockerfileも、これまで通りにDockerfileとなっており、docker-compose.ymlなどもそのまま残っているとのこと。

mobyでコンテナシステムを作る


http://qiita.com/pottava/items/3e64cf0476d4cfa93169
などを参考に、実際にmobyでLinuxKitが起動するところや、
runc, containerdを使ってdockerデーモン無しでのコンテナの起動させるなどのデモを行っていました。

ということで、moby projectは現時点では過渡期ということもあり、概念が複雑でいまいち掴みどころが無いところもありますが、
レゴブロックを組み合わせるように好きなコンポーネントを使って自由にシステム構築出来るようになってくれる、というのは素直にワクワクしますね。

この記事へのコメント