実践業務を爆速でこなすtipsとgenerics
-
Upload
daisuke-nagata -
Category
Software
-
view
243 -
download
0
Transcript of 実践業務を爆速でこなすtipsとgenerics
![Page 1: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/1.jpg)
実践業務を爆速でこなすtipsとgenerics
![Page 2: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/2.jpg)
iosにはプログラミングの概念で
プロトコル指考とオブジェクト指考がある
![Page 3: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/3.jpg)
概念、思考??プロトコル指考
オブジェクト指考とは?
![Page 4: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/4.jpg)
アプリケーションを構築する上で、方針、設計、具体的なコードのこと
![Page 5: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/5.jpg)
そして今回紹介するgenericsは連想型のパラメーターを
使う関数
コードで紹介!!
![Page 6: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/6.jpg)
func DddcountOne<T>(check:T)->T{
return check
}
Tがパラメーターです。その他の文字が?な方は、
ビギナーズ倶楽部でお伝えします。
![Page 7: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/7.jpg)
なぜ型を指定しないパラメータなのか?
![Page 8: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/8.jpg)
幾つかありますが、一つ目
![Page 9: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/9.jpg)
暗黙の共有を避ける。
![Page 10: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/10.jpg)
objective-cの時代は、知らず知らず、
インスタンスの共有をしてしまう場合があった
![Page 11: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/11.jpg)
それはデットロックへの危機感
![Page 12: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/12.jpg)
デットロックとは
![Page 13: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/13.jpg)
デッドロックとは、特に計算機科学において、2つ以上のスレッドあるいはプロセスなどの処理単位が互いの処理終了を待ち、結果としてどの処理も先に進め
なくなってしまうことを言う。
![Page 14: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/14.jpg)
対応には排他処理を実施。今回はSwiftのgenericsを説明するので、
排他処理コードは飛ばす。
必要な場合は自分で、そこ調べて。
![Page 15: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/15.jpg)
ただし、排他制御←
この考えやどういうものか知っとく必要あります。
![Page 16: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/16.jpg)
スレッド、同期処理、非同期処理などで電気のメモリの流れなどを考量して、
あらかじめ排他処理を実施する
![Page 17: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/17.jpg)
同時共有するアプリケーションを作成する場合など、排他処理を実施してスレッドが同時に起
きた場合もindexやindexPathのデーターベースの整合性を保つ場合などに使用する概念で、今後そういった多数のスレッドを多様する機会が増えるので、、知っとく必要
あり。
![Page 18: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/18.jpg)
スマフォじゃなくて、セマフォで調べると良いです。
![Page 19: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/19.jpg)
スマフォじゃなくて、セマフォで調べると良いです。
もう一度話を戻します。
![Page 20: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/20.jpg)
generics注力した理由は
オブジェクト指向にあります。
![Page 21: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/21.jpg)
オブジェクト指向の作法は、クラス化だけど、
クラス化だと多重に継承ができない。
![Page 22: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/22.jpg)
オブジェクト指向言語では、スーパークラスを
一つしか持つことができず、機能変更する場合など、
スーパークラスをあとから変更するのは、極めて困難だ。
![Page 23: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/23.jpg)
オブジェクト指向
プログラミングに関するキーワード
![Page 24: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/24.jpg)
オブジェクト
クラス
インスタンス(実体)
状態と振る舞い
カプセル化(隠蔽)
継承、委譲
インタフェース、抽象化
などなどありますが
![Page 25: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/25.jpg)
このまま行くとオブジェクト指考の話になるので、一旦ストップしてまとめると
![Page 26: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/26.jpg)
変数の参照設定weakやstrongなど
変数を使う場合の初期化設定alloc initwith〜などスーパークラス設定
後から変更が困難になる型関係が損失
ダウンキャストする必要な場合が起きる
![Page 27: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/27.jpg)
今までのオブジェクト指向objective-cは
いろいろ対応するのが面倒だった。
![Page 28: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/28.jpg)
genericsは
使用する方で、型を宣言すれば知らず、知らずのうちに
共有するようなことが起きない。
![Page 29: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/29.jpg)
具体的なコードはリンク先にあります。Starを押してください。
https://github.com/daisukenagata/GenericsSample
よろしくお願いします。
![Page 30: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/30.jpg)
class Sample1: NSObject {
//ジェネリックスを作成引数を1つ返す
func DddcountOne<T>(check:T)->T{
return check
}
}
![Page 31: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/31.jpg)
//Buttonの継承
self.view.addSubview
(SampleUIView(frame:self.view.frame))
// あらゆる型に変換するジェネリックス ラベルを一つ返す
print("1111",Sample1().DddcountOne(check:"111"))
print("222",Sample1().DddcountOne(check:222))
print("333",Sample1().DddcountOne(check:1.0))
print("444",Sample1().DddcountOne(check:true))
![Page 32: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/32.jpg)
使う側で選ぶgenericsを使用する場合に
必要なプロトコル指考とは
![Page 33: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/33.jpg)
関数型プログラミングがヒントになります。
こちらに関数プログラミング紹介があります。
http://www.slideshare.net/DaisukeNagata1/sansan-65191797
![Page 34: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/34.jpg)
関数型プログラミングは複数の式を関数の適用によって組み合わせて
いくプログラミングスタイルである
![Page 35: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/35.jpg)
また
![Page 36: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/36.jpg)
プロトコル思考って?
![Page 37: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/37.jpg)
プロトコル思考、Swiftではプロトコルや構造体は初期化の負担がなくモデ
ルにデータを強制しない開発者が採用した場合に
使用箇所が明示的で明確です。
![Page 38: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/38.jpg)
これは僕のイメージですが、プログラムメソッドとプログラムメソッドを接続する場合で開発者が明確に採択できメモリの管
理などSwiftがよしなにやってくれる。
![Page 39: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/39.jpg)
generics
![Page 40: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/40.jpg)
//Associatedtypプロトコル 設定
protocol ProtocolBoard {associatedtype protocolPiecestatic var rows: Int { get }static var columns: Int { get }//取得用サブスクリプト
subscript(row: Int, column: Int) -> protocolPiece? { get set }}
![Page 41: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/41.jpg)
//配列設定
struct ArrayBoard<T>: ProtocolBoard {static var rows: Int { return 7 }static var columns: Int { return 7 }// 配列
var board = [T?](repeating: nil, count: 7 * 7)// 取得用サブスクリプト
subscript(row: Int, column: Int) -> T? {get {
return board[row * 7 + column]}set {
board[row * 7 + column] = newValue}
}}
![Page 42: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/42.jpg)
//Associatedtyp プロトコル 設定
var board = ArrayBoard<Bool>()board[3, 3] = trueboard[3, 4] = falseprint(board[3, 3]!)print(board[3, 4]!)
![Page 43: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/43.jpg)
先ほどの<T>がパラメータ
なのでStringにもできます。
var board = ArrayBoard<Bool>()
![Page 44: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/44.jpg)
//先ほどのBoolをStringにしました。
var board = ArrayBoard<String>()board[3, 3] = "もう一回"board[3, 4] = "当たり"print(board[3, 3]!)print(board[3, 4]!)
![Page 45: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/45.jpg)
具体的なコードはリンク先にあります。Starを押してください。
https://github.com/daisukenagata/GenericsSample
よろしくお願いします。
![Page 46: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/46.jpg)
Swiftの場合は開発者側でコードの型を選び、
使用したら解放される。
objective-cの場合はコードのメモリの解放なども開発者が自分で設定しなくてはいけない。
![Page 47: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/47.jpg)
個人的にはgenericsを使うと引数や戻り値をよく考えるので
プログラミングを学ぶ上でも勉強になると思います。
![Page 48: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/48.jpg)
永田大祐フリーランスios歴1.5年週7日実施(少し他言語も)1日12時間〜20時間実施
![Page 49: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/49.jpg)
今までの活動
![Page 50: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/50.jpg)
登壇させていただきました。青葉台 カジュアルSwift勉強会様
Swift愛好会様ios馬場様
フリースタイルPort もくもく会様Realm Meet Up 様
AKIBA.swift 様第2回RxSwift勉強会 @ Sansan 様
![Page 51: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/51.jpg)
iosエンジニアニュースアプリ ReacticeCocoa Realm 使用相続税アプリ CoreData使用SDK Realmを使用漫画アプリ Obcセキュリティアプリ Obcカメラアプリ Obc
Androidアキパス
![Page 52: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/52.jpg)
仕事を手に入れるためにiosアプリ
![Page 53: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/53.jpg)
Androidアプリがこちら
![Page 54: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/54.jpg)
で
![Page 55: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/55.jpg)
実践業務を爆速でこなすtips
![Page 56: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/56.jpg)
Swift案件はgenericsが多用しています。
![Page 57: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/57.jpg)
class priceRide {
var price = 1
func addPrice(_ price:Int){
self.price += price
}
}
class subRide:priceRide {
var page = 1
}
func addPrice<T:priceRide>(_ data:T) -> T {
data.addPrice(13)
return data
}
![Page 58: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/58.jpg)
genericsが読めないと自分がデットロックします。
![Page 59: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/59.jpg)
1.コードを読めるようになる。
読めるようになるにはオブジェクト指向とプロトコル指向を学ぶ
![Page 60: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/60.jpg)
2.読むためのMac操作を覚える
⌘+B = build⌘+Shift + k = clean⌘+R = run ⌘+C = copy⌘+V = past
![Page 61: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/61.jpg)
⌘+Z = 戻る⌘+Shift + Z = 進むXcode内⌘+Ctr +→= クラスファイルを進む⌘+Ctr +←= クラスファイルを戻る⌘+A = Xcodeすべて選択⌘+I = インテント整形
![Page 62: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/62.jpg)
Xcode内⌘+Shift + F = キワード検索⌘+Shift + O = クラス検索
メソッドを選択して⌘+トラックパッドを押す = スーパクラスに辿れる。
![Page 63: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/63.jpg)
option + トラックパッドを押すパラメーターの紹介
![Page 64: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/64.jpg)
Mac内⌘+Shift +F4 =スクリーンショット
トラックパット3本指で横にスワイプ=画面移動トラックパット3本指で縦にスワイプ=画面の縮小
![Page 65: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/65.jpg)
もっとありますが自然とこういう操作ができるようになること
![Page 66: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/66.jpg)
3.モックとなるコードを記録する。サイトを用意しておく
![Page 67: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/67.jpg)
githubbitbucketswift docs
http://blog.personal-factory.com/tag/swift/リブレoffice
スプレッドシートgoogleのメモ帳などなど
![Page 68: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/68.jpg)
4.はまった点など記録する
![Page 69: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/69.jpg)
5.会話をアンラップしない
![Page 70: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/70.jpg)
大人は知らず知らず会話をgenericsのようなパラメーター
にして抽象化します。
![Page 71: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/71.jpg)
これはビジネスだとスピードが減速する原因と思います。
![Page 72: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/72.jpg)
いかに率直に伝えれるかがキーポイント
![Page 73: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/73.jpg)
率直になるほど、アンラップしていないので
それを補うために態度や行動で言語の
率直さをリカバリーします。
![Page 74: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/74.jpg)
まとめると
単刀直入にしゃべり態度では気を使う
この比率を場合で調整する。
![Page 75: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/75.jpg)
そうすることにより、言語が直接的なほどに意味が限定的になり
判断をする思考回路が短くなり
結果として作業のスピードが早くなります。
![Page 76: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/76.jpg)
覚悟と情熱、ビジョンがある方この方針をお勧めします。
![Page 77: 実践業務を爆速でこなすtipsとgenerics](https://reader031.fdocuments.net/reader031/viewer/2022020411/587123fa1a28abe4448b5b61/html5/thumbnails/77.jpg)
Swiftビギナーズ倶楽部 #swiftbg | Doorkeeper 様
コワーキングスペース茅場町 Co-Edo 様
登壇ありがとうございます。