IOS 使用 Google Map

安裝 Google Map SDK

先在專案目錄下建立Podfile檔案,在裡面填入

1
2
3
4
5
source 'https://github.com/CocoaPods/Specs.git'
target 'YOUR_APPLICATION_TARGET_NAME_HERE' do
pod 'GoogleMaps'
pod 'GooglePlaces'
end

存擋後在專案目錄下指令pod install

安裝完之後會出現專案名稱.xcworkspace檔案

點擊此檔案來打開 XCode

取得 Google Map API Key

進入此網址

1
https://console.developers.google.com/flows/enableapi?apiid=maps_ios_backend&reusekey=true

選擇建立專案->繼續->Maps SDK for iOS->取得 API 金鑰 1

1
2
3
金鑰	    XXXXXXXXXXXXXXXXXXX
限制 無
建立日期 2018年8月1日 下午9:01:30

在金鑰設定中選擇 IOS 應用程式

1
2
3
4
5
6
7
8
9
10
11
12
應用程式限制


HTTP 參照網址 (網站)
IP 位址 (網路伺服器和 Cron 工作等)
Android 應用程式
iOS 應用程式 ------> (選這個)

接受包含下列任一繫結識別碼的 iOS 應用程式發出的要求 (選填)
tw.com.xxx.zzz -----> (填這個)

上面填入你的專案 Bundle identifier

設定 XCode

AppDelegate.swift中最上面輸入

1
import GoogleMaps

application(_:didFinishLaunchingWithOptions:)中輸入

1
2
3
4
GMSServices.provideAPIKey("YOUR_API_KEY")

//如果你需要使用Google Place,要再加上以下這行
GMSPlacesClient.provideAPIKey("YOUR_API_KEY")

加入地圖

將以下程式碼貼上ViewController.swift在執行模擬器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import UIKit
import GoogleMaps

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

let camera = GMSCameraPosition.camera(withLatitude: 25.041535, longitude: 121.545027, zoom: 14.0)
let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
view = mapView


let marker = GMSMarker()
marker.position = CLLocationCoordinate2D(latitude: 25.041535, longitude: 121.545027)
marker.title = "台北"
marker.snippet = "台灣"
marker.map = mapView
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

}

如果看到下圖表示成功

2018-08-06_152344.png

Machine Learning A-Z(2)

將 Data 分為 Training set 和 Test set

1
2
3
4
5
6
7
8
A.下載 Dataset
B.導入標準庫
C.導入 Dataset
D.缺失 Data
E.分類 Data
F.將 Data 分為 Training set 和 Test set
G.特徵縮放
H.Data 預處理模板

Machine Learning A-Z(1)

安裝 R 環境 & IDE

安裝 R 環境

1
2
3
4
5
6
7
https://cran.r-project.org/

下載對應的 OS 安裝檔
EX: Windows
1.Download R for Windows
2.install R for the first time
3.Download R 3.4.2 for Windows

安裝 R IDE

1
2
3
https://www.rstudio.com/products/rstudio/download/

下載免費版本即可

安裝 Anaconda Python

1
2
3
4
5
6
7
8
https://www.anaconda.com/download/

安裝 3.6 版本
Anaconda Python 其實類似組合包
就是 Python + 常用到的 Lib 一起下載
當然你也可以單純下載 Python 3.6 然後再找需要的 Lib 安裝
不過就會比較麻煩,常常某個 Lib 需要依賴其他 Lib 等等
所以建議直接安裝 Anaconda Python

安裝完可以打開 Anaconda Navigator

其中Spyder 是 Python 的 IDE

上方View->panes 可以自訂 IDE 的介面呈現

Python 30 天筆記(Ch2)

類別

1
2
3
4
5
6
7
8
9
10
11
12
class Dog():
name = 'Jon'
color = 'brown'


>>> Dog
<class '__main__.Dog'>
Dog 是一個類別

>>> Dog()
<__main__.Dog object at 0x00000174A8438D68>
Dog() 是一個物件

範例

1
2
3
4
5
6
class Dog():
name = 'Jon'
color = 'brown'

instance = Dog()
instance.name

繼承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Animal():
name = 'Amy'
noise = "Grunt"
size = "Large"
color = "brown"
hair = "covers body"
def get_color(self):
return self.color
def make_noise(self):
return self.noise

// Dog 繼承 Animal
class Dog(Animal):
name = 'Jon'


dog = Dog()
dog.make_noise()
dog.size = "small"
dog.color = "black"
dog.hair = "hairless"

Unity (Ch1)

熱鍵

1
2
3
W: 移動物件
E: 旋轉物件
R: 拉伸物件

基本介面

2017_09_13_1.png
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Transform    : 物件位置/旋轉/大小

Mesh Filter : 物件形狀

Box Collider : 物件碰撞設定
可以按 Edit Collider 按鈕決定物件碰撞的範圍

Mesh Renderer: 物件材質
可以在 Asset 建立材質,然後直接拉給物件使用

Rigidbady : 鋼體,和真實物理相關的設定
質量設定(Mass)
例如使用重力(Use Gravity)
Is Kinematic 打勾物件就不會動

Script

Asset -> Create -> C# Script

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 預設程式碼
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour {

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}
}

Start 會在一開始使用,之後就不會再呼叫

Update 會在每一次 frame 呼叫一次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour {

public bool varBool = false;
public string name = "Jason";
public int number = 2;
// Use this for initialization
void Start () {
Debug.Log(varBool);
Debug.Log(name);
Debug.Log(number);
}

// Update is called once per frame
void Update () {

}
}

變數加上 public 可以在 Unity 裡面覆寫掉原本的值

有個要注意的地方是,你可以在play 模式直接改變值,或是增加其他物件等等

畫面會及時顯示出來改變的東西,當你暫停時會回復到原始的狀態

改變play 模式顯示的顏色可以去下面設定

1
Edit -> Preferences -> Color

匯入素材

1
2
3
4
5
6
7
Import New Asset

Create -> 2D Object -> Sprite

再把剛剛匯入的素材拉到 Sprite 中的 Sprite Renderer

如果拉不過去,要先把素材的 TexTure Type 改為 "Sprite (2D & UI)"

一開始的素材是把多張圖合成一張

2017_10_09_1.png

我們目的是把此張圖切成不同小張圖

首先 Sprite Mode 改為 Multiple

2017_10_09_2.png

再按 Sprite Editor -> 按下 Slice 就會自動切 -> Apply

2017_10_09_3.png 2017_10_09_4.png

選第 7 張當作初始圖

2017_10_09_5.png

控制人物

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void Update () {
Movement();
}

void Movement()
{
if( Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow) )
{
transform.Translate(0, speed * Time.deltaTime, 0);
}

if( Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow) )
{
transform.Translate(0, -speed * Time.deltaTime, 0);
}

if( Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow) )
{
transform.Translate(-speed * Time.deltaTime, 0, 0);
}

if( Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow) )
{
transform.Translate(speed * Time.deltaTime, 0, 0);
}
}

如果不想要你的人物能斜著走,改成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Update is called once per frame
void Update () {
Movement();
}

void Movement()
{
if( Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow) )
{
transform.Translate(0, speed * Time.deltaTime, 0);
}
else if( Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow) )
{
transform.Translate(0, -speed * Time.deltaTime, 0);
}
else if( Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow) )
{
transform.Translate(-speed * Time.deltaTime, 0, 0);
}
else if ( Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow) )
{
transform.Translate(speed * Time.deltaTime, 0, 0);
}
}

Python 機器學習 (Scikit-Learn Ch2)

常用網站

PDF 下載

線上文件

Machine learning 簡化流程圖

快速開始

這邊是根據官網的Quick Start章節做個筆記,內容並非一定正確

主要是介紹machine learning的一些專屬名詞,並舉一些實際例子

目前主要把machine learning分為兩大類,其中supervised有兩種演算法

unsupervised有一種演算法

1
2
3
4
5
supervised learning
- classification
- regression
unsupervised learning
- clustering

Supervised 就是你先給一些輸入資料以及你預期的輸出結果(答案)

那程式就會根據你給的東西來產生一個公式

產生公式之後你再給新的輸入資料

程式就會根據公式產生輸出結果,此公式也稱為模型 Model

classification 手寫辨識用此演算法,能夠將不同手寫的字對應到有限的字

簡單的說就像分類一樣,電腦會將輸入的資料分類

regression 你期望的輸出是由一個或多個變數來表示的

Unsupervised 就是只有給你輸入資料沒有告訴你答案,所以必需根據這些資料來找出一些線索

此種演算法稱為clustering

dataset 範例

scikit-learn 預設有一些 dataset,dataset 其實就是一些數據而已

例如全班的名字身高體重也算是一種 dataset

而 scikit-learn 中有包含Iris flower data set

Iris是一種花,中文為鳶尾花?

2017_05_30_1.jpg

Iris flower data set就是此種花的資料,例如花瓣寬度、長度等等

Iris flower data set 可參考

另外還有digits datasets以及boston house prices dataset

1
2
classification 使用 iris and digits dataset
regression 使用 boston house prices dataset

範例程式如下

1
2
3
4
5
6
from sklearn import datasets
import numpy as np

# Load Data Set
iris = datasets.load_iris()
digits = datasets.load_digits()

digits 是字典類型,print 出來如下

1
2
3
4
5
6
7
8
9
10
11
12
{
'DESCR': 'Optical Recognition of Handwritten Digits Data Set\n'
......,
'data': array([[ 0., 0., 5., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 10., 0., 0.],
......,
'images': array([[[ 0., 0., 5., ..., 1., 0., 0.],
[ 0., 0., 13., ..., 15., 5., 0.],
......,
'target': array([0, 1, 2, ..., 8, 9, 8]),
'target_names': array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
}

我們需要的是data,這裡可以用print( len(digits.data) )看有幾筆資料

目前總共是1797筆 (list),你也可以把其中一筆 print 出來看

每一筆資料含 8*8 = 64 筆元素

1
2
3
4
5
6
7
8
9
10
11
array = np.array( digits.data[0] )
print( array.reshape(-1,8) )

[[ 0. 0. 5. 13. 9. 1. 0. 0.]
[ 0. 0. 13. 15. 10. 15. 5. 0.]
[ 0. 3. 15. 2. 0. 11. 8. 0.]
[ 0. 4. 12. 0. 0. 8. 8. 0.]
[ 0. 5. 8. 0. 0. 9. 8. 0.]
[ 0. 4. 11. 0. 1. 12. 7. 0.]
[ 0. 2. 14. 5. 10. 12. 0. 0.]
[ 0. 0. 6. 13. 10. 0. 0. 0.]]

我們也可以直接用shape屬性來觀察

1
2
3
4
5
digits          = datasets.load_digits()
digits_data = digits.data
print(digits_data.shape)

# 輸出: (1797, 64)

表示有 1797 筆list (digits.data[0],digits.data[1] … digits.data[1796])

而每筆list有包含 64 個元素

學習和預測

estimator在 python 是一個類別sklearn.svm.SVC

此類別有實作fit(X, y)predict(T)方法

1
2
3
4
from sklearn import datasets, svm
import numpy as np

clf = svm.SVC(gamma=0.001, C=100.)

目前參數gamma的值是手動設定的,但是你也可以用grid searchcross validation

來找出更合適的值,這裡將變數命名為clf是當作classifier的簡稱

參考

https://www.datacamp.com/community/tutorials/scikit-learn-python#gs.hozWP1g

Python 機器學習 (Scikit-Learn Ch1)

安裝 scikit

首先在乾淨環境下安裝 Python,本文使用 Win10 64 安裝 Python 3.6.1

Python 3.6.1 For Windows

建議不要安裝在C:(OS 安裝硬碟),不然之後常遇到權限問題

安裝完預設就會有 pip,可以在 cmd 下試試看

1
2
D:\>pip -V
pip 9.0.1 from d:\program files\python36\lib\site-packages (python 3.6)

要安裝Scikit-Learn之前需要先安裝以下其他的 Lib

1
2
3
● nose (自動化測試相關)
● numpy+mkl (注意有加上 mkl(math kernel library),運算陣列矩陣相關)
● scipy (數學演算法相關、訊號處理、圖像處理、積分、線代等等)

首先先安裝nose,直接用 pip 安裝即可

1
D:\>pip install nose

接下來的numpy+mklscipy不要使用 pip 直接安裝,會發生很多問題

先打開此網站LFD

裡面有許多whl檔案可以下載,所以要下載 (有32/64位元,依照你的OS下載)

numpy-1.13.0rc2+mkl-cp36-cp36m-win_amd64.whl

scipy-0.19.0-cp36-cp36m-win_amd64.whl

scikit_learn-0.18.1-cp36-cp36m-win_amd64.whl

下載完後安裝指令如下,記得要按照順序,因為scikit_learn會先檢查numpy+mklscipy是否已經安裝

1
2
3
D:\>pip install "numpy-1.13.0rc2+mkl-cp36-cp36m-win_amd64.whl"
D:\>pip install scipy-0.19.0-cp36-cp36m-win_amd64.whl
D:\>pip install scikit_learn-0.18.1-cp36-cp36m-win_amd64.whl

顯示一下已安裝的 Lib

1
2
3
4
5
D:\>pip freeze
nose==1.3.7
numpy==1.13.0rc2+mkl
scikit-learn==0.18.1
scipy==0.19.0

最後執行測試指令看是否成功安裝scikit_learn 參考

1
D:\> nosetests -v sklearn

之後會開始跑一些測試,會花一段時間,最後顯示以下訊息,會出現兩個 fail

但是目前不知道為什麼,有找到問題在更新

1
2
3
Ran 7159 tests in 240.549s

FAILED (SKIP=19, failures=2)

Python 30 天筆記

常用網頁

範例程式

Youtube

建議

Lists

Lists (array) 可存不同種類

1
2
3
4
5
6
7
8
list_var = ['some string' , 123, "another string"]
list_var.append("some other item") // 加入新 item
len(list_var) // 4 ( 4 個 item)
len("an string") // 9 ( 9 個字元)

list = [1,2,3]
list.pop(0)
print(list) // [2,3]

Dictionary

{} 包起來

1
2
3
4
5
6
7
8
9
// Python 可以用字串當作 Key
a_dict = { "a":"1", "b":"2", "c":"3"}
a_dict["abc"] = "another" // {'a': '1', 'b': '2', 'c': '3', 'abc': 'another'}

// Python 也可以用整數當作 Key
abc = {}
abc[0] = "abc"

// dic 也可以把 dic 或 list 放進去

Tuple

1
2
3
tup = ()
tup = ("abc","abc")
tup = ( ("a","b"), ("c","d"))

差別

Tuple 資料不可以修改,List 可以

但是 Tuple 使用的資料型態會比較小

Loop

1
2
3
4
5
6
7
8
9
10
11
bag = [1,2,3,4,5,6,7,8,9,10]

// For
for item in bag:
print(item)

// While
i = 0
while i < 11:
print("OK")
i+=1

Conditionals

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
True
Flase

i = 1
if i == 1:
print("A")
elif i == 2:
print("B")
else:
print("C")


print(isinstance(3, int)) # T
print(isinstance("Jason", int)) # F
print(isinstance("Jason", str)) # T

Function

1
2
3
4
5
6
7
8
9
10
11
12
13
str_items = ["A", "C", "W", "a", "E"]
str_items.sort()
str_items.sort(key=str.lower)
str_items.sort(key=str.lower,reverse=True)

int_items = [123,11,534.12,561,22.213]
new_items = sorted(int_items,reverse=True)
print(new_items)

int_items = [123,11,534.12,561,22.213]
new_items = sorted(int_items,reverse=True)
print(new_items)
print(sum(int_items))

自訂 function

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
items = ["Mac", "Phone", 123.11, 462.14, "Jason", "Bag", 512]

str_items = []
num_items = []

for i in items:
if isinstance(i, float) or isinstance(i, int):
num_items.append(i)
elif isinstance(i, str):
str_items.append(i)
else:
pass

print(str_items)
print(num_items)

def parse_lists(some_list):
str_list_items = []
num_list_items = []
for i in items:
if isinstance(i, float) or isinstance(i, int):
num_list_items.append(i)
elif isinstance(i, str):
str_list_items.append(i)
else:
pass
return str_list_items,num_list_items


print(parse_lists(items))

String

Cheat Sheet

1
2
3
4
5
6
7
8
9
10
11
text = "This is a {var}".format(var="cool")
print(text)

text = "{0} {1} {2}".format("A","B","C")
print(text)

text = "Hello %s %s" %("Jason","Sharon")
print(text)

text = "Hello %%s %s" %("Jason")
print(text) // Hello %s Jason

Machine Learning (1)

Supervised

給定一組 Data set

Classification 分類問題(連續)

Regression 遞歸問題(分類)

UnSupervised

所有數據都是一樣的,需要根據給定數據找出規則或分類

1
2
3
4
5
6
7
8
9
10
11
雞尾酒問題

假設宴會上有很多人,現在給 2 人 1 人 1 隻麥克風講話

此 2 個麥克風都會錄到 2 人的聲音

要如何分離 2 人聲音或背景音樂?

[W,s,v] = svd(( repmat(sum(x.*x,1),size(x,1),1).*x)*x');

SVD = singular value decomposition (奇異值分解)

Cocktail Party

學習 ML 使用 Octave (free) 或 Matlab 練習

先用 Octave 做出原型,在用其他語言實現

因為 Octave 以內建許多演算法函式

其他

3 element vector or a 3 dimensional vector

1
2
3
      element 1
A = [ element 2 ]
element 3

練習

Model

Regression Problem = 根據之前的數據,預測出一個準確值

Training set = 之前蒐集的數據

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
面積(x)   價錢(y)
2104 460
1416 232
1534 315
852 178
... ...

m = 幾項樣本數目,假設有 47 樣本數就為 47
x = input = input features
y = output = target variable

(x,y) = one training example
(x^(i) , y^(i)) = 第 i 項樣本
(x^(i) , y^(i)) i=1,....m = training set


Ex:
x^(2) = 1416
y^(3) = 315

流程: Training Set -> Learning Algo -> h(Hypothesis) 表示函數

面積(x) -> h -> 價錢(y)

1
h maps from x to y

h 可以寫成

1
2
3
4
hθ(x) = θ0 + θ1X (線性函數)
= 線性回歸(linear regression) model
= 根據 x (變量) 來預測價格
= 單變量線性回歸

Cost Function

代價函數,或稱為 squared error function

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Training Set:
面積(x) 價錢(y)
2104 460
1416 232
1534 315
852 178
... ...

Hypothesis : hθ(x) = θ0 + θ1X
用來預測的函數

θi = Parameters = Parameters of model
問題在於如何決定 θ0 或 θ1

θ0 和 θ1 不同會造成線的斜率不同
所以我們要找的是,再給定的 Training Set 之下
θ0 和 θ1 要取多少才會經過最多的 Training Set


所以根據此想法,我們要訂一個規則:

1. minimize θ0,θ1
2. (hθ(x) - y)^2 要小 (表示越準確)


Hypothesis:
h(x) = θ0 + θ1X

Parameters:
θ0 , θ1

Cost Function:
m
J(θ0,θ1) = 1/2m ∑ ( h(x^(i) ) - y^(i) )^2
i=1

Goal: minimize J(θ0,θ1)
θ0,θ1



Simplified: 將 θ0 = 0

m
J(θ1) = 1/2m ∑ ( h(x^(i) ) - y^(i) )^2
i=1

Goal: minimize J(θ1)
θ1

簡單的說,就是要找出 θ0 , θ1,並且使 J(θ0,θ1) 最小

使用梯度下降演算法 ( gradient descent )

此演算法會持續變化 θ0 , θ1 來找出 min J(θ0,θ1)

PCI (2)

專有名詞簡寫

1
2
3
4
PCI Express      = PCIe
PCI-to-PCI 橋 = PCI 橋
PCIe-to-PCI 橋 = PCIe 橋
Host-to-PCI 主橋 = Host 主橋 (PCI 主橋/PCI 總線控制器)

基礎知識

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
1. PCI 總線空間 & CPU 空間隔離
PCI Device 要有獨立地址空間(PCI 總線空間)

CPU 總線 PCI 總線
CPU ---------- HOST 主橋 ---------- PCI Device
|
Main Storge


HOST 主橋有緩衝,所以讓 CPU 總線和 PCI 總線可工作在不同頻率
也可以讓 CPU 和 PCI Device 共享 Main Storge

CPU access PCI Device : 透過 HOST 主橋做地址轉換
PCI Device access Main Storge : 透過 HOST 主橋做地址轉換

* HOST 主橋設計並沒有文件規範,每家都不相同
Freescale : PowerPC
Intel : x86

2. 擴展性
一個 PCI 總線樹上,最多只能有 256 個 PCI Device (包含 PCI 橋)

CPU 總線 PCI 總線
CPU ---------- HOST 主橋 --------------------- PCI Device
| |
Main Storge PCI 橋 --------- PCI Device
|
+----- PCI Device

在 PCI 總線上的 PCI Device 可溝通
同一棵 PCI 樹的 Device 也可溝通,但有時需要透過 PCI 橋


PCI 橋有管理 PCI 總線子樹的 Reg

上游總線(Primary Bus) 下游總線 (Secondary Bus)
------------------------ PCI 橋 --------------------------

3. 動態配置
PCI Device 地址可由軟體動態分配 -> 即插即用
讓每個 PCI Device 都有不同位址

4. 總線帶寬 (M = 1000 , B = Byte)
32 bit/33 MHz = (32 * 33000) / 8 = 132 MB/s
64 bit/66 MHz = (64 * 66000) / 8 = 528 MB/s

5. 共享總線
PCI Device 通過"仲裁",獲得總線使用權,才可以傳輸資料
在 PCI 總線傳輸資料不需要 CPU 干涉
* 但 PCI 仲裁器沒有在規範當中
此仲裁器可以嵌入在 HOST 主橋 或 PCI 橋 當中
當然也可以手動關閉,在獨立使用額外的仲裁器