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