實現 iOS App 與網站之間互通的 Universal Links

Universal Links 是網站與應用程式之間的橋樑,可以將使用者從網站導引至應用程式。比如說有個網址是 http://www.example.com/book/12345678 ,在 iOS 上用 Safari 瀏覽時剛好也有安裝 App 端,網頁最上方就會出現一個  "在「XXX」App 中打開" 的橫幅,點擊就會開啟 App 端進到指定的頁面。

你可能對於 URL Schemes 不陌生,以前要從網頁連到 App 需要判斷是否有安裝該 App,然後分別連到 App 下載頁面或是開啟 App 到某一頁。現在有了 Universal Links 確實方便許多,至少已安裝的部分系統已經幫你處理好了。

 

Apple Developer 設定

先去 iOS App IDs 確定該 ID 的 Associated Domains 為啟用狀態。

 

Xcode 專案設定

Target → Capabilities → 打開 Associated Domains → + → "applinks:example.com"

 

Web 設定

新增一個 apple-app-site-association 檔案(沒有副檔名),內容如下:


{
"applinks": {
"apps": [],
"details": [
{
"appID": "D3KQX62K1A.com.example.DemoApp",
"paths": [
"*"
]
}
]
}
}

若已有這個檔案,只要加入 applinks 這個層級並保持 JSON 結構即可。
D3KQX62K1A 為 Team ID ,可以從這裡找到。
com.example.DemoApp 為 Bundle Identifier 。
paths 裡寫 "*" 代表整個網站都會處理,初期為測試方便所以先全部接收,如果只想接收 /book 就寫 "/book"。另外除了 "*" 也能搭配使用 "?" 及 "NOT" 使用。

將此檔案放在網站的 .well-known 資料夾下,整個網址就像這樣 https://example.com/.well-known/apple-app-site-association ,需注意必須要 https:// 開頭,如果有子網域也要分別作設定。每當 App 安裝或是更新版本才會去抓 apple-app-site-association 。

 

程式碼設定


func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {

// 來源是網頁或網址
if userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let incomingURL = userActivity.webpageURL,
let components = NSURLComponents(url: incomingURL, resolvingAgainstBaseURL: true),
let path = components.path {

print("path = \(path)")

// 如果之前有做 URL Schemes 處理,可以搭配使用
/* 書籍資訊
https://www.example.com/book/12345678
com.example.DemoApp://book/12345678
*/
if path.hasPrefix("/book/"), let bookID = path.components(separatedBy: "/").last, bookID.count >= 10 {
// 跳轉到書籍詳細資訊
return true
}
return false
}

return false
}

 


 在 iOS 使用 Safari 瀏覽此網址,可以看到上方的橫幅。若沒有看到可以捲動一下頁面,它有時會隱藏。接著把網址放到備忘錄並對他長按放開,會多出一個 "在「XXX」中打開" 的選項。

 Apple 也有提供工具來檢驗,如果出現 Error no apps with domain entitlements 也不用太糾結,可能是有此功能的新版本未正式上線的關係,只要確定網頁上方有出現橫幅就是成功了。

 


 
參考資料
https://developer.apple.com/ios/universal-links/
https://developer.apple.com/documentation/uikit/core_app/allowing_apps_and_websites_to_link_to_your_content
https://developer.apple.com/documentation/uikit/core_app/allowing_apps_and_websites_to_link_to_your_content/enabling_universal_links
https://developer.apple.com/documentation/uikit/core_app/allowing_apps_and_websites_to_link_to_your_content/handling_universal_links

在 iOS App 裡實現密碼自動填寫

想像一下這個使用情境,某個服務有 Web 也有 App,若使用者有用 Safari 登入並記住密碼,那麼在 App 裡點擊 Text Field 的鍵盤會提示是否要用已儲存的密碼,點擊後帳號密碼就會填入對應的 Text Field 中,使用者完全不用自行輸入非常方便。

若要實現這功能需要從 App 以及 Web 兩邊都做設定,且系統需求為 iOS 11 以上。

 

Apple Developer 設定

先去 iOS App IDs 確定該 ID 的 Associated Domains 為啟用狀態。

 

Xcode 專案設定

Target → Capabilities → 打開 Associated Domains → + → "webcredentials:example.com"

 

Web 設定

新增一個 apple-app-site-association 檔案(沒有副檔名),內容如下:

{
    "webcredentials": {
        "apps": [
            "D3KQX62K1A.com.example.DemoApp",
            "D3KQX62K1A.com.example.DemoAdminApp"
        ]
    }
}

若已有這個檔案,只要加入 webcredentials 這個層級並保持 JSON 結構即可。
D3KQX62K1A 為 Team ID ,可以從這裡找到。
com.example.DemoApp 為 Bundle Identifier 。

將此檔案放在網站的 .well-known 資料夾下,整個網址就像這樣 https://example.com/.well-known/apple-app-site-association ,需注意必須要 https:// 開頭,如果有子網域也要分別作設定。每當 App 安裝或是更新版本才會去抓 apple-app-site-association 。

 


現在你可以試試先在網站登入並儲存密碼,儲存的密碼可在 設定 → 帳號與密碼 → App 與網站密碼 裡找到。

然後回到 App 的登入畫面裡點擊 Text Field 應該就可使用儲存的帳號密碼了,雖然這只是單向的。

 


你可能會發現並非所有的 Text Field 都會出現,因為預設是以 secureTextEntry 這屬性來判斷是否為密碼,若沒指定則需要另外要用 textContentType 來指定:


userTextField.textContentType = .username
userTextField.keyboardType = .emailAddress
passwordTextField.textContentType = .password

newPasswordTextField.textContentType = .newPassword
confirmPasswordTextField.textContentType = .newPassword

singleFactorCodeTextField.textContentType = .oneTimeCode

 

參考資料
https://developer.apple.com/documentation/security/password_autofill/
https://developer.apple.com/documentation/security/password_autofill/setting_up_an_app_s_associated_domains
https://developer.apple.com/documentation/security/password_autofill/enabling_password_autofill_on_a_text_input_view

WordPress 關閉 wptexturize 功能避免符號被轉換

WordPress 會自動轉換一些符號,例如 "--" 會顯示成 "–" ,由於我會在部落格裡放 bash 語法,裡面一定會有 "--help" 這種字串,不解決會十分困擾。

查到的原因是 wptexturize 方法導致,雖然放在 pre, code, kbd, style, script, tt 標籤內的內容將會忽略而不會觸發 wptexturize 方法,但是這樣就會改變排版。

 

以下是變換前變換後的對照

"---"
"—"

" -- "
"—"

"--"
"–"

" - "
"–"

"..."
"…"

``

"hello
“hello

'hello
‘hello

''

world."
world.”

world.'
world.’

" (tm)"
" ™"

1234"
1234″

1234'
1234′

'99
’99

Webster's
Webster’s

1234x1234
1234×1234

 

將以下程式碼儲存成 disable-wptexturize.php 上傳放到 /wp-content/plugins 底下,再到後台安裝啟用這個外掛就能解決。


/*
Plugin Name: Remove the wptexturize filter
*/

add_filter( 'run_wptexturize', '__return_false' );

 

參考資料
https://codex.wordpress.org/Function_Reference/wptexturize
https://codex.wordpress.org/Plugin_API/Filter_Reference/run_wptexturize
https://geeksterminal.com/wordpress-double-dash-problem/1399/

海外遊戲進入中國市場的相關政策規範及如何克服涉入障礙 筆記

本文是 2018 台北遊戲開發者論壇 的其中一個主題演講筆記

海外遊戲進入中國市場的相關政策規範及如何克服涉入障礙
郭珈瑜 Abby (TapTap)

TapTap 是有媒體屬性與玩家有高互動性的第三方 Android 平台。

特色:
1. 推薦是根據遊戲本身是否好玩以及與該平台的玩家契合度
2. 未上市也可以用預約狀態來露出
3. 禁止刷榜或違規評論
4. 社區玩家的評論牆
5. 不需接 SDK
6. 下載方式有三種,從本平台或是 Google Play 、 App Store 上下載

建議從預約期間就建立遊戲頁面,並且使用論壇功能發布消息。發文內容可以從開發角度或是遊戲本身,像是開發日誌或是遊戲設定的分享,官方帳號會有藍色勾勾作為識別。

版號:遊戲在中國合法發布提供下載必須要有版號
1. 必須要有中國落地的發行商
2. TapTap 會免費協助版號申請
3. 遊戲需注意文字的內容及選題的規範

建議開發進度50~70%進行遊戲內容的評估,70%時進行軟體著作權的申請,100%申請版號。

利潤均不分成,商業模式為廣告系統。

「不只是美術而已」技術美術之路 筆記

本文是 2018 台北遊戲開發者論壇 的其中一個主題演講筆記

「不只是美術而已」技術美術之路
黃香菱 (曉數碼)

何謂技術美術
懂技術的美術人員、程式與美術的溝通橋樑
技術向TA:渲染、特效、優化等的工具製作
美術向TA:美術資深人員懂得與程式人員溝通,且對於新技術接受度高
廣義 TA:任何工作內容同時包括程式與美術的人員

技術美術的工作內容
工作核心:綜合的問題解決,沒有明確答案的問題

1. 建立美術的工作流程
2. 美術相關工具製作 (自動化)
3. 美術效果的研究 (特效、粒子等)
4. 效能優化
5. 大量的溝通

專案支援的三階段變化
1. 前期配合企劃、美術的需求去研究會用到的技術
2. 中期整理好美術流程、美術工具的開發
3. 後期優化效能及解決美術相關 Bug

美術轉職成TA
1. 有完整的參與美術製作流程的觀念
2. 學習遊戲引擎與shader引擎
3. 學習電腦圖學
4. 3D 繪圖
5. Google 力
6. 程式語言、英文能力

技術美術的特質
1. 具有美術基礎
2. 好奇心
3. 善於溝通
4. 耐心
5. 熱情

XMR-Stak 指令參數挖 XMR 簡易教學

XMR-Stak 是一個挖 Monero (XMR) 的軟體,只要是同屬 CryptoNight 的競爭幣都可以使用。此軟體最大的特色就是可以同時使用 CPU 與顯示卡挖同一個幣種,而且只需開一個程式就能辦到。

XMR-Stak 2.4.x 的新版本中,只能使用 2.3.x 以上的設定檔,但我個人還是建議重新產生一份乾淨的設定檔,詳細可以參考這個影片。

經過影片的步驟後會得到新增的檔案如下:
config.txt (通用設定)
cpu.txt (CPU設定)
amd.txt nvidia.txt (顯卡設定)
pools.txt (礦池設定)
我們會拿以上的設定檔串成 .bat 或 .sh 檔

 


這裡以 XMR 為例,基本上不同幣種都是共用前 3 個檔案,只有 pools.txt 必須個別設置。我將 pools.txt 名稱改為 pools-xmr.txt ,同一個幣種都共用此檔案,先把此檔案打開。


"pool_list" :
[
{"pool_address" : "xmr.omine.org:5000", "wallet_address" : "43yG8CDmWgSiyxX9rxH7tfAz4E4VbrvvFFGSAMmaAKm4UL7T3MuKA8C6QMGmcuBUQbGGsFDFcrB5SZ1puboMFETd2ecoxVK#pc1", "rig_id" : "", "pool_password" : "", "use_nicehash" : false, "use_tls" : false, "tls_fingerprint" : "", "pool_weight" : 10 },
{"pool_address" : "xmr-asia1.nanopool.org:14444", "wallet_address" : "43yG8CDmWgSiyxX9rxH7tfAz4E4VbrvvFFGSAMmaAKm4UL7T3MuKA8C6QMGmcuBUQbGGsFDFcrB5SZ1puboMFETd2ecoxVK.pc1/trleee@gmail.com", "rig_id" : "", "pool_password" : "", "use_nicehash" : false, "use_tls" : false, "tls_fingerprint" : "", "pool_weight" : 1 },
],

我設定兩個礦池,並且給予不同的優先權,這樣若是礦池連不上就會換另一個。注意 rig_id 這個參數需要伺服器支援才能用,絕大部分都是在錢包地址上面加工,例如 "." "#" "/" 等字元請參考礦池網站說明。

接下來就是要打指令參數了。

xmr-stak ^
--config config.txt ^
--cpu cpu.txt ^
--amd amd.txt ^
--poolconf pools-xmr.txt ^
--url xmr.omine.org:5000 ^
--user 43yG8CDmWgSiyxX9rxH7tfAz4E4VbrvvFFGSAMmaAKm4UL7T3MuKA8C6QMGmcuBUQbGGsFDFcrB5SZ1puboMFETd2ecoxVK#pc1

每行最後的 “ ^” 是為了斷行,這樣看得比較清楚。若是 Linux 及 Mac 的使用者請使用 ” \” 。

你可能會發現 --url 與 --user 分別對應 pools-xmr.txt 中的 pool_address 與 wallet_address ,為什麼這邊還要再寫一次?因為指令的優先權會大於 pools-xmr.txt 中的 pool_list 設定,假如你今天想挖第 2 個礦池,用指令覆蓋就好不須變動 pools-xmr.txt 檔案。

假設你想要暫時關閉顯示卡挖礦,則直接用指令 --noAMD 與 --noNVIDIA 禁用就好,也不須變動 amd.txt 和 nvidia.txt ,我分別對 GPU 啟用與禁用的兩種情況建立指令,依照心情隨時切換。

xmr-stak ^
--config config.txt ^
--cpu cpu.txt ^
--amd amd.txt ^
--poolconf pools-xmr.txt ^
--url xmr.omine.org:5000 ^
--user 43yG8CDmWgSiyxX9rxH7tfAz4E4VbrvvFFGSAMmaAKm4UL7T3MuKA8C6QMGmcuBUQbGGsFDFcrB5SZ1puboMFETd2ecoxVK#pc1 ^
--noAMD ^
--noNVIDIA

最後將指令存成 .bat (Windows) 與 .sh (Linux Mac) 再執行就可以開挖囉。

台灣最大 XMR 礦池
https://xmr.omine.org/

 


附上官方指令參數說明

Usage: xmr-stak [OPTION]...

-h, --help show this help
-v, --version show version number
-V, --version-long show long version number
-c, --config FILE common miner configuration file
-C, --poolconf FILE pool configuration file
--noUAC disable the UAC dialog
--benchmark BLOCKVERSION ONLY do a benchmark and exit
--benchwait WAIT_SEC ... benchmark wait time
--benchwork WORK_SEC ... benchmark work time
--noCPU disable the CPU miner backend
--cpu FILE CPU backend miner config file
--noAMD disable the AMD miner backend
--noAMDCache disable the AMD(OpenCL) cache for precompiled binaries
--openCLVendor VENDOR use OpenCL driver of VENDOR and devices [AMD,NVIDIA]
default: AMD
--amd FILE AMD backend miner config file
--noNVIDIA disable the NVIDIA miner backend
--nvidia FILE NVIDIA backend miner config file
-i --httpd HTTP_PORT HTTP interface port

The following options can be used for automatic start without a guided config,
If config exists then this pool will be top priority.
-o, --url URL pool url and port, e.g. pool.usxmrpool.com:3333
-O, --tls-url URL TLS pool url and port, e.g. pool.usxmrpool.com:10443
-u, --user USERNAME pool user name or wallet address
-r, --rigid RIGID rig identifier for pool-side statistics (needs pool support)
-p, --pass PASSWD pool password, in the most cases x or empty ""
--use-nicehash the pool should run in nicehash mode
--currency NAME currency to mine

Environment variables:

XMRSTAK_NOWAIT disable the dialog `Press any key to exit.
for non UAC execution

Supported coin options:
- aeon7
- bbscoin
- croat
- cryptonight
- cryptonight_heavy
- cryptonight_lite
- cryptonight_lite_v7
- cryptonight_lite_v7_xor
- cryptonight_v7
- cryptonight_v7_stellite
- edollar
- electroneum
- graft
- haven
- intense
- ipbc
- karbo
- masari
- monero7
- stellite
- sumokoin
- turtlecoin

Version: xmr-stak 2.4.4 c0ab1734
Brought to by fireice_uk and psychocrypt under GPLv3.
Press any key to exit.

ethminer 新版指令參數挖 ETH 簡易教學

ethminer 是一個挖 Ethereum (ETH) 的軟體,只要是同屬 Ethash 的競爭幣都可以使用。此軟體最大的特色是沒有開發者抽成,當然也不需要自己去編譯了。

ethminer 0.14.0 的新版本中,已準備棄用多個與礦池有關的參數,目前舊的參數還是可以使用但會顯示警告,並在未來的版本將會移除,以下的參數會被一行的 -P 所取代。

-F, --farm, -FF, -SF, -FS, --farm-failover, --stratum-failover, -S, --stratum, -O, --userpass, -SP, --stratum-protocol, --stratum-ssl, -FO, --failover-userpass, -u, --user, -p, --pass, -o, --port, -fu, --failover-user, -fp, --failover-pass, -fo, --failover-port

 


舊版
ethminer ^
-S eth.gpumine.org:3333 ^
-FS eth2.gpumine.org:4333 ^
-O 0xFdd43923340736FfBcB31C808aC644922c1dF05d.pc1 ^
-SP 1 ^
-RH ^
--farm-recheck 200 ^
-G

新版
ethminer ^
-P stratum1+tcp://0xFdd43923340736FfBcB31C808aC644922c1dF05d.pc1@eth.gpumine.org:3333 ^
-P stratum1+tcp://0xFdd43923340736FfBcB31C808aC644922c1dF05d.pc1@eth2.gpumine.org:4333 ^
-RH ^
--farm-recheck 200 ^
-G

每行最後的 " ^" 是為了斷行,這樣看得比較清楚。若是 Linux 及 Mac 的使用者請使用 " \" 。

其中要特別說明的是 stratum1+tcp:// ,如果是 getwork 就要填 http ,如果是 stratum 則可以填以下任一個
stratum+ssl
stratum+tcp
stratum+tls
stratum+tls12
stratum1+ssl
stratum1+tcp
stratum1+tls
stratum1+tls12
stratum2+ssl
stratum2+tcp
stratum2+tls
stratum2+tls12

你可以發現上面那一大坨有些只差在數字,前者對應 -SP --stratum-protocol ,後者則對應 --stratum-ssl ,不過最常用的還是 tcp 和 ssl 啦。

最後將指令存成 .bat (Windows) 與 .sh (Linux Mac) 再執行就可以開挖囉。

台灣兩大 ETH 礦池
https://eth-tw.gpumine.org/
https://www.tweth.tw/

 


附上官方指令參數說明

Usage ethminer [OPTIONS]
Options:

Work farming mode:
-F,--farm <url> (deprecated) Put into mining farm mode with the work server at URL (default: http://127.0.0.1:8545)
-FF,-FO, --farm-failover, --stratum-failover <url> (deprecated) Failover getwork/stratum URL (default: disabled)
--farm-retries <n> Number of retries until switch to failover (default: 3)
-S, --stratum <host:port> (deprecated) Put into stratum mode with the stratum server at host:port
-SF, --stratum-failover <host:port> (deprecated) Failover stratum server at host:port
-O, --userpass <username.workername:password> (deprecated) Stratum login credentials
-FO, --failover-userpass <username.workername:password> (deprecated) Failover stratum login credentials (optional, will use normal credentials when omitted)
--work-timeout <n> reconnect/failover after n seconds of working on the same (stratum) job. Defaults to 180. Don't set lower than max. avg. block time
--stratum-ssl [<n>] (deprecated) Use encryption to connect to stratum server.
0: Force TLS1.2 (default)
1: Allow any TLS version
2: Allow self-signed or invalid certs and any TLS version
-SP, --stratum-protocol <n> (deprecated) Choose which stratum protocol to use:
0: official stratum spec: ethpool, ethermine, coinotron, mph, nanopool (default)
1: eth-proxy compatible: dwarfpool, f2pool, nanopool (required for hashrate reporting to work with nanopool)
2: EthereumStratum/1.0.0: nicehash
-RH, --report-hashrate Report current hashrate to pool (please only enable on pools supporting this)
-HWMON [<n>], Displays gpu temp, fan percent and power usage. Note: In linux, the program uses sysfs, which may require running with root privileges.
0: Displays only temp and fan percent (default)
1: Also displays power usage
--exit Stops the miner whenever an error is encountered
-SE, --stratum-email <s> Email address used in eth-proxy (optional)
--farm-recheck <n> Leave n ms between checks for changed work (default: 500). When using stratum, use a high value (i.e. 2000) to get more stable hashrate output
-P URL Specify a pool URL. Can be used multiple times. The 1st for for the primary pool, and the 2nd for the failover pool.
URL takes the form: scheme://user[:password]@hostname:port[/emailaddress].
for getwork use one of the following schemes:
http
for stratum use one of the following schemes:
stratum+ssl stratum+tcp stratum+tls stratum+tls12 stratum1+ssl stratum1+tcp stratum1+tls stratum1+tls12 stratum2+ssl stratum2+tcp stratum2+tls stratum2+tls12
Example 1 : stratum+ssl://0x012345678901234567890234567890123.miner1@ethermine.org:5555
Example 2 : stratum1+tcp://0x012345678901234567890234567890123.miner1@nanopool.org:9999/john.doe@gmail.com
Example 3 : stratum1+tcp://0x012345678901234567890234567890123@nanopool.org:9999/miner1/john.doe@gmail.com

Benchmarking mode:
-M [<n>],--benchmark [<n>] Benchmark for mining and exit; Optionally specify block number to benchmark against specific DAG.
--benchmark-warmup <seconds> Set the duration of warmup for the benchmark tests (default: 3).
--benchmark-trial <seconds> Set the duration for each trial for the benchmark tests (default: 3).
--benchmark-trials <n> Set the number of benchmark trials to run (default: 5).
Simulation mode:
-Z [<n>],--simulation [<n>] Mining test mode. Used to validate kernel optimizations. Optionally specify block number.
Mining configuration:
-G,--opencl When mining use the GPU via OpenCL.
-U,--cuda When mining use the GPU via CUDA.
-X,--cuda-opencl Use OpenCL + CUDA in a system with mixed AMD/Nvidia cards. May require setting --opencl-platform 1 or 2. Use --list-devices option to check which platform is your AMD.
--opencl-platform <n> When mining using -G/--opencl use OpenCL platform n (default: 0).
--opencl-device <n> When mining using -G/--opencl use OpenCL device n (default: 0).
--opencl-devices <0 1 ..n> Select which OpenCL devices to mine on. Default is to use all
-t, --mining-threads <n> Limit number of CPU/GPU miners to n (default: use everything available on selected platform)
--list-devices List the detected OpenCL/CUDA devices and exit. Should be combined with -G, -U, or -X flag
--display-interval <n> Set mining stats display interval in seconds. (default: every 5 seconds)
-L, --dag-load-mode <mode> DAG generation mode.
parallel - load DAG on all GPUs at the same time (default)
sequential - load DAG on GPUs one after another. Use this when the miner crashes during DAG generation
single <n> - generate DAG on device n, then copy to other devices
OpenCL configuration:
--cl-kernel <n> Use a different OpenCL kernel (default: use stable kernel)
0: stable kernel
1: experimental kernel
--cl-local-work Set the OpenCL local work size. Default is 128
--cl-global-work Set the OpenCL global work size as a multiple of the local work size. Default is 8192 * 128
--cl-parallel-hash <1 2 ..8> Define how many threads to associate per hash. Default=8
CUDA configuration:
--cuda-block-size Set the CUDA block work size. Default is 128
--cuda-grid-size Set the CUDA grid size. Default is 8192
--cuda-streams Set the number of CUDA streams. Default is 2
--cuda-schedule <mode> Set the schedule mode for CUDA threads waiting for CUDA devices to finish work. Default is 'sync'. Possible values are:
auto - Uses a heuristic based on the number of active CUDA contexts in the process C and the number of logical processors in the system P. If C > P, then yield else spin.
spin - Instruct CUDA to actively spin when waiting for results from the device.
yield - Instruct CUDA to yield its thread when waiting for results from the device.
sync - Instruct CUDA to block the CPU thread on a synchronization primitive when waiting for the results from the device.
--cuda-devices <0 1 ..n> Select which CUDA GPUs to mine on. Default is to use all
--cuda-parallel-hash <1 2 ..8> Define how many hashes to calculate in a kernel, can be scaled to achieve better performance. Default=4
--cuda-noeval bypass host software re-evaluation of GPU solutions.
This will trim some milliseconds off the time it takes to send a result to the pool.
Use at your own risk! If GPU generates errored results they WILL be forwarded to the pool
Not recommended at high overclock.
API core configuration:
--api-port Set the api port, the miner should listen to. Use 0 to disable. Default=0, use negative numbers to run in readonly mode. for example -3333.
General Options:
-v,--verbosity <0 - 9> Set the log verbosity from 0 to 9 (default: 5). Set to 9 for switch time logging.
-V,--version Show the version and exit.
-h,--help Show this help message and exit.
Environment variables:
NO_COLOR - set to any value to disable color output. Unset to re-enable color output.

使用 Let’s Encrypt 及 Certbot 在 Debian 上的 Nginx 啟用 HTTPS

本篇文章所搭配環境為 Debian 9 + Nginx 並使用架構在 Let’s Encrypt 上的 Certbot 來啟用 HTTPS 。

 

找出各網域所對應的根目錄

先去 /etc/nginx/sites-enabled/default 這個檔案記錄下各子網域所對應的根目錄
例如我的像是這樣
dreambreakerx.com /usr/share/nginx/www
api.dreambreakerx.com /usr/share/nginx/api
blog.dreambreakerx.com /usr/share/nginx/blog

 

安裝 Certbot


apt-get install python-certbot-nginx -t stretch-backports

如果無錯誤請直接跳到設定 Certbot 那個步驟,若是出現
E: The value 'stretch-backports' is invalid for APT::Default-Release as such a release is not available in the sources
請按照 https://backports.debian.org/Instructions/
編輯 /etc/apt/sources.list 這個檔案新增這行
deb http://ftp.debian.org/debian stretch-backports main


pico /etc/apt/sources.list
apt-get update
apt-get install python-certbot-nginx -t stretch-backports

 

設定 Certbot


certbot --authenticator webroot --installer nginx

各項設定請參考下面,需要注意的是我輸入一個空格字元選擇所有的網域,以及最後我設定強制使用 https


Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): example@gmail.com

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: Y

Which names would you like to activate HTTPS for?
-------------------------------------------------------------------------------
1: dreambreakerx.com
2: api.dreambreakerx.com
3: blog.dreambreakerx.com
-------------------------------------------------------------------------------
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):

Input the webroot for dreambreakerx.com: (Enter 'c' to cancel): /usr/share/nginx/www

Select the webroot for api.dreambreakerx.com:
-------------------------------------------------------------------------------
1: Enter a new webroot
2: /usr/share/nginx/www
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Input the webroot for api.dreambreakerx.com: (Enter 'c' to cancel): /usr/share/nginx/api

Select the webroot for blog.dreambreakerx.com:
-------------------------------------------------------------------------------
1: Enter a new webroot
2: /usr/share/nginx/api
3: /usr/share/nginx/www
-------------------------------------------------------------------------------
Select the appropriate number [1-3] then [enter] (press 'c' to cancel): 1
Input the webroot for blog.dreambreakerx.com: (Enter 'c' to cancel): /usr/share/nginx/blog

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

接著可以試試新網址,也試試舊網址有沒有轉址到 https

 

自動更新證書

更新時使用這句


certbot renew --dry-run

也可以加入 Cron Job ,讓它每個星期一早上3點30分自動執行


crontab -e
30 3 * * 1 certbot renew --dry-run

 

使用 Network Link Conditioner 在 iOS 實機與模擬器模擬伺服器無回應逾時或網路極慢的狀況

在製作一個需要連網的 App 時,常常會需要打 API 取得資料,所以我們一定會針對伺服器回傳的資料處理,但要是伺服器根本就無回應呢?這時我們就需要使用 Network Link Conditioner 這項工具模擬出不同的網路環境做處理。

 


實機設定

先從 設定 → 開發者 → Network Link Conditioner 進去。
選擇 profile ,這裡因為要模擬 timedout 的情況所以選擇 100% Loss 。
並且 Enable 設定為開啟,這樣整台 iOS 裝置都會受到影響。

Network Link Conditioner iOS

 


模擬器設定

由於模擬器的設定裡沒有 Network Link Conditioner ,必須透過電腦設定才行。
請依照 Xcode 版本下載對應的檔案,不然會沒有效果。
Xcode 8 以上請從這下載安裝。
Xcode 7 以下請從這下載安裝。

掛載 dmg 尋找 Network Link Conditioner.prefPane 並點兩下安裝重開機。
路徑是 Additional Tools/Hardware/Network Link Conditioner.prefPane 。
安裝成功會在系統偏好設定裡出現 Network Link Conditioner。

Network Link Conditioner Mac 1

Network Link Conditioner Mac 2

使用方法跟實機一樣就不多說了,也可用用 Very Bad Network 這個 profile 模擬網路超慢的情況,這個會影響到整台電腦與模擬器請小心使用。

 

在 UITableViewCell 中取得 UITableView 或 UIViewController

在 iOS 7 ~ iOS 10 , UITableViewCell 與 UITableView 中間多了一層 UITableViewWrapperView ,直到 iOS 11 又移除...

將以下兩段複製到繼承 UITableViewCell 的自定義 class 裡


weak var tableView: UITableView? {
// 在 iOS 7 ~ 10 中 ,UITableViewCell 的 superview 為 UITableViewWrapperView 而不是 UITableView
if #available(iOS 11, *) {
return self.superview as? UITableView
}else {
return self.superview?.superview as? UITableView
}
}

weak var viewController: UIViewController? {
return self.tableView?.delegate as? UIViewController
}