SlideShare a Scribd company logo
1 of 41
Download to read offline
少しずつキャッチアップしていくAndroidアプリ開発

(改訂版)
Kotlin愛好会	#27	@	オンライン
2021/02/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の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の機能や端末認証を利用した画
面ロック機能を盛り込んだ実装を紹介。
今年の5月末よりAndroidアプリ開発もするように
Javaは過去に経験はあったけど、Androidアプリ開発は今回初めて
参考:	比較的軽めのタスクをこなしながらキャッチアップ期間を過ごした時の記録

https://note.com/fumiyasac/n/nec1c3c80f12d
Webエンジニアをしていた際に業務経験としてはあるんだけどもKotlinに触れているわけではなかった。
1.	過去にSpring(Java)等は経験はあったけど…
ざっくりとしたAndroid側の知識はあれどもネイティブアプリ側の開発経験はほぼ皆無といっても良い。
2.	過去にReactNativeを触っていた際にAndroid側に触れたことは少しあったけど…
個人的に「共通点と相違点を見つけながら」という部分にフォーカスを当てて進めていました。
いきなり触るのではなく自分なりにコードにおける大事な部分を言語化しながら読み進めていく。
3.	最初はiOS側の開発と並行しながらAndroid側のコードも読む時間を取る様にする。
基本的には予習と実践の2段構成
(1)	Server	Side	Kotlinでまずは自分なりに練習
簡単にAPIサーバーを立てて試してみようというところから始める
Kotlinそのものに触れる機会を業務外でも持つ
まずはKotlinの書き方そのものに慣れる&Layered	Architectureの基本を知る
iOSアプリサンプル実装で利用するバックエンド用のAPI通信サンプルを元に実装する
自分が経験のある技術スタックからヒント	→	Laravel	/	Rails
Language:
Framework:
Middleware:
Infra:
POST処理実装
テストユーザー作成・認証
GET処理実装
DB格納表示データ返却
Server	Side	Kotlin	+	Spring	Bootのコード例(1)
簡単に責務を分離した状態でDB側とのやり取りをする処理
@Repository

interface	ItemRepository	:JpaRepository<ItemEntity,	Int>	{

	 @Query(value	=	"SELECT	*	FROM	items	ORDER	BY	id	ASC	LIMIT	:limit	OFFSET	:offset"	,	nativeQuery	=	true)

	 fun	selectItemPerPage(@Param("limit")	limit:	Int,	@Param("offset")	offset:	Int):	List<ItemEntity>

}
@Service

class	ItemService	{

				@Autowired

				private	lateinit	var	itemRepository:	ItemRepository

				fun	findListPerPage(limit:	Int,	offset:	Int):	List<ItemEntity>	{

								return	itemRepository.selectItemPerPage(limit	=	limit,	offset	=	offset)

				}

}
@Entity

@Table(name="items")

data	class	ItemEntity(・・・MySQL側のカラム構造と合わせた構成にする・・・)
「Entity	⇆	Repository	⇆	Service」の3層構成
Entity: DB格納内容とのMapping
Service: RepositoryのSQL処理との仲介
Repository: ライブラリJPAを利用してSQLを組み立てる処理
Server	Side	Kotlin	+	Spring	Bootのコード例(2)
実際にJSONの形式でデータを返却するための処理
@RestController

@RequestMapping(“/api/v1")

@Api(description	=	"iOSアプリトップ画面アイテム一覧に関するエンドポイント(表示コンテンツ)")

class	ItemController	{

	 private	val	LIMIT_PER_PAGE	=	9

	 @Autowired

	 private	lateinit	var	itemService:	ItemService

	 @GetMapping("/items")

	 fun	findListPerPage(@ApiParam(value	=	"ページ番号",	required	=	false)	@RequestParam(required	=	false,	defaultValue	=	"1")	page:	
String):	ItemListResponse	{

	 	 val	currentPage	=	page.toInt()

	 	 if	(currentPage	<	1)	{	throw	BadRequestException(“パラメーターの値が不正です。")	}

	 	 val	hasNextPage	=	(currentPage	*	LIMIT_PER_PAGE	<	itemService.findAllCount())

	 	 val	offset	=	(currentPage	-	1)	*	LIMIT_PER_PAGE

	 	 val	items	=	itemService.findListPerPage(limit	=	LIMIT_PER_PAGE,	offset	=	offset)

	 	 return	ItemListResponse(result	=	items,	currentPage	=	currentPage,	hasNextPage	=	hasNextPage)

	 }

}
実際にAPIレスポンスを返却するController部分
Annotationの理解: 結構最初は取っ付きづらい部分
Pagination処理: Service層へ必要なものを送る
(2)	あれ、感覚が似ているかもしれない…?
コードの書き方の部分や設計に関する細かな部分での類似点に触れる
最初は不安のほうが大きいけど少しずつ理解を深める
いきなりコードを読む衝動を少し押さえてインプットをメインにする
最初は基礎を徹底的に固める 簡単〜標準?位のタスクを実施
Kotlin/AndroidStudioに触れる
早い段階で実施したこと:
基本事項をノートに自分でまとめて
いきながら実務で頻出な部分を重点
的に&自分なりにしつこく書き記す
感じで書き記していく。

(これは自分が慣れた方法)
・基本のさらに基本を知る
両方一緒に
早い段階で実施したこと:
読みながら仕様と基礎を理解する
操作方法	/	デバッグ手法	/	実機
・Kotlinの書き方を知る
Swiftの文法をヒントに読み進める
早い段階で実施したこと:
従来通りSwiftのUIサンプルを作る
が、それに合わせるバックエンド側
部分をServer	Side	Kotlinで簡単な
物を試してみる。

(Backend側も知れるのでお得)
・アプリにおける基本理解
ライフサイクルやAndroid機能等
・UI実装部分における理解
iOSアプリとの共通点&相違点
・実務で使われるものの理解
RxJava	/	Dagger	/	Apollo	…
・複雑な構造を組み立てる
RecyclerView	/	ViewHolder	…
①
GUIを利用したレイアウトの作成について(1)
AutoLayout(iOS)	&	ConstraintLayout(Android)を見てみる
10
24
24
10
CenterX:280
CenterY:200
相対的な位置関係の調節を
コードまたはGUIで実装
<androidx.constraintlayout.widget.ConstraintLayout

				android:layout_width="match_parent"

				android:layout_height="wrap_content">

				<View	

								android:layout_width="0dp"

								android:layout_height="wrap_content"

								app:layout_constraintTop_toTopOf="10dp"

								app:layout_constraintBottom_toBottomOf="10dp"

								app:layout_constraintStart_toStartOf="24dp"

								app:layout_constraintEnd_toEndOf="24dp"	/>
contentView.addSubview(childView)

childView.snp.makeConstraints	{	make	in

					make.top.equalToSuperview().offset(10.0)

					make.right.equalToSuperview().offset(24.0)

					make.left.equalToSuperview().offset(24.0)

					make.bottom.equalToSuperview().offset(10.0)

}
contentView.addSubview(childView)

childView.snp.makeConstraints	{	make	in

					make.centerX.equalToSuperview()

					make.centerY.equalToSuperview()

					make.height.equalTo(200.0)

					make.width.equalTo(280.0)

}
<LinearLayout

				android:layout_width="match_parent"

				android:layout_height="wrap_content"

				android:gravity="center_horizontal"

				android:orientation="vertical">

				<View

								android:layout_width="280dp"

								android:layout_height="200dp"	/>
iOS:	AutoLayout	(with	SnapKit)
Android:	ConstraintLayout	&	Gravity
①	相対配置
②	中央寄せ
①
②
②
GUIを利用したレイアウトの作成について(2)
UIStackView(iOS)	&	LinearLayout(Android)を見てみる
UIStackViewの内部にXibで切り出したりコードで
作成したView要素のクラスを追加する。
iOS:	UIStackView
match_parent/wrap_contentで親との位置関係を
指定しorientationで横・縦方向の指定をする。
Android:	LinearLayout
レイアウトを構築する上で
も活用機会が多いView要素
Horizontal
Vertical
<LinearLayout

				android:layout_width="match_parent"

				android:layout_height="wrap_content"

				android:orientation=“vertical">

この中に各種要素やConstraintLayoutを配置

</LinearLayout>
contentsStackView.addArrangedSubview(contentView1)

contentsStackView.addArrangedSubview(contentView2)
コードでの実装例:
contentView2
contentView1
縦に長い可変の画面要素の配置や等間隔での要素
の整列時に用いる場面など結構な頻度で活用する
ConstraintLayoutとも上手に併用しながら実装
アーキテクチャの大枠をiOS/Androidで合わせる
iOS/Android間で設計思想を合わせておくことで考えやすくなると感じています
責務に適切に分割/分離することで実装が考えやすくなる。
1.	MVVM(MVP)+	Layered	Architectueの構成
共通の拠り所とできうる基準を持つことでの安心感がある。
2.	ドメイン駆動設計(DDD)の世界に触れてみる
Entity
Service
Repository
DataTransfer
Factory
UseCase
Presenter
ViewModel
Activity
Fragment
BindingModel
iOS開発/Android開発を行ったり来たりしなければいけない場合にはこの恩恵を感じる場面は多いはず。
InfraStructure
DataStore
Context
①
②
①
②
iOS/Android間でも実装や機能設計の際にお互
いのコードを比較しながら参考にしやすい
View要素や画面構築の手法やライフサイクル
が違うので切り分けて考える必要がある
APIサーバーより取得したデータの内容を画面に表示する際の処理の例を考えてみる
実装方法の手法をできるだけ統一する(1)
iOS側はRxSwift	/	Android側はRxJavaを利用した処理の事例
UseCase
Presenter
Repository層で定義したAPI通信後の処理をそれぞれ定義する。(※One	Usecase	has	many	Repositories)

Repositoryの処理を実行	→	flatMapでレスポンス内容を変換	→	Single<T>	/	Maybe<T>	/	Completableに変換
Repository
InfraStructure
UseCaseで実行された処理に対してUI側で実施する処理をそれぞれ定義する。

UseCaseの処理を実行	→	Main	Threadで実行する	→	成功時	/	エラー発生時	/	処理完了時	に合わせてUI処理を実行
今回例として挙げる部分はこちら
REST	APIやGraphQLを利用してサーバー側との非同期通信を実施する基盤となる処理
非同期通信の処理結果を元にEntityに変換したり内部キャッシュに保存する処理
※	RxSwift	/	RxJavaのStreamに乗せていくイメージ
doSomethingUseCase.execute()

.observeOn(

				uiScheduler

).subscribeBy(

				onSuccess	=	{	dto	->

//	MEMO:	処理成功時の処理(Viewの組み立て)

//	→	iOS側とほんのちょっと違う部分

								view.setUpContent(

												SomethingConverter.convertToBindingModel(dto)

								)

				},

				onError	=	{	error	->

//	MEMO:	エラー発生時のハンドリング処理

				},

				onComplete	=	{

								//	MEMO:	処理が完了した際に実施する処理

				}

).addTo(disposables)
Point1:
doSomethingUseCase.execute()

.observeOn(

				mainScheduler

).subscribe(

				onSuccess:	{	[weak	self]	dto	in

								guard	let	weakSelf	=	self	else	{	return	}

								//	MEMO:	処理成功時の処理(Viewの組み立て)

								weakSelf.view?.setupContent(

												SomethingConverter.convertToViewModel(dto)

								)

				},

				onError:	{	[weak	self]	error	in

								//	MEMO:	エラー発生時のハンドリング処理 

				},

				onCompleted:	{	[weak	self]	in

								//	MEMO:	処理が完了した際に実施する処理

				}

).disposed(by:	disposeBag)
実装方法の手法をできるだけ統一する(2)
実際のコードとして実装を当てはめてみるとこのような形にできる(Presenter)
スレッドや非同期
通信時処理はある
程度は類似した形
Android:	RxJavaを利用
Point2:
iOS:	RxSwiftを利用
RxSwift	/	RxJava
での記法をヒント
にして実装する
Maybe<Dto> Maybe<Dto>
直列:	flatMap
並列:	Single.zip
iOS/Androidで頻出のOSSライブラリを調べてみる
iOS/Androidのよく用いられているものを知っておくと結構ヒントになることも
RxSwift(Ractive	Programming),	Resolver(Dependency	Injection),	Alamofire(Networking),	SwiftyJSON(JSON	Decoder),

Kingfisher(Image	Cache),	Quick	+	Nimble	+	SwiftyMocky(Unit	Testing),	…
1.	iOS側のライブラリ例
RxJava(Ractive	Programming),	Dagger2(Dependency	Injection),	OkHttp	+	Retrofit(Networking),	ExoPlayer(Movie),

Picasso(Image	Cache),	Groupie(RecyclerView),	BubbleLayout(Tooltip),	Mockito(Mocking),	…
2.	Android側のライブラリ例
Apollo(GraphQL),	lottie(Animation),	Firebase(Platform),	Realm(Data	Storage),	JWTDecode(JWT),	…
3.	iOS/Android両方ある例
iOS開発/Android開発を行ったり来たりしなければいけない場合にはこの恩恵を感じる場面は多いはず。
(3)	Android開発における基本事項を押さえる
実務でAndroid開発を進めていく上で最低限必要そうな部分を整理する
iOS/Androidのデザインガイドラインを理解する
デザインの統一感を意識していく際にもMaterialDesignの事を知る
iOS側もデザインをMaterialDesignに寄せていく決断をした際もガイドラインと合わせて不自然にならないように注意。
iOS:	Human	Interface	Guideline Android:	Material	Design
一見すると同じ様な見た目にも見えるかもしれないが、細かな点を注意深く見ていくと実装で配慮すべき点が見えてくる。
ActivityやFragmentのライフサイクルを理解する
画面に関する実装をする場合には押さえておきたい重要な部分
Activity Fragment
できるだけ見通しをよくす
るためにシンプルにする。
Activity:
Fragment:
画面レイアウトに関する処
理はできるだけこちらへ。
どんな感じの構成になっているかの一例:
Intentによる画面遷移処理など画面クラス全体に関わるもの
Activity:
Fragment:
RecyclerViewの処理やメニュー部分など画面表示全般
※	ActivityとFragmentが1対1対応が基本型
サーバー側とのAPI通信処理に関する概要
メールアドレスとパスワードで認証処理を実行する部分に関する例
val	okHttpClient	=	OkHttpClient.Builder()

				.addInterceptor(loggerInterceptor)

				.addInterceptor(OnlyBasicAuthorizationInterceptor())

				…	途中省略	…

				.build()

return	Retrofit.Builder()

				.baseUrl(BuildConfig.SESSION_API_URL)

				.client(okHttpClient)

				.addConverterFactory(GsonConverterFactory.create())

				.addCallAdapterFactory(RxJava2CallAdapterFactory.create())

				.build()

				.create(SessionsApiClient::class.java)
interface	SessionsApiClient	{

				@POST("v1/sessions")

				fun	login(

								@Body	body:	HashMap<String,	String>

				):	Single<SessionTokenEntityJson>

}
sessionsApiClient.login(hashMapOf(

				EMAIL	to	email.value,	PASSWORD	to	password.value

))
OKHttpとRetrofitを併用したAPI通信処理:
①	APIリクエスト実行用Factoryクラス抜粋 ②	APIエンドポイント定義
③	必要があればModule化しておく
@Module

internal	class	XXXModule	{

@Provides

fun	provideSessionsApiClient():	
SessionsApiClient	=

				SessionsApiClientFactory().create()
実際の処理をする責務ではこんな感じで利用
当該エンドポイントとの通信実行
Log出力やBasic認証に関する処理
よく利用するRecyclerViewでの実装方法(1)
RecyclerViewを利用する際に押さえておきたい部分を簡単にまとめてみる
RecyclerView:
ListViewの進化版でListViewよりも高機能(Header/Footerはない,	区切り線は自前で準備)
Adapter:
1行分のデータを1行分のViewにして生成するもの
ViewHolder:
1行分のViewの参照を保持するもの(ライブラリ:	Groupieを利用)
ViewHolder Adapter RecyclerView
LayoutManager:
DataSizeを考慮してResponsiveにLayoutを管理する
①	Layout読み込み	&	Inflate
②	表示数分ViewHolder生成
DataSource ③	1行分データ取得
④	1行分取得して設定
1行できたら格納
よく利用するRecyclerViewでの実装方法(2)
画面を構成するFragmentやViewHolder1個分の要素と関係を簡単にまとめてみる
Fragment
Fragment●●Binding
fragment_xxx.xml

-	ConstraintLayout

		-	Toolbar

		-	RecyclerView
fragment_xxx.xml内に配置
した要素をIDで取得可能
配置したRecyclerViewに適用するAdapter初期化時に下記も一緒に渡す

①	ViewHolderタップ時のEventListener	/	②	BindingModel
XML内では	android:text=“@{bindingModel.name}”の様にできる
Adapter
ViewHolder
※View要素内ではbinding.bindingModelで取得
・BindingModel内のデータを元にViewHolderを生成処理を実施

・ViewHolderタップ時のEventListenerとのBindもここで行う
※ライブラリ「Groupie」を利用
view_xxx.xml

ViewHolder1個分のLayout
BindingModel View要素に表示対象のデータ
View●●Binding
※Fragment同様XMLとBinding
例)	binding.recyclerView
(4)	UI実装をAndroidで実現しようとする場合の考え方
iOSのUI実装との相違点をヒントにして処理を調べていく様なアプローチ
Androidでは標準で準備されている表現例(1)
DrawerMenuはAndroidだと標準で用意されているがiOSは別途作成が必要
AndroidではDrawerMenuが標準で実装されている
公式ドキュメントでも実装方針や方法が示されている。

https://developer.android.com/guide/navigation/navigation-ui
一方でiOSでは自前で実装するかライブラリを活用する
ライブラリを利用しないで独自実装を進める方針:
-	ContainerViewとGestureRecognizerを利用して実現する
iOSアプリ内でDrawerMenuに近しい挙動を実現する例:

https://qiita.com/fumiyasac@github/items/eb5b17ab90f5aa27b793
ライブラリを利用して進める方針:
例)	SideMenu:

https://github.com/jonkykong/SideMenu
-	よく利用されるものなので著名なライブラリも存在する
Androidでは標準で準備されている表現例(2)
Tab付SwipeViewもAndroidでは実装方法が紹介されているがiOSは別途作成が必要
Tab	No.1 Tab	No.2 Tab Tab	No.1 Tab	No.2 Tab
AndroidではTab付SwipeViewの事例がすでにある
公式のドキュメントでも実装方針や方法が示されている。

https://developer.android.com/guide/navigation/navigation-
swipe-view

一方でiOSでは自前で実装するかライブラリを活用する
ライブラリを利用しないで独自実装を進める方針:
-	タブ表示部分:	UIScrollView	or	UICollectionView
例)	Parchment:

https://github.com/rechsteiner/Parchment
-	コンテンツ表示部分:	UIPageViewController
ライブラリを利用して進める方針:
-	よく利用されるものなので著名なライブラリも存在する
Swipable	Page	Contents
iOSとAndroidでのUI表現の方針の違いを知る(1)
縦方向だけではなく横方向へのスクロールも考慮する様な形の画面
Androidにおける実装方針例
RecyclerViewの入れ子構造	&	適用するLayoutManagerをSection毎に変更
Section:	0	(Category)
Section:	1	(Article)
Section:	2	(Featured)
Horizontal	Scroll
Horizontal	Scroll
Grid	Layout	Pattern
val	gridlayoutManager	=	GridLayoutManager(recyclerView.context,	4)

gridlayoutManager.spanSizeLookup	=	object	:	GridLayoutManager.SpanSizeLookup()	{

				override	fun	getSpanSize(position:	Int):	Int	{

								if	(categoriesCount	<	position)	{

												return	4

								}	else	{

												return	1

								}

				}

}

recyclerView.layoutManager	=	gridlayoutManager
val	linearLayoutManager	=

				LinearLayoutManager(recyclerView.context,	LinearLayoutManager.HORIZONTAL,	false)

recyclerView.layoutManager	=	linearLayoutManager
※iOSではUICollectionViewを利用する
-	格子状に並べる表現におけるLayoutManager設定例
-	水平方向へのスクロール表現におけるLayoutManager設定例
iOSとAndroidでのUI表現の方針の違いを知る(2)
Pinterestの様に配置するサムネイル画像のアスペクト比に合わせる
Androidにおける実装方針例
適用するLayoutManagerをStaggeredGridLayoutManagerに変更
Waterfall	Grid
val	staggeredGridLayoutManager

	=	StaggeredGridLayoutManager(2,	StaggeredGridLayoutManager.VERTICAL)

recyclerView.layoutManager	=	gridlayoutManager
※iOSではUICollectionViewを利用する
-	一見すると難しそうなレイアウトに見えるが実はこれだけ
写真アスペクト比
を考慮する形のレ
イアウト表現
参考:	StaggeredGridLayoutManager

https://developer.android.com/reference/androidx/
recyclerview/widget/StaggeredGridLayoutManager
一方でiOSでは自前で実装するのはなかなか大変な実装
参考:	UICollectionViewCompositionalLayoutを利用した例

https://qiita.com/fromkk/items/475eb761fa3352829f52
従来通りのUICollectionViewの実装だとレイアウト属性を調整する形になる
iOSとAndroidでのUI表現の方針の違いを知る(3)
配置したヘッダー画像がスクロールに合わせて伸縮する様なレイアウト
AndroidではCoodinatorLayoutを活用して実装する
①	実際の実装事例紹介

https://guides.codepath.com/android/handling-scrolls-with-
coordinatorlayout
一方でiOSでは自前で実装するかライブラリを活用する
ライブラリを利用しないで独自実装を進める方針:
基本はUIScrollView等を利用してスクロールの変化量をキャッチ
してヘッダー画像に付与しているAutoLayout制約を変更する形

(UINavigationBarの変化も考慮すると結構大変な処理)
例)	ParallaxHeader:

https://github.com/romansorochak/ParallaxHeader
Streachy	Header
②	CoodinatorLayoutに関する解説

https://techblog.yahoo.co.jp/android/androidcoordinatorlayout/
iOSとAndroidでのUI表現の方針の違いを知る(4)
iOSのUITabBarControllerの様な下タブで選択画面を切り替える形の表現
≡	タイトル
Bottom	Navigation
ViewPager
Toolbar	Title
スクリーン
Androidにおける実装方針例 ※iOSではUITabBarControllerを利用する
下タブを切り替え
るとタイトル表示
が変更される
下タブを切り替え
るとスクリーン表
示が変更される
ViewPager	&	BottomNavigation
BottomNavigationの使いどころを整理する

https://qiita.com/konifar/items/d64ada9c8ce069e6d138
BottomNavigationViewとNavigationを一緒に使う

https://qiita.com/superman9387/items/d373c8bddfe2243a49a7
ViewPagerとPagerAdapterでスワイプビューを作ってみる

https://qiita.com/shira-jun/items/1c40b087b38a370c6d18
BottomNavigation(下タブ)	+	Navigationを試してみる

https://qiita.com/orimomo/items/313ce4e273fa741dddf2
Navigation	+	BottomNavigationViewでFragmentの状態を残す

https://bit.ly/3mOV5Rh
(5)	UI実装を伴う機能開発時におけるケーススタディ
実際に業務内でiOS/Androidで同様な機能を実装した際の経験から
実装した画面と機能におけるケーススタディ(1)
アプリトップ画面でもよく見かけるような様々な表示要素が組み合わさった例
Section:	0
Section:	1
Section:	2
Horizontal	Scroll
Horizontal	Scroll
Grid	Layout	Pattern
表示に必要なデータはRxJavaの処理を利用してできるだけまとめてサーバーからデータ取得
基本構造はRecyclerViewを入れ子にする方針で実施する
iOSだとUICollectionViewCompositionalLayoutで実装するけど…果たしてAndroidはどうする?
基本方針
各セクション毎に適用するレイアウトについてはLayoutManagerを利用する
iOSでの実装と照らし合わせて明確に異なるまたは似ているポイントの整理
レイアウトを実現する上で必要な知識(全く異なる部分):
RecyclerView	/	ViewHolder	(ライブラリ:	Groupie)	/	BindingModel	※	DataBinding
表示データの取得に関する部分(参考にできる余地がありそうな部分):
RxJavaを利用した非同期通信を束ねる処理	/	GraphQL	(ライブラリ:	Apollo)
実装した画面と機能におけるケーススタディ(1)
要素毎に分解していきながら構造を理解すると見えやすかった
Section:	0
Section:	1
Section:	2
Horizontal	Scroll
Horizontal	Scroll
Grid	Layout	Pattern
RecyclerView	&	ViewHolder	&	DataBindingの基本実装を少しだけ応用する形
全体的な処理についてはRecyclerViewで構築する
Section:
さらに配置したViewHolder内部にRecyclerViewを配置する
Sectionタイトル表示用
ViewHolder
Gridパーツ1個分表示用
ViewHolder
横スクロール要素表示用
ViewHolder
用途に応じた形でRecyclerView
を活用する点とLayoutManagerを
活用した複雑なレイアウト構築
ViewHolderに渡す表示データを組
み立てるBindingModelの形に注意
Point2:
Point1:
実装した画面と機能におけるケーススタディ(1)
画面に表示するデータを取得する処理に関する形のイメージ
Section:	0
Section:	1
Section:	2
Horizontal	Scroll
Horizontal	Scroll
Grid	Layout	Pattern
RxJavaを利用した複数のAPIリクエストを上手に束ねてうまく返却する際のヒント
UseCase Presenter
Repository
InfraStructure
GraphQL	Request 各種画面への表示
表示データ取得 表示用に加工
Single.zip(

				exampleRepository1.find(),

				exampleRepository2.find(),

				exampleRepository3.find(),

				Function3<List<Article1>,	List<Article2>,	List<Article3>,	ExampleDto>	{	

				article1,	article2,	article3	->

		//	Presenterで利用するExampleDtoへの変換処理

				}

)
※	Dto	…	Data	Transfer	Objectの略 iOS側でRxSwiftを利用していれば処理方針は類推可能
Point:
最終的に返却したい型
各種データの型が異なるRepository層での処理	※Single<T>
3つの異なる非同期通信を束ねる部分	※RxJavaでの処理
実装した画面と機能におけるケーススタディ(2)
バックエンドAPIと連動したキーワード検索画面の実装を紐解いてみる
Section:	1
Section:	2
Section:	0
Input	Keywords
≡
検索履歴:
|	●●●●●●
←
×
キーワード
×
キーワード
×
キーワード
×
キーワード
×
キーワード
TOP画面 検索実行画面
検索結果:
●●●●●●
←
検索結果画面
TOPからキーワードで検索を考えていく場合の画面構成はシンプルに見えるけど結構悩ましげな部分もある
YouTubeの様な検
索の動きを想定
どちらを選ぶ方が
実装しやすい?
Point2:
カスタマイズのし
やすさの点で選択
すると良さそう
AppBarの中に検索
バー表示が入って
いる状態の表現
Point1:
※	iOSとの比較
iOSでも同様に細
部の位置調整はな
かなか大変な部分
・SearchView

・EditText
キーワードに紐
づくデータ表示
実装した画面と機能におけるケーススタディ(2)
実装に落とし込むためにまずは様々なアプリを観察して疑問点を洗い出す
この画面の様な機能を実装した際にまず気をつけた部分を紹介します。
TOP/検索/結果という形で3つの独立した画面に分けるので、TOPに配置するものは飾り&遷移アニメーションで調整
Q.	TOP画面のActionBarに配置する検索バーはどの様にするか?
onCreateOptionsMenuとBottomNavigationを利用して切り替え処理を実行する
Q.	TOP画面のActionBar上に配置する検索バー表示はBottomNavigation&ViewPagerでの切り替えといかに両立させるか?
Intentを利用して2つ前の画面に戻す処理で実現できそう
Q.	検索結果画面表示から「戻るボタン」で一気にTOP画面へ戻るには?
SharedPreference	&	RecyclerViewを利用する(単純にKeywordを保存するだけの機構で最初の段階であれば)
Q.	履歴表示部分はどんな形で実装するか?
機能そのものに加えて、デザイン調整や慣れたアプリに近い操作感を実現する点もポイントだったように思います。
その他始めた当初理解するまでに苦戦した部分
実務の中でハマってしまった部分の事例を簡単にピックアップしてみます
これからももっと色々と出てきそうではありますが現時点で思いつくもの
エラーメッセージだけでは最初なかなか原因の特定に時間がかかってしまうことが多かったように思います。
1.	Daggerを利用したDepency	Injectionの部分	/	MultiModule構成で作られたProjectの把握
僕自身iOSでも結構苦手意識が強い部分の1つです。
2.	Backgroundで処理するような機能
iOSのUINavigationController/UINavigationBarの感じかなと思っていて最初は痛い目を見ました…。
3.	onCreateOptionsMenuを利用した実装
これまでの自分が慣れていた書き方と違った部分でもあったのでやっぱり最初は苦戦していました…。
4.	Retrofit	&	OkHttpを利用したリクエスト・レスポンスの取得処理
iOS/Androidの両方を考えていく際にはこの部分が関わる実装や機能開発時は今も注意するようにしています。
まとめ(進め方の方針)
iOS/Android開発を並行しながら進めることで感じる共通点と相違点に向き合う
1.	予習と実践の2段構成を基本にして進めていくことで見えたものがある:
UIの作り方における作法や開発で利用するプログラミング言語、それにデザインに対する考え方はもちろん違いはある部分では
あるが内部実装における設計パターン等の部分については類似点があったりもするのでそこを手がかりとする。
2.	機能や実装を実現するにあたって必要そうになる部分をしつこく調査する:
実務でのコードを読む他にもUdemyの教材等も活用して本当に基本的な部分の理解から少しずつスタートしていった。

僕の場合は「アプリにおける頻出のUI表現」と「利用ライブラリとその効用」という観点からも調査をする形にした。
iOSアプリ開発は相変わらず楽しい、そして今新しいページが追加されている感覚が自分の中にある。
3.	iOSアプリではこうするけれどもAndroidアプリではどうする?という視点で紐解く:
iOSでのUI実装の方針をヒントにしながら、Androidアプリではいかに実現するかという視点を自分は持つ様に心がけた。

特に現在携わっている業務内ではDDDでアーキテクチャが合わせてあったのでその恩恵にうまくあやかることができた。
まとめ(実務とこれまでの開発を通して)
iOS/Android間の違いを上手に楽しむための工夫と意識を向ける部分のヒント
1.	最初は基本事項の整理と理解から進めて今もなお継続中:
特にUI実装を考えていく時は「iOSの時はこうしていたな〜」という部分をヒントに進めることも多かった。

とはいえまだまだ知らない故にハマる時もあったりするので今後も引き続き色々と試していきたいです。
2.	これまで以上にアーキテクチャや処理構成に関する部分に意識が向く様になった:
業務で触れているコードがiOS/Androidでのアーキテクチャの概略や処理のコンテキストが揃っていた。

これまで以上にDDDに関する知識や設計を意識するきっかけにもなり、またその恩恵を大きく受けているとも感じています。
他にも何か今回の様なトピックがある程度まとまったタイミングで共有できればと思います。
3.	iOS/Androidでの共通点や相違点そして似て非なる部分を知る事:
同じないしは似ているような印象を持つ機能やデザインであっても実現方法やUIデザイン実装は全く異なる。

時にはデザイナーの方とも相談しながら業務の中で色々試しながら試行錯誤する経験が本当に良かった。
Thank	you	for	listening	!

More Related Content

More from Fumiya Sakai

最近の業務やAndroid関連のインプットと振り返り
最近の業務やAndroid関連のインプットと振り返り最近の業務やAndroid関連のインプットと振り返り
最近の業務やAndroid関連のインプットと振り返りFumiya Sakai
 
少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り
少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り
少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返りFumiya Sakai
 
少しずつキャッチアップしていくAndroidアプリ開発
少しずつキャッチアップしていくAndroidアプリ開発少しずつキャッチアップしていくAndroidアプリ開発
少しずつキャッチアップしていくAndroidアプリ開発Fumiya Sakai
 
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察するUIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する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
 
Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).
Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).
Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).Fumiya Sakai
 
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
 
メディアアプリでよく見る無限スクロールするタブの動きへの考察
メディアアプリでよく見る無限スクロールするタブの動きへの考察メディアアプリでよく見る無限スクロールするタブの動きへの考察
メディアアプリでよく見る無限スクロールするタブの動きへの考察Fumiya Sakai
 
RxSwiftとMVVMパターンと仲良くなる次のステップ
RxSwiftとMVVMパターンと仲良くなる次のステップRxSwiftとMVVMパターンと仲良くなる次のステップ
RxSwiftとMVVMパターンと仲良くなる次のステップFumiya Sakai
 

More from Fumiya Sakai (20)

最近の業務や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
 
Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).
Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).
Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).
 
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.
 
メディアアプリでよく見る無限スクロールするタブの動きへの考察
メディアアプリでよく見る無限スクロールするタブの動きへの考察メディアアプリでよく見る無限スクロールするタブの動きへの考察
メディアアプリでよく見る無限スクロールするタブの動きへの考察
 
RxSwiftとMVVMパターンと仲良くなる次のステップ
RxSwiftとMVVMパターンと仲良くなる次のステップRxSwiftとMVVMパターンと仲良くなる次のステップ
RxSwiftとMVVMパターンと仲良くなる次のステップ
 

Recently uploaded

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 

Recently uploaded (10)

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 

Kotlin愛好会Vol27資料: 少しずつキャッチアップしていくAndroidアプリ開発 (改訂版)