SlideShare une entreprise Scribd logo
1  sur  19
Télécharger pour lire hors ligne
少しずつ手厚くして不具合や仕様漏れを防ぐために
開発×テスト	LT会	-	vol.2	#devtestlt	@	オンライン
2022/03/15
Fumiya	Sakai
自己紹介
・Fumiya	Sakai
・Freelance	App	Engineer
アカウント:
・Twitter:	https://twitter.com/fumiyasac

・Facebook:	https://www.facebook.com/fumiya.sakai.37

・Github:	https://github.com/fumiyasac	

・Qiita:	https://qiita.com/fumiyasac@github
発表者:
・Born	on	September	21,	1984
これまでの歩み:
Web	Designer
2008	~	2010
Web	Engineer
2012	~	2016
App	Engineer
2017	~	Now
iOS	/	Android	/	sometimes	Flutter
iOSのUI実装本を執筆しています!
書籍に掲載したサンプルのバージョンアップや続編等に現在着手中です。
少しの工夫で実現できるTIPS集やライブラリ表現の活用集をはじめとした、iOSア
プリ開発の中でも特にUI実装やUIKitを利用した画面の中で特徴を与える様な表現
という題材に焦点を当てた書籍となっております。
現在は電子書籍版のみとなります。	こちらは全て¥1,000となっております。
https://just1factory.booth.pm/
概要:
https://book-tech.com/
価格:
📖 	Booth
📖 	Book	Tech
UI実装であると嬉しいレシピブックの最新情報
UI実装であると嬉しいレシピブックVol.3として昨年10月に商業化しました!
New
これまでの同人誌として頒布したものに加えて、Vol.1及びVol.2に頒布したものの
中で書籍に載せきれなかったものや表現や動きが特徴的でユーザーにもほんの少し
遊び心を与える様なUI実装を紹介したものをVol.3としています。
概要:
これからの構想:
こちらで購入可能です:
Amazon	/	Google	Play	/	Apple	Books	/	KINOKUNIYA	/	Rakuten	BOOKS	etc..
🏊 	iOS:	SwiftUIを利用したUI実装や動画関連の実装
🏊 	Android:	Jetpack	Composeの基本やその他気になるUI表現の考察
今回の処理で想定している責務レイヤーの分割例
ここではRxSwiftを利用したPresenter	⇄	UseCase	⇄	Repositoryの処理
Presentation Business	Logic Domain	Logic Infrastructure
-	DomainModel	(Entity)
-	Repository
-	DomainService
-	RestAPI	Client
-	GraphQL	Client
-	UserDefault	/	Realm
-	View	(ViewController)
-	Presenter
-	Contract
RxSwiftでのOperatorを利用する	(Single	/	Maybe	/	Completable)
FirebaseRemoteConfigClient
// sourcery: AutoMockable


protocol FirebaseRemoteConfigClient {


func getFeaturedRecipes() -> Single<[FeaturedRecipeEntityJson]>


func getFeaturedRecipeEnabled() -> Single<Bool>


func getTrendKeywords() -> Single<[TrendKeywordEntityJson]>


func getTrendKeywordEnabled() -> Single<Bool>


… (get display data and feature flags) …


}
UseCase
// sourcery: AutoMockable


protocol CheckTrendKeywordEnabledUseCase {


func execute() -> Single<Bool>


}
// sourcery: AutoMockable


protocol GetTrendKeywordUseCase {


func execute() -> Single<[TrendKeyword]>


}
例1.	A/Bテスト	(Optional)
例2.	表示データ取得処理
-	return	Single<Bool>
-	Fetch	from	Remote	Config
-	Convert	to	DomainModel
-	UseCase
並列
Quick	+	Nimble	+	SwiftyMockyを組み合わせた形(1)
RxBlockingを利用しつつもUnitTestの骨格部分はQuick	+	Nimbleの組み合わせ
テストケースの基本形 全体処理を考える
describe("#execute") {


context(“A/Bの対象&トレンドキーワードの一覧が取得処理が成功した場合”) {


let checkTrendKeywordEnabled = true


let trendkeywords = … (Stubに相当するテストデータの作成) …


beforeEach {


checkTrendKeywordEnabledUseCase.given(


.execute(willReturn: Single.just(checkTrendKeywordEnabled))


)


getTrendKeywordUseCase.given(


.execute(willReturn: Single.just(trendkeywords))


)


}


it(“トレンドキーワードのデータ一覧が取得できること”) {


expect(try! target.fetch().toBlocking().first())


.to(equal(trendkeywords))


}


}


}
①	Quick	&	Nimbleの記載方法
②	Stubを定義してMockに適用する
- ①	Business	Logic	→	return	Single<P>

- ②	Another	Business	Logic	→	return	Single<Q>

- ③	Common	Business	Logic	→	return	Single<R>

Expected	Result	→	return	S
とある処理でこの3つの処理が必要になる場合:
(Point)	実際のコードで結果を得るための処理は?
③	期待するケースをRxBlockingを利用して記載
①	Single<P>

②	Single<Q>

③	Single<R>
①	Single<P>

→	②	Single<Q>

			→	③	Single<R>
直列
※	処理の順番が実は大きな影響を及ぼす場合もあったりする
Quick	+	Nimble	+	SwiftyMockyを組み合わせた形(2)
SwiftyMockyを利用して該当する責務部分をUnitTestで利用するためにMock化
SwiftyMockyの導入と紹介 // Install SwiftyMocky CLI


$ brew install mint


$ mint install MakeAWishFoundation/SwiftyMocky
👉 	Swift	Package	Manager
👉 	Test	Target
// MEMO: Mock preparation required for testing


let checkTrendKeywordEnabledUseCase = CheckTrendKeywordEnabledUseCaseMock()


let getTrendKeywordUseCase = GetTrendKeywordUseCaseMock()


// MEMO: Apply Mock to the class under test


let target = TrendKeywordPresenterImpl(


checkTrendKeywordEnabledUseCase: checkTrendKeywordEnabledUseCase,


getTrendKeywordUseCase: getTrendKeywordUseCase


)
// sourcery: AutoMockable


protocol CheckTrendKeywordEnabledUseCase {


func execute() -> Single<Bool>


}
// sourcery: AutoMockable


protocol GetTrendKeywordUseCase {


func execute() -> Single<[TrendKeyword]>


}
// Generate Mock


$ swiftymocky generate
UnitTestを実施する準備
SwiftyMocky:	

https://github.com/MakeAWishFoundation/SwiftyMocky
Mockを適用して想定する値を返す形を作っていく
仕様で本当に抜け漏れがないか(MECEか?)を確認する
できれば細かな画面の振る舞いに関する部分まで想定すると良いかもしれない
A/Bテスト対象時のみ表示
History:
keyword
←
salad
chicken
sushi
×
×
×
Trend: A/Bテスト対象か否かで変化
- A/Bテストが対象ならばこのセクションを表示する

- A/Bテストが対象でないならばセクション自体を表示しない
(Point)	ここから更に深ぼって読み取ると更に細かな仕様はどうなるか
- A/Bテストの対象ではあるが、もしこの場合にトレンドキーワードが1つもない場合はどうする?

- A/Bテスト処理	or	トレンドキーワード取得処理のいずれか1つがエラーだった場合はどうする?

- エラーになってしまった際の対象部分以外の画面表示についてはどうする?
🤔
本当にこれで大丈夫か?
足りない要件はないか?
検索画面の中にトレンドキーワードを表示したい:
先ほどの処理の一例(どこまでをエラーとするか?)
ここではA/Bテストの対象かが不明だった場合には後続の処理は続ける方針
Presentation部分の処理例
checkTrendKeywordEnabledUseCase.execute()


.observe(on: mainScheduler)


.subscribe(


onSuccess: { [weak self] checkTrendKeywordEnabled in


guard let weakSelf = self else {


return


}


weakSelf.fetchTrendKeywords(


checkTrendKeywordEnabled: checkTrendKeywordEnabled


)


},


onFailure: { [weak self] _ in


weakSelf.fetchTrendKeywords(


checkTrendKeywordEnabled: false


)


}


)


.disposed(by: disposeBag)
private func fetchTrendKeywords(checkTrendKeywordEnabled: Bool) {


getTrendKeywordUseCase.execute()


.observe(on: mainScheduler)


.subscribe(


onSuccess: { [weak self] trendKeywords in


guard let weakSelf = self else {


return


}


let souldHide = trendKeywords.isEmpty || !checkTrendKeywordEnabled


weakSelf.view?.setup(trendKeywords: souldHide ? trendKeywords : [])


},


onFailure: { [weak self] _ in


guard let weakSelf = self else {


return


}


weakSelf.view?.showError(error: error, closeHandler: {})


}


)


.disposed(by: disposeBag)


}
①	まずはA/Bの対象かを確認
②	トレンドキーワードを表示する
③	キーワード一覧を失敗した場合のみ
言葉だとシンプルだが実際に正しいかすぐに解らない
1つ1つの条件自体はシンプルであったとしても組み合わせると複雑になる場合
Carouselバナー表示部分
Shop	List:
お店を探す
Special	Contents: 表示データの並び順の条件
- 表示データにはID(Unique)	/	優先度	/	日付の項目がある

- 条件は、優先度の値が小さい	>	日付が若い	>	IDが若い順
(Point)	処理よりも実現するためのテストケースの作り方が重要そうだ
- 条件となるものが複数存在する、かつ複合な条件である。

- IDはユニークな値でも日付や優先度については運用の都合で等しい値の可能性がありえる。

- 登録されているデータについてもバックエンド側で順番を担保してくれないとしたら?
🤔
目視では見誤りそうだ。
UnitTestで担保したいな。
Carouselバナー5件表示部分の並ぶ順を決める:
先ほどの処理の一例(シンプルに書けたけど…)
処理自体は数行でさっと収まるような分量ではあるがわかりにくさもある
該当UseCase部分の処理例
private func getSpecialContentBanners() -> Single<[SpecialContentBanner]> {


return specialContentsBannerRepository.findAll()


.flatMap { specialContentsBanners in


let targetSpecialContentsBanners = specialContentsBanners


.sorted {


($0.priority, $0.date, $0.id.value) < ($1.priority, $1.date, $1.id.value)


}


.prefix(5)


return Single.just(targetSpecialContentsBanners)


}


}
データを全件を取得後にSortを実施

「優先度の値が小さい	>	日付が若い	>	IDが若い」順
- 例1.	日付が全て等しい	&	優先度が全て等しい	→	IDの順番でデータが取得できていること

- 例2.	日付が全て等しい	&	スペシャルコンテンツバナー優先度がIDの並び順と異なる	→	優先度とIDを加味した順番となること

- 例3.	日付が異なる	&	スペシャルコンテンツバナー優先度もIDの並び順と異なる	→	日付・優先度・IDを加味した順番となること
cf.	tuple利用した複数の設定をしています。
ぱっと見だと結構わかりにくいので具体的なテストケースを準備する例:
データの表示順番や並べ替え処理が重要になる場合
題意を満たすことができる様なテストデータを作成してUnitTestで担保する
検証用スタブデータ例 実際のテストケース事例
let banner1 = SpecialContentsBannerTestData(


id: 1, priority: 3, date: nowDate


)


let banner2 = SpecialContentsBannerTestData(


id: 2, priority: 1, date: twoDayLaterDate


)


let banner3 = SpecialContentsBannerTestData(


id: 3, priority: 1, date: threeDayLaterDate


)


let banner4 = SpecialContentsBannerTestData(


id: 4, priority: 1, date: twoDayLaterDate


)


let banner5 = SpecialContentsBannerTestData(


id: 5, priority: 2, date: twoDayLaterDate


)


let banner6 = SpecialContentsBannerTestData(


id: 6, priority: 2, date: twoDayLaterDate


)
context("順番が正しくソートできているかのテスト") {


beforeEach {


specialContentsBannerRepository.given(


.findAll(


willReturn: Single.just([banner1, banner2, … banner6])


)


)


}


it("IDが2,4,3,5,6の順番にbannerが5件取得できること") {


let actual = sut.execute()


let expected = [banner2, banner4, banner3, banner5, banner6]


expect(try! actual.toBlocking().first()).to(equal(expected))


}


}


日付を微妙に

ずらしたデータ
②	期待する順番と一致するかを判定
①	Mockでは全データを返す想定
実は細かな点に気を配ってみると疑問が生まれる処理
厳密に考えるとデータがないケースについても考えておきたいと思う場合
おすすめ	or	関連を表示する
Related	or	Recommend:
○○○のお店
レスポンス取得タイミングの状態を考慮する
- 関連のお店が取得できた時はそのまま表示する

- 関連のお店が取得失敗時にはおすすめを取得を試みる
(Point)	画面になにも表示しない場合を考えてみると良いかもしれない
- 関連のお店が取得できたがお店データが0件となってしまった場合はどう扱う?

- 関連のお店が失敗し、おすすめが取得できたがお店データが0件の場合はどう扱う?

- 画面としてエラー表示をさせる場合は共に失敗した時だけで良いのか?
🤔
そのままSingle.zipは🙅
ならばどんな形にしようか
詳細画面内においておすすめ	or	関連を表示:
先ほどの処理の一例(どの場合を全体エラーとする?)
処理全体としてのエラーとみなすタイミングをどこに置くかに注目する
該当UseCase部分の処理例
private func getRelatedOrRecommendedCourses(shopId: ShopId) -> Single<RelatedOrRecommendedShopsDto>
{


return shopRepository.findAllRelatedById(shopId)


.flatMap { [weak self] relatedShops in


guard let weakSelf = self else {


return Single.error(CommonError.notExistSelf)


}


return weakSelf.getDtoByRelatedShops(relatedshops: relatedShops)


}


.catch { [weak self] _ in


guard let weakSelf = self else {


return Single.error(CommonError.notExistSelf)


}


return weakSelf.getDtoByRecommendedShops()


}


}
①	0件/Error発生時は.catch内の処理
後続処理を続けるための工夫:
// MEMO: findAllRelatedByIdでの結果が空の場合はエラー


if relatedShops.isEmpty {


return Single.error(GlobisError.notExistObject)


}
👉 	成功時は必要なObject(Dto)を返却する
②	0件/Error発生時は全体のエラー
👉 	成功時は必要なObject(Dto)を返却する
RxSwiftの.catchを利用することで最初の処理がエラーとなっても次の処理を実行させる
責務全体と単一処理のエラーハンドリングを加味する
全体のエラーとみなす場合とそうでない場合のUnitTestで仕様を担保する
実際のテストケース事例 その他のテストケース洗い出し例
context("ショップに紐づく関連ショップ・おすすめショップの両方が存在する場合") {


beforeEach {


shopRepository.given(


.findAllRelatedById(.value(shopId), willReturn: Single.just(relatedShops))


)


shopRepository.given(


.findRecommended(willReturn: Single.just(recommendShops))


)


}


it("関連ショップが格納されたRelatedOrRecommendedShopsDtoが返る") {


let single = target.execute(shopId: shopId)


let expected = RelatedOrRecommendedShopsDto(


relatedShops: expectedRelatedShops, recommendedShops: []


)


let actual = try! single.toBlocking().first()


expect(actual).to(equal(expected))


}


}
②	関連ショップが優先される
①	関連&おすすめがともに正常
関連1件以上	&&	おすすめ0件:
- ⭕ 	関連ショップ一覧表示
関連0件	&&	おすすめ1件以上:
- ⭕ 	おすすめショップ一覧表示
関連0件	&&	おすすめ0件:
- ⭕ 	全体エラー表示
関連1件以上	&&	おすすめError:
関連0件	&&	おすすめError:
関連Error	&&	おすすめ1件以上:
関連Error	&&	おすすめ0件:
実際の開発の中でテストがあったので助かったお話
画面を構成する要素が多い	or	データ取得処理が複雑な場合等に生きてくる
過去にUnitTestを利用したことで助けられた事例
最初は自分も見様見真似から、出来る所から初めて、危ない所を徐々に厚く
📊 	Qiita	(Article): 📊 	Library	(Github):
個人開発及び実務でユニットテストに助けられたと

個人的に感じた例の紹介:

https://qiita.com/fumiyasac@github/items/19c525116f1b585bb43f
handMadeCalendarAdvance

2000年以降の日本の祝祭日を判定するライブラリ:	

https://github.com/fumiyasac/handMadeCalendarAdvance
まとめ
少しずつUnitTestを手厚くして複雑になっても仕様を読みとれる様にする
1.	仕様を良い意味で疑いながら必要な観点を洗い出す:
実装を進めている最中はもちろん、実際のデータに近い形でのテストデータとも併せて常に仕様と照らし合わせていく様な方針
で進めていく様にする癖や習慣を少しずつ付けていくと「良い意味で」疑うことができる様になると思います。
2.	UnitTestがあると以前の仕様の確認もできる:
機能を追加するケース等では、実際にUnitTestがあるのとないのでは、仕様の把握やキャッチアップの速度が全く異なる。そし
て機能を追加する際や類似した処理を考えていく際にも大いに参考になる場合は多かった気がします。
本当にすごく小さくて細かな部分ではあるかもしれないが、これが積もっていくと大きな礎になると思います。
3.	言葉だけでは紛らわしい部分にはテストを手厚く書く様にする:
言葉ではシンプルに表現できるような場合であったとしても、実際にロジックに落とし込んでみると想像以上に難易度が高い場
合や読み違えやすい場合もあるので、僕自身は自分が読み違えてしまったところは手厚くする様に心がけています。
Thank	you	for	listening	!

Contenu connexe

Tendances

ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
Yoshiki Shibukawa
 
【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWay【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWay
Takayuki Shimizukawa
 

Tendances (20)

Azure Api Management 俺的マニュアル 2020年3月版
Azure Api Management 俺的マニュアル 2020年3月版Azure Api Management 俺的マニュアル 2020年3月版
Azure Api Management 俺的マニュアル 2020年3月版
 
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
MVC の Model を考える
MVC の Model を考えるMVC の Model を考える
MVC の Model を考える
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
オープンソースで提供される第二のJVM:OpenJ9 VMとIBM Javaについて
オープンソースで提供される第二のJVM:OpenJ9 VMとIBM Javaについてオープンソースで提供される第二のJVM:OpenJ9 VMとIBM Javaについて
オープンソースで提供される第二のJVM:OpenJ9 VMとIBM Javaについて
 
Open Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere LibertyOpen Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere Liberty
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
 
MQ入門
MQ入門MQ入門
MQ入門
 
【BS14】Blazor WebAssemblyとJavaScriptのインターオペラビリティ
【BS14】Blazor WebAssemblyとJavaScriptのインターオペラビリティ 【BS14】Blazor WebAssemblyとJavaScriptのインターオペラビリティ
【BS14】Blazor WebAssemblyとJavaScriptのインターオペラビリティ
 
【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWay【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWay
 
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredis
 
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
 
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 

Similaire à 少しずつ手厚くして不具合や仕様漏れを防ぐために

Webアプリ開発のトレンドとUIライブラリ開発事情(仙台Geek★Night #1)
Webアプリ開発のトレンドとUIライブラリ開発事情(仙台Geek★Night #1)Webアプリ開発のトレンドとUIライブラリ開発事情(仙台Geek★Night #1)
Webアプリ開発のトレンドとUIライブラリ開発事情(仙台Geek★Night #1)
masakazusegawa
 
Blendの便利機能振り返り
Blendの便利機能振り返りBlendの便利機能振り返り
Blendの便利機能振り返り
一希 大田
 
ABC2012Spring 20120324
ABC2012Spring 20120324ABC2012Spring 20120324
ABC2012Spring 20120324
Tak Inamori
 
smartphone test (know how & tools)
smartphone test (know how & tools)smartphone test (know how & tools)
smartphone test (know how & tools)
Yukio Andoh
 

Similaire à 少しずつ手厚くして不具合や仕様漏れを防ぐために (20)

RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
 
全日本<label>要素マークアップ検定
全日本<label>要素マークアップ検定全日本<label>要素マークアップ検定
全日本<label>要素マークアップ検定
 
Webアプリ開発のトレンドとUIライブラリ開発事情(仙台Geek★Night #1)
Webアプリ開発のトレンドとUIライブラリ開発事情(仙台Geek★Night #1)Webアプリ開発のトレンドとUIライブラリ開発事情(仙台Geek★Night #1)
Webアプリ開発のトレンドとUIライブラリ開発事情(仙台Geek★Night #1)
 
Blendの便利機能振り返り
Blendの便利機能振り返りBlendの便利機能振り返り
Blendの便利機能振り返り
 
プロダクトにおけるScala
プロダクトにおけるScalaプロダクトにおけるScala
プロダクトにおけるScala
 
ABC2012Spring 20120324
ABC2012Spring 20120324ABC2012Spring 20120324
ABC2012Spring 20120324
 
20140523 jQuery基礎 (HTML5ビギナーズ)
20140523 jQuery基礎 (HTML5ビギナーズ)20140523 jQuery基礎 (HTML5ビギナーズ)
20140523 jQuery基礎 (HTML5ビギナーズ)
 
テスト駆動開発の進化
テスト駆動開発の進化テスト駆動開発の進化
テスト駆動開発の進化
 
プロ文.com 勉強会 Phase 1
プロ文.com 勉強会 Phase 1プロ文.com 勉強会 Phase 1
プロ文.com 勉強会 Phase 1
 
ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~
 
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
 
エネチェンジでのSTIの使い方紹介
エネチェンジでのSTIの使い方紹介エネチェンジでのSTIの使い方紹介
エネチェンジでのSTIの使い方紹介
 
smartphone test (know how & tools)
smartphone test (know how & tools)smartphone test (know how & tools)
smartphone test (know how & tools)
 
Visual studio online and Agile
Visual studio online and AgileVisual studio online and Agile
Visual studio online and Agile
 
IaC化の3つのポイント
IaC化の3つのポイントIaC化の3つのポイント
IaC化の3つのポイント
 
運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み
運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み
運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み
 
福岡XFD導入記
福岡XFD導入記福岡XFD導入記
福岡XFD導入記
 
Code igniterを初めて使うときにはまった4つのポイント
Code igniterを初めて使うときにはまった4つのポイントCode igniterを初めて使うときにはまった4つのポイント
Code igniterを初めて使うときにはまった4つのポイント
 
Visual Studio App Centerの始め方
Visual Studio App Centerの始め方Visual Studio App Centerの始め方
Visual Studio App Centerの始め方
 
リーン開発の本質 公開用
リーン開発の本質 公開用リーン開発の本質 公開用
リーン開発の本質 公開用
 

Plus de Fumiya Sakai

Plus de Fumiya Sakai (20)

iOS側のUIの特徴と見比べるAndroid側でのUI実装のヒント
iOS側のUIの特徴と見比べるAndroid側でのUI実装のヒントiOS側のUIの特徴と見比べるAndroid側でのUI実装のヒント
iOS側のUIの特徴と見比べるAndroid側でのUI実装のヒント
 
Measures for Growth with Firebase Remote Config & Unit Testing Using RxSwift
Measures for Growth with Firebase Remote Config & Unit Testing Using RxSwiftMeasures for Growth with Firebase Remote Config & Unit Testing Using RxSwift
Measures for Growth with Firebase Remote Config & Unit Testing Using RxSwift
 
2022年の抱負とここ数年続けてきたインプット
2022年の抱負とここ数年続けてきたインプット2022年の抱負とここ数年続けてきたインプット
2022年の抱負とここ数年続けてきたインプット
 
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
 
最近の業務やAndroid関連のインプットと振り返り
最近の業務やAndroid関連のインプットと振り返り最近の業務やAndroid関連のインプットと振り返り
最近の業務やAndroid関連のインプットと振り返り
 
少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り
少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り
少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り
 
少しずつキャッチアップしていくAndroidアプリ開発
少しずつキャッチアップしていくAndroidアプリ開発少しずつキャッチアップしていくAndroidアプリ開発
少しずつキャッチアップしていくAndroidアプリ開発
 
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察するUIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
 
レイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞく
レイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞくレイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞく
レイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞく
 
iOSアプリ開発で意識すると役立ちそうな「つなぎ目」の部分について
iOSアプリ開発で意識すると役立ちそうな「つなぎ目」の部分についてiOSアプリ開発で意識すると役立ちそうな「つなぎ目」の部分について
iOSアプリ開発で意識すると役立ちそうな「つなぎ目」の部分について
 
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
 
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
 
何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考える
何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考える何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考える
何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考える
 
アプリ開発におけるテキスト装飾のアイデア集
アプリ開発におけるテキスト装飾のアイデア集アプリ開発におけるテキスト装飾のアイデア集
アプリ開発におけるテキスト装飾のアイデア集
 
ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介
ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介
ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介
 
部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装
部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装
部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装
 
UI表現ライブラリを有効活用して iOSアプリのUIをオシャレにするワザ紹介
UI表現ライブラリを有効活用して iOSアプリのUIをオシャレにするワザ紹介UI表現ライブラリを有効活用して iOSアプリのUIをオシャレにするワザ紹介
UI表現ライブラリを有効活用して iOSアプリのUIをオシャレにするワザ紹介
 
iOSアプリで気になった動きや表現を上手にアレンジして活用してみる
iOSアプリで気になった動きや表現を上手にアレンジして活用してみるiOSアプリで気になった動きや表現を上手にアレンジして活用してみる
iOSアプリで気になった動きや表現を上手にアレンジして活用してみる
 
iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方
iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方
iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方
 
Approach of Prototyping for making Application User Interface about iOS
Approach of Prototyping for making Application User Interface about iOSApproach of Prototyping for making Application User Interface about iOS
Approach of Prototyping for making Application User Interface about iOS
 

Dernier

研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
atsushi061452
 

Dernier (14)

情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイント
 
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイルLoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
 
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdfネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
 
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアルLoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
 
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
 
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
 
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
 
Keywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltdKeywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltd
 

少しずつ手厚くして不具合や仕様漏れを防ぐために