如何把 mysql 新增資料夾的編碼,預設成 UTF-8

有時候我們想要用第三方程式,快速建立多個 mysql 資料庫或是 table,這時你也許會使用類似以下的複製語法:

CREAT Table XXX LIKE ABC

但你會發現,就算在創造 ABC 時已經選擇 utf8_unicode_ci ,複製過來的 XXX Table 仍然會是latin1的編碼。

網路上有很多人都有提供方法,我這邊也提供我成功的方式。
我的設備和環境:
2018 mac mini
OSX 10.14.4
mysql 5.6.21

繼續閱讀 “如何把 mysql 新增資料夾的編碼,預設成 UTF-8″

crontab 執行有中文編碼的程式時,出現錯誤 : UnicodeEncodeError: ‘ascii’ codec can’t encode character

最近寫了幾隻爬蟲,爬一些網站,然後存到 mysql 裡面,在使用 crontab 排成執行時,發生了錯誤。

在終端機或是 spyder 上執行都是沒問題的,但是 crontab 就是跑不出來,於是使用了我在另一篇文章提到的:用 crontab 安排作業排程後,如何知道裡面發生了什麼事?

顯示出這個錯誤:UnicodeEncodeError: ‘ascii’ codec can’t encode character

繼續閱讀 “crontab 執行有中文編碼的程式時,出現錯誤 : UnicodeEncodeError: ‘ascii’ codec can’t encode character"

用 crontab 安排作業排程後不動,該如何找錯?

當然,你可以寫在程式裡面,在進行的當下就產出文字檔、報表,或甚至圖片檔都行。

但有時候我們並不想要有這麼多的記錄檔,或是我們在測試的時候,程式都會動,但排入 crontab 之後,它就不動或是產出錯誤訊息了,就像我在另一篇裡面寫到的問題,中文編碼與 crontab 產生衝突,這是你怎麼測都測不出的吧。

這時候可以用一個很簡單的方法,也就是在你的 crontab 語法後面,加上一個 > 然後指派一個空的 .txt 檔給它,它就會把你程式裡面寫的 print 印在裡面,或是如果有錯誤,也會顯示在檔案裡。 繼續閱讀 “用 crontab 安排作業排程後不動,該如何找錯?"

iTunes Connect 上傳 screenshot 錯誤:圖像不能包含通道或透明度 ( Images can’t contain alpha channels or transparencies.)

 

如果你的預覽圖是 .png 檔案,很容易出現這個錯誤訊息:

圖像不能包含通道或透明度 ( Images can’t contain alpha channels or transparencies.)

兩個方法: 繼續閱讀 “iTunes Connect 上傳 screenshot 錯誤:圖像不能包含通道或透明度 ( Images can’t contain alpha channels or transparencies.)"

iOS App上傳後收到:Missing Push Notification Entitlement

在上傳 iOS App 專案到 iTunes connect 之後收到一封信,內容如下:

Dear Developer,

We identified one or more issues with a recent delivery for your app, “xxx". Your delivery was successful, but you may wish to correct the following issues in your next delivery: 繼續閱讀 “iOS App上傳後收到:Missing Push Notification Entitlement"

iOS App 上傳回報問題:ERROR ITMS-90705: “Launch storyboard not found.

這邊用的是 Xcode 9.4,開發一個 iOS 11.3 的 App。

這是一個當你開發完一個 App 要上傳到 App Store 的時候,會遇到的問題。

我是根據這一篇的解法去解開的。

我的做法是,去 info.plist 裡面,找到一個 key 是 UILaunchStoryboardName 的項目,然後修改它的 value。 繼續閱讀 “iOS App 上傳回報問題:ERROR ITMS-90705: “Launch storyboard not found."

Python – 使用Google Map API(6) – 取得照片

在前面第四篇的時候,提到有一個項目是 photo,裡面通常有10個項目,我們可以透過這 10 個項目取得該地點的圖片,這一篇就來看看如何透過這個項目取得圖片。

首先我們來看看,photo 裡面的 10 個項目長怎樣。

photo 裡面會有一個項目是 photo_reference,它的value大概是長這樣:CmRaAAAAMRw3rMQekkw1vt8BISl4OdOzt4Hl-9bNqpAL8XRA9iPlY5zzTptLIty32cIcNnCh0GXK8-gLZx0cjG9Xa1l8tzVNiZRLr0DXWyuAjBzztWKzrlYpaWWTHVnjcpoBotr3EhC553Dy95yqdZ2qhyeMRhmSGhSHXqw_4Wsl8V9V4fYH3hwqanK95A

繼續閱讀 “Python – 使用Google Map API(6) – 取得照片"

iOS Develop – app View Lifecycle測試 (2)

原本(自)以為關於 app 生命週期,透過上次測試就已經大概掌握了,直到最近某個專案練習到一半才發現,原來在不同情況下,viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear 的執行時機與次數,還有另一種模式。

原因在於,上一個文章裡面的範例,我們是在兩個 view 之間移動,所以當我們從第一個 view 轉換到第二個 view 的時候,理所當然第一個 view 會需要經歷 viewWillDisappear、viewDidDisappear ,而我們從第二個 view 回到第一個 view的時候,第一個 view 會需要再一次經歷 viewWillAppear、viewDidAppear。

但是,巴特,西咖西…….,如果我們是按下 home 鍵退出 app 再進入呢?

繼續閱讀 “iOS Develop – app View Lifecycle測試 (2)"

iOS swift4 使用者定位權限,設定心得與討論

本篇分享關於iOS開發中,定位功能的一些心得。

版本:swift 4

介面:Xcode 9

希望提示出現的時機有:

  1. 使用者下載完,第一次打開 app
  2. 或是在之前已經拒絕被追蹤的情況下,整個app關掉重新打開的時候
    • 跳出 alert ,詢問是否接受追蹤他的位置。
      • 接受:取得定位,開始提供服務。
      • 不接受:跳出 alert 告訴使用者這樣無法得到最好的服務。

這一段的程式碼寫在 AppDelegate.swift 檔案的 didFinishLaunchingWithOptions 區塊內。

這個區塊內的動作,是在使用者下載後第一次打開 app,或是把 app 整個關掉,再重新打開的時候執行。如果只是放到background中,再打開,是不會執行這一段。

繼續閱讀 “iOS swift4 使用者定位權限,設定心得與討論"

Xcode介面蠢事 – 除錯區塊 output 不見

事情是這樣的:

今天早上在測試一段關於定位的程式碼,看著模擬器的畫面上的小藍點模擬開車跑動,然後 print 出經緯度,覺得非常有成就感 XDD。

做了一些修改之後不知道發生什麼事,小藍點還在跑動,但原本該 print 出來的東西不見了。

繼續閱讀 “Xcode介面蠢事 – 除錯區塊 output 不見"

Python – 使用 Google Map API(3) – 取得地點詳細資料

首先複習一下本系列第一篇我們用的程式碼:


import googlemaps
google_key = “xxx”
gmaps = googlemaps.Client(key = google_key)
radar_results = gmaps.places_radar(location = (25.034195, 121.564467), radius = 100, type = “cafe”)
print(radar_results)

最後得到的 radar_results 是一個 dict,裡面有三個根元素,分別包含三個 dict。

我們要用到的是 [‘results’] 這個 key。

繼續閱讀 “Python – 使用 Google Map API(3) – 取得地點詳細資料"

Python – 使用 Google Map API (2) – 解析結果

解析雷達搜尋傳回來的 json 物件

上一篇 Python – 使用Google Map API(1) – 雷達搜尋 中最後提到,將回傳的內容print出來後得到下方的結果:


{'html_attributions': [], 'status': 'OK', 'results': [{'place_id': 'ChIJSTLZ6barQjQR7OeldE1QDsU', 'id': '09bd306d8a6fff4ed4920a843bfffb77405c4dbc', 'reference': 'CmRSAAAAbulvhVx0YEexX2M3Fi3BtxLea2U8_7Ruq1HnivcsnhQfnbur1TxVfdKCFSICFQeUyoOsGnvZLDHHHzNaP7QN__fJ4LL9WNdqW2pRPRhqsUKG8ZAKYm7puNkundjgFlPTEhARhMUPDUPBbAqDYGP6G3ddGhSaoLSfPYT4cLtjcxW72QReaX93yw', 'geometry': {'location': {'lng': 121.5651166, 'lat': 25.0338119}}}, {'place_id': 'ChIJraeA2rarQjQRcsQVAszSNog', 'id': '24711f6d1d5600fb77e7fe680d251776da27bc56', 'reference': 'CmRSAAAACT67OQqRIlpQmduE4RAFWcqxSXhEbt3gZO4SYGTwLpKbZXZu30OBpb4C8D5ncJwDtMsE13xuEIqDAqAayuIOfRQSzDq3hFmdKnaWsKSI62s7LtEQSfCs1TXQO6OxehaVEhDG_WnFgjmK8QwaV_v8ZaDvGhSghBE7BlQ14yWAwQvaGYZy3oXriA', 'geometry': {'location': {'lng': 121.56481, 'lat': 25.033718}}}, {'place_id': 'ChIJSTLZ6barQjQRDNycA51cBq4', 'id': 'cdff9d8fc20ef48d0f10f3227e890d97ed3c8ce2', 'reference': 'CmRSAAAAm1FvUZQ0fWLwYXD4COXlRNfNS3KJqs9B7AdMbjthAfy0aHB6fut6Uf8MbLd9vpQoTlLr0JznkXjMRVQoMiGarDO-GHEh4DLAGOs66F8F5L5g6DU-_TgliEgsXQuyf9-tEhADSx7IIYzZGUEicpsO4CckGhT20WcmEFlbas7zM4eFHkGDvE1cjw', 'geometry': {'location': {'lng': 121.5645391, 'lat': 25.0334612}}}, {'place_id': 'ChIJ1S3Z6barQjQRKb4ubuIujDg', 'id': '5aec3fa9fee319e70950b8b265622a0adf51e8e2', 'reference': 'CmRRAAAAibD4kyOb2YztYpfYlSYiSnDYSjSgrjLL51cI0IbKHArB_dQUveca4MWIwaXxjR9D5lRxQStyZeuU2CazfKuv-3hjCejKJZuFG6lVIVryDY4mh8rvWgMOtgN80T8cCYJSEhB1BghYVb_PoZ17kPRgjxXJGhQ96erXB8xywkj9bEWtBPN0o-jkuw', 'geometry': {'location': {'lng': 121.5638627, 'lat': 25.0334962}}}, {'place_id': 'ChIJNzLZ6barQjQReRr0AwrDlfI', 'id': '64d339a0714893fa6879639e28828563ba9409de', 'reference': 'CmRSAAAAplF_qWllM9uLZU6Z8M_wgo_GHErDBYwXtAknAYtYQ-xgfQX_bLAWBBT9IVTxpUI-9BTN0xvxcBt-cHPGe5cDtNMqEGfN78sDJYKnPwvDKLNFmYNbsQaMm-fPWImw4eKXEhB3q8dK0bCg586TexrYSiEdGhRe2fDMyupgMccnLxCuTYNwiwg-uA', 'geometry': {'location': {'lng': 121.564101, 'lat': 25.033493}}}, {'place_id': 'ChIJrXJz7K2rQjQRis4azcE0bl0', 'id': 'b3055b2436ef8135d9ba12e8bb1abfcb0a07351a', 'reference': 'CmRRAAAAPC1Bv9Gw9B_IxUAL-ThPIV-E4G37rYJqWbw8TCTYQK1rN6yVacSS9sID2WdUtptvlXGziZcvtj7l_KLIOxCSnk78uJ3xWNwDlZXKD7ZSZYMPzktNyL8yA8cHHQth1_kjEhABPqmb0iD2LmijQI0MSkwXGhQJdueeyKUT3dMnhtOiwlT-escUmw', 'geometry': {'location': {'lng': 121.5648144, 'lat': 25.0335615}}}, {'place_id': 'ChIJO8RPJ7erQjQRK7lBH_vJJQs', 'id': 'e7038e4be482c4f18c7776a505999d3769c08015', 'reference': 'CmRRAAAAno6LB7BiEpmHILy7lMjvImr1_VpVQbonyJPduFaHoi50ZlLZvwdzDwjiuy4BHnIjE_D0095Lc_nGnHQln2ApukT4jug00vlEsNW1OTIftTwVdsybe0kWx6eLDpBM4JiaEhCsx61tHrcilHVrw0gPKGoXGhQrR3niCYNznqbK4Qn6JpqG1tCkEg', 'geometry': {'location': {'lng': 121.564461, 'lat': 25.0338915}}}, {'place_id': 'ChIJUwMfwrarQjQRTg3KGHwh1gU', 'id': '5fc15ea7ded0cbf6c450e61eb60ac30bd19aaf92', 'reference': 'CmRRAAAAfrv4l4ihJEuwyq9ducmmdt0RH_Z5bJJTJQgGYHTefmZSOjl7_ti7iNeZJjzFc5gLabIdzkvdXhf4TARUf4w1OR7o1Tmlsh4E-PWC6koTwZNiivnaPxOIpDa50MDLDmGsEhBbp0wWEea6Z6fIIVg0gDp2GhSBXaaHeiWIVcquFsGXTZ02ZaTfWw', 'geometry': {'location': {'lng': 121.5641948, 'lat': 25.0333792}}}, {'place_id': 'ChIJN6uq3rarQjQR12G5vIYbHAw', 'id': 'c89fd501af56ddeb6844e3f23e65c1c9120c2d49', 'reference': 'CmRRAAAAPlbRsZY1Thk7MuD1m_Dluyzs0F_RSDcrcNtDBnrfZJyhItZF4NqR6AhbEy4IX_LQumwh8vvYMUscTBGttQT2zIYRpLWeNI0XHk1FCyIbyCiNyT5jQ7n0azWDQeC2YQiVEhDoKE6X68MsDYGPuCV8P02LGhSKiN_W_GTMfU1u64plzzL_JjVNmQ', 'geometry': {'location': {'lng': 121.5644721, 'lat': 25.0339649}}}, {'place_id': 'ChIJoSJTw7arQjQRnCc70GtKTNs', 'id': 'c6423bce8f2d8f984e621fd0086981ad4aaceea2', 'reference': 'CmRSAAAAsEeZIt1HTM3L8WPFHaCemTLwzObpXdNKXcU1tAGXoupq7ZK1Eky2oINI07uXNd–55f_HI_EcvLuV1PCDIeXieOjjJKjgWTsx4ek6J4u6Zcqb0xhP_yj63u8LScN01AvEhBgjKn_0EpKjlJAyfn8RXq9GhS6WNbtnJGTXCQOd3mUkUhbPZTaBg', 'geometry': {'location': {'lng': 121.5644412, 'lat': 25.0336347}}}, {'place_id': 'ChIJsVahxLarQjQRfkqE8XAR_9E', 'id': '80142f8b863f944054639597685da4dc180b60cb', 'reference': 'CmRSAAAA9DofkcecvBbsXclrzD9TrguQsl7Fw43GZGSNQlBdOuyHx6eZUceo8hfUEImoq7JQKCeovDd_29SrNGzCCy-Jp2dKYAol8TRfLfX1SjcPzQAL93wVEgkBPu-Nh6hb_tkpEhCpBhVcasoveJ7Qc6ytTq28GhQI2mSe_IzEIw8cedGIVFPoXAvXog', 'geometry': {'location': {'lng': 121.5644932, 'lat': 25.0335639}}}, {'place_id': 'ChIJMQANxbarQjQRtrPUHgvc_F4', 'id': '46000da8d74a1f3e7269e9b257f05b7077c95e79', 'reference': 'CmRRAAAA1W-e2Pjy2RElOjCoPtnyguJotI_iHaqzGDex8fJEp0sOgybjphCn-PkwJVsxb7I4CM-iZpI75L5sQGXwpaaL3twFBritvq1eHC7fkBcLMTmdGdvK4QevISPS5chmJFSpEhAErtzFHR93_hcWNNM6vgfNGhRDDW6WOy2Y1WpBHrwT_L7rm44f8A', 'geometry': {'location': {'lng': 121.5647292, 'lat': 25.0334375}}}]}

首先我們把這些內容丟到 json editor 來看看:

*線上 json editor 的版本很多,我就用我習慣的平台來做。

繼續閱讀 “Python – 使用 Google Map API (2) – 解析結果"