SwiftUIについて調べたこと
この記事は ウィルゲート Advent Calendar 2019 の17日目の記事です。
最近業務でSwiftを触ることがなくなり少しさみしいのでSwiftUIについて調べたことをまとめていきます。
SwiftUIの登場まで
iOS SDKの登場以降、iOSアプリのViewを開発する場合はAppleが提供しているUIフレームワークのUIKitを使用してきました。このフレームワークを使用することで、簡単にViewを組み立てることができました。 ただUIKitで作られたアプリはViewControllerに処理が集まっていることが多く、FatViewController になることが多くありました。
問題を解消するため、開発者はMVVM,Viper,クリーンアーキテクチャなどの設計を取り入れてアプリを開発してきました。 2019年WWDCで宣言的にViewを組み立てる仕組みとしてのSwiftUIが発表されました。 SwiftUIの登場によりアプリ開発がどう変わるかをまとめていきます。
SwiftUIとUIkitの違い
UIKit | SwiftUI | |
---|---|---|
アーキテクチャ | イベント駆動 | 状態駆動 |
イベント処理 | コールバック,デリゲート | クロージャーコールバック |
SwiftUIとUIKitの大きな違いは、構文が変わったこと以外に、Viewに状態をもたせることができるようになったことです。 アプリ開発では複雑な状態を扱う事が多く、状態どこで管理しどう扱うかに頭を悩ませることが多くありました。 状態を管理する方法として、AppleはCombineをSwiftUIと同時に発表しました。 CombineはViewへ状態をバインドするための仕組みを提供しています。またViewの中で状態を管理することができるようになりました。 SwiftUIとCombineを使用することで状態の管理が簡単になると思います。
WWDCのセッションではユーザーのアクションをViewへ伝えていくためにどうするか説明がされています。 興味がある人は見てみるといいと思います。
アーキテクチャについて
SwiftUIとCombineを使用することにより画面の状態をViewに持たせることが出来ます。またデータバインドの仕組みを標準でサポートしているため、MVVMアーキテクチャを使用して作成することが簡単になりました。@Publishedや@Stateような属性や@ObservableObjectを使用しViewModelを作ることが出来ます。
まとめ
SwiftUIはまだまだ登場したばかりで資料がすくないため導入は難しいかもしれません。今後も動向を追っていきたいと思います。
明日はokashoiさんで、『PHP + Swoole で論理回路シミュレータを作ってみた(仮)』です。 お楽しみに!
参考資料
若手エンジニアで振り返り会をやった
若手エンジニアが集まって振り返り会を行いました。
今後どういったキャリアを描きたいのかやどういった成長をしてきたかをまとめることを目的に行いました。
2019前半振り返り会なう pic.twitter.com/w48sqV1SVG
— キュアセブン (@cureseven) July 27, 2019
やったこと
2時間くらい個人でモクモク振り返り
2時間くらいで振り返ったことを共有
雑に発表した人まとめ
覚えてることを雑多に書きます
アッキー (@akki_megane) | Twitter
- ISUCON優勝
02 (@cocoeyes02) | Twitter
- 推進力が足らないので自信を持って推進する
しょーぞー (@shozo_ms) | Twitter
- アウトプット少ないのでアウトプットする
ぴんくもひかん (@pinkumohikan) | Twitter
- Railsでサービス作ってみる
おかしょい@アーキテクト 兼 技術広報 (@okashoi) | Twitter
- プライベートが充実
広高@エンジニア兼プレゼン講師 (@yutanpo_it) | Twitter
- 深く学びたいことを探したい
キュアセブン (@cureseven) | Twitter
- 強くなりたい
for_3 | ZOE (@for__3) | Twitter
- 身近な人を救うようなアウトプットをするためにどうするかを考える
- ISUCON予選突破できなかったらユニセフ
ShuzoN@webエンジニアとヘッドホン (@ShuzoN__) | Twitter
- 本をめっちゃ読んだ
本は実質タダ
— for_3 | ZOE (@for__3) July 27, 2019
振り返って
- 個人的にはインプットを多くできていたと感じている
- アウトプットが少なかったので今後は少しでも増やしていきたい
iOSで該当のViewControllerが生成されているかを確認する関数を作る
最近暖かくなったり寒くなったりするので体調を崩し気味ですがなんとか気合で乗り越えています。 業務はいい感じなのでいい感じです。
最近iOSを書いていてバックグラウンドで描画している画面を検索したいことがありなんとか実装したのでメモとして残します。
import Foundation import UIKit extension UIViewController { /** * ViewControllerが子や孫に存在する場合はそのViewControllerを返す */ func findChildren<T:UIViewController>(kind:T.Type?) -> T? { if let viewControler = self as? T { return viewControler } if let viewControler = self.presentedViewController as? T { return viewControler } if let viewControlers = self.presentedViewController?.children { return viewControlers.compactMap{$0.findChildren(kind: kind)}.first } return nil } }
いい感じにかけた気がするのですが、急いで書いたので抜けてる部分とかありそう。 ご利用は計画的に。
Codableで使える構造体をJsonから自動生成してくれる便利拡張
最近業務でSwiftを書くことが多くなり(ここ6ヶ月はほぼSwift)わからないことだらけで右往左往しています。
業務ではAPIとのやり取りを行うことが多くSwift4から追加されたCodableを使用してJsonの整形を行っています。Codableを利用するときはAPIのレスポンスに合った構造体の定義する必要があり、APIごとに定義していくことが面倒になっていました。
そんなときXcodeの便利そうな拡張を見つけました。
この拡張を使うと、Jsonの構造からCodableで使える構造体を自動的に生成してくれます。
便利そう
導入(メモ)
- Alcatrazで入れられそうと思った
-
アーカイブされてた・・・
読み取ることはできるけどこれって入れていいの? - 少し調べてみたら良さそうな資料が出てきた。この資料を見たところ一旦.appを生成すれば導入できるよって書いてありました。なのでソースコードを落としてきてArchiveする。
- Archiveした結果を「アプリケーション」ディレクトリに入れる。
- システム環境設定から拡張機能を開き有効化することで使用できます。
- 有効化後xcodeを再起動することで機能をしようるることができました。
まとめ
いろいろ調べて便利な拡張機能を使っていきたい。
アプリケーションアーキテクチャ設計パターン【目次】
本を読む習慣をつけるために、少しずつ読んだ内容をブログとしてまとめていきたいと思います。
1冊目は、「アプリケーションアプリケーションアーキテクチャ設計パターン」についてまとめていきます。
この本を読む理由は、アーキテクチャって何なんだろうと疑問に思ったことと、いざ業務でやることがあったときに少しでも困らないようにしようと思ったからです。
まとめたブログ記事は、この記事からリンクさせていきます。
目次
- 第2章 エンタープライズアプリケーションの共通概念と処理形態
- 第3章 エンタープライズアプリケーションの機能配置とレイヤ化
- 第4章 プレゼンテーション層の設計パターン
- 第5章 インスタンスの生成や構造に関する設計パターン
- 第6章 ビジネス層の設計パターン
- 第7章 トランザクション管理とデータ整合性確保のための設計パターン
- 第8章 データアクセス層の設計パターン
- 第9章 検証と例外のための設計パターン
- 第10章 非同期呼び出しと並列処理のための設計パターン
- 第11章 その他のアーキテクチャパターン
- 第12章 クライアントサイドのアーキテクチャ概要
- 第13章 Webページの設計パターン
- 第14章 シングルページアプリケーションの設計パターン
- 第15章 バッチ処理の概要
- 第16章 オフラインバッチアプリケーションの設計パターン
- 第17章 オンラインバッチとディレードオンラインの設計パターン
- 第18章 ビッグデータ技術による分散並列バッチ処理
- 第19章 システム間連携の概要
- 第20章 アプリケーション連携の設計パターン
- 第21章 メッセージングの設計パターン
Cakephp3でCSVのデータをSeedで利用する
最近、巨大なCSVをSeedとして利用することがあり、そのさい行ったことをメモ程度にまとめていきます。
環境は以下です。
- PHP7.1
- CakePHP 3.4
最初のプログラム
1番最初に作成したプログラムでは、CSVをfopen関数で呼び出し、内容をループで取得しながらインサートしていました。
<?php use Migrations\AbstractSeed; class TestSeed extends AbstractSeed { public function run() { $table = $this->table('test'); $fp = fopen("seedファイルのパス", "rb"); while(($line = fgetcsv($fp)) !== false) { $insertData = [ 'data1' => (int)$data[1], 'data2' => (string)$data[2], ]; $table->insert($insertData)->save(); } } } ?>
Seedに使用するCSVファイルが複数ある場合に同じ処理を複数回書いていました。 関数化することで他のクラスでも使用できるようにしたかったため、Generatorを使用してCSVの読み込み処理を関数化しました。 Generatorを使用しようと思ったのは、メモリ効率が良さそうなのと、使ってみたかったからです。
Generatorを使った処理。
<?php use Migrations\AbstractSeed; class TestSeed extends AbstractSeed { public function run() { $table = $this->table('test'); foreach ($this->fileGetLines("seedファイルのパス") as $data) { $insertData = [ 'data1' => (int)$data[1], 'data2' => (string)$data[2], ]; $table->insert($insertData)->save(); } } public function fileGetLines($filepath) { $lines = []; $fp = fopen($filepath, "rb"); while(($line = fgets($fp)) !== false) { yield $line; } fclose($fp); } } ?>
Generatorを使用することで、処理がスッキリし読みやすくなりました。 また、変更後処理時間を測定した結果、Generatorを使用したほうが、若干処理が早くなりました。
バルクインサートする
先程までの処理は1行ずつ保存していたため、処理が遅かったです。 そのため、バルクインサートにすることで処理を早くしました。 バルクインサートにした結果2分かかっていた処理が、40秒ほどになりました。
<?php use Migrations\AbstractSeed; class TestSeed extends AbstractSeed { public function run() { $table = $this->table('test'); foreach ($this->fileGetLines("seedファイルのパス") as $data) { $insertData = [ 'data1' => (int)$data[1], 'data2' => (string)$data[2], ]; if (count($insertData) >= 1000) { $this->insert('test', $insertData); $insertData = []; } } $this->insert('test', $insertData); } public function fileGetLines($filepath) { $lines = []; $fp = fopen($filepath, "rb"); while(($line = fgets($fp)) !== false) { yield $line; } fclose($fp); } } ?>
参考にしたサイト
【t_wadaさんの講演】技術の学び方
2017/09/23にサポーターズコラボの和田さんの「【和田卓人氏特別講演】若手エンジニアに送る、"心構え"と"キャリア観"」の講演会に参加していました。
参加した経緯としては、友人からすすめられたのもあるのですが、最近テストを書くことが多くあり、調べた際にT和田さんの話が多く出ていたので興味を持ち参加することにしました。
講演を聞き和田さんがプログラマーとして生き続けるために必要なこととして「技術を学ぶことよりも、技術の学びかたを学ぶこと」がこの先プログラマーとして生きていく上で大切だと思ったのでまとめたいと思います。
今回の講演ではないですが、資料があったので参考までに以下に貼っておきます。
技術の学び方を学ぶとは
プログラミングの技術は小さなことから大きなことまで、毎日のように新しい技術が出て来る。そのため、出てきた技術をすべて学ぼうとすると、時間が足りなくなり、学習し続けることが難しくなるそうです。そうならないためには、技術の中で必要なものや必要でないものをしっかりと取捨選択していく必要があり、そのためには学び方自体を学ぶことで効率よく学ぶことができるそうです。
また、最新の技術を学ぶことは大切であるが、最新の技術を学ぶためにも過去に出された書籍から、捨てられた技術となぜ捨てられたかを知ることも大切だそうです。
技術の学び方とは
講演の中で技術の学び方として、以下の5つを上げていました。
- 技術書の読み方
- 手を動かして学ぶ
- 毎年1つの言語を学ぶ
- 身の回りをプログラムする
- アウトプットを行う
それぞれについて、不足している情報はありますが以下にまとめていきます。
技術書の読み方
和田さんが「技術書の内容をすべて読むのではなく、その本の中で必要な情報だけを学ぶようする。」とおっしゃられていました。また、本は個別に存在するのではなく、参照があり、それぞれが過去の本を参照していることを意識して読むことで、捨てられた技術がなぜ捨てられたのかを考える切っ掛けにもなり良いとおっしゃられていました。脳内にインデックスを貼るように、内容をすべて覚えるのではなく関連付けることで情報を引き出しやすくなるそうです。
手を動かして学ぶ
デールの円錐から、何かを学ぶときに、読んだだけの人は、90%の人が2週間後には内容を忘れてしまうが、実際に手を動かしてアウトプットした人は90%の人が内容を覚えている。そのため、本をただ読むだけでなく、写経するなど、学んだことをアウトプットにして、残すといいとおっしゃられていました。本を読んだときには、写経をするや、疑問に思ったことでもいいので、感想などもコメントとして書き込みながら読むとあとで見返したときに学びが多くなるとおっしゃられていました。
写経のやり方は和田さんのTwitterにあるので参考にすると良いそうです。
技術書の「写経」の方法。 1.ローカルで使える SCM を用意 2.「ほんたった」などで対象の本を固定 3.ひたすらサンプルコードを写して実行 4.実行するたびにコミット(コミットログにページ番号を含める) 5.疑問点があったらコミットログや本に書き込む 6.章ごとにタグを打つ
— Takuto Wada (@t_wada) February 12, 2010
毎年1つの言語を学ぶ
仕事で使っている以外の言語を学ぶことで、他の言語の考え方を知ることができ、仕事で使っている言語を書く際に良い影響を与えるとおっしゃられていました。
例えば副作用の多い言語を書いている人が、副作用をなくそうとする言語を学ぶと、副作用の多い言語を書くとに、副作用を少なくする書き方を意識してできるようになるなどです。
学習する言語を選ぶ基準としては、オブジェクト指向、動的型付け言語を使っていた人であれば、関数型、動的型付け言語を学ぶなど、今まで使っていた言語よりも少しだけ変化をつけると学習コストが下がりいいとおっしゃられていました。
1つの言語を学び終えたと思えるときは、APIやドキュメントを調べなくてもその言語で何かものが作れるレベルになれば学びの終着点だそうです。1年で1つここまで学ぶのは難しそうですが・・・
身の回りをプログラムする(うまくまとめられなかった)
身の回りで不便だと感じていることを技術を使用して便利にしていくといいそうです。アウトプットや効率化にもつながるのでいいそうです。
和田さんは今は子育てをハックするなどを行っているそうです。
感想になってしまうのですが、自分の好きなようにすることでモチベーションが保てると感じました。
アウトプットを行う
インプットしてアウトプットを繰り返す正のループを繰り返すことで情報が蓄積されていく。質よりも量を大切にし、量は質を量が凌駕するので量をこなすことが大切だと仰られていました。
アウトプットする場は、Twitterやブログ、github、1人で何か手を動かして作る。などなど、なんでもいいので始め習慣化ることが大切だそうです。
まとめ
今回の講演を聞いて、自分に1番足らないのはアウトプットを出すことだと感じました。今後は少しでもアウトプットを出すことを習慣づけられるようにしていきたいです。まずはブログを書くやTwitterでつぶやくなど小さなことからコツコツと習慣にしていく。
蛇足ですが、英語を学ぶことが大切だと仰られていた。技術が出てきたときに、1番最初に目にするのは英語で書かれた文章なので。学ぶことで得することしかないそうです。
英語が苦手なので逃げないようにしたい(小並感)。
和田さん最初はネット上の情報を見ると怖い印象でしたが、そんなことはなく優しい印象でした。スタンドが怖いだけでした。