SlideShare a Scribd company logo
Swift
by Ray Fix for iOSDC
Ray Fix
Photo by Renato Sanchez Lozada on Unsplash
iOSDC 

RayWenderlich.com
Ray Ray Wenderlich 😉
REVOLVE
REVOLVE
Swift
Swift Python R
•
• Swift
•
• Swift
•
• Swift
WWDC 2017 — fox2
https://developer.apple.com/videos/play/wwdc2017/604/
WWDC 2017 — fox2
https://developer.apple.com/videos/play/wwdc2017/604/
WWDC 2017 — ARKit
https://developer.apple.com/videos/play/wwdc2017/602/
WWDC 2017 — ARKit
https://developer.apple.com/videos/play/wwdc2017/602/
Fall 2017 — ARFaceAnchor
https://developer.apple.com/documentation/arkit/arfaceanchor?changes=latest_beta
I❤Swift
I❤Swift
https://github.com/rayfix/TypedTransforms
視覚化とSwiftのタイプについて
視覚化とSwiftのタイプについて
degrees radians
protocol AngleProtocol {
}
associatedtype TT
protocol AngleProtocol {
}
associatedtype T
protocol AngleProtocol {
}
associatedtype Real
protocol AngleProtocol {
}
associatedtype Real : FloatingPoint
AngleProtocol
protocol AngleProtocol {
associatedtype Real: FloatingPoint
init(radians: Real)
var radians: Real { set get }
}
(1)
extension AngleProtocol {
}
(1)
extension AngleProtocol {
}
static func +(lhs: Self, rhs: Self) -> Self {
return Self(radians: lhs.radians + rhs.radians)
}
(1)
extension AngleProtocol {
}
static func +=(lhs: inout Self, rhs: Self) {
lhs = lhs + rhs
}
static func +(lhs: Self, rhs: Self) -> Self {
return Self(radians: lhs.radians + rhs.radians)
}
(2)
extension AngleProtocol {
}
(2)
extension AngleProtocol {
}
static prefix func -(angle: Self) -> Self {
return Self(radians: -angle.radians)
}
(2)
extension AngleProtocol {
}
static prefix func -(angle: Self) -> Self {
return Self(radians: -angle.radians)
}
static func -(lhs: Self, rhs: Self) -> Self {
return lhs+(-rhs)
}
(2)
extension AngleProtocol {
}
static prefix func -(angle: Self) -> Self {
return Self(radians: -angle.radians)
}
static func -(lhs: Self, rhs: Self) -> Self {
return lhs+(-rhs)
}
static func -=(lhs: inout Self, rhs: Self) {
lhs = lhs - rhs
}
(3)
extension AngleProtocol {
}
(3)
extension AngleProtocol {
}
static func *(multiple: Real, angle: Self) -> Self {
return Self(radians: multiple * angle.radians)
}
(3)
extension AngleProtocol {
}
static func *(multiple: Real, angle: Self) -> Self {
return Self(radians: multiple * angle.radians)
}
static func *(angle: Self, multiple: Real) -> Self {
return multiple * angle
}
(3)
extension AngleProtocol {
}
static func *(multiple: Real, angle: Self) -> Self {
return Self(radians: multiple * angle.radians)
}
static func *(angle: Self, multiple: Real) -> Self {
return multiple * angle
}
static func /(angle: Self, divisor: Real) -> Self {
return angle * (1/divisor)
}
extension AngleProtocol: Hashable, Comparable {
} Stepanov, Alexander; McJones, Paul (2009). Elements of Programming. Addison-Wesley. ISBN 978-0-321-63537-2.
extension AngleProtocol: Hashable, Comparable {
}
static func ==(lhs: Self, rhs: Self) -> Bool {
return lhs.radians == rhs.radians
}
Stepanov, Alexander; McJones, Paul (2009). Elements of Programming. Addison-Wesley. ISBN 978-0-321-63537-2.
extension AngleProtocol: Hashable, Comparable {
}
static func ==(lhs: Self, rhs: Self) -> Bool {
return lhs.radians == rhs.radians
}
var hashValue: Int {
return radians.hashValue
}
Stepanov, Alexander; McJones, Paul (2009). Elements of Programming. Addison-Wesley. ISBN 978-0-321-63537-2.
extension AngleProtocol: Hashable, Comparable {
}
static func ==(lhs: Self, rhs: Self) -> Bool {
return lhs.radians == rhs.radians
}
var hashValue: Int {
return radians.hashValue
}
static func <(lhs: Self, rhs: Self) -> Bool {
return lhs.radians < rhs.radians
}
Stepanov, Alexander; McJones, Paul (2009). Elements of Programming. Addison-Wesley. ISBN 978-0-321-63537-2.
protocol AngleDegreesConvertible: AngleProtocol {
init(degrees: Real)
var degrees: Real { set get }
static var radiansToDegrees: Real { get }
}
(1)
extension AngleDegreesConvertible {
var degrees: Real {
get {
return radians * Self.radiansToDegrees
}
}
}
(1)
extension AngleDegreesConvertible {
var degrees: Real {
get {
return radians * Self.radiansToDegrees
}
}
}
radiansToDegrees
(1)
extension AngleDegreesConvertible {
var degrees: Real {
get {
return radians * Self.radiansToDegrees
}
}
}
radiansToDegrees
radiansToDegreesradians
(1)
extension AngleDegreesConvertible {
var degrees: Real {
get {
return radians * Self.radiansToDegrees
}
}
}
radiansToDegrees
radiansToDegrees degrees
(2)
init(degrees: Real) {
self.init(radians: degrees * Self.radiansToDegrees)
}
(2)
init(degrees: Real) {
self.init(radians: degrees * Self.radiansToDegrees)
}
(2)
init(degrees: Real) {
self.init(radians: degrees * Self.radiansToDegrees)
}
Inverse Transform
(2)
init(degrees: Real) {
self.init(radians: degrees * Self.radiansToDegrees)
}
ToDegreesradians
Inverse Transform
(2)
init(degrees: Real) {
self.init(radians: degrees * Self.radiansToDegrees)
}
ToDegrees radians
Inverse Transform
Radiansdegrees
(2)
init(degrees: Real) {
self.init(radians: degrees * Self.radiansToDegrees)
}
(2)
init(degrees: Real) {
self.init(radians: degrees * Self.radiansToDegrees)
}
(2)
init(degrees: Real) {
self.init(radians: degrees * Self.radiansToDegrees)
}
init(degrees: Real) {
let degreesToRadians = 1 / Self.radiansToDegrees
self.init(radians: degrees * degreesToRadians)
}
(2)
init(degrees: Real) {
self.init(radians: degrees * Self.radiansToDegrees)
}
init(degrees: Real) {
let degreesToRadians = 1 / Self.radiansToDegrees
self.init(radians: degrees * degreesToRadians)
}
(2)
init(degrees: Real) {
self.init(radians: degrees * Self.radiansToDegrees)
}
init(degrees: Real) {
let degreesToRadians = 1 / Self.radiansToDegrees
self.init(radians: degrees * degreesToRadians)
}
var degrees: Real {
set(newDegrees) {
let degreesToRadians = 1 / Self.radiansToDegrees
radians = newDegrees * degreesToRadians
}
}
(3)
var degrees: Real {
set(newDegrees) {
let degreesToRadians = 1 / Self.radiansToDegrees
radians = newDegrees * degreesToRadians
}
}
(3)
var degrees: Real {
set(newDegrees) {
let degreesToRadians = 1 / Self.radiansToDegrees
radians = newDegrees * degreesToRadians
}
}
(3)
To
🐶
🐕
🐩 😸
🐈
😽
To
🐶
🐕
🐩 😸
🐈
😽
To
🐶
🐕
🐩😸
🐈
😽
protocol AngleProtocol {
associatedtype Real:
init(radians: Real)
var radians: Real { set get }
}
FloatingPoint
protocol AngleProtocol {
associatedtype Real:
init(radians: Real)
var radians: Real { set get }
}
FloatingPoint
protocol AngleProtocol {
associatedtype Real:
init(radians: Real)
var radians: Real { set get }
}
TrigonometricFloatingPoint
protocol AngleProtocol {
associatedtype Real:
init(radians: Real)
var radians: Real { set get }
}
TrigonometricFloatingPoint
protocol TrigonometricFloatingPoint: FloatingPoint {
static func sine(radians: Self) -> Self
static func cosine(radians: Self) -> Self
}
sin
sin
func sin(_ angle: AngleProtocol) -> ???? {
}
sin
func sin(_ angle: AngleProtocol) -> ???? {
}
sin
func sin<A: AngleProtocol>(_ angle: A) -> A.Real {
return A.Real.sine(radians: angle.radians)
}
func sin(_ angle: AngleProtocol) -> ???? {
}
CGAngle
struct CGAngle: AngleDegreesConvertible {
var radians: CGFloat
static var radiansToDegrees: CGFloat {
return 180/CGFloat.pi
}
}
😍
CGAngle
struct CGAngle: AngleDegreesConvertible {
var radians: CGFloat
static var radiansToDegrees: CGFloat {
return 180/CGFloat.pi
}
}
😍
視覚化とSwiftのタイプについて
視覚化とSwiftのタイプについて
protocol Point2DProtocol {
associatedtype Scalar: FloatingPoint
init(_ x: Scalar, _ y: Scalar)
var x: Scalar { get set }
var y: Scalar { get set }
}
…
static func +(lhs: Self, rhs: Self) -> Self {
return Self(lhs.x + rhs.x, lhs.y + rhs.y)
}
static prefix func -(p: Self) -> Self {
return Self(-p.x, -p.y)
}
static func -(lhs: Self, rhs: Self) -> Self {
return lhs+(-rhs)
}
extension Point2DProtocol {
}
…
extension Point2DProtocol {
}
var lengthSquared: Scalar {
return self*self
}
var length: Scalar {
return lengthSquared.squareRoot()
}
func projected(on other: Self) -> Self {
return ((self*other)/(other*other))*other
}
🤠
extension CGPoint: Point2DProtocol {
public init(_ x: CGFloat, _ y: CGFloat) {
self.x = x
self.y = y
}
}
💯
let newPoint = transform * point
[ ]a
db
c
[x
y
]=[ax + cy
]bx + dy
let newPoint = transform * point
[ ]a
db
c
1
tx
ty
0 0 [x
y
1 ]=[ax + cy + tx
1 ]bx + dy + ty
視覚化とSwiftのタイプについて
CGAffineTransform
CGAffineTransform
Think Different
CGAffineTransform
Think Different
][ax + cy + tx 1bx + dy + ty
[ ]a
d
b
c
1tx ty
0
0
[x y 1
]=
let newPoint = transform * point
][ax + cy + tx 1bx + dy + ty
[ ]a
d
b
c
1tx ty
0
0
[x y 1
]=
let newPoint = transform * point
][ax + cy + tx 1bx + dy + ty
[ ]a
d
b
c
1tx ty
0
0
[x y 1
]=
let newPoint = transform * point
let newPoint = point * transform
][ax + cy + tx 1bx + dy + ty
[ ]a
d
b
c
1tx ty
0
0
[x y 1
]=
A
C
(0, 0)
A
C
(7, 7)
xa = (7, 7)
(0, 0)
A
C
(7, 7)
yc = xa * aToC
xa = (7, 7)
(0, 0)
A
C
(7, 7)
(1,0)
yc = xa * aToC
xa = (7, 7)
yc == (1, 0)
(0, 0)
A
C
(7, 7)
(1,0)
yc = xa * aToC
xa = (7, 7)
yc == (1, 0)
yc * aToC
(0, 0)
A
C
(7, 7)
(1,0)
yc = xa * aToC
xa = (7, 7)
yc == (1, 0)
yc * aToC
(0, 0)
A
A
B
A
C
A
C
aToB * bToC
A
C
aToB * bToC
aToC
=
[ ]1
10
0
1
0
0
tx ty [ ]sx
sy0
0
1
0
0
0 0 [ ]
cos a
cos a-sin a
sin a
1
0
0
0 0
translation scale rotation
[ ]1
10
0
1
0
0
0 0
identity
[ ]-1
10
0
1
0
0
0 0
horizontal flip
[ ]1
-10
0
1
0
0
0 0
vertical flip
ctm
[ ]2
-20
0
1
0
0
0 1096
userToDevice
CGAffineTransform
extension CGAffineTransform {
static func *(point: CGPoint, transform: CGAffineTransform)
-> CGPoint
{
return point.applying(transform)
}
static func *(lhs: CGAffineTransform, rhs: CGAffineTransform)
-> CGAffineTransform
{
return lhs.concatenating(rhs)
}
}
modelToDevice = modelToUser * userToDevice
devicePoint = userPoint * userToDevice
2
let house: [CGPoint] = [CGPoint(1,-1),
CGPoint(1,1),
CGPoint(0,2),
CGPoint(-1,1),
CGPoint(-1,-1)]
2
let house: [CGPoint] = [CGPoint(1,-1),
CGPoint(1,1),
CGPoint(0,2),
CGPoint(-1,1),
CGPoint(-1,-1)]
context.saveGState()
defer {
context.restoreGState()
}
let userToDevice = context.ctm
context.concatenate(userToDevice.inverted())
2
let modelToUser =
CGAffineTransform(scaleX: 1, y: -1) *
CGAffineTransform(scaleX: 100, y: 100) *
CGAffineTransform(translationX: bounds.width/2,
y: bounds.height/2)
2
let modelToUser =
CGAffineTransform(scaleX: 1, y: -1) *
CGAffineTransform(scaleX: 100, y: 100) *
CGAffineTransform(translationX: bounds.width/2,
y: bounds.height/2)
let modelToDevice = modelToUser * userToDevice
context.concatenate(modelToDevice)
2
context.move(to: house.first!)
house.dropFirst().forEach { context.addLine(to: $0)}
context.closePath()
context.strokePath()
protocol CoordinateSpace {}
enum ModelSpace: CoordinateSpace {}
enum UserSpace: CoordinateSpace {}
enum DeviceSpace: CoordinateSpace {}
struct CGPointT<Space: CoordinateSpace>: Point2DProtocol {
var xy: CGPoint
:
}
let house: [CGPointT<ModelSpace>] = [CGPointT(1,-1),
CGPointT(1,1),
CGPointT(0,2),
CGPointT(-1,1),
CGPointT(-1,-1)]
struct CGAffineTransformT<From: CoordinateSpace,
To: CoordinateSpace>
{
var matrix: CGAffineTransform
public func inverted() -> CGAffineTransformT<To,From> {
return CGAffineTransformT<To,From>(matrix.inverted())
}
}
struct CGAffineTransformT<From: CoordinateSpace,
To: CoordinateSpace>
{
var matrix: CGAffineTransform
public func inverted() -> CGAffineTransformT<To,From> {
return CGAffineTransformT<To,From>(matrix.inverted())
}
}
public func * <From,To,I>(from: CGAffineTransformT<From, I>,
to: CGAffineTransformT<I, To>) ->
CGAffineTransformT<From, To>
{
return CGAffineTransformT<From,To>
(from.matrix.concatenating(to.matrix))
}
To
🐶
🐕
🐩 😸
🐈
😽
To
🐶
🐕
🐩 😸
🐈
😽
To
😸
🐈
😽
To
😸
🐈
😽
ARKit 3
SIMD
[ ]matrix_float4x4
[ ]float4
post multiply To
[ ]float4
ARKit 3
From
worldFromCameralet worldPoint = * cameraPoint
float4_t
struct float4_t<Space: CoordinateSpace> {
var point: float4
init(_ point: float4) {
self.point = point
}
}
matrix_float4x4_t
struct matrix_float4x4_t<To: CoordinateSpace,
From: CoordinateSpace> {
var matrix: matrix_float4x4
init(_ matrix: matrix_float4x4) {
self.matrix = matrix
}
}
extension matrix_float4x4_t {
static func *<To, From>(lhs: matrix_float4x4_t<To, From>,
rhs: float4_t<From>) -> float4_t<To>
{
return float4_t<To>(lhs.matrix * rhs.point)
}
}
transform
transform
transform
cameraFromWorld
worldFromCamera
transform
cameraFromWorld
worldFromCamera
視覚化とSwiftのタイプについて
final class TypedTransforms<Base> {
let base: Base
init(_ base: Base) {
self.base = base
}
}
final class TypedTransforms<Base> {
let base: Base
init(_ base: Base) {
self.base = base
}
}
protocol TypedTransformAdditions {
associatedtype Typed
var typed: Typed { get }
}
final class TypedTransforms<Base> {
let base: Base
init(_ base: Base) {
self.base = base
}
}
protocol TypedTransformAdditions {
associatedtype Typed
var typed: Typed { get }
}
extension TypedTransformAdditions {
var typed: TypedTransforms<Self> {
return TypedTransforms(self)
}
}
視覚化とSwiftのタイプについて
extension ARCamera: TypedTransformAdditions {}
extension TypedTransforms where Base: ARCamera {
var worldFromCamera: matrix_float4x4_t<WorldSpace,
CameraSpace>
{
return matrix_float4x4_t(base.transform)
}
}
extension ARCamera: TypedTransformAdditions {}
let worldFromCamera =
frame.camera.typed.worldFromCamera
let shotDirectionCamera =
float4_t<CameraSpace>(float4(0, 0, -3, 1))
let shotDirectionWorld = worldFromCamera *
shotDirectionCamera
let direction =
SCNVector3(float4: shotDirectionWorld.point)
let worldFromCamera =
frame.camera.typed.worldFromCamera
let position =
SCNVector3(float4: worldFromCamera.matrix.columns.3)
[ ]
matrix_float4x4
tx
ty
tz
1
0 21 3
let ball = Ball()
ball.position = position
ball.physicsBody?.applyForce(direction,
asImpulse: true)
sceneView.scene.rootNode.addChildNode(ball)
視覚化とSwiftのタイプについて
視覚化とSwiftのタイプについて
視覚化とSwiftのタイプについて

More Related Content

PPT
jimmy hacking (at) Microsoft
PDF
Ray Tracing with ZIO
PDF
Ray tracing with ZIO-ZLayer
PDF
The Ring programming language version 1.5.3 book - Part 87 of 184
PPT
Queue implementation
PDF
The Ring programming language version 1.3 book - Part 25 of 88
PDF
"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)
PDF
Apache PIG - User Defined Functions
jimmy hacking (at) Microsoft
Ray Tracing with ZIO
Ray tracing with ZIO-ZLayer
The Ring programming language version 1.5.3 book - Part 87 of 184
Queue implementation
The Ring programming language version 1.3 book - Part 25 of 88
"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)
Apache PIG - User Defined Functions

What's hot (20)

PDF
Делаем пользовательское Api на базе Shapeless
ZIP
Intro to Pig UDF
PDF
openCypher Technology Compatibility Kit (TCK)
PDF
Compositional I/O Stream in Scala
PDF
The Ring programming language version 1.5.4 book - Part 77 of 185
TXT
F(3)
PPTX
Lecture 5, c++(complete reference,herbet sheidt)chapter-15
PDF
FS2 for Fun and Profit
PDF
The Ring programming language version 1.9 book - Part 90 of 210
PPTX
operator overloading
PDF
Higher Order Components and Render Props
PPTX
Command line arguments
PDF
Rcpp11 genentech
PPTX
Mca 2nd sem u-4 operator overloading
PPSX
Scala @ TomTom
PPTX
Variadic functions
PDF
The Ring programming language version 1.5.1 book - Part 20 of 180
PDF
Functional Stream Processing with Scalaz-Stream
PDF
The Ring programming language version 1.5.2 book - Part 21 of 181
PDF
The Ring programming language version 1.9 book - Part 94 of 210
Делаем пользовательское Api на базе Shapeless
Intro to Pig UDF
openCypher Technology Compatibility Kit (TCK)
Compositional I/O Stream in Scala
The Ring programming language version 1.5.4 book - Part 77 of 185
F(3)
Lecture 5, c++(complete reference,herbet sheidt)chapter-15
FS2 for Fun and Profit
The Ring programming language version 1.9 book - Part 90 of 210
operator overloading
Higher Order Components and Render Props
Command line arguments
Rcpp11 genentech
Mca 2nd sem u-4 operator overloading
Scala @ TomTom
Variadic functions
The Ring programming language version 1.5.1 book - Part 20 of 180
Functional Stream Processing with Scalaz-Stream
The Ring programming language version 1.5.2 book - Part 21 of 181
The Ring programming language version 1.9 book - Part 94 of 210
Ad

Similar to 視覚化とSwiftのタイプについて (20)

PDF
Fighting history of CGFloat in Swift
PDF
Hidden Gems in Swift
PDF
A swift introduction to Swift
PDF
Pooya Khaloo Presentation on IWMC 2015
PDF
Minimizing Decision Fatigue to Improve Team Productivity
PDF
AppKitでお絵描きしてみよう
PDF
Read carefully. Im not sure if the point class is correct but postin.pdf
PDF
Stanfy MadCode Meetup #9: Functional Programming 101 with Swift
PDF
7 Habits For a More Functional Swift
PDF
Swift core
PDF
What Swift can teach us all
PDF
Value Objects, Full Throttle (to be updated for spring TC39 meetings)
PDF
An introduction to functional programming with Swift
PDF
09 Jo P Sep 07
PDF
Funcitonal Swift Conference: The Functional Way
PDF
Swift Type System
PDF
Denis Lebedev, Swift
PDF
Swift Programming
PDF
Swift Introduction
PDF
Pst eucl-doc
Fighting history of CGFloat in Swift
Hidden Gems in Swift
A swift introduction to Swift
Pooya Khaloo Presentation on IWMC 2015
Minimizing Decision Fatigue to Improve Team Productivity
AppKitでお絵描きしてみよう
Read carefully. Im not sure if the point class is correct but postin.pdf
Stanfy MadCode Meetup #9: Functional Programming 101 with Swift
7 Habits For a More Functional Swift
Swift core
What Swift can teach us all
Value Objects, Full Throttle (to be updated for spring TC39 meetings)
An introduction to functional programming with Swift
09 Jo P Sep 07
Funcitonal Swift Conference: The Functional Way
Swift Type System
Denis Lebedev, Swift
Swift Programming
Swift Introduction
Pst eucl-doc
Ad

Recently uploaded (20)

PDF
AI-Powered Threat Modeling: The Future of Cybersecurity by Arun Kumar Elengov...
PDF
Cost to Outsource Software Development in 2025
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PDF
Tally Prime Crack Download New Version 5.1 [2025] (License Key Free
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PDF
Download FL Studio Crack Latest version 2025 ?
PDF
iTop VPN Crack Latest Version Full Key 2025
PPTX
Oracle Fusion HCM Cloud Demo for Beginners
PPTX
history of c programming in notes for students .pptx
PDF
Autodesk AutoCAD Crack Free Download 2025
PDF
Digital Systems & Binary Numbers (comprehensive )
PDF
CapCut Video Editor 6.8.1 Crack for PC Latest Download (Fully Activated) 2025
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PDF
Designing Intelligence for the Shop Floor.pdf
PPTX
AMADEUS TRAVEL AGENT SOFTWARE | AMADEUS TICKETING SYSTEM
PDF
17 Powerful Integrations Your Next-Gen MLM Software Needs
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PPTX
Computer Software and OS of computer science of grade 11.pptx
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
AI-Powered Threat Modeling: The Future of Cybersecurity by Arun Kumar Elengov...
Cost to Outsource Software Development in 2025
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
Tally Prime Crack Download New Version 5.1 [2025] (License Key Free
wealthsignaloriginal-com-DS-text-... (1).pdf
Download FL Studio Crack Latest version 2025 ?
iTop VPN Crack Latest Version Full Key 2025
Oracle Fusion HCM Cloud Demo for Beginners
history of c programming in notes for students .pptx
Autodesk AutoCAD Crack Free Download 2025
Digital Systems & Binary Numbers (comprehensive )
CapCut Video Editor 6.8.1 Crack for PC Latest Download (Fully Activated) 2025
Internet Downloader Manager (IDM) Crack 6.42 Build 41
Designing Intelligence for the Shop Floor.pdf
AMADEUS TRAVEL AGENT SOFTWARE | AMADEUS TICKETING SYSTEM
17 Powerful Integrations Your Next-Gen MLM Software Needs
Odoo Companies in India – Driving Business Transformation.pdf
Computer Software and OS of computer science of grade 11.pptx
Adobe Illustrator 28.6 Crack My Vision of Vector Design

視覚化とSwiftのタイプについて