SlideShare a Scribd company logo
1 of 28
Download to read offline
既存プロジェクトで使っていたDIを

お引っ越し&DIYすることになった
potatotips	#76	@	オンライン
2021/11/17
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集 ライブラリ表現の活用集
書籍に掲載したサンプルのバージョンアップや続編等に現在着手中です。
過去に技術書典8で電子版だけ頒布した書籍紹介
Vol.1及びVol.2に頒布したものの中で書籍に載せきれなかったものを紹介
第1章:	メディアアプリ型のUI	
第2章:	構造が複雑な写真表示UI
記事一覧を無限スクロールする様な形のアプリ
UIを一覧/詳細表示を簡素化した実装を紹介。
現在はBoothにて販売中です! https://booth.pm/ja/items/1835468
¥1,000	-	
iOSアプリ開発「UI実装であると嬉しいレシピブック	まかない編」
サンプルコード:	https://github.com/fumiyasac/meals_ios_ui_recipe_showcase
第3章:	Combine	+	UICollectionViewCompositionalLayout
タイル状のフォトギャラリーや一覧表示型のア
プリUIでライブラリを活用した実装を紹介。
実務でも利用&考察したもの
特に第1章と第2章の内容に関し
ては、実際に相談されたり、実
装アイデアとして活用する機会
があったものになります。
	全てUIKitを利用
新たに技術書典9で電子版だけ頒布した書籍紹介
表現や動きが特徴的でユーザーにもほんの少し遊び心を与える様なUI実装を紹介
現在はBoothにて販売中です! https://booth.pm/ja/items/2360379
¥1,000	-	
iOSアプリ開発「UI実装であると嬉しいレシピブック	おもしろ編」
サンプルコード:	https://github.com/fumiyasac/meals_2nd_ios_ui_recipe_showcase
実務導入前の検証段階
若干一癖がありそう、ぱっと見
だと実装の方針が立ちにくい感
じに見受けられそうなUI実装や
構造に関して考察しました。
	UIKit	&	SwiftUIを利用
第1章:	面白い表現のフォトギャラリーUI	
第2章:	画面ロック機能を利用したUI
UICollectionViewを活用したユニークなレイア
ウト表現と画面遷移カスタマイズ実装を紹介。
第3章:	SwiftUI	+	OSS	Libraryの活用
SceneDelegateの機能や端末認証を利用した画
面ロック機能を盛り込んだ実装を紹介。
インプレスR&D様より発刊されました✨
UI実装であると嬉しいレシピブックの最新情報
UI実装であると嬉しいレシピブックVol.3として今年10月に商業化しました!
少し複雑で特徴的なUI実装のTIPS集
今後ともUI実装に関する新たな探究や最新のトピック等
にも積極的にキャッチアップしていく所存でおります。
現在は、

・Amazon	Kindleストア

・達人出版会

・紀伊国屋書店

・Apple	Books

・Google	Play

等で電子版を購入できます!
※	物理本も一部ストアで購
入する事ができます。
今回の発表でお話すること
業務の中でDependency	Injectionをする部分を自作する機会があった
本発表ではUI実装とは少し違ったトピックですが実務の中で活用できたものになります。
1.	DI部分を自前で作る決断と前提となる構成の紹介:
現在のチーム内で色々と検証や議論を重ねた結果自前でこの部分を準備する運びとなった。また、以前に自分でも簡単なサンプ
ルを試したこともあるが、施策が進む中で既存のコードとの上手な共存をしながら進めていく事が求められた。
2.	良いとこどりができるか?のヒントを探る:
現在のチーム内ではアプリエンジニアがiOS/Androidを両方実装する機会もあるので、できれば定番ライブラリや知名度のあるラ
イブラリの利用経験した事がある方であればキャッチアップしやすい形でシンプルにしたいという要望はありそうだった。
3.	実際に運用しているコードから見るポイントや所感など:
自作すると言えどもライブラリの中で利用されている実装方針や考え方には素晴らしいものが沢山あるのは事実なので、既存の
実装方針を崩すことなく進める方針や取り組みの中で思った事をお伝えできればと思います。
(1)	DI部分を自前で作る決断と前提となる構成の紹介
以前に個人的に取り組んだ事例に関する紹介
Property	Wrapperを利用したDependency	Injectionをするアイデアを思いつく
1年前に書いた記事:	https://bit.ly/3nkwW8b
記事の内容を取り入れたサンプル実装:	https://github.com/fumiyasac/VisualEffectTraceExample
外部APIリクエストを利用して表示データ情報を取得する場合
Infra	/	Repository	/	UseCase	/	ViewModelに分離して考えていく
APIRequestManager
▲▲▲▲UseCase
▲▲▲▲ViewModel
▲▲▲▲Repository
ということは、このクラスのインスタンスがないと
左に記載したクラスの処理は利用できない
左に記載したクラスが依存しているクラス
▲▲▲▲ViewController
▲▲▲▲UseCase
▲▲▲▲ViewModel
▲▲▲▲Repository
①	Domain層
②	UseCase層
④	UI層
③	ViewModel層
APIリクエスト&データ取得
ロジックとViewModel仲介
画面取得データの作成
画面表示に関する処理
実際のクラス
各クラスを初期化する際には依存するクラスのインス
タンスを引き渡す形にしなければいけない
補足事項
この処理では各クラスのinitialize
時に依存するクラスのインスタンス
を渡すコンストラクタ・インジェク
ションを想定
この例ではまだ1つのクラスへの依
存しかない形ではあるが、実際は
多くのクラスへ依存する形になる
場合もあります。
Dependency	Injectionを実行する処理の方針
Swift5.1〜利用可能なPropertyWrappersを利用する形で考えてみる
Dependency	Injection	実行側
名前をキーにして呼び出す
名前が一致しないとクラッシュする
container.register(

				RealmAccessManager.shared,

				for:	Dependencies.Name(rawValue:	Dependencies.Name(rawValue:	"RealmAccessProtocol"))

)
let	container	=	Dependencies.Container.default
@Dependencies.Inject(Dependencies.Name(rawValue:	"APIRequestProtocol"))	

				private	var	apiRequestManager:	APIRequestProtocol
@Dependencies.Inject(Dependencies.Name(rawValue:	“RealmAccessProtocol”))

				private	var	realmAccessManager:	RealmAccessProtocol
Dependency	Injection	定義側
container.register(

				APIRequestManager.shared,

				for:	Dependencies.Name(rawValue:	Dependencies.Name(rawValue:	"APIRequestProtocol"))

)
Containerにインスタンスを登録
名前と一緒にContainerへ登録
レイヤー化して責務を分けた部分の実装例
Domain層やUseCase層での実装例(API	Request	with	RxSwiftの場合)
import	RxSwift

//	MARK:	-	Protocol

protocol	ItemUseCase	{

			func	execute(page:	Int)	->	Single<ItemAPIResponse>

}

final	class	RequestItemDataUseCase:	ItemUseCase	{

				//	MARK:	-	Properties

				@Dependencies.Inject(Dependencies.Name(rawValue:	"ItemRepository"))	private	var	itemRepository:	ItemRepository

				//	MARK:	-	EventIntroductionUseCase

				func	execute(page:	Int)	->	Single<ItemAPIResponse>	{

								itemRepository.requestItemDataList(page:	page)

				}

}
コードの抜粋 API経由でItem一覧を取得するUseCase層
Property	Wrapperを利用したインスタンス化
Protocol定義
※	UnitTestなどの際にMock化したものを適用する想定
Single	/	Maybe	/Completableを利用して処理を結合
※	APIリクエスト処理を連携する形にする
参考:	https://qiita.com/monoqlo/items/7bcec98432389b3b8909
実際の開発で適用できるかを吟味していく
MVP(Model-View-Presenter)	+	Layered	Architecture(with	DDD)
今回想定しているApp内部のアーキテクチャ概要	(UIKit	&	RxSwiftを利用する想定)
UI UseCase Domain InfraStructure
View	(ViewController)
Presenter
Contract
View-Model-Presenter

※	ViewObject
プレゼンテーション ビジネスロジック ドメインロジック
DomainModel	(Entity)
Repository
DomainService
Api	/	GraphQL	Client
LocalStore
外部技術
ロジック部分はiOS/Android間で実装や機能設計で比較できる様に設計思想を統一している
※	基本的には疎結合な構造&責務の明確化はしている(UnitTestは導入している)形となっています。
RestfulAPI	/	GraphQL

UserDefault	/	Realm
※	UnitTestはPresenter/UseCase/Damain/InfrastructureはQuick・Nimbleを利用	&	MockはSwiftyMockyでの自動生成の方針です。
実際のプロジェクトでも軽く検証をしてみたその後
この方法とは別の方法を改めて探してみることを決断することにしました
それなりの規模感があるのでここは「心臓部分」。なので流れを止めず短期決着でカタをつけたいと思った。
1.	必要最低限の変更で済むか?という観点:
この方法だと名前をキーにして呼び出す管理方法ではあったので、よくよく考えてみると冗長&変更ファイル数が結構出てしま
う点や既存のUnitTestに沿うかという点では、自分でも検証を進めていく中で懸念を感じた。
2.	メンバーの中で馴染みがある書き方か?という観点:
iOSではSwinject/DIKit,	AndroidではDagger2/DaggerHiltといった定番ライブラリや知名度のあるライブラリの利用経験があり
その書き方や考え方からは少し外れてしまいそうな気がした。
新機能開発や改善対応もあったのでその部分と両立したかった。
自分たちで仕様を把握しておきたい思いもあった。
ライブラリに依存しない形ではあるけれども

できるだけ似た感覚で書ける形を模索することに
(2)	良いとこどりができるか?のヒントを探る
DIに関する解説資料からも理解を深める
自分もこの様なタスクは初めて&影響範囲が全体なので準備を念入りにする
ライブラリを利用した際の知見や他社様の開発事例に触れることでイメージがしやすくなった。
仕組みを改めて復習&参考事例に触れるのも大切:
資料:	https://bit.ly/2YShmHx 資料:	https://bit.ly/3oxNsRT
馴染みのあるライブラリの実装からヒントを得る
iOS/Android両方のライブラリの仕様・実装例・ドキュメントを参考にする
DI部分をライブラリに頼らない決断をしたとはいえ良さそうな部分はできるだけ取り入れたい。
1.	iOSでのDIライブラリ例:
Swinject:

https://github.com/Swinject/Swinject
2.	AndroidでのDIライブラリ例:
Dagger2	&	Dagger	Hilt:

https://developer.android.com/training/dependency-injection/dagger-basics?hl=ja

https://developer.android.com/training/dependency-injection/hilt-android?hl=ja
実務で経験があったのはSwinject・Dagger2、個人的に軽く試してみたのはDITranquillity・Dagger	Hit
DITranquillity:

https://github.com/ivlevAstef/DITranquillity
needle:

https://github.com/uber/needle
なぜ両OSを試してみたか?
自分自身もiOS開発と並行して
Android開発をしていたため。
DIコンテナを自前で作成する上で今回元にした資料
自前でDIコンテナを作成する事例や紹介記事から良さそうに感じたもの
How	to:	create	your	SUPER	simple	dependency	injector	container	in	Swift	(自前でのシンプルなDIコンテナの作成)
https://www.fabrizioduroni.it/2020/04/19/dependecy-injection-swift/
1.	実態は大きなシングルトンの中にインスタンスを格納する仕様:
このプロジェクトで一番大事な部分については、

(1)	コンストラクタインジェクションができること

(2)	Local	/	Remoteで同じProtocolを使う際も管理できること

の2点だったのでこの方針でもひとまず大きな問題はなさそうだった。
2.	依存関係の書き方が意外と直感的で馴染むと感じた:
DIライブラリ「Swinject	/	DITranquillity」にもイメージが似ていたの
で、DIライブラリに触れた経験があれば慣れるのではないかと思えた。
個人的に「良さそう」と思えた部分は下記の2点になります
DIコンテナの元となる部分のコード例
Protocol・実装クラスを1セットで登録し必要があれば名前で分類する形
final	class	DependeciesContainer	{

				//	MARK:	-	DIコンテナ自体はSingletonとして保持する

				static	let	shared	=	DependeciesContainer()

				private	init()	{}

				private	var	dependecies:	[DependencyKey:	Any]	=	[:]

				//	MARK:	-	Function

				func	register<T>(_	type:	T.Type,	impl:	Any,	name:	String?	=	nil)	{

								let	dependencyKey	=	DependencyKey(type:	type,	name:	name)

								dependecies[dependencyKey]	=	impl

				}

				func	resolve<T>(_	type:	T.Type,	name:	String?	=	nil)	->	T	{

								let	dependencyKey	=	DependencyKey(type:	type,	name:	name)

								if	let	dep	=	dependecies[dependencyKey]	as?	T	{

												return	dep

								}	else	{

												let	protocolTypeName	=	NSString(string:	"(type)").components(separatedBy:	".").last!

												fatalError("(protocolTypeName)の依存性を解決できませんでした:(protocolTypeName).")

								}

				}

}
final	class	DependencyKey:	Hashable,	Equatable	{

				//	MARK:	-	Properties

				private	let	type:	Any.Type

				private	let	name:	String?

				//	MARK:	-	Initializer

				init(type:	Any.Type,	name:	String?	=	nil)	{

								self.type	=	type

								self.name	=	name

				}

				//	MARK:	-	Hashable,	Equatable

				func	hash(into	hasher:	inout	Hasher)	{

								hasher.combine(ObjectIdentifier(type))

								hasher.combine(name)

				}

				static	func	==	(lhs:	DependencyKey,	rhs:	DependencyKey)

	->	Bool	{

								return	lhs.type	==	rhs.type	&&	lhs.name	==	rhs.name

				}

}
型と名前で分類
v
追加し忘れがあった場合にはfatalErrorでわかるようにする
//	MEMO:	Infra/Repository/UseCaseについてはDIコンテナに登録する

final	class	DependenciesDefinition	{

				//	MARK:	-	Function

				func	inject()	{

								//	MEMO:	インスタンスを保持するための場所

								let	dependecies	=	DependeciesContainer.shared

								//	※途中省略

								//	MARK:	-	Infra

								dependecies.register(

												MovieQualityLocalStore.self,

												impl:	MovieQualityLocalStoreImpl()

								)
DIコンテナの元となる部分のコード例
各種Layerにおける依存関係の解決を図る部分の書き方はこの様な形
								//	MARK:	-	Repository

								dependecies.register(

												FeaturedMovieRepository.self,

												impl:	FeaturedMovieRepositoryImpl(

																apiClient:	dependecies.resolve(ApiClient.self),

																backgroundScheduler:	dependecies.resolve(ImmediateSchedulerType.self,	name:	background)

												)

								)

								//	MARK:	-	UseCase

								dependecies.register(

												GetMainUseCase.self,

												impl:	GetMainUseCaseImpl(

																mainBannerRepository:	dependecies.resolve(MainBannerRepository.self),

																mainNewsRepository:	dependecies.resolve(MainNewsRepository.self),

																featuredMovieRepository:	dependecies.resolve(FeaturedMovieRepository.self),

																mainMovieRepository:	dependecies.resolve(MainMovieRepository.self)

												)

								)

				}

}
Domain	Logic
LocalDB	/	API
Business	Logic
//	MEMO:	DIコンテナの適用

DependenciesDefinition().inject()
AppDelegate.swiftに記載
(3)	実際に運用しているコードから見るポイントや所感など
DIコンテナの中で実行する処理のコード例(1)
名前と型による管理をすることで適切な処理を選択する事例(1)
処理レイヤーによって利用するスレッドを適切に指定するために第2引数を活用:
let	background	=	"background"
dependecies.register(

				ImmediateSchedulerType.self,

				impl:	MainScheduler.instance

)

dependecies.register(

				ImmediateSchedulerType.self,

				impl:	SerialDispatchQueueScheduler(qos:	.default),

				name:	background

)
CategoryCoursesPresenterImpl(

				getCategoryCoursesUseCase:	dependecies.resolve(GetCategoryCoursesUseCase.self),

				stockCourseUseCase:	dependecies.resolve(StockCourseUseCase.self),

				unstockCourseUseCase:	dependecies.resolve(UnstockCourseUseCase.self),

				mainScheduler:	dependecies.resolve(ImmediateSchedulerType.self)

)
dependecies.register(

				CategoryRepository.self,

				impl:	CategoryRepositoryImpl(

								graphQLClient:	dependecies.resolve(GraphQLClient.self),

								readApiCacheClient:	dependecies.resolve(ReadApiCacheClient.self),

								backgroundScheduler:	dependecies.resolve(ImmediateSchedulerType.self,	name:	background)

				)

)
subscribe(on:	backgroundScheduler)
Repository API	/	GraphQLでの処理なのでサブスレッドで実行
Presenter UIへの取得データ反映処理なのでメインスレッドで実行
observe(on:	mainScheduler)
処理内ではこの様に利用する
サブスレッドで処理をする場合は下記を付与
メインスレッドで処理をする場合は下記を付与
DIコンテナの中で実行する処理のコード例(2)
名前と型による管理をすることで適切な処理を選択する事例(2)
Cacheを利用するか?サーバーとの通信を利用するか適切に指定するために第2引数を活用:
let	local	=	"local"
dependecies.register(

				CourseRepository.self,

				impl:	CourseRepositoryImpl(

								graphQLClient:	dependecies.resolve(GraphQLClient.self),

								readApiCacheClient:	dependecies.resolve(ReadApiCacheClient.self),

								courseMemoryCache:	dependecies.resolve(CourseMemoryCache.self),

								backgroundScheduler:	dependecies.resolve(ImmediateSchedulerType.self,	name:	background)

				)

)
dependecies.register(

				CourseRepository.self,

				impl:	LocalCourseRepositoryImpl(

								readApiCacheClient:	dependecies.resolve(ReadApiCacheClient.self),

								courseMemoryCache:	dependecies.resolve(CourseMemoryCache.self),

								backgroundScheduler:	dependecies.resolve(ImmediateSchedulerType.self,	name:	background)

				),

				name:	local

)
サーバーとの通信
Cacheを利用する
localGetCategoryCoursesUseCase:	

		dependecies.resolve(

				GetCategoryCoursesUseCase.self,	name:	local

		)
getCategoryCoursesUseCase:

		dependecies.resolve(

				GetCategoryCoursesUseCase.self

		)
とあるPresenterでの処理例
①	まずはCacheからのデータを反映する
②	次にサーバーからのデータを反映する
同じ名前のUseCaseでもデータ取得先が違う
Presenter部分はDIコンテナに登録しない
DIコンテナの中で実行する処理のコード例(3)
PresenterとViewController部分に関する処理
ここだけは例外的にFactoryメソッドを作って反映する形を取る:
static	func	createFindPresenter()	->	FindPresenter	{

				return	FindPresenterImpl(

								getFindUseCase:	dependecies.resolve(GetFindUseCase.self),

								localGetFindUseCase:	dependecies.resolve(GetFindUseCase.self,	name:	local),

								stockCourseUseCase:	dependecies.resolve(StockCourseUseCase.self),

								unstockCourseUseCase:	dependecies.resolve(UnstockCourseUseCase.self),

								getCommunityEventUseCase:	dependecies.resolve(GetCommunityEventUseCase.self),

								mainScheduler:	dependecies.resolve(ImmediateSchedulerType.self)

				)

}
private	var	presenter:	FindPresenter!
//	MEMO:	ViewDidLoad内部

presenter	=	PresenterFactory.createFindPresenter()
画面生成時にこのメソッドを適用する
※注意※
let	findViewController	=	UIStoryboard(name:	"Find",	bundle:	nil).instantiateInitialViewController	{	coder	in

				FindViewController(

								coder:	coder,

								presenter:	PresenterFactory.createFindPresneter()

				)

}
※	iOS13からはStoryboardのDependency	Injectionが利用できるのでこれを利用しても良さそうです。
実際にお引っ越し期間はどの様なスケジュールだった?
実は書き換える部分は既存DIコンテナとPresenterの一部だけで済みました
移行作業&切り替え作業方針とfeature開発との歩調を合わせ:
様々なライブラリの実装や参考記事等を比較しながら、ど
の方法が良いかを探りながら実装方針を決める。

また、独立した画面で旧新DIコンテナで動くことを確認。
Start
End
🏃 	DI 🏃 	Feature
1	Sprint
developブランチの変更
Feature開発ブランチがdevelop
にマージされたら取込&変更
基本的に対応中はDIコンテナの
お引っ越し&DIYに専念する
この期間はこまめにMerge&Confiict解消
2	Sprint
比較的軽めで依存関係が複雑ではないものから少しずつ移
行する。また移行作業中は2つのDIを共存させる形。
旧DI 新DI 新DI
移行完了
移行作業中は共存 力仕事にならざるを得なかった
のは反省点でした…😢
DIをお引っ越し&DIYをする際にあると嬉しいこと
上手く移行が完了しても以前と変わらず動作確認ができていないといけない
自分1人では結構不安に最初は感じていた部分はあれども、この様なチームの助けのお陰で完了できたと思います。
1.	現在の画面を書き出した画面遷移図:
チームとしてもアプリの仕様や画面遷移の全体像を把握する用途でデザイナーの方が準備して
頂いていたものがあり、画面や機能毎に適用ないしは移行をする作業時にも画面実装の抜け漏
れを防止するのに役に立ちました。
2.	QAチームによるリグレッションテスト:
UnitTestでの仕様の担保はある程度してはいるものの、開発者だけではテストがしにくい部分
(SandBoxでの課金処理など)の動作検証や、開発者の観点だけでは気がつきにくい部分を洗
い出すことができる事もあったので、本当に実施して頂き本当に感謝しております。
まとめ
車輪の再開発かもしれないが、自前で実装する方針もありかもしれない
1.	新たに取り入れる際も既存開発と並行した引っ越し時でも今のコードへの影響を少なくする工夫:
今回は既存で利用していたものを置き換える形で置き換えていく方針ではあったので、特にプロダクションコードだけではなく
テストコードに対しても最低限の調整だけで置き換える部分に注意をした様に思いました。
2.	各種定番ライブラリでの実装方針により深く触れる良い機会:
iOS/Android共にDI用の有名ライブラリがあり、それぞれ特徴的な部分があるので、平素の開発においては慣習的となっている部
分に改めて深く触れることでその特徴やメリット・デメリットを再認識する良い機会になった様に思いました。
勿論、素晴らしいライブラリが沢山ある領域なので、プロジェクトに合わせた良い選択を心がけたい部分。
3.	ライブラリの良い部分や特徴を取り入れた形を保ちつつも上手な形を見出す難しさ:
既存である程度の規模がある中ではチームの中で「しっくり来る形」を見出す準備の大切さを感じると同時に、自前でこの部分
を実装する際にはチームの状況等を鑑みて良い特徴となり得る部分を積極的に取り入れていくと良さそうに思いました。
Thank	you	for	listening	!

More Related Content

What's hot

エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~Daisuke Morishita
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門masayoshi takahashi
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxShota Shinogi
 
「Helix Core」導入事例紹介 『小~中規模事例 "Unreal Engine 4 × Helix Core ヒストリア運用レギュレーション紹介"』
「Helix Core」導入事例紹介 『小~中規模事例 "Unreal Engine 4 × Helix Core ヒストリア運用レギュレーション紹介"』「Helix Core」導入事例紹介 『小~中規模事例 "Unreal Engine 4 × Helix Core ヒストリア運用レギュレーション紹介"』
「Helix Core」導入事例紹介 『小~中規模事例 "Unreal Engine 4 × Helix Core ヒストリア運用レギュレーション紹介"』historia_Inc
 
UE4でAIとビヘイビアツリーと-基礎-
UE4でAIとビヘイビアツリーと-基礎-UE4でAIとビヘイビアツリーと-基礎-
UE4でAIとビヘイビアツリーと-基礎-com044
 
低レイヤー入門
低レイヤー入門低レイヤー入門
低レイヤー入門demuyan
 
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?naoki koyama
 
2015/11/15 Javaでwebアプリケーション入門
2015/11/15 Javaでwebアプリケーション入門2015/11/15 Javaでwebアプリケーション入門
2015/11/15 Javaでwebアプリケーション入門Asami Abe
 
Reactive Programming by UniRx for Asynchronous & Event Processing
Reactive Programming by UniRx for Asynchronous & Event ProcessingReactive Programming by UniRx for Asynchronous & Event Processing
Reactive Programming by UniRx for Asynchronous & Event ProcessingYoshifumi Kawai
 
最近のやられアプリを試してみた
最近のやられアプリを試してみた最近のやられアプリを試してみた
最近のやられアプリを試してみたzaki4649
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選Takuya Ueda
 
オープンソースで構築するWebメタバース ~Mozilla Hubsで学ぶUX開発から運用コスト最小化まで #CEDEC2022
オープンソースで構築するWebメタバース ~Mozilla Hubsで学ぶUX開発から運用コスト最小化まで #CEDEC2022オープンソースで構築するWebメタバース ~Mozilla Hubsで学ぶUX開発から運用コスト最小化まで #CEDEC2022
オープンソースで構築するWebメタバース ~Mozilla Hubsで学ぶUX開発から運用コスト最小化まで #CEDEC2022GREE VR Studio Lab
 
比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)gree_tech
 
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話Yuhei Miyazato
 
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜aha_oretama
 
Hubsカスタマイズ 別WEBサイトとのログイン連携による入室制限
Hubsカスタマイズ 別WEBサイトとのログイン連携による入室制限Hubsカスタマイズ 別WEBサイトとのログイン連携による入室制限
Hubsカスタマイズ 別WEBサイトとのログイン連携による入室制限hironroinakae
 
Firebase Authを Nuxt + Railsの自前サービス に導入してみた
Firebase Authを Nuxt + Railsの自前サービス に導入してみたFirebase Authを Nuxt + Railsの自前サービス に導入してみた
Firebase Authを Nuxt + Railsの自前サービス に導入してみたTomoe Sawai
 

What's hot (20)

エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
 
「Helix Core」導入事例紹介 『小~中規模事例 "Unreal Engine 4 × Helix Core ヒストリア運用レギュレーション紹介"』
「Helix Core」導入事例紹介 『小~中規模事例 "Unreal Engine 4 × Helix Core ヒストリア運用レギュレーション紹介"』「Helix Core」導入事例紹介 『小~中規模事例 "Unreal Engine 4 × Helix Core ヒストリア運用レギュレーション紹介"』
「Helix Core」導入事例紹介 『小~中規模事例 "Unreal Engine 4 × Helix Core ヒストリア運用レギュレーション紹介"』
 
WayOfNoTrouble.pptx
WayOfNoTrouble.pptxWayOfNoTrouble.pptx
WayOfNoTrouble.pptx
 
UE4でAIとビヘイビアツリーと-基礎-
UE4でAIとビヘイビアツリーと-基礎-UE4でAIとビヘイビアツリーと-基礎-
UE4でAIとビヘイビアツリーと-基礎-
 
低レイヤー入門
低レイヤー入門低レイヤー入門
低レイヤー入門
 
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
 
猫でも分かる UE4のAnimation Blueprintの運用について
猫でも分かる UE4のAnimation Blueprintの運用について猫でも分かる UE4のAnimation Blueprintの運用について
猫でも分かる UE4のAnimation Blueprintの運用について
 
2015/11/15 Javaでwebアプリケーション入門
2015/11/15 Javaでwebアプリケーション入門2015/11/15 Javaでwebアプリケーション入門
2015/11/15 Javaでwebアプリケーション入門
 
Reactive Programming by UniRx for Asynchronous & Event Processing
Reactive Programming by UniRx for Asynchronous & Event ProcessingReactive Programming by UniRx for Asynchronous & Event Processing
Reactive Programming by UniRx for Asynchronous & Event Processing
 
Nginx lua
Nginx luaNginx lua
Nginx lua
 
最近のやられアプリを試してみた
最近のやられアプリを試してみた最近のやられアプリを試してみた
最近のやられアプリを試してみた
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選
 
オープンソースで構築するWebメタバース ~Mozilla Hubsで学ぶUX開発から運用コスト最小化まで #CEDEC2022
オープンソースで構築するWebメタバース ~Mozilla Hubsで学ぶUX開発から運用コスト最小化まで #CEDEC2022オープンソースで構築するWebメタバース ~Mozilla Hubsで学ぶUX開発から運用コスト最小化まで #CEDEC2022
オープンソースで構築するWebメタバース ~Mozilla Hubsで学ぶUX開発から運用コスト最小化まで #CEDEC2022
 
比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)
 
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
 
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
 
Hubsカスタマイズ 別WEBサイトとのログイン連携による入室制限
Hubsカスタマイズ 別WEBサイトとのログイン連携による入室制限Hubsカスタマイズ 別WEBサイトとのログイン連携による入室制限
Hubsカスタマイズ 別WEBサイトとのログイン連携による入室制限
 
Firebase Authを Nuxt + Railsの自前サービス に導入してみた
Firebase Authを Nuxt + Railsの自前サービス に導入してみたFirebase Authを Nuxt + Railsの自前サービス に導入してみた
Firebase Authを Nuxt + Railsの自前サービス に導入してみた
 

Similar to 既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった

UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察するUIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察するFumiya Sakai
 
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)Fumiya Sakai
 
書籍執筆からの今後に向けてのロードマップ
書籍執筆からの今後に向けてのロードマップ書籍執筆からの今後に向けてのロードマップ
書籍執筆からの今後に向けてのロードマップFumiya Sakai
 
How I become Go GDE
How I become Go GDEHow I become Go GDE
How I become Go GDEEvan Lin
 
Hint of a little ingenuity about UI.
Hint of a little ingenuity about UI.Hint of a little ingenuity about UI.
Hint of a little ingenuity about UI.Fumiya Sakai
 
A Brief Introduction to Design Hacking + Generative Design
A Brief Introduction to Design Hacking + Generative DesignA Brief Introduction to Design Hacking + Generative Design
A Brief Introduction to Design Hacking + Generative DesignGuy Haviv
 
Hashicorp Tools For The Windows Ecosystem
Hashicorp Tools For The Windows EcosystemHashicorp Tools For The Windows Ecosystem
Hashicorp Tools For The Windows Ecosystemcontinohq
 
The webs and it's future.
The webs and it's future.The webs and it's future.
The webs and it's future.Gbolahan Alli
 
Improving developer collaboration with CodeSandbox
Improving developer collaboration with CodeSandboxImproving developer collaboration with CodeSandbox
Improving developer collaboration with CodeSandboxAbati Adewale
 
DroidKaigi 2018報告会(公式アプリへのコントリビュート)
DroidKaigi 2018報告会(公式アプリへのコントリビュート)DroidKaigi 2018報告会(公式アプリへのコントリビュート)
DroidKaigi 2018報告会(公式アプリへのコントリビュート)Hironytic
 
Hacking Saturday 2018-05 - flutter
Hacking Saturday 2018-05 - flutterHacking Saturday 2018-05 - flutter
Hacking Saturday 2018-05 - flutterWan Leung Wong
 
Introducing Ubuntu SDK
Introducing Ubuntu SDKIntroducing Ubuntu SDK
Introducing Ubuntu SDKShuduo Sang
 
iOS design: a case study
iOS design: a case studyiOS design: a case study
iOS design: a case studyJohan Ronsse
 
A2 Media Evaluation Question 2
A2 Media Evaluation Question 2A2 Media Evaluation Question 2
A2 Media Evaluation Question 2Ashleat153
 
A2 Media Evaluation
A2 Media Evaluation A2 Media Evaluation
A2 Media Evaluation Ashleat153
 
A2 Media Evaluation Q.2
A2 Media Evaluation Q.2A2 Media Evaluation Q.2
A2 Media Evaluation Q.2Ashleat153
 
UI Framework Prototyping with Playgrounds for iOS Apps
UI Framework Prototyping with Playgrounds for iOS AppsUI Framework Prototyping with Playgrounds for iOS Apps
UI Framework Prototyping with Playgrounds for iOS AppsTechWell
 
Build your first Monster APP
Build your first Monster APPBuild your first Monster APP
Build your first Monster APP2600Hz
 

Similar to 既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった (20)

UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察するUIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
 
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
 
書籍執筆からの今後に向けてのロードマップ
書籍執筆からの今後に向けてのロードマップ書籍執筆からの今後に向けてのロードマップ
書籍執筆からの今後に向けてのロードマップ
 
How I become Go GDE
How I become Go GDEHow I become Go GDE
How I become Go GDE
 
Hint of a little ingenuity about UI.
Hint of a little ingenuity about UI.Hint of a little ingenuity about UI.
Hint of a little ingenuity about UI.
 
A Brief Introduction to Design Hacking + Generative Design
A Brief Introduction to Design Hacking + Generative DesignA Brief Introduction to Design Hacking + Generative Design
A Brief Introduction to Design Hacking + Generative Design
 
Hashicorp Tools For The Windows Ecosystem
Hashicorp Tools For The Windows EcosystemHashicorp Tools For The Windows Ecosystem
Hashicorp Tools For The Windows Ecosystem
 
The webs and it's future.
The webs and it's future.The webs and it's future.
The webs and it's future.
 
Improving developer collaboration with CodeSandbox
Improving developer collaboration with CodeSandboxImproving developer collaboration with CodeSandbox
Improving developer collaboration with CodeSandbox
 
An intro to Eleventy
An intro to EleventyAn intro to Eleventy
An intro to Eleventy
 
DroidKaigi 2018報告会(公式アプリへのコントリビュート)
DroidKaigi 2018報告会(公式アプリへのコントリビュート)DroidKaigi 2018報告会(公式アプリへのコントリビュート)
DroidKaigi 2018報告会(公式アプリへのコントリビュート)
 
Hacking Saturday 2018-05 - flutter
Hacking Saturday 2018-05 - flutterHacking Saturday 2018-05 - flutter
Hacking Saturday 2018-05 - flutter
 
Introducing Ubuntu SDK
Introducing Ubuntu SDKIntroducing Ubuntu SDK
Introducing Ubuntu SDK
 
iOS design: a case study
iOS design: a case studyiOS design: a case study
iOS design: a case study
 
DevOps + MongoDB Serverless = 
DevOps + MongoDB Serverless = DevOps + MongoDB Serverless = 
DevOps + MongoDB Serverless = 
 
A2 Media Evaluation Question 2
A2 Media Evaluation Question 2A2 Media Evaluation Question 2
A2 Media Evaluation Question 2
 
A2 Media Evaluation
A2 Media Evaluation A2 Media Evaluation
A2 Media Evaluation
 
A2 Media Evaluation Q.2
A2 Media Evaluation Q.2A2 Media Evaluation Q.2
A2 Media Evaluation Q.2
 
UI Framework Prototyping with Playgrounds for iOS Apps
UI Framework Prototyping with Playgrounds for iOS AppsUI Framework Prototyping with Playgrounds for iOS Apps
UI Framework Prototyping with Playgrounds for iOS Apps
 
Build your first Monster APP
Build your first Monster APPBuild your first Monster APP
Build your first Monster APP
 

More from Fumiya Sakai

RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介Fumiya Sakai
 
少しずつ手厚くして不具合や仕様漏れを防ぐために
少しずつ手厚くして不具合や仕様漏れを防ぐために少しずつ手厚くして不具合や仕様漏れを防ぐために
少しずつ手厚くして不具合や仕様漏れを防ぐためにFumiya Sakai
 
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 RxSwiftFumiya Sakai
 
2022年の抱負とここ数年続けてきたインプット
2022年の抱負とここ数年続けてきたインプット2022年の抱負とここ数年続けてきたインプット
2022年の抱負とここ数年続けてきたインプットFumiya Sakai
 
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説Fumiya Sakai
 
最近の業務やAndroid関連のインプットと振り返り
最近の業務やAndroid関連のインプットと振り返り最近の業務やAndroid関連のインプットと振り返り
最近の業務やAndroid関連のインプットと振り返りFumiya Sakai
 
少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り
少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り
少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返りFumiya Sakai
 
少しずつキャッチアップしていくAndroidアプリ開発
少しずつキャッチアップしていくAndroidアプリ開発少しずつキャッチアップしていくAndroidアプリ開発
少しずつキャッチアップしていくAndroidアプリ開発Fumiya Sakai
 
レイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞく
レイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞくレイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞく
レイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞくFumiya Sakai
 
iOSアプリ開発で意識すると役立ちそうな「つなぎ目」の部分について
iOSアプリ開発で意識すると役立ちそうな「つなぎ目」の部分についてiOSアプリ開発で意識すると役立ちそうな「つなぎ目」の部分について
iOSアプリ開発で意識すると役立ちそうな「つなぎ目」の部分についてFumiya Sakai
 
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
試して感覚を掴んでみるUICollectionViewCompositionalLayout & CombineFumiya Sakai
 
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略Fumiya Sakai
 
何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考える
何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考える何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考える
何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考えるFumiya Sakai
 
アプリ開発におけるテキスト装飾のアイデア集
アプリ開発におけるテキスト装飾のアイデア集アプリ開発におけるテキスト装飾のアイデア集
アプリ開発におけるテキスト装飾のアイデア集Fumiya Sakai
 
ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介
ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介
ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介Fumiya Sakai
 
部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装
部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装
部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装Fumiya Sakai
 
UI表現ライブラリを有効活用して iOSアプリのUIをオシャレにするワザ紹介
UI表現ライブラリを有効活用して iOSアプリのUIをオシャレにするワザ紹介UI表現ライブラリを有効活用して iOSアプリのUIをオシャレにするワザ紹介
UI表現ライブラリを有効活用して iOSアプリのUIをオシャレにするワザ紹介Fumiya Sakai
 
iOSアプリで気になった動きや表現を上手にアレンジして活用してみる
iOSアプリで気になった動きや表現を上手にアレンジして活用してみるiOSアプリで気になった動きや表現を上手にアレンジして活用してみる
iOSアプリで気になった動きや表現を上手にアレンジして活用してみるFumiya Sakai
 
iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方
iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方
iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方Fumiya Sakai
 
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 iOSFumiya Sakai
 

More from Fumiya Sakai (20)

RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
 
少しずつ手厚くして不具合や仕様漏れを防ぐために
少しずつ手厚くして不具合や仕様漏れを防ぐために少しずつ手厚くして不具合や仕様漏れを防ぐために
少しずつ手厚くして不具合や仕様漏れを防ぐために
 
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年の抱負とここ数年続けてきたインプット
 
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
 
最近の業務やAndroid関連のインプットと振り返り
最近の業務やAndroid関連のインプットと振り返り最近の業務やAndroid関連のインプットと振り返り
最近の業務やAndroid関連のインプットと振り返り
 
少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り
少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り
少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り
 
少しずつキャッチアップしていくAndroidアプリ開発
少しずつキャッチアップしていくAndroidアプリ開発少しずつキャッチアップしていくAndroidアプリ開発
少しずつキャッチアップしていくAndroidアプリ開発
 
レイヤー分けをしたアーキテクチャで作る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
 

Recently uploaded

Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDGMarianaLemus7
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
costume and set research powerpoint presentation
costume and set research powerpoint presentationcostume and set research powerpoint presentation
costume and set research powerpoint presentationphoebematthew05
 

Recently uploaded (20)

Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDG
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
costume and set research powerpoint presentation
costume and set research powerpoint presentationcostume and set research powerpoint presentation
costume and set research powerpoint presentation
 
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort ServiceHot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
 

既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった