2015/12/13

機器學習速遊筆記


機器學習速遊
 http://datasci.tw/event/machine_learning/
http://www.slideshare.net/tw_dsconf/ss-56071386

機器學習的定義:
從資料中計算出某種經驗

機器學習和AI的差別:
AI從遊戲規則中計算
機器學習從觀察別人進行遊戲/自己進行遊戲中學習


機器學習的符號定義:
X 題目
x1,x2,x3,...

Y 答案
y1,y2,y3,...

D 考古題庫
{(x1,y1),(x2,y2),(x3,y3)...}

f 宇宙法則
f(xi) = yi

g 機器學習的輸出
X -> Y (給他題目,他會給你一個他覺得的答案)

e error measure
用來計算 g 離 f 神多遠的函數

Ein in-sample error
寫考古題時的錯誤

Eout out-of-sample error
實際上考場時的錯誤

H 假說
所有可能的 g

A 機器學習的演算法
H,D,e -> g
根據考古題庫D,從 H 中挑選出一個離 f 最近的 g 的方法


判斷一個問題適不適用機器學習?滿足以下三點就適用。
1. 覺得資料背後有規則
2. 但是看不出來規則
3. 手上有資料


機器學習的應用
回答是非題:二元分類
在教育上預測學生能不能答對某個題目
使用 3000個學生 900萬筆記錄
H:假設學生的強度 > 題目的難度,學生就會答對

回答選擇題:分類
OCR
圖像辨識
人臉辨識

回答填空題:預測一個數值 regression
netflix 預測某人會給某電影打幾分
H:某人的喜好和電影的特性的接近程度

分群:把一群資料分成幾群
Supervised 和 Unsupervised 的差別
Supervised 事先知道有幾類
Unsupervised 事先不知道有幾類

Semi-supervised 有些知道有些不知道
照片人臉自動標示

Reinforcement Learning
跟訓練狗狗坐下很像
沒有考古題庫 D
事後給獎賞或懲罰

問題:遇到一個問題時應該選擇用是非、選擇還是填空模型?
回答:可以優先選擇填空

問題:什麼時候該用Supervised?什麼時候用 Semi-supervised
回答:先用 Supervised 因為比較簡單

問題:如果沒有音樂領域知識是不是會對解決音樂問題的影響
回答:有 但是剛好 netflix 不需要音樂內容

問題:網路廣告是不是 Reinforcement Learning
  回答:是,你點了一個賣鞋子的網站,機器得到獎勵,就會開始丟鞋子廣告。如果你點了廣告,機器得到獎勵,機器就會給你更多的鞋子廣告。如果你都沒點廣告,機器得到懲罰,就不會再給你鞋子廣告了 。

問題:機器學習 和 資料探勘 有沒有差異
回答:在這個場子應該回答沒有
資料探勘和機器學習的目標不同
但是 tool 相同

一些觀念
機器學習的目標:最小化 out-of-sample error
最早的分類法PLA:在空間上找到一條線切割出兩個空間(知錯能改演算法)
我們注重 generalization ,模型舉一反三的能力,而不是 memoraze 死背的能力,考試滿分不代表實用性高,Ein滿分不代表Eout表現就好,通常比較簡單的 H ( 比方說line ) 比較容易舉一反三。

機器學習的幾個基礎方法
linear regression:
H : y = wx
e : (wx - y)^2
利用微分後等於0,算出計算最佳 w
一步登天演算法

logistic regression:
給xy,y=0 or 1, 問給 x 會發生y的機率是多少?
H : y = θ(wx)
e : 一個很長很複雜的式子
直接解不好解,所以用 gradient descent 方法解 w

linear models summarized
H : y = wx
透過微調 H 做出 linear classification、linear regression、logistic regression
達人的秘訣:先用linear model!

問題:liear regression 的用處
回答:
只要是 regression 問題就可以用
一開始學的時候覺得很沒用,可是後來覺得很有用,liear regression 是作為初步觀察,和結合多個模型的工具。

問題:linear regression 和 logistic regression 是從統計來的,在機器學習上跟統計有什麼不一樣?
回答:
統計:用樣本反推母體
機器學習:用 g 反推 f

統計在意反推的信心水準
機器學習在意 g 的效能

統計在計算上比較沒有研究
機器學習在計算效能上研究較深

問題:機器學習是持續在學習,所以 g 會一直在動?
回答:對

Nonlinear Transform
當一個線性模型表現不好的時候,表示data的邊界可能不是一條線
可以透過特徵轉換把非線性問題轉成線性問題
Feature Transform
H : y = wϕ(x)
ϕ = 特徵轉換 Feature Transform
ϕ 其實是包含了領域知識 the force
但是要小心 over fitting

circular Separable (一個特徵轉換的例子)
H : y = wz
z = x^2, 1
對z作線性模型等於對x作圓形模型
若使用2次方程 z = x^2 , x , 1 ,表示 H 包含所有2次曲線

問題:是不是先畫個圖看看再怎麼決定ϕ
答案:可以,但是有風險,你可以先對資料做分析再做決定

問題:如果資料比較交錯,比方說區分奇數偶數
答案:覺得有規律就可以解

問題:不平衡的資料 (y 大部分都是0) 要怎麼辦?
答案:
從錯誤衡量方法上作修改
比方說廣告點擊率1%
你預測所有人都不會點廣告,可以得到99%的正確率
所以應該調整 error function 來修正這個結果

問題:自己找 feature 能不能做得比deep learning 好
答案:deep learning 比較好,但是這是不同的路,說不定未來可以混用。

decision tree:
是用很多條線切割平面的方法
實務上的實用性是人類可理解
可以處理很多型態的資料
是非線型模型,但比其他非線性模型快

Overfitting:
問題:
太強大的 H 使得機器連雜訊都學起來造成 Overfitting
一點點小小的 error 就可以把模型搞爛

觀念:
雜訊越多,Overfitting 就越容易發生
資料量越大 就可以用越複雜的模型,想畫一條10次方程式應該要有很多很多個資料點才能畫得精準

解決方法:
判斷目前是 underfitting 還是 overfitting 然後修改 H 的複雜度。

降低資料中的noise
data manipulation
手動修改資料或把noise資料移除
不用期待太高

增加資料量
data Hinting
能不能弄多一點資料?
用既有資料,對資料做一些修改再丟回去資料裡

Regularization
修改error funciton, 使得 w 的維數自動降低
舉例:
Eaug(w) = Ein(w) + λ/N * wTw
λ代表模型複雜度參數
N代表資料量,資料量越大就可以越不用在意模型複雜度

最佳化 Eval 而不是 Ein
Validation
保留一部分資料作為 out-of-sample data
Eout 會很接近 Eval

很多個 H 利用 Validation 選出一個最好的 H,然後再把全部的 data 丟給 H

V-flod Cross Validation
把資料分成 V 群,作 V 次 Validation

問題:資料降維算不算降低模型複雜度?
答案:算



學習的原則:
KISS:
盡量用簡單模型
Sampling Bias:
手上的資料有偏見,做出來的 g 就會有偏見
validation set 最好可以接近 test set

舉例:
Netflix 比賽,test 只用使用者的最後幾筆資料
但是 在 validation 的時候不小心用了 隨機資料

Visual Data Snooping
你對 H 的選擇,和機器對 w 的選擇,加起來才是模型複雜度
所以你如果刻意降維,也許也會 overfitting ,你對資料的理解有可能是錯的。
盡量用領域知識選feature,不要用資料觀察選feature
最好連人都不要去看validation set

問題:PCA 算不算Data Snooping,這樣做好不好
回答:好,但是要清楚 input 還是原本那個


現代版機器學習
Support Vector Machine
最佳線性分割線 error function: 胖胖的分割線

Soft-Margin Support Vector Machine
最佳線性分割線 error function : 胖胖的分割線+分類錯誤
模型內建 Regularization

Linear SVM
http://www.csie.ntu.edu.tw/~cjlin/liblinear

Kernels SVM
www.csie.ntu.edu.tw/~cjlin/libsvm

常用的 Kernel:
Gaussian Kernel
Gaussian SVM: 比較相似度的方法
非線性模型裡面表現得很好

linear classification model 裡面最好的方法
non-linear classification model 不錯的方法

有全自動的 tool 是台灣人開發的


Random Forest (RF)
手上的資料分T群(可重複抽)
做出T個 decision tree
T顆樹一起投票決定最終結果
模型內建特徵選擇,每切一刀就是在選一個特徵

也可以利用RF來找出重要特徵(non-linear case)

Random Test:
某個維度的重要性 = 效果(某維) - 效果(某維+雜訊)

投票的效果是產生平滑的邊界

Adaptive (or Gradient) Boosting
Gradient Boosted Decision Tree (GBDT)
decision tree 的 regression 版

Deep Learning
從類神經網路開始
類神經網路的實務上問題:幾個神經元?幾層?
超多層的類神經網路:太神啦
還是要問怎麼決定幾個神經元?幾層?

用領域知識來決定網路結構
舉例:用 convolutional NNet 作視覺

regularization:
容許部份神經元死掉

避免掉入local 最佳解:
選一個好的初始位置
pre-training

計算上:
用GPU

問題:PLSPM 好不好用? https://en.wikipedia.org/wiki/Partial_least_squares_path_modeling
回答:沒聽過

2015/11/26

解決 Cannot reload AVD list: cvc-enumeration-valid: Value '360dpi' is not facet-valid with respect to enumeration.


錯誤訊息


Cannot reload AVD list: cvc-enumeration-valid: Value '360dpi' is not facet-valid with respect to enumeration. '[ldpi, mdpi, tvdpi, hdpi, 280dpi, xhdpi, 400dpi, xxhdpi, 560dpi, xxxhdpi]'. It must be a value from the enumeration. .... 下略

解法


從Android SDK Manager 移除 Android 6.0 中的
Android Wear ARM EABI v7a System Image
Android Wear Intel x86 Atom System Image

參考

2015/11/24

企業內部用的開發者帳號無法使用XCode Server,是規格?還是bug?

結論

OS X Server 和 Xcode 7.1 和 Apple Developer Enterprise Program 的搭配會造成
「所選的團隊沒有適用於此功能的方案會員資格。請參訪 Apple Developer Member Center 來更新您的會員資格。」。

OS X Server 和 Xcode 6 系列的搭配會造成
「此版本的 Xcode 無法和 OS X Server 一起使用」。

解法


請嘗試改用 OS X Server 4.1.5 (未證實)。

問題


Xcode Server 是 OS X Server 中的功能,用來作持續整合 (Continuous integration, CI) 的功能。
任何一台 Mac 只要花 590 元在 app store 都能買到 OS X Server。


 我遇到的問題是「所選的團隊沒有適用於此功能的方案會員資格。請參訪 Apple Developer Member Center 來更新您的會員資格。」

產生問題的步驟和環境截圖:https://docs.google.com/document/d/1MxNUZApRtl9LWTkqANgwM6ndxXeUeq0GpNVdCjrF-l8/edit?usp=sharing

成因

https://developer.apple.com/library/prerelease/tvos/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc7_release_notes.html
在 Xcode 7 Release Notes 上面可以看到 Known Issue 裡面有一條:
Xcode Server may not be able to join new development teams with versions of OS X Server other than version 4.1.5.
Existing team memberships will continue to work correctly. (22539804)


而在 OS X Server 的介紹頁面中,對於 Xcode Server 的說明是寫著:「使用 Xcode 6 來製作持續整合的 bot」,是的,他沒有說 Xcode 7 可以用...,Apple 有你的。

求解過程


發現 bug 之後先到 apple 官網上的文件爬文兩天,找不到解。
https://developer.apple.com/library/prerelease/ios/documentation/IDEs/Conceptual/xcode_guide-continuous_integration/adopt_continuous_integration.html#//apple_ref/doc/uid/TP40013292-CH3-SW1


我決定打電話到 Apple 客服 (0800 022 237) ,途中發現在電話上說明問題很困難,加上他不是老外口音,就是大陸口音,光是讓他了解問題大概就花了 30 分鐘。而且在電話上沒有螢幕截圖,其實用文字加圖片會比較容易了解。
https://developer.apple.com/contact/phone.php

客服:「我短時間可能沒辦法解決你的問題,不然我先給你一個案件編號,你過兩天打來只要說案件編號,就可以找到我。」。我只好先掛電話,過兩天我再打去。
客服:「可能是 Apple Developer Enterprise Program 沒有使用 Xcode Server 的權限。」。臥草,這你敢信?
我「確定不換?進入至尊對決。你能不能給我一個確定的答覆?」
客服:「這個...如果要確定的話還是問問看 Developer Technical Support。」



每個開發者帳號一年都有兩次免費額度的專業客服功能(DTS),專治軟硬體開發上的疑難雜症,我從來沒用過。DTS的使用方法是從 Member Center 裡的 Technical Support 進入。我在填單的時候除了 step by step 的操作流程之外,也把 Apple 客服給我的案件編號也填進去了。填完內容之後會收到一封副本信,內容大概是說:「感謝您的來信,這是自動回覆信件請勿回復。」。

過兩天之後收到來自DTS的回信。

DTS:「For such questions, please contact the Apple Developer Program Support Team. You can contact them directly via webform <http://developer.apple.com/contact/submit.php> or via phone <http://developer.apple.com/contact/phone.php>.
Also, when contacting them, be sure to mention that you were referred by DTS.」。

請注意,他叫我去打Apple 客服電話或是填表,而那個電話是我已經打過了的。所以我選擇填表,這次我把客服給我的案件編號和DTS給我的案件編號都填到表裡。

是的,又過了兩天。

這次他一語中的,直接給我看 Xcode 7 release notes ,並說明我的版本不 work 是因為這問題。但是他沒有告訴我怎麼取得舊版 Xcode 或取得舊版 OS X Server。

我人很好,都幫你們準備好了,前提是你們有看到最後。

http://stackoverflow.com/questions/10335747/how-to-download-xcode-4-5-6-7-and-get-the-dmg-file

哦對了,DTS因為沒有真的幫我解決問題,所以原本消耗掉的一個額度又還給我了。而我目前正在下載 Xcode 6.4,還沒有真正測試過到底行不行。


2015/11/26 更新:
 Xcode 6.4 版下載安裝完成了之後

此版本的 Xcode 無法和 OS X Server 一起使用。

目前測試過的Xcode 版本:
6.0.1: 此版本的 Xcode 無法和 OS X Server 一起使用。
6.1.1: 此版本的 Xcode 無法和 OS X Server 一起使用。
6.2: 此版本的 Xcode 無法和 OS X Server 一起使用。
6.3.2: 此版本的 Xcode 無法和 OS X Server 一起使用。
6.4: 此版本的 Xcode 無法和 OS X Server 一起使用。
7.1: 所選的團隊沒有適用於此功能的方案會員資格。請參訪 Apple Developer Member Center 來更新您的會員資格。


2015/12/10 更新:

後來接到一通 apple 客服打來的電話,客服證實企業用開發者帳號(可上架app store)可以在 XCode 7.1 的狀態下正常使用,但企業內部用開發者帳號就不行。所以我問客服這是規格?還是bug?客服說不確定要再查查,後來就沒下文了,看樣子一封信只能取得一次回應。


2015/11/16

單例模式

單例模式確保一個類別只能產生一個實體,並且防止實體被修改。

為了只能產生一個實體,所以限制建構式為 private。

為了防止實體被修改,所以用一個 private static 變數存實體,和一個 get 方法取得實體。


Q:單例模式和全域變數有什麼不同?
A:單例防呆,全域變數不防呆。

2015/11/12

物件導向原理

繼承和介面是一種包裝
繼承和介面的目的:用相同的包裝裝不同的東西

委派是一種插座
委派的目的:可抽換插座上的包裝

舉例說明:
1.
電腦上的USB插座是委派,插在上面的東西全都得實作USB介面,你隨時可以插拔USB插座上的東西,來改變電腦功能。

2.
不管你在PCHOME買啥,他都會找到一個更大的箱子去包裝你買的東西,而那個箱子是他們運送的標準規格,送貨員只需要學會接受標準規格即可上班。

最簡單的兩個設計模式:

所以延長線可以接延長線是天經地義的事情。

寫筆記的要訣

為什麼要寫筆記:
學習一次的記憶沒辦法長期保存,根據遺忘曲線,定期複習是最佳策略
第一次複習在學習後的20分鐘
第二次複習在當天晚上
第三次複習在隔天早上
第四次複習在三天後
第五次複習在一周後
而寫筆記能讓你極度減少複習時間

寫筆記的要訣:
用最少的文字或圖讓自己重讀筆記時能回想起整個內容

MAPS教學法心得




翻轉教學的目標
在課堂內學會如何思考
在課堂內學會如何學習
學生沒有學習能力(不會學習)
學生沒有學習態度(不願意學習)
必須先教會學生學習的方法才有可能願意學習

學習金字塔
聽講 5%
閱讀 10%
視聽 20%
示範 30%
討論 50%
實作 75%
教人 90%

MAPS教學法:
Mind Mapping 心智繪圖
Asking 提問策略
Presentation 口說發表
Scaffolding 同期鷹架

課前測驗:
機制:
答錯的部分是回家作業
效果:
學生不想寫作業,就會預習

課中:
講考試範圍
不看課前導讀、課文賞析,培養自己賞析能力
老師提問引導學生解構課文畫心智圖 => 學生討論畫心智圖 => 自己畫心智圖
老師提問引導學生思考

回家:
評論賞析

課後測驗:
只出問答題,沒過關要補考,不同程度的學生過關標準不同、考到過關才有寒暑假

分組:
機制:
4人一組,4個不同程度的學生ABCD、同組成績相同、A答對1倍分數、B答對2倍分數、C答對3倍分數、D答對4倍分數
效果:
利用紅利引導最強的學生教人 90%
最弱的學生報告 75%
討論和提問 50%

分組避免爭議的方法:
第一階段:
老師隨機產生組
之後的階段:
A選位置
D選A
A選B
C選組

報告時間不夠的解決方法:
機制:
前三個人完整報告,後面的人只報告差異,沒報告到的人下一次上課完整報告
效果:
誘導思考,學生不想完整報告,就會想要只報告差異

2015/11/10

swift 物件導向觀念

import UIKit

//程式碼複製

class A11{
    func doo(){
        print("A")
        print("A")
        print("A")
        
        print("B")
        print("B")
        print("B")
    }
}

class A12{
    func doo(){
        print("A")
        print("A")
        print("A")
        
        print("C")
        print("C")
        print("C")
    }
}



// 包裝重複
class StaticOrSingleton{
    class func AAA(){
        print("A")
        print("A")
        print("A")
    }
}

class A21{
    func doo(){
        StaticOrSingleton.AAA()
        print("B")
        print("B")
        print("B")
    }
}

class A22{
    func doo(){
        StaticOrSingleton.AAA()
        print("C")
        print("C")
        print("C")
    }
}


// 包裝不同 by 繼承

class A31{
    func doo(){
        StaticOrSingleton.AAA()
        bbb()
    }
    func bbb(){
        print("B")
        print("B")
        print("B")
    }
}

class A32:A31{
    override func bbb(){
        print("C")
        print("C")
        print("C")
    }
}


// 包裝不同 by 繼承2
class A40{
    func doo(){
        StaticOrSingleton.AAA()
        bbb()
    }
    func bbb(){}
}

class A41:A40{
    override func bbb(){
        print("B")
        print("B")
        print("B")
    }
}

class A42:A40{
    override func bbb(){
        print("C")
        print("C")
        print("C")
    }
}



// 包裝不同 by 委派
protocol B{
    func bbb()
}

class B1:B{
    func bbb(){
        print("B")
        print("B")
        print("B")
    }
}

class B2:B{
    func bbb(){
        print("C")
        print("C")
        print("C")
    }
}

class A6{
    var b:B
    init(b:B){
        self.b = b
    }
    func doo(){
        StaticOrSingleton.AAA()
        b.bbb()
    }
}

A6(b: B1()).doo()
A6(b: B2()).doo()


// 包裝不同 by 函數變數
class A7{
    var b:()->()
    init(b:()->()){
        self.b = b
    }
    func doo(){
        StaticOrSingleton.AAA()
        b()
    }
}

A7(b: {
    print("B")
    print("B")
    print("B")
}).doo()
A7(b: {
    print("C")
    print("C")
    print("C")
}).doo()





2015/11/6

如何寫出好程式

想要寫出好程式,你需要具備兩個能力:

價值觀:你能比較實作一個功能,兩個不同寫法之間的優缺點。
實作能力:你能夠實作一個功能,用多個不同的寫法。


case A:
當你還是一個新手,你剛學會寫程式。你不會考慮效能、可讀性、可擴充性等等的問題。你好不容易找到一個寫法可以讓編譯器通過編譯,並且顯示出正確結果。此時的你,沒有價值觀也沒有實作能力。


case B:
你開始看一些如何寫出好程式的原則,知道效能、可讀性、可擴充性等等的問題是重要的。此時的你,有價值觀但是沒有實作能力,你說得一口好程式

當你面臨一個選擇題,但你只有一個選項,即使你有再好的價值觀也沒用。


case C:
你開始看一些設計模式、繼承、委派、泛型、學會使用套件,學會各種寫法。此時的你,沒有價值觀但是有實作能力,你的程式充滿設計模式,你喜歡過度設計

當你面臨一個選擇題,而你有上百個選項,但是你不知道哪個選項比較好,你沒辦法選出最佳解。


case D:
於是你學會了應該要實作各種寫法,並認真思考各種寫法之間的優缺點,跟人討論的同時逐漸建立出自己的價值觀,你終於能寫出好程式。

2015/10/21

讀了幾本書不重要,不要再比誰讀得書多了!

在Coursera上知名的老師呂世浩說過:「如果你讀完了一本書後,書還是書,你還是你,沒有任何改變,你就等於沒讀過這本書。」。

對我們這個時代的人來說,要取得書太容易,書債太多,每個人都匆匆忙忙看完一本接一本,看完之後到底得到什麼?

試想今天給你一本九陽神功,你是練武奇才,全都看得懂,只要你不去把他應用在戰鬥中,你一出門還是被人家打爆。現代我們可以挑大師寫的書看,但你如果很快翻過去,跟大家公告你都看過了,你不練,就是沒用。

舉例:有一本減肥書教你減肥,然後你想減肥所以買來看了。減肥方法你都知道了,然後呢?你會看下一本書,裡面寫的大同小異,只要你不開始減肥,你就永遠是個胖子,懂了嗎?胖子,你學會了就要用阿。學用合一

看書並不會幫助你減肥,你會選擇一直看減肥書,而不去減肥,是因為看減肥的書比減肥容易太多。方法很簡單,就是要去做很難。知易行難阿。

想變聰明不是要多看書,是要挑大師的書看完並且好好的練習,直到練到潛意識裡才算大功告成了。

現在,挑一本你覺得最棒的書,好好的開始練功吧!

2015/9/22

小故事:兩圖交替辨識測驗

艾德想對我和這群學生證明,我們的記憶原本就夠強了,起碼用來學習某些知識絕對綽綽有餘。為了證明這點,他為大家示範了名之為『兩圖交替辨識測驗』的記憶力測驗。

他先自我解嘲一番,當作開場白:『我來自英國,英國人寧可把時間花在回憶,也不願意好好經營社交生活。』他還示範在一分鐘內記住七十位數字,展現他的真功夫,之後就開始測驗學生和我的記憶力。

『我會給各位看一些圖片,翻頁的速度非常快。』他說,並且提高音量想要過鬧哄哄的高中生。『我要你們盡量記,記越多越好。』他按下遙控器的按鍵,天花板的燈隨即轉暗,一系列幻燈片開始在房間前面的投影螢幕上顯現,每一張只停留不到半秒,有張是拳王阿里得意地站在倒地的桑尼里斯頓前面,然後是啞鈴,再來是阿姆斯壯登陸月球的腳印,之後是尼采的道德系譜學封面,再之後是一朵紅玫瑰。

總共三十張照片,每一張都匆匆閃過,難以想像我們會記住任何一張,要記住全部就更不可能了,但我已經盡己所能地捕捉每張照片的某些細節,很快的在腦中記下看到的畫面。最後一張是山羊照,之後牆壁轉黑,燈光亮起。

『怎麼樣?你們認為自己可以記住全部的照片嗎?』艾德問大家。

坐在我前面的女生嬌嗔地說:『怎麼可能!』引起同學一陣科科笑。

『拿出這種氣魄就對了!』艾德回吼說,然後低頭看錶注意時間。這個練習不就是為了證明我們可以記住所有照片,不然呢?我跟坐在前面的女生一樣,覺得很難相信。

艾德給我們三十分鐘的時間讓遺忘曲線開始作用,快速抹去我們剛剛瀏覽而過的圖像,然後放上一組新的幻燈片。這次螢幕上一次出現兩張照片,一張是我們看過的照片,一張沒看過,左邊是拳王阿里,右邊是嘶嘶冒泡的止痛錠。

他要我們指出我們認得的照片,簡單!我們都很確定看過阿里的照片,而不是止痛錠。『你們這麼快就想起來了,不覺得很驚人嗎?』艾德說。他又跳到下一張,左邊是一頭鹿,右邊是尼采的書。

這題大家也都答對了。他總共放了三十張幻燈片,房間裡的每個人都認出我們剛剛看到的照片。『這就是奇妙的地方。』艾德說,在鋪上油布的演講廳前像教授一樣來回踱步。『就算放一萬張投影片,你們的表現也不會差太多,各位的圖像記憶就是這麼好。』艾德指的是常被引用的一組實驗,這組實驗在1970年代完成,實驗者給實驗對象做了我們剛剛做的圖像辨識測驗,只不過他們看了不只三十張照片,而是一萬張,前後共花了一星期才完成實驗。腦袋要記住的圖片那麼多,而且每張圖片都只能看一次,儘管如此,科學家發現實驗對象能記住八成以上的圖像。最近一次研究也做了同樣的實驗,這次辨識的圖片只有兩千五百張,但不是在拳王阿里和發泡止痛錠之間選一張,而是要從幾乎一模一樣的兩張圖片中選一張,比方一疊五元鈔票和一疊一元鈔票、綠色火車廂和紅色火車廂、窄把手的鈴鐺和寬把手的鈴鐺。儘管圖片只有小處不同,大家還是可以記住九成的圖片。

這些數字讓我很訝異,但我發現那只是把我直覺知道的事量化而已,那就是:我們的記憶其實挺厲害的。我們每天都忘東忘西,忘了鑰匙放哪、忘了別人的名字、忘了說要嘴邊的話,但更重要的也許是,我們忘了其實我們很少遺忘。

『這是我們剛剛做的測驗最不可思議的一點,』艾德說,『我們可以過幾年再做一次測驗,看你還記得多少圖片。事實上,你多半能指出正確的照片。你看過的所有東西,腦袋都存有紀錄。』


摘自『記憶人人hold得住 p46~p48』Joshua Foer

記憶宮殿法材料 - 溫哥華南邊小廚房


材料來源:袖珍博物館



記憶項目:
餐桌、三隻狗、垃圾桶、烤箱、櫥櫃、洗手台
瓦斯爐、罐頭、電話、擀麵棍、保鮮膜、狗食


影片

2015/8/22

記憶宮殿法材料 - 琴師出門的前刻


材料來源:袖珍博物館


記憶項目:
大門、椅子、神像、壁爐、水果籃
沙發、行李箱、小提琴、鋼琴、掛畫

在圖片上看不到掛畫,要看影片才會看到

標記圖片

原始圖片

影片

2015/8/19

記憶宮殿法

記憶宮殿法

記憶宮殿法是記憶學當中用來作為記憶樁的一種方法。記憶樁是用來彌補鎖鏈記憶法缺點的方法。因為鎖鏈記憶法的缺點是只要中間斷了任何一個節點,接下來的事情就全部想不起來。你可以利用記憶樁把一條很長的鎖鏈拆分成多個鎖鏈,分別放到記憶樁上來避免掉記憶鎖鏈斷掉的問題。最浪費記憶樁的作法是每個記憶樁只連結一個記憶內容,而這種作法理論上最牢固。

學過資料結構的朋友,鎖鏈記憶法是用連結串列(Linked List)來儲存資料,而記憶樁法則是用雜湊陣列(Hash-Table) 來儲存資料,在隨機存取這點上顯然雜湊陣列的效能會比連結串列來得好。而記憶宮殿法就是幫助你在腦內建立大容量雜湊陣列的方法。

如果想要記憶一長串數字的話可以參考記憶學 - 瞬間記憶超長數字的方法

全美記憶冠軍 Joshua Foer 的說法

記憶的技巧是把無趣變有趣,無畫面變生動畫面。


記憶宮殿法是來自於2500年前的西蒙尼德。

把圖像放入想像的空間,形成難忘的畫面。

利用場所記憶,你需要很多場所來記憶不同的內容。

人類很擅長記場所。

結合遺忘曲線,在特定的幾個時間作複習,可以記得更牢。

想要入門就得先收集十幾個記憶宮殿。

世界記憶冠軍王峰的說法

記憶宮殿法是一個很容易可以取得大量記憶樁的方法。

選擇記憶樁的要點有『熟悉、順序、特徵、適中、固定、數量』這些要點。

大家可以試著用範例圖裡面的記憶樁來記東西。

這張圖的十個記憶樁是
1.小木馬 2.向日葵 3.檯燈 4.鏡子 5.抱枕
6.國際象棋 7.書架 8.吉他 9.白沙發 10.茶几


參考資料


記憶人人hold得住 / Moonwalking with Einstein: The Art and Science of Remembering Everything
Joshua Foer 喬許.佛爾

Joshua Foer: 每個人都能表演的記憶壯舉



最強大腦:寫給中國人的記憶魔法書
王峰

王峰在最強大腦創世界紀錄的影片 (最强大脑2:20150403)


2015/7/4

八仙同理心測驗 - 測試你有沒有同理心

一個簡單測試你有沒有同理心的方法,請先看燒燙傷治療有多痛看完之後再開始作題,請作完一題再看下一題。




1. 當時你在現場,你是受害者,你受到了70%的燒傷面積,將近100%的死亡率,接下來的命運你有3個選項,你會怎麼選?

A. 長痛不如短痛,最好事發現場就讓我死。
B. 送急診承受每2~3小時換藥一次,但痛苦一週後還是逃不了死亡的命運,努力了但無法活下來。
C. 做了幾次截肢手術後,接著面對半年的痛不欲生的拉皮復健後,終於活下來,但除了自己接受自己之外,終生要面對異樣的眼光。





2. 你是受害者的家屬,你的親人受到了70%的燒傷面積,接下來的命運你有2個選項,你會怎麼選?

A. 好不容易爭取到一間加護病房,無論如何一定要想辦法讓他活下來,各種哀求和批評醫生護士都是為了得到更多的醫療資源,你們要體諒我。
B. 這種情況下即使治好,日後的生活也會很困難,不論是不忍受害者需要承受巨大的痛苦,或者家屬在經濟上的考量,最後選擇放棄急救





3. 你是護士,八仙爆炸之後湧進大量的傷患,接下來的命運你有3個選項,你會怎麼選?

A. 加班加到精神不濟,短暫受到全民按讚,但不小心一個失誤弄傷了傷患,接下來兩三年面對數十個法律訴訟,出獄後當醫護還是繼續被病患家屬頤指氣使。
B.  該上班就上班,該放假就爭取放假,該休息就休息,雖然被指責MgCuLiZn,但不用被病患家屬當狗,作息也正常。
C. 醫療資源已經稀缺的情況下,面對傷患家屬的無理使喚,心想是你們把我逼走,有病才繼續當護士,立馬離職。





4. 你是受害者的男/女朋友,八仙爆炸之後你的另一半變成受害者,接下來的命運你有3個選項,你會怎麼選?

A. 我沒有很愛他,在此之前沒有討論過要不要結婚,但發生這種事情之後我能走嗎?因為太在意社會觀感,只好默默陪他走完接下來的一輩子。
B. 我愛的是之前的他,不是現在的他,他已經變了。但考量社會觀感和輿論壓力,還是等他狀況穩定之後再跟他提分手。
C. 我沒有辦法接受這個他,果斷提分手,即使被說的再難聽。




5. 你是活動主辦人/八仙樂園老闆,八仙爆炸之後,接下來的命運你有3個選項,你會怎麼選?

A. 我哪知道粉塵會爆炸,這是一場意外,不應由我負責吧?
B. 先說願意負全責取得一個空檔,接著利用各種政商關係,很快的把自己名下的財產全都轉移到別的地方,把損失降到最低。
C. 會造成這場災難都是我害的,願意負全責,即便瞬間負債到上億。





6. 你是無關人士,八仙爆炸之後,接下來的命運你有3個選項,你會怎麼選(可複選)?

A. 上網集氣,祈禱他們趕快好起來。
B. 捐款,捐款才能實質而且有效的幫助他們。
C. 說受害者會去參加吸粉活動就已經腦子有洞了,被燒不意外,天擇仍然存在,適者生存,這就是現實。






=== 解答在下面 ===





1. 如果你選A或B,當你選擇死亡的同時,你的家人會對著你說加油你一定要撐下去,另一面卻對著說出實情的醫生和路人說你們要有同理心。
如果你選C,即使你能承受巨大的痛苦,但你怎麼知道你的家人是真的也想幫你?你會成為家裡的重擔,你痛苦家人也痛苦。




如果你選B或C,面對社會觀感和輿論壓力,全世界都會說你沒同理心,你能承受得住嗎?


4. 如果你選A,你怎麼知道你的另一半也願意讓你受苦?
如果你選B或C,面對社會觀感和輿論壓力,全世界都會說你沒同理心,你能承受得住嗎?


5. 如果你選A或B,面對社會觀感和輿論壓力,全世界都會說你沒同理心,你能承受得住嗎?
如果你選C,你犧牲奉獻的精神已經達到聖人了,為了不想被說沒同理心,值得嗎?


6. 如果你選A,你會說那些選C的人沒有同理心
如果你選B,你很好。
如果你選C,家屬和那些選A的人會說你沒同理心





=== 上面只是選項分析 下面才是解答 ===

醫生都知道受害者不截肢會死,截肢是斷尾求生的作法。
現場檢傷官都知道紅區不救會死,選擇不救黑區,也是斷尾求生的作法。
家屬放棄急救、護士離職、伴侶分手、老闆跑路,都是斷尾求生,雖然冷血殘酷但現實。


當你在每個角度都思考過之後,你會都選擇利他的一方嗎?面對現實的人會被說沒有同理心,但真的沒有同理心嗎?

所有人都可以拿同理心這個詞可以用來攻擊你,讓你面對輿論壓力,你撐不住只好選那些對他有利的選項。真正沒有同理心的人,就是那些說別人沒有同理心的人。

即使你假想自己是他,你做出來的選擇未必跟他相同,你會尊重他的意見還是你想要他尊重你意見?你的親人想死,你想要他活,你會選擇讓他死還是讓他活?在台灣你會看到多想兩分鐘,你可以不必自殺,那請問是社會沒有同理心還是自殺者沒有同理心?

不要猜想對方會怎麼選,直接問對方的選擇,講真話,並且達到共識,才是真正有同理心的作法。

你只有選擇利己但是被說沒同理心或是選擇利他,這兩個選項。然後所有人都要別人選利他,自己選就選利己。超級有同理心喔~

最後附上一個影片




2015/6/28

你應該準備作品還是考證照?

你是學生,在畢業之前還有1~2年的時間可以準備作品或考證照,請問你該選擇作作品,還是考證照?

在我快畢業的那時候,我思考過這個問題。當時得到的結論是「那就都拿阿」。現在回頭想想,傻孩子,人的時間是有限的。除了必須持有證照才合法的職業之外,我認為只需要把時間投資在作品上。

公司用人,基本上就是要找有用的人,有能力的人。不管作品還是證照,都是證明你有用的佐證。作品是直接證明,而證照是透過第三方機構間接證明。除非第三方機構非常知名,要不然參考價值不大。

證照不代表經驗。考證照對於某些人來說是簡單的,很多人都有英文證照,他們真的能跟老外對話嗎?請問你如果想要找一個接老外電話的客服,你會找一個去美國留學過的,還是找一個考過英文證照的?顯然是要找經常跟老外對話的人阿,有經驗者就是勝過沒經驗者

證照有過適的問題。很多補習班專門猜考題,教你怎麼背考題,考試已經成為一門專業的學問。你可以成為很會考試的人,但那不代表你實戰很強。如果你不懂原理,只要題目一換,你沒看過的題目你就不會作了。考試有太多技巧可以得高分。


這個問題可以廣義地說,你應該準備學歷還是經歷?學歷沒有用,只有經歷有用。你曾經做過哪些事情可以拿出來講的?基本上有賺錢的事情可以拿出來講,引起很多人迴響的事情可以拿出來講,其他事情就不要拿出來講了。

比方說

你作了高人氣的App
你作了高人氣的youtube影片
你寫了高人氣的Blog文章
你經營了高人氣的FB粉絲團
你有用以上項目賺錢的經驗
你有募資成功的經驗
你在知名的比賽上得獎

想做什麼職業,就直接去作那職業會做的事情。作出一番成績來,就能夠做為最有力證明你價值的經歷。帶著這個經歷,又有什麼工作是你應徵不上的呢?


你夠專業嗎?

如果你在某個領域夠強,那就是專業。

夠強就是問不倒,在這個領域下任何問題,你都能給出一個令人滿意的解答。

當客戶問你為什麼這樣作,為什麼不那樣作?你可以清楚地說出其中的差別,或者舉例說明,讓一個外行人輕易了解你在取捨的是什麼。

如果你夠專業:

你的任何行為背後都是遵循原則在作,不是亂作。

你知道每個原則為什麼存在。

你清楚違反原則會有什麼問題。

你知道在某些情況下可以不用遵守哪些原則,引發的問題不大。

如果你不能說明你為什麼這樣作,這樣做的好處在哪,那你就還不夠專業。


你夠專業嗎?

如果你夠專業的話,被質疑的時候就能說服對方,而不是被對方牽著鼻子走。

在你要求別人尊重專業之前,先想想自己。

當你被問到為什麼這樣作,而你是靠直覺作選擇,找不到任何可以支持你行為的原則,或者無法說出一套自己的原則,也許是你不夠專業。


2015/6/19

什麼是熱情?怎樣才能有熱情?

什麼是熱情?

熱情是發自內心想要去做的事。熱情就是那些會讓你廢寢忘食的事。所以你媽叫你做、你老闆叫你做、你主管叫你做的全都不是讓你有熱情的事。除非你媽、你老闆、你主管叫你做的事情剛好是你原本就想做的事。每個人有熱情的項目不同。

比方說:
「玩電動、作電動」
「看漫畫、畫漫畫」
「看實況、開實況」
「看影片、作影片」
「聽音樂、作音樂」
「爬文、寫文章」

什麼是自己想做的事?

自己單純覺得爽、自己覺得有趣的事、自己覺得有成就感的事、自己覺得有意義的事、自己定了目標想要達成的事。很多事情你媽覺得有意義不代表你覺得有意義,就像你媽覺得讀書有意義,而你可能覺得沒有。你的意義不等於我的意義。

什麼是成就感?

成就感就是當你做了某件事,得到很多回饋。你認為你成功了,你渴望得到更多的回饋,於是你開始複製成功經驗,你會不自覺想做那些得到很多回饋的事情。

比方說:
「抄國外新創團隊的梗,在本地複製幾乎一樣的東西」
「把日文歌改成台語歌」
「第一次拍電影就拿到一堆獎」
「上傳電影懶人包影片」
「發了一篇笑話很多人XDDD」
「開實況嗆觀眾,也一直被觀眾嗆」
「開實況轉珠珠轉的超爛,但是一直吃石復活」

怎樣才能有熱情?

有些技能是人家想教你的時候你不想學,但可能過沒多久你會發現自己缺的剛好是這塊。學校教的東西剛好都是這樣,因為學校通常不會告訴你學了之後可以用在哪。你會沒有學習的熱情是因為你不懂他能用在哪,若你先懂得用法,就會自然而然想學會,這就是學用合一的道理。當你認同作某件事的意義之後,就會主動去做某件事。

比方說
「你小時候被逼學樂器超不爽,但長大後懂得樂器的好開始而自發性的去碰樂器」
「在學校某科目超爛,結果出去工作後發現處處要某科目,又開始自學」
「某個在學校教APP的老師,每學期第一堂課都會給學生玩一款看似簡單的小遊戲,然後告訴學生這款遊戲賺了好幾億美金,想學寫APP嗎?」

什麼是認同某件事的意義?

就是當人家叫你這樣作事,你馬上問對方為什麼要這樣作,而對方能回答出一個你滿意的答案,而不是跟你說「一直都是這樣作的阿」「叫你作就作,問那麼多幹嘛」,若對方成功說服你,你就會去作某事,遊戲業、直銷跟詐騙集團在這方面一直是強項,以後想當業務的話可以多參考他們是怎麼作的。所以各位媽媽、主管、老闆們知道該怎麼作了嗎?

一些心得歡迎分享~

2015/6/14

菜單精靈

今天想到一個Idea,菜單精靈,用精靈模式點餐,在UI上用「下一步、下一步、完成」的引導式點餐法,或者可以對菜單做篩選,比方說不吃牛、豬、羊、辣、胡蘿蔔。

這東西好處在哪?

今天中午聚餐的時候,看著菜單上寫的各種點法,我就在想「為什麼我需要去了解每一家店菜單格式上的不同?」,光是要讀懂他的計費方式:有幾種不同的套餐?一個套餐包含哪些東西?套餐加多少錢,會多得到什麼東西?決定要吃什麼,變成一件很困難的事情。

要統一菜單格式我認為是一件非常困難的一件事情,大概就跟要每家公司使用相同的履歷表一樣困難。但是若要從紙本菜單換成電子菜單,我認為難度下降很多。電子菜單能讓客戶點餐變得容易,至少電子菜單能夠做到更多紙本作不到的事情,比方說隱藏次要資訊,只顯示主要資訊,提供建議、試算,食材介紹等。

對於客人來說點餐變得更有趣,對於老闆來說,修改菜單不需要重新印刷,若將點餐結果直接串連到店家的系統,那連服務生都省了。

2015/6/13

為什麼設計總是被要求改稿,最後卻採用初稿?

本文請搭配音樂欣賞


死了都要改,原作可能在這裡

為什麼設計總是被要求改東改西,最後卻採用初稿?

初稿是設計師最滿意的稿

在設計師在權衡各種需求後,交出初稿之前,已經思考過各種可能性,微調過無數個小地方,設計師會有一種設計師的堅持,最後設計師終於得到一個最滿意的結果作為初稿交出。而這已證明了是初稿是個區域最佳解,區域最佳解意味著作任何微調都會得到更糟的結果

客戶不認同初稿是最佳解

客戶對初稿不滿意,因為客戶只看到一個結果,沒有看到整個思考流程,不知道設計師在權衡需求時的取捨,不知道設計師為了滿足了什麼需求而犧牲了什麼需求。一開始客戶沒有意識到初版是區域最佳解,開始提出各種調整方案,設計方通常配合改稿,客戶看見各種微調後的結果後,發現比初稿還糟,有一好沒兩好,才開始知道初稿的好,客戶在改稿後才認同初稿是最佳解。

為什麼客戶一開始不認同初稿?

原因有很多,比方說我錢都付了,不多改個幾次不划算;我的想法比專業的好,不尊重專業;設計沒聽懂我要的;價值觀不同等很多原因都有可能。其中最糟糕的想法就是不尊重專業。更可怕的是,他可能沒注意到他正在不尊重專業。(趕快把這篇文章貼在他臉上R)

要怎麼確認客戶尊不尊重專業?

若價值觀相同,客戶也一開始就把需求講清楚了,沒有陸續追加需求的情況下,提出的修改方案就會是不尊重專業。價值觀相同的意思是你覺得好的東西我也覺得好,你覺得不好的東西我也覺得不好。

為什麼客戶應該採用初稿

對於客戶來說,使用初稿是CP值最高的選擇,花最少的錢,最快的速度,得到一個相對好的結果。對於設計師來說,感覺到被客戶尊重,這麼阿莎力的客戶,以後接他的案,少收一點錢都願意。若不直接採用初稿,則需要許多次改稿後,才有可能得到比初稿好一點點的結果,記住:最後20分的品質需要80分的成本。

設計師的自我保護

若是接案,簽約時一定要說明改稿和修改需求要額外收費,收費方式最好是採用分階段收費,還沒開工就先收一筆訂金,交了初稿就至少要收到80%的金額,這樣才不會被客戶凹單。記住:當客戶欠你1000元時是你決定客戶的人生,當客戶欠你100000元時,客戶決定你的人生,欠錢的人講話最大聲了。
若是員工,一旦老闆開始亂改,不尊重設計,老闆說要改啥就配合改沒關係,但你下班時間一到就一定要走人,讓老闆知道他正在浪費的不是你的時間,而是他的錢,那是他的自由,但他可能不知道,他正在消耗你的熱情。所謂熱情,就是一股莫名自願加班的感覺。

最後再送上一個影片


出處:http://app2.atmovies.com.tw/film/fajp45012460/

一些心得歡迎分享~

2015/6/11

區域最佳解:任何微調都會得到更糟的結果

當定義域(x)連續的情況下

當定義域(x)離散的情況下


所謂的區域最佳解,指的是在某個定義域(x)範圍內,最高或者最低的值(y)。我們經常面臨一些求解區域最佳解的問題,通常長這樣:

「精英中心裡面最強的武術是哪個?」
定義域(x):精英中心裡面的武術
值域(y):武術強度
最佳解的方向:取最高 (我認為啊,空手道是世界上最強的武術了,所以我覺得精英中心裡面,應該就只有空手道的存在,其他應該廢除。)

「台灣哪一任總統支持度最低?」
定義域(x):當過台灣總統的人
值域(y):人民支持度
最佳解的方向:取最低

「CP值最高的低音耳機是哪款?」
定義域(x):所有低音耳機
值域(y):CP值
最佳解的方向:取最高

「最省電的冷氣是哪一台?」
定義域(x):所有冷氣
值域(y):冷氣的耗電程度
最佳解的方向:取最低

「王品集團旗下餐廳最便宜的是哪家?」
定義域(x):王品集團旗下所有餐廳
值域(y):套餐價格
最佳解的方向:取最低

「這張設計稿的標題字體是不是可以換一下?」
定義域(x):標題字體
值域(y):設計稿的好看程度
最佳解的方向:取最高

以上的舉例全是離散定義域,而求連續區域最佳解的問題通常長這樣:

「你給我注意聽好,我的料理是炸鳳尾蝦,就是蝦子裹碎核果去炸的,將核果搗碎後裹在蝦肉上,油炸成為金黃色,不但要考慮核果跟蝦肉的比例,高低油溫的調節也需要高度的技術跟經驗的。鮮脆可口的核果外衣,經油炸之後,其香味立即倍增,堪稱人間第一美味,搭配特製醬汁來食用,味道更是妙不可言。所以那個醬汁要加多少?」
定義域(x):特製醬汁的量
值域(y):味道的好吃程度
最佳解的方向:取最高 (沒有醬汁還敢說已經作好了,誰會相信你啊,真是笑死人了)

「欸幹,手機沒訊號,你家哪裡有訊號?」
定義域(x):你家的位置
值域(y):手機的訊號
最佳解的方向:取最高

「全世界海拔最高的地點落在經緯度多少?」
定義域(x):經緯度
值域(y):海拔高度
最佳解的方向:取最高

「這張設計稿的標題大小是不是可以再大一點?」
定義域(x):標題大小
值域(y):設計稿的好看程度
最佳解的方向:取最高

很明顯可以看出這裡的定義域(x) 從問「是誰」變成了用問「是多少」來呈現,相信大家看到這裡已經明白什麼是區域最佳解了。

2015/6/10

Swift 的 SequenceType、GeneratorType 的實作

class RandomDoubleGenerator: GeneratorType {
    let min = 0.1
    var current = 1.0
    
    func next() -> Double? {
        current = Double(arc4random()) / Double(UINT32_MAX)
        if current < min {
            return nil
        }
        return current
    }
}

class RandomDoubleSequence: SequenceType {
    func generate() -> RandomDoubleGenerator {
        return RandomDoubleGenerator()
    }
}

var sequence = RandomDoubleSequence()
var list = [Double]()
for x in sequence {
    list.append(x)
}
list

var g = sequence.generate()
while let x = g.next(){
    println(x)
}

這裡實作出一個隨機長度的隨機數值序列(Sequence)

這個序列會產出介於0~1之間的亂數

當產出值小於0.1的時候判定為序列結束

大家可以嘗試把上面那段code貼到 playground 看結果


核心程式在 GeneratorType.next()

    func next() -> Double? {
        current = Double(arc4random()) / Double(UINT32_MAX)
        if current < min {
            return nil
        }
        return current
    }
}

為了讓下面的 for 可以跑,我們需要實作一個 SequenceType 和一個GeneratorType

for x in sequence{
    println(x)
}

SequenceType 介面需要實作一個函數 generate()->GeneratorType

他會傳回一個 Generator 作為跑迴圈用的變數

而實作 GeneratorType 需要實作一個函數 next()->T?

若 next() 傳回 nil 就代表結束了,後面沒東西了

其背後的運作邏輯為

var g = sequence.generate()
while let x = g.next(){
    println(x)
}



若對應到C#

Swift 的 SequenceType 其實是 C# 的 IEnumerable

Swift 的 GeneratorType 其實是 C# 的 IEnumerator



附上 SequenceType 和 GeneratorType 合在一起寫的版本:

class RandomDoubleSequence2: GeneratorType, SequenceType
{
    let min = 0.1
    var current = 1.0

    func generate() -> RandomDoubleSequence2 {
        return RandomDoubleSequence2()
    }
    func next() -> Double? {
        current = Double(arc4random()) / Double(UINT32_MAX)
        if current < min {
            return nil
        }
        return current
    }
}

var sequence2 = RandomDoubleSequence2()
var list2 = [Double]()
for x in sequence {
    list2.append(x)
}
list2

Swift 日期比較運算子 <、==、>

extension NSDate: Comparable { }

public func ==(lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs === rhs || lhs.compare(rhs) == .OrderedSame
}

public func <(lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.compare(rhs) == .OrderedAscending
}

public func >(lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.compare(rhs) == .OrderedDescending
}

// true
NSDate() < NSDate()
// false
NSDate() == NSDate()
// false
NSDate() > NSDate()

在 Swift 裡類似 JS eval 的東西

func caculate(s:String)->Double{
    let exp:NSExpression = NSExpression(format:s)
    let result:Double = exp.expressionValueWithObject(nil,context:nil) as? Double ?? 0
    return result
}

caculate("(1+1)*2")
caculate("1+1*2")
caculate("1+1")
caculate("(3+1)*2")
caculate("1/0")
caculate("1/0.0")
caculate("sqrt(2.99)")
caculate("log(2)")
caculate("abs(-1)")
caculate("exp(3)")
caculate("ln(exp(3))")
caculate("random()")

2015/5/21

回不去了 - 黏性的設計原則

請極盡所能地利用使用者的輸入來客製化服務


若所有的使用者輸入都被轉化為服務的客製化參考,越多的使用者輸入,就有越多客製化。他對服務的依賴就越高,因為他轉移到其他服務需要重新適應。

比方說文字編輯器VIM、Sublime Text,網頁瀏覽器chrome、firefox 這些軟體的特徵是可以安裝外掛,你若使用這些軟體,裝了一堆外掛,你就難以轉換到另一套軟體,因為轉換成本上升了。

比方說 iOS 和 Android 這兩大陣營,之所以會「用了 iOS就回不去了」最主要的理由是因為買了iOS App,當你一買 iOS App 就會發現回去 Android 的成本上升了。

比方說社群網站 facebook,你花時間加好友,建立黑名單,按讚關注等等的都是在作調整服務內容的事情,而每當你要換一套社群網站就必須重新作一次那些事,所以轉換成本上升了。

如果上述服務都沒有做利用使者輸入來客製化內容的話,還會有回不去了的感覺嗎?

2015/5/12

白羅家麵點王羅根手上的老麵


為什麼APP都寫完了還要回頭補寫需求規格書?

因為在一開始製作的時候並不是完整理解所有需求,所以需求是動態新增的(一邊做一邊增加需求)。

 而需求規格是知識的累積,他代表在寫這支APP之前應該考慮到的項目。

一邊做APP的時候,一邊發現當初還沒想到的問題,經過臨時討論,提出解決方案,在將方案實作到APP內,做完之後如果沒記錄到需求規格書內,則沒有累積到知識。

其實就像獲利時代裡說的商業模式圖,這張圖的價值就是創業前應該考慮到的項目,所以APP需求規格書的價值在於提供新APP在定義需求時參考。一個良好的經過這樣累積的需求規格書,就像是白羅家麵點王羅根手上的老麵,要作新APP的時侯應該回過頭來看看。 

一個良好的需求規格書的價值除了他能規範目前開發的APP,最大的價值是作為新APP需求規格書的範本。

2015/5/11

如何評價一個人事物?

如何評價一個人事物?

評價一個人事物之前是否需要爬過所有的文?在看完所有資訊之前,發表的意見都是偏見嗎?可現在是資訊爆炸的時代,有必要投資時間在爬文上嗎?

其實透過發表偏見得到的回饋,會比較快看見真實,但是不斷看見別人發表偏見卻覺得這樣不好。

只有三條路

1. 不發表任何評價
2. 發表偏見等待回饋
3. 努力爬文後發表比較不偏的偏見

結論:選擇有價值的議題發表比較不偏的偏見,不要花時間在無價值的議題上

2015/5/5

xcode 在 build 的時候發生的錯誤

錯誤訊息如下:
Apple Mach-O Linker Error
clang: error: linker command failed with exit code 1 (use -v to see invocation)

解決方法:
上面選單 production -> clean

2015/4/27

什麼是資金控管 / 下注策略?

什麼是資金控管 / 下注策略?

下注策略是在調整遊戲的勝率跟賠率,不是在調整期望值。準確的說是透過下注金額來改變遊戲的機率分布。機率分布是指每個可能結果個別的機率。

在股票術語裡面,叫資金控管。
在賭博術語裡面,叫下注法或下注策略。

下注策略中最經典的是馬丁格爾策略,馬丁格爾策略又稱加倍下注法。每次輸,下次就加倍下注。這是提高勝率,降低賠率的方法。這是小賺大賠法。另一個是反馬丁格爾策略,每次贏就把贏了的錢拿去下注,直到贏N場為止。這是降低勝率,提高賠率的方法。這是小賠大賺法。

贏要衝,輸要縮,這講的也是導向小賠大賺的下注策略。

為什麼需要資金控管 / 下注策略?

從數學的角度來看,既然期望值相同,不管我用什麼策略,只要玩的久,結果不是都一樣嗎?考量現實上的情況,因為期望值的正確解讀是「長期來說每次輸贏的平均值」,什麼是長期?期望值的計算方法是把每個事件發生的機率乘上每個事件發生後的結果後加總。從計算方法來看,要達到所謂的長期,至少每個事件都要發生過一次!

以大樂透為例:大樂透頭獎中獎機率 1/13983816。什麼意思?玩大樂透要到達所謂的長期,如果每期只買一張,至少要買1398萬期!可是一年只開200期,如果每期只買一張,你一輩子也不會買到所謂長期。那麼又何必參考期望值?關心勝率即可,不用關心賠率。

但是在賭博時輸光籌碼就得離場,一旦離場就看不到所謂長期,請問馬丁格爾策略發生連輸破產之後還有辦法繼續下注嗎!!我並不是說馬丁格爾策略不能用,是你會不會看時機用的問題。使用馬丁格爾策略的時機是在一個勝率高又不限制單次下注上限的遊戲裡面,第一注的下注金額根據總資金,和想玩的場數來定。

比方說我只想贏一場。那麼我可以下比較大的注。但是如果我想贏一百場,一百場裡面會遇到連輸破產的機率絕對比贏一場遇到連輸破產的機率高。玩馬丁格爾策略一定要避免遊戲場數到達所謂長期,可以藉由調整單次下注金額來改變遊戲周期。

怎麼調整?

假設進行一個遊戲,勝率50%,賠率1:1,期初資金為1000,可以輸到變負的。

如果我第一注下的金額是1,我最多可以連輸10場 ( 1+2+4+8+16+32+64+128+256+512 )。而連輸10場的機率是 1/1024,這表示1024就是所謂的周期。只要我沒連輸10場,就不算輸。

機率分布為:
賺1元:在連輸10場之前贏1場的機率 = 1023/1024
破產:連輸10場的機率 = 1/1024

如果我第一注下的金額是100,我最多可以連輸4場 ( 100+200+400+800 )。
機率分布為:
賺100元;在連輸4場之前贏1場的機率:15/16
破產:連輸4場的機率:1/16

馬丁格爾策略講求的是在破產之前見好就收,既然馬丁格爾策略不是在拼久,你用馬丁格爾策略一玩久就等著破產,而久就是長期,所以選擇適當的周期數是重要的。

回頭講樂透,威力彩頭獎30億人人搶著買。搶什麼搶?中30億跟中1億有差嗎?還不都是躺著過下半輩子?那麼在威力彩頭獎30億時的最佳下注策略是什麼?

注意:下注策略是在調整勝率跟賠率,不是在調整期望值。

如果我不想贏30億,我只想贏1億的話我應該怎麼下注?我會找信任的30個人來跟我合資,頭獎金額分一分變成1億,但中獎機率瞬間變成30倍!

再講股票,大家都在講資金控管,資金控管到底有多重要,從上面的馬丁格爾策略就可以看得出來。如果玩的遊戲是正期望值,就應該盡量想辦法到達長期,存活最重要,所以應該採取小賠大賺法。股票有股利,顯然是正期望值,從0050來看的話是接近年利率約4%的正期望值遊戲。資金控管講的是生存,是保本,是停損不是攤平,就是要導向小賠大賺。

資金控管講的是贏要衝,那要衝多少?要不要ALL IN?輸要縮,那要縮多少?要不要出場?這些都是計算後的結果,必要先知道自己想要或喜歡的賠率和勝率是如何,根據心理素質,每個人能適合的勝率和賠率都不同。這就是為什麼大家在講要建立自己系統。

雞蛋不要放在同一個籃子裡,講的是小注多量,這也是為了更快到達長期的作法。

一般散戶的操作完全相反,通常喜歡採取馬丁格爾策略,股票一漲就跑,一跌就套牢,沒賣就不算輸,跌深攤平,攤個兩到三次就沒錢了,如果是現股,放著等到解套還是有可能的,但有一批人是資買,直接被殺到斷頭。顯然是第一注下太大,周期太短,一下就破產了。


2015/4/9

阿帕契 - 單腳敬禮姿勢

原作:http://www.appledaily.com.tw/realtimenews/article/new/20150404/586620/

背景圖:http://goo.gl/wKttVg

我用電腦螢幕當背景,跟實境有90%像。








其實還蠻困難的,試了蠻久還是沒辦法原汁原味擺出來。

iPhone / iPad 各種觸控筆試用心得

會想要買觸控筆是為了玩遊戲(龍族拼圖)。

因為 iPad 螢幕太大,如果想要觸控到整個螢幕的話就必須移動手肘,不能只靠手腕,但是在 iPhone 上是可以只靠移動手腕就能觸控到整個螢幕的。因為遊戲有時間限制,所以手指在螢幕上的移動速度是重要的,我就想到說如果有觸控筆的話,就可以不用移動手肘了吧?移動速度就可以變快了吧?而且也不會被手指遮住畫面了吧?於是決定弄一隻觸控筆。

我目前試過的觸控筆大致上分為三種,第一種是橡皮擦筆,第二種是圓盤筆,第三種是充電筆。測試環境是無保護貼的 iPhone。


橡皮擦筆:
舉例:Bamboo Stylus Solo 第三代觸控筆
https://store.wacom.tw/products.aspx?prssno=1182
優點:不用充電,感應角度大。
缺點:使用時需要出力施壓,光是碰到螢幕是不會感應的,使用起來的觸感就像用橡皮擦,所以不太能滑很快。


圓盤筆:
舉例:Adonit Jot Pro 專業隨行觸控筆
http://www.aiplife.com.tw/products_detail.php?id=172
優點:不用充電,不用出力施壓,碰到即感應。
缺點:因為圓盤的關係,傾斜角度過大的話(大約45度左右),圓盤就沒辦法貼齊銀幕,所以就會中斷感應,在遊戲裡這會是致命傷。我用正常拿筆方式會遇到中斷感應的問題,但是用拿粉筆的方式就沒這問題。


充電筆:
舉例:Intuos Creative Stylus 2專業繪圖觸控筆
https://store.wacom.tw/products.aspx?prssno=1175

舉例:Adonit Jot Touch Pixelpoint™(iPad專用壓力感應觸控筆)
http://www.aiplife.com.tw/products_detail.php?id=162
優點:不用出力施壓,碰到即感應,感應角度大,某些筆可配合特定APP使用防掌觸或感壓等額外功能。
缺點:貴,需要充電,大約充電1~2小時可以用20~25小時。因為筆頭細的關係,比較弱的螢幕保護貼可能會被刮傷。


2015/3/21

程式設計師界的文人相輕是怎麼一回事?

這是一個文人相輕的故事。

使用設計模式的人有兩種。第一種人他們知道各種模式的優缺點而能夠在適當的時機去使用正確的模式。第二種人是剛學會設計模式,覺得在程式裡面有用設計模式真屌,通常我們會稱呼這叫作過度設計。

不使用設計模式的人也有兩種。第一種是學會之後知道他的缺點所以盡量不使用,第二種人是沒學過。

當一個使用設計模式的人,遇到一個不使用設計模式的人時,就會出現文人相輕的局面:雙方都認為對方是第二種人。

我說明一下什麼是設計模式:就是一群人覺得自己寫的程式架構很好然後把架構命個名丟出來,出了一本書叫設計模式,簡單說就是給你作文範本。所以你在程式裡面去使用設計模式,就好像你寫作文有用成語一樣,可是你知道剛學會成語的人很喜歡整篇作文都是成語,因為覺得很屌...




附上一篇整篇都是成語的作文:http://kids.yam.com/joke/article.php?cid=campus&id=53013

== 以下轉載 ==

今天是國慶日,因為英明偉大的政府建設國家、愛護百姓的功績罄竹難書,所以放假一天,爸爸媽媽特地帶我們到動物園玩。

按照慣例,我們早餐喜歡吃地瓜粥。今天因為地瓜賣完了,媽媽只好黔驢技窮地削些芋頭來濫竽充數。沒想到那些種在陽台的芋頭很好吃,全家都貪得無厭地自食其果。

出門前,我那徐娘半老的媽媽打扮的花枝招展,鬼斧神工到一點也看不出是個糟糠之妻。頭頂羽毛未豐的爸爸也趕緊洗心革面沐猴而冠,換上雙管齊下的西裝後英俊得慘絕人寰,雞飛狗跳到讓人退避三舍。東施效顰愛漂亮的妹妹更是穿上調整型內衣愚公移山,畫虎類犬地打扮的豔光四射,趾高氣昂地穿上新買的高跟鞋。

我們一丘之貉坐著素車白馬,很快地到了動物園,不料參觀的人多到豺狼當道草木皆兵,害我們一家骨肉分離。妻離子散的爸爸鞠躬盡瘁地到處廣播,終於找到到差點認賊作父的我和遇人不淑的妹妹,困獸之鬥中,我們螳臂當車力排眾議推己及人地擠到猴子柵欄前,魚目混珠拍了張強顏歡笑的全家福。

接著到雞鳴狗盜的鳥園欣賞風聲鶴唳哀鴻遍野的大自然美妙音樂。後來爸爸口沫橫飛地為我們指鹿為馬時,吹來一陣涼風,唾面自乾的滋味,讓人毛骨悚然不寒而慄,媽媽連忙為爸爸黃袍加身,也叮囑我們要克紹其裘。

到了傍晚,因為假日的關係,餐廳家家鵲佔鳩巢六畜興旺,所以媽媽帶著我們孟母三遷,最後終於決定吃火鍋。有家餐廳剛換壁紙,家徒四壁很是美麗,燈火闌珊配上四面楚歌,非常有氣氛。十面埋伏的女服務生們四處招蜂引蝶,忙著為客人圍魏救趙,口蜜腹劍到讓人誤認到了西方極樂世界。

飢不擇食的我們點了綜合火鍋,作懷不亂的爸爸當頭棒喝先發制人,要求為虎作倀拿著刀子班門弄斧的女服務生,快點將狡兔死走狗烹,因為尸位素餐的我們一家子早就添油加醋完畢,就等著火鍋趕快沈魚落雁好問鼎中原,可惜鍋蓋太小,有點欲蓋彌彰。

湯料沸騰後,熱得樂不思蜀的我們趕緊解衣推食好大義滅親上下其手,一網打盡撈個水落石出。

火鍋在我們呼天嗆地面紅耳赤地蠶食鯨吞後,很快就只剩滄海一粟,和少數的漏網之魚。母範猶存的媽媽想要丟三落四放冬粉時,發現火苗已經危在旦夕,只好投鼠忌器。幸好狐假虎威的爸爸呼盧喝雉叫來店員抱薪救火,終於死灰復燃,也讓如坐針毯的我們中飽私囊。鳥盡弓藏後,我們一家子酒囊飯袋,沆瀣一氣,我和妹妹更是小人得志,沾沾自喜。

不料結帳的時候,老闆露出廬山真面目,居然要一飯千金,爸爸氣得吳牛喘月,媽媽也委屈地牛衣對泣。

啊!這三生有幸的國慶日,就在爸爸對著錢包自慚形穢大義滅親後,我們全家江郎才盡,一敗塗地! ~ the end ~


2015/3/19

開發 iOS Web App 在開發階段不用 xCode 重新編譯的方法

Web App 是一個APP裡面包一個網頁,這個網頁可以是 local file 也可以是一個網址。

如果你沒有一台網頁伺服器,你會選擇使用 local file 的方式。

或者當網頁是 local file 的時候,會有額外的存取能力,有些時候會為了這個能力去使用 local file。

正常流程是把做好的網頁放進 Macbook Pro 裡面的 xCode ,然後編譯成 app 發布到手機上做測試。

如果是這樣,那我不就每次改一點網頁就要重新編譯?

這問題有解嗎?有的。

我想到 iTools 可以修改 App 中的檔案這件事情。

所以可以這樣做:

先講結論:這樣做可行,而且效果十分顯著。


程式碼:https://github.com/etrex/webViewTest

這個程式的行為是當APP打開時,檢查Document 下有沒有 index.html ,如果沒有,就把在 xCode 做好的 index.html 複製到 Document。

然後用 UIWebView 讀取 /Document/index.html。

使用步驟:
1. 找一個 ios app 開發者帳號
2. 找一台 Makbook Pro,
3. 下載程式碼
4. 把這個 App 安裝到手機上,
5. 用 iTools 去改改看 index.html

我在 git 上放了測試用的網站,在 testWebCode 資料夾,裡面有一個 index.html 和一個 js 資料夾。網頁內容是跟這個網址 http://etrex.tw/a/Game/SlidingPuzzle.html 一樣的 。

附上修改index前後畫面
修改前 iTools

修改前 iPhone



修改後 iTools


修改後 iPhone



如果不考慮排版的話,完全可以正常的進行遊戲。這表示我們放進去的 js 檔有正確地被 index.html 載入。

測試大成功!!


最後附上用 iPhone 的 Chrome 來開這款遊戲時的畫面。

剛進入時的畫面

經過適當的縮放後



另外,關於這款遊戲,有興趣玩的可以玩玩看 http://etrex.blogspot.tw/2014/04/blindfold-sliding-puzzle.html

2015/3/1

IKEA KALLAX 層架組

今天去買了 KALLAX 層架組, 黑棕色

用機車運回家真的是還蠻痛苦的


紙箱蠻難拆的,我最後選擇用暴力法拆掉

打開後是說明書在最上面,旁邊是零件包

零件包內的東西分類後

先組一個L,然後用長螺絲鎖

用四個木卡榫把隔板放進去

放進去後的樣子

接著放另一個方向的隔板,也是用木卡榫

然後再用木卡榫把兩個方向的隔板接起

一直接一直接

接完了,準備裝側版

側版裝上後

底版也裝上,螺絲還沒鎖的樣子

鎖完螺絲和貼上防滑墊(防滑墊在材料包裏面有,忘記拍)

最後放置的位置


過程中最困難的其實是搬運,第二困難的部分是螺絲很難鎖上,因為要很大力鎖他才會密合。

從購買到裝好大約花2個小時左右。