SlideShare a Scribd company logo
1 of 34
Download to read offline
Deep dive into OSS written in Swift
yukiasai
・浅井勇樹 28歳
・Github : yukiasai
・出身:福井県 福井高専
・所属 : 株式会社マネーフォワード
・マネーフォワード - 自動家計簿アプリ
・経歴 : 株式会社ナチュラルスタイル
・ZOZOTOWN - ファッション通販アプリ
・WEAR - ファッションコーディネートアプリ
・得意 : iOS
・趣味 : コードリーディング
自己紹介
日常のコードリーディング
・通勤時間中はだいたいGithub
・おやすみ前もだいたいGithub
・Trending repositories - Github
・最近人気のリポジトリランキング
・Search Github - Github
・使い方がわからないクラスがあったらとりあえず検
索
・みんながどんな使い方をしているかわかる
社内でコードリーディング
・週1でSwiftコードリーディング会を開催
・全社のiOSエンジニアに知見を共有するのが目的
・有名どころから自作まで様々
・Alamofire
・Bond
・ObjectMapper
・SwiftTask
・などなど、、、
紹介するOSS
・Shoyu - yukiasai/Shoyu
・UITableViewをもっと簡単に
・Kaiseki - yukiasai/Kaiseki
・JSONのパースを自動で
Shoyu
UITableViewをもっと簡単に
UITableViewを普通に使うとこうなる
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 3
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
switch section {
case 0: return 5
case 1: return 3
default: fatalError()
}
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->
UITableViewCell {
switch (indexPath.section, indexPath.row) {
case (0, _):
let cell = tableView.dequeueReusableCellWithIdentifier("MemberCell") as! MemberTableViewCell
return cell
case (1, _):
let cell = tableView.dequeueReusableCellWithIdentifier("GroupCell") as! GroupTableViewCell
return cell
default:
fatalError()
}
}
UITableViewあるある
・デリゲートメソッドがswitch文(if文)地獄になる
・ビューの見た目とコードの見た目が乖離している
・どのセクションにどのローが表示されているか追うのが
大変
・switch文を一箇所いじるとほぼ全箇所に影響する
・バグの温床となる可能性が極めて高い
・カスタムセルを使う場合デリゲートメソッド内でいちいちキャ
ストしてやる必要がある
Shoyuだとこうなる
tableView.source = Source()
.createSection { section in
section.createRows(5) { (_, row: Row<MemberTableViewCell>) in
row.height = 52
row.configureCell = { cell, _ in }
row.didSelect = { _ in }
}
}
.createSection { section in
section.createRows(3) { (_, row: Row<GroupTableViewCell>) in
row.height = 52
row.configureCell = { cell, _ in }
row.didSelect = { _ in }
}
}
tableView.reloadData()
Shoyuの利点
・switch文(if文)地獄から開放される
・ビューの見た目とコードの見た目が近い
・セクションの追加、ローの追加がとっても楽ちん
Shoyuで使われているテクニック
・初期化クロージャ付きinit
・ジェネリクス対応のSectionとRow
初期化クロージャ付きinit
例えばRowのinit
init(@noescape closure: (Row<T> -> Void)) {
closure(self)
}
使うとき
let row = Row<XxxxCell>() {
$0.height = 52
}
利点
・インデントが一つ下がるのでコードが見やすくなる
・スコープをより小さく保つことができる
OSSでこんなのもありました
Then - devxoul/Then
let view = UIView().then {
$0.backgroundColor = UIColor.redColor()
}
ジェネリクス対応のSectionとRow
ジェネリック対応のSectionとRow
public class Section<HeaderType: UIView, FooterType: UIView>: SectionType {
// ごにょごにょ
}
public class Row<T: UITableViewCell>: RowType {
// ごにょごにょ
}
利点
・ビューのタイプが確定するのでタイプセーフが貫ける
・デリゲートでいちいちキャストするみたいなのをしなくて良い
今一度コードを見てみる
tableView.source = Source()
.createSection { section in
section.createRows(5) { (_, row: Row<MemberTableViewCell>) in
row.height = 52
row.configureCell = { cell, _ in } // <- このcellのタイプはMemberTableViewCell
になる
row.didSelect = { _ in }
}
}
.createSection { section in
section.createRows(3) { (_, row: Row<GroupTableViewCell>) in
row.height = 52
row.configureCell = { cell, _ in } // <- このcellのタイプはGroupTableViewCellに
なる
row.didSelect = { _ in }
}
}
tableView.reloadData()
今後対応したいこと
・UICollectionView対応
・遅延評価対応
Kaiseki
JSONのパースを自動で
Kaisekiを使うとこうなる
こんなオブジェクトを宣言
class Object: Entity {
// Basic
let int = Property<Int>()
let string = Property<String>()
// Array
let array = Property<[Bool]>()
// Optional
let optional = Property<Int?>()
// Entity
let object = Property<Object?>()
}
使い方
let json: [String: AnyObject] = [“int”: 1, “string”: “aaa”, “array”: [true, false], “optional”: null, ....]
let obj = Object.fromJSON(json: jsonData)
obj.int.value // -> 1
obj.string.value // -> aaa
Kaisekiで使われているテクニック
・Mirrorを用いた自動マッピング
・プロトコルで構造体(Int,Optional,Array)を拡張
Mirrorを用いた自動マッピング
Mirrorを用いた自動マッピング
Mirror : SwiftのリフレクションAPI
class Object {
var id: Int = 0
var name: String = ""
}
let obj = Object()
Mirror(reflecting: obj).children.forEach { child in
print(child)
}
出力
(Optional("id"), 0)
(Optional("name"), "")
・プロパティ名と値がとれるので、、
・JSONのキー名とプロパティ名を付け合わせてパースする!
Entityクラス
public class Entity: ValueType {
typealias ReflectedProperty = (label: String, property: PropertyType)
private lazy var reflectedProperties: [ReflectedProperty] = {
return Mirror(reflecting: self).children.filter { $1 is PropertyType }.flatMap {($0!, $1 as! PropertyType)}
}()
public static func fromJSON(json: AnyObject?) -> Self? {
// …
reflectedProperties.forEach {
let key = $1.keyWith($0)
if let value = dic[key] {
$1.fromJSON(value)
}
}
}
}
Propertyクラス
・なぜProperyクラスでラップしているか?
・Mirrorで取得できるChildが構造体(タプル)
・値を取得はできるものの変更することができない
・Child.valueがクラスの場合は参照が渡ってくる
・Property.valueを変更することで間接的に値を変更する
public class Property<Value: ValueType>: PropertyType {
public var value
public func fromJSON(json: AnyObject) {
if json is NSNull {
if let value = Value.fromJSON(nil) where Value.isOptional {
self.value = value
}
return
}
if let value = Value.fromJSON(json) {
self.value = value
}
}
}
ValueType
・Property<ValueType>に指定できるValueType一覧
・Bool
・Int
・Float
・Double
・String
・Optinal
・Array
今一度サンプルコードを見てみる
こんなオブジェクトを宣言
class Object: Entity {
// Basic
let int = Property<Int>()
let string = Property<String>()
// Array
let array = Property<[Bool]>()
// Optional
let optional = Property<Int?>()
// Entity
let object = Property<Object?>()
}
使い方
let json: [String: AnyObject] = [“int”: 1, “string”: “aaa”, “array”: [true, false], “optional”: null, ....]
let obj = Object.fromJSON(json: jsonData)
obj.int.value // -> 1
obj.string.value // -> aaa
プロトコルで構造体(Int,Optional,Array)を拡張
Optionalの例を紹介
Optional<T>をValueTypeで拡張
public protocol ValueType {
static func fromJSON(json: AnyObject?) -> Self?
func toJSON() -> AnyObject?
}
extension Optional: ValueType {
public static func fromJSON(json: AnyObject?) -> Wrapped?? {
guard let valueType = Wrapped.self as? ValueType.Type,
let value = valueType.fromJSON(json),
let wrapped = value as? Wrapped else {
return .Some(.None)
}
return .Some(.Some(wrapped))
}
public func toJSON() -> AnyObject? {
switch self {
case .Some(let wrapped):
guard let value = wrapped as? ValueType else {
return nil
}
return value.toJSON()
case .None:
return nil
}
}
}
どういうこと?
static func fromJSON
let optionalInt = Int?.fromJSON(json: 1)
print(optionalInt) // -> Optional<Optional(1)>
if let unwrappedOptinalInt = optionalInt {
print(unwrappedOptionalInt) // -> Optional(1)
}
・上記のコードはOptional<Int>へのスタティックメソッド呼び出し
・fromJSONはSelf?を返すので、optionalIntの型はOptional<Optional<Int>>になる
func toJSON(instance func)
let json = optionalInt.toJSON()
・Optional<Int>に追加されたtoJSONを呼び出している
Propertyクラスで行われていること
public class Property<Value: ValueType>: PropertyType {
public var value: Value
public func fromJSON(json: AnyObject) {
// ...NSNullの処理
if let value = Value.fromJSON(json) { // <- ここ
self.value = value
}
}
public func toJSON() -> AnyObject? {
if let json = value.toJSON() {
return json
}
// ...NSNullの処理
return nil
}
}
今後対応したいこと
・Property.valueへのアクセスをもっと簡単にしたい
・Property<Bool>をBoolと同様に扱えるようにしたい
・
紹介したOSS
・Shoyu - yukiasai/Shoyu
・UITableViewをもっと簡単に
・Kaiseki - yukiasai/Kaiseki
・JSONのパースを自動で
Thank you!
yukiasai

More Related Content

What's hot

GoF デザインパターン 2009
GoF デザインパターン 2009GoF デザインパターン 2009
GoF デザインパターン 2009miwarin
 
Swift 2.0 で変わったところ「前編」 #cswift
Swift 2.0 で変わったところ「前編」 #cswiftSwift 2.0 で変わったところ「前編」 #cswift
Swift 2.0 で変わったところ「前編」 #cswiftTomohiro Kumagai
 
Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムYuichi Yoshida
 
Pattern match with case class
Pattern match with case classPattern match with case class
Pattern match with case classKai Sasaki
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftTomohiro Kumagai
 
可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswift可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswiftTomohiro Kumagai
 
Perlでちょいモテデザインパターン
PerlでちょいモテデザインパターンPerlでちょいモテデザインパターン
PerlでちょいモテデザインパターンYuki Manno
 
Swift の可変値と不変値 #cocoa_kansai
Swift の可変値と不変値 #cocoa_kansaiSwift の可変値と不変値 #cocoa_kansai
Swift の可変値と不変値 #cocoa_kansaiTomohiro Kumagai
 
Swift 3 その基本ルールを眺める #cswift
Swift 3 その基本ルールを眺める #cswiftSwift 3 その基本ルールを眺める #cswift
Swift 3 その基本ルールを眺める #cswiftTomohiro Kumagai
 
What is doobie? - database access for scala -
What is doobie? - database access for scala -What is doobie? - database access for scala -
What is doobie? - database access for scala -chibochibo
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRubyemasaka
 
SlowQueryとの戦い
SlowQueryとの戦いSlowQueryとの戦い
SlowQueryとの戦いKen Gotoh
 
よいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれたよいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれたMoriyoshi Koizumi
 
JavaScript入門-基礎編
JavaScript入門-基礎編JavaScript入門-基礎編
JavaScript入門-基礎編mactkg
 
JavaScript超入門 基礎
JavaScript超入門 基礎JavaScript超入門 基礎
JavaScript超入門 基礎tetsu6
 
ジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansaiジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansaiTomohiro Kumagai
 

What's hot (20)

GoF デザインパターン 2009
GoF デザインパターン 2009GoF デザインパターン 2009
GoF デザインパターン 2009
 
Swift 2.0 で変わったところ「前編」 #cswift
Swift 2.0 で変わったところ「前編」 #cswiftSwift 2.0 で変わったところ「前編」 #cswift
Swift 2.0 で変わったところ「前編」 #cswift
 
Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウム
 
Pattern match with case class
Pattern match with case classPattern match with case class
Pattern match with case class
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
 
可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswift可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswift
 
Perlでちょいモテデザインパターン
PerlでちょいモテデザインパターンPerlでちょいモテデザインパターン
Perlでちょいモテデザインパターン
 
Swift の可変値と不変値 #cocoa_kansai
Swift の可変値と不変値 #cocoa_kansaiSwift の可変値と不変値 #cocoa_kansai
Swift の可変値と不変値 #cocoa_kansai
 
mishimasyk#4
mishimasyk#4mishimasyk#4
mishimasyk#4
 
Swift 3 その基本ルールを眺める #cswift
Swift 3 その基本ルールを眺める #cswiftSwift 3 その基本ルールを眺める #cswift
Swift 3 その基本ルールを眺める #cswift
 
What is doobie? - database access for scala -
What is doobie? - database access for scala -What is doobie? - database access for scala -
What is doobie? - database access for scala -
 
春のJs祭り2015 lt
春のJs祭り2015 lt春のJs祭り2015 lt
春のJs祭り2015 lt
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRuby
 
Griffon10 in groovy_fx
Griffon10 in groovy_fxGriffon10 in groovy_fx
Griffon10 in groovy_fx
 
SlowQueryとの戦い
SlowQueryとの戦いSlowQueryとの戦い
SlowQueryとの戦い
 
MlnagoyaRx
MlnagoyaRxMlnagoyaRx
MlnagoyaRx
 
よいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれたよいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれた
 
JavaScript入門-基礎編
JavaScript入門-基礎編JavaScript入門-基礎編
JavaScript入門-基礎編
 
JavaScript超入門 基礎
JavaScript超入門 基礎JavaScript超入門 基礎
JavaScript超入門 基礎
 
ジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansaiジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansai
 

Viewers also liked

Core dataと比較してrealmを使ったまとめ
Core dataと比較してrealmを使ったまとめCore dataと比較してrealmを使ったまとめ
Core dataと比較してrealmを使ったまとめFumiya Sakai
 
Oss written in swift
Oss written in swiftOss written in swift
Oss written in swiftYuki Asai
 
iOSエンジニアの最近 株式会社マネーフォワード
iOSエンジニアの最近 株式会社マネーフォワードiOSエンジニアの最近 株式会社マネーフォワード
iOSエンジニアの最近 株式会社マネーフォワードYuki Asai
 
デザインにもこだわったUiの事始め3
デザインにもこだわったUiの事始め3デザインにもこだわったUiの事始め3
デザインにもこだわったUiの事始め3Fumiya Sakai
 
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説Fumiya Sakai
 
GitLab CI の布教 for iOS
GitLab CI の布教 for iOSGitLab CI の布教 for iOS
GitLab CI の布教 for iOSIkada Kaori
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 

Viewers also liked (7)

Core dataと比較してrealmを使ったまとめ
Core dataと比較してrealmを使ったまとめCore dataと比較してrealmを使ったまとめ
Core dataと比較してrealmを使ったまとめ
 
Oss written in swift
Oss written in swiftOss written in swift
Oss written in swift
 
iOSエンジニアの最近 株式会社マネーフォワード
iOSエンジニアの最近 株式会社マネーフォワードiOSエンジニアの最近 株式会社マネーフォワード
iOSエンジニアの最近 株式会社マネーフォワード
 
デザインにもこだわったUiの事始め3
デザインにもこだわったUiの事始め3デザインにもこだわったUiの事始め3
デザインにもこだわったUiの事始め3
 
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
 
GitLab CI の布教 for iOS
GitLab CI の布教 for iOSGitLab CI の布教 for iOS
GitLab CI の布教 for iOS
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 

Similar to Deep dive into oss written in swift

探検!SwiftyJSON
探検!SwiftyJSON探検!SwiftyJSON
探検!SwiftyJSONYuka Ezura
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?Kenji Nakamura
 
インメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギインメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギMasaki Yamakawa
 
Roslyn による Visual Studio のアドイン
Roslyn による Visual Studio のアドインRoslyn による Visual Studio のアドイン
Roslyn による Visual Studio のアドインFujio Kojima
 
学生向けAndroid勉強会(入門編)
学生向けAndroid勉強会(入門編)学生向けAndroid勉強会(入門編)
学生向けAndroid勉強会(入門編)Itsuki Kuroda
 
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ ver1.1
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ ver1.124時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ ver1.1
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ ver1.1聡 中川
 
XPagesDay 2015 RESTの総復習
XPagesDay 2015 RESTの総復習XPagesDay 2015 RESTの総復習
XPagesDay 2015 RESTの総復習Masahiko Miyo
 
J qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかJ qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかHisashi Aruji
 
20110714 j queryベーシック
20110714 j queryベーシック20110714 j queryベーシック
20110714 j queryベーシック良太 増子
 
Marionettejs getting started
Marionettejs getting startedMarionettejs getting started
Marionettejs getting startedKyohei Morimoto
 
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackTakahiro Yoshimura
 
PHPerのためのSwift入門
PHPerのためのSwift入門PHPerのためのSwift入門
PHPerのためのSwift入門Tomoki Hasegawa
 
Template method #dezapatan
Template method #dezapatanTemplate method #dezapatan
Template method #dezapatankuidaoring
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜JustSystems Corporation
 

Similar to Deep dive into oss written in swift (20)

探検!SwiftyJSON
探検!SwiftyJSON探検!SwiftyJSON
探検!SwiftyJSON
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?
 
Ll xcode
Ll xcodeLl xcode
Ll xcode
 
APIKit
APIKitAPIKit
APIKit
 
jQuery超入門編
jQuery超入門編jQuery超入門編
jQuery超入門編
 
インメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギインメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギ
 
Teclab3
Teclab3Teclab3
Teclab3
 
Roslyn による Visual Studio のアドイン
Roslyn による Visual Studio のアドインRoslyn による Visual Studio のアドイン
Roslyn による Visual Studio のアドイン
 
学生向けAndroid勉強会(入門編)
学生向けAndroid勉強会(入門編)学生向けAndroid勉強会(入門編)
学生向けAndroid勉強会(入門編)
 
Scala with DDD
Scala with DDDScala with DDD
Scala with DDD
 
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ ver1.1
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ ver1.124時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ ver1.1
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ ver1.1
 
XPagesDay 2015 RESTの総復習
XPagesDay 2015 RESTの総復習XPagesDay 2015 RESTの総復習
XPagesDay 2015 RESTの総復習
 
J qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかJ qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているか
 
20110714 j queryベーシック
20110714 j queryベーシック20110714 j queryベーシック
20110714 j queryベーシック
 
Refactoring point of Kotlin application
Refactoring point of Kotlin applicationRefactoring point of Kotlin application
Refactoring point of Kotlin application
 
Marionettejs getting started
Marionettejs getting startedMarionettejs getting started
Marionettejs getting started
 
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hack
 
PHPerのためのSwift入門
PHPerのためのSwift入門PHPerのためのSwift入門
PHPerのためのSwift入門
 
Template method #dezapatan
Template method #dezapatanTemplate method #dezapatan
Template method #dezapatan
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 

Recently uploaded

プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 

Recently uploaded (7)

プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 

Deep dive into oss written in swift