2018 Google IO 已經開始,從講題分類統計,看今年 Google 的重點方向。
今年的分類跟去年差不多,統計如下:
AR & VR: 13
Accessibility: 8
Ads: 8
Android & Play: 122
Assistant: 24
Cloud: 33
Design: 28
Firebase: 26
Flutter: 11
Identity: 13
IoT: 18
Keynote: 13
Location & Map: 6
Machine Learning & AI: 26
MISC: 38
Nest: 1
OpenSource: 2
Payment: 6
Web: 53
今年很強調 Android,Web。
去年的重點統計:
Firebase 場數有 24 場
Mobile Web 場數有 20 場
Cloud 為 12,Android 為 11。
2018年5月8日 星期二
2018年4月3日 星期二
[git]form hg to git (windows)
目前主要趨勢底定是 git。得要先把 hg 的專案轉到 git 來。
我在 windows 有裝 tortoisehg,所以作法如下:
(1) 在 tortoisehg 的 global settings 裡,把 extension hggit 打開。
(2) 在 bitbucket 開一個 git repo。假設路徑為 https://bitbucket.org/username/hg-projectname-git
(3) 在原來的 hg 的目錄下,執行以下命令,產生 git 的頭:
打完收工
注意事項:
(1) tortoiseplink 已經失效,所以 hg push git+ssh 這個指令會失敗。我找不到辦法換成 ssh.exe,所以就用 https 的方式。
(2) hg push 的路徑不要用 https://username@bitbucket.org 這種,hg 會產生 getaddrinfo 錯誤。
主要參考文章三篇:
http://arr.gr/blog/2011/10/bitbucket-converting-hg-repositories-to-git/
https://mcmblog.azurewebsites.net/using-tortoisehg-with-git/
https://stackoverflow.com/questions/9272233/hg-clone-using-mercurial-throws-getaddrinfo-failed-error-windows-7
我在 windows 有裝 tortoisehg,所以作法如下:
(1) 在 tortoisehg 的 global settings 裡,把 extension hggit 打開。
(2) 在 bitbucket 開一個 git repo。假設路徑為 https://bitbucket.org/username/hg-projectname-git
(3) 在原來的 hg 的目錄下,執行以下命令,產生 git 的頭:
hg bookmark -r default master(4) 在原來的 hg 的目錄下,執行以下命令,把歷史推上去:
hg push git+https://bitbucket.org/username/hg-projectname-git(5) 用 git clone 新路徑。之後就用這個新的 git clone 目錄工作。
打完收工
注意事項:
(1) tortoiseplink 已經失效,所以 hg push git+ssh 這個指令會失敗。我找不到辦法換成 ssh.exe,所以就用 https 的方式。
(2) hg push 的路徑不要用 https://username@bitbucket.org 這種,hg 會產生 getaddrinfo 錯誤。
主要參考文章三篇:
http://arr.gr/blog/2011/10/bitbucket-converting-hg-repositories-to-git/
https://mcmblog.azurewebsites.net/using-tortoisehg-with-git/
https://stackoverflow.com/questions/9272233/hg-clone-using-mercurial-throws-getaddrinfo-failed-error-windows-7
2017年12月28日 星期四
[python]youtube-dl 選擇最好 quality 並使用 ffmpeg 合併 與 加上 playlist_index 與下載範圍
python 裡有個小工具叫做 youtube-dl,可以從 youtube 下載影片。
一般來說,只要安裝之後,在命令列輸入 youtube-dl 再加上 youtube 網址就解決了。
而我這裡算是一個綜合題。
(1) 選擇最好影片:
有兩種,一個是影音檔可選擇最好的那個檔案下載,那就是使用:
另一個是影片中選最好的,音樂中選最好的,然後合併,那就是用:
然而,這個需要ffmpeg/avconv 的幫忙,在 windows 的話,就是去下載 ffmpeg 的執行檔包,然後把也就是 ffmpeg.exe 與它的好朋友們放到與 youtube-dl.exe 同一層目錄裡。
(2) 下載 playlist 裡所有影片並且加上編號:
有個線上課程有存成 playlist,下載之後因為沒有順序編號而亂掉怎辦?
其實 -o 參數可以改變存檔的檔名規則,預設是 %(title)s-%(id)s.%(ext)s,所以參考說明,就加上:%(playlist_index)s,也就是:
注意:如果在批次檔使用的話,% 要用 % 跳脫,所以會是:
參考:
https://askubuntu.com/questions/486297/how-to-select-video-quality-from-youtube-dl
https://github.com/rg3/youtube-dl/issues/3631
https://github.com/rg3/youtube-dl/blob/master/README.md
一般來說,只要安裝之後,在命令列輸入 youtube-dl 再加上 youtube 網址就解決了。
而我這裡算是一個綜合題。
(1) 選擇最好影片:
有兩種,一個是影音檔可選擇最好的那個檔案下載,那就是使用:
youtube-dl -f bestvideo+bestaudio --format mp4 "這裡接youtube網址"
另一個是影片中選最好的,音樂中選最好的,然後合併,那就是用:
youtube-dl -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/bestvideo+bestaudio" --merge-output-format mp4
然而,這個需要ffmpeg/avconv 的幫忙,在 windows 的話,就是去下載 ffmpeg 的執行檔包,然後把也就是 ffmpeg.exe 與它的好朋友們放到與 youtube-dl.exe 同一層目錄裡。
(2) 下載 playlist 裡所有影片並且加上編號:
有個線上課程有存成 playlist,下載之後因為沒有順序編號而亂掉怎辦?
其實 -o 參數可以改變存檔的檔名規則,預設是 %(title)s-%(id)s.%(ext)s,所以參考說明,就加上:%(playlist_index)s,也就是:
-o "%(playlist_index)03d-%(title)s-%(id)s.%(ext)s"
注意:如果在批次檔使用的話,% 要用 % 跳脫,所以會是:
-o "%%(playlist_index)03d-%%(title)s-%%(id)s.%%(ext)s"WINDOWS使用者注意,在官方說明中,使用單引號的地方,都要換成雙引號。
(3) 下載 playlist 裡的某部份
也許是下載失敗要從失敗的地方繼續,或是只要某些部份,有三個參數可用:
--playlist-start NUMBER
--playlist-end NUMBER--playlist-items ITEM_SPEC
(4) 只要聲音
--extract-audio
--audio-format mp3
參考:
https://askubuntu.com/questions/486297/how-to-select-video-quality-from-youtube-dl
https://github.com/rg3/youtube-dl/issues/3631
https://github.com/rg3/youtube-dl/blob/master/README.md
https://github.com/ytdl-org/youtube-dl/blob/master/README.md
2017年10月2日 星期一
[mongodb] 在 windows7 上遇到 0xc000007b 應用程式錯誤
一拳解決:
下載 VC ++ redistribution。我下載 VS 2015 的。安裝後,解決。
找了三天。
下載 VC ++ redistribution。我下載 VS 2015 的。安裝後,解決。
找了三天。
2017年9月27日 星期三
[lxml] 換成 python3 之後的 tostring 問題
原本在 python2 的時候,lxml 要序列化,只要呼叫 tostring,就可以交給檔案物件寫進檔案,像是這樣:
換到在 python3 的時候,就會發生:
原因是 lxml 回傳的是 python3 的新型態 bytes,其實就是以前的 str 型態。
要解決有兩個方法。
一個是 tostring 成 unicode,像這樣
另一個方法是
以我們有中文需求的話,我比較喜歡第一種。
f = open('test.xml', 'w')
f.write(etree.tostring(root))
換到在 python3 的時候,就會發生:
f.write(etree.tostring(root))
TypeError: write() argument must be str, not bytes
原因是 lxml 回傳的是 python3 的新型態 bytes,其實就是以前的 str 型態。
要解決有兩個方法。
一個是 tostring 成 unicode,像這樣
f = open('test.xml', 'w')
f.write(etree.tostring(root,encoding='unicode'))
另一個方法是
f = open('test.xml', 'wb')
f.write(etree.tostring(root))
以我們有中文需求的話,我比較喜歡第一種。
2017年9月13日 星期三
[python] 用 requests 出現 InsecureRequestWarning,自己加上認證檔
在換到 requests 之後,因為他使用 urllib3,就會對 https 的網址出現以下警告:
InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
通常找到的解決方法是關閉這個警告,如下:
在官網上提供另一個方法就是加上認證,但是,認證檔要去哪兒找?
這真的要感謝 stackoverflow 的網友以及 certifiio 網站提供可用的認證檔。
所以先到 http://certifiio.readthedocs.io/en/latest/ 下載 Raw CA Bundle,放在你知道的地方。
然後在使用 requests 的時候,verify 參數後面接那個檔案的路徑。問題解決!
InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
通常找到的解決方法是關閉這個警告,如下:
import requests.packages.urllib3
requests.packages.urllib3.disable_warnings()
在官網上提供另一個方法就是加上認證,但是,認證檔要去哪兒找?
這真的要感謝 stackoverflow 的網友以及 certifiio 網站提供可用的認證檔。
所以先到 http://certifiio.readthedocs.io/en/latest/ 下載 Raw CA Bundle,放在你知道的地方。
然後在使用 requests 的時候,verify 參數後面接那個檔案的路徑。問題解決!
[超譯] 微服務怎麼溝通?
# 微服務怎麼溝通?
我們在工作上做過一些分散式的開發與服務間的溝通。有些是透過開放 HTTP 服務。對於系統間的非同步訊息傳送,我公司使用 FubuMVC 與它的 .Net Core 取代物 "Jasper" 做為 service bus (translate "Jasper" to "MassTransit" or "NServiceBus" when you read this). 此格文是給我們團隊的架構的建議的草案,讓我們團隊為產品選擇何者做為微服務架構的一部份時有個參考。如果我同事看到這篇而有不同意的話,不用擔心。這份文件是活的,總是能討論的。
微服務通常需要傳送訊息給別人或處理別人的訊息,也許是微服務或客戶端。因此,為服務間通訊好好思考是值得的。
我們通常使用 HTTP 或 Jasper/FubuMVC service bus 做為服務間溝通。在思考如何選擇服務間溝通的工具之前,先要想想你的訊息的要求是什麼。服務間溝通約略是以下幾個分類:
1. Publish/Subscribe 非同步廣播一個訊息到所有的訂閱者,不預期一個立即的回應。它與「射後不理」的差異是隱含「保證送達」,也就是訊息會持續保留,直到它被發布出去。Jasper/FubuMVC service bus 有做到「保證送達」,它透過在 LightingQueue 的持續式 "store and forward" 機制,而且最後我們把 RabbitMQ 放進 Docker'ized hosting。
2. Request/Reply 呼叫另一個服務且期待一個回應。從 web service 查詢資料是一個例子。透過 service bus 送訊息且期待一個回應也是一個例子。query handler 就是 request/reply 的範例。
3. Fire and Forget 送出一個 request,然後不管任何回應,不在乎回應是否有來。這種模式多用在效能優先且訊息不是很要緊的情況。Jasper/FubuMVC 使用在 node 內通訊,用以協調訂閱與健康檢查,這是透過 LightningQueue 在 "fire and forget" 的模式來做。
## 以下情況使用 HTTP Service:
* 你的服務要開放 API 給外部使用者。
* 你的服務要給網頁瀏覽器使用。
* 你要開放查詢端點( query endpoint) 給其他服務,它們需要拿到資料馬上使用的方式。
* 你不需要「保證送達」。
* 你在前期不清楚未來你的服務的客戶端會是什麼其他的機制。目前 HTTP 普通存在於所有平台。
* 你需要開放你的服務給「非.Net」客戶端。用現存其他平台的 service bus 是完全可能的,但在這個情況,用 HTTP 端點會比較少阻力。
## 以下情況使用 Service Bus:
* 你需要耐用的 publish/subscribe 的模式。如果你的服務不需要等待下家系統的回應,你需要的可能是 publish/subscribe。
* 如果你會同一個訊息給不同的訂閱者。
* 如果你需要支援「動態訂閱」。也就是讓其他服務可以到你的服務註冊,然後從你的服務接收訊息。
* 如果你要「射後不理」的訊息方式,使用 service bus 在 LightningQueue 的 non-persistent mode。(參考 ZeroMQ)
* 你也許需要 Jasper/FubuMVC 裡的 "delayed message" 的好處。
* 你需要實作長命服務,例如 saga workflow
* 雖然可利用限縮 HTTP request 來控制,但透過 servcie bus 後面的 message queue 來處理大量負載會更簡單有效。
* 如果 message 處理順序很重要,你需要在 servcie bus 排隊。
## 灰色地帶
比較 HTTP 與 service bus 不是完全黑與白的選擇。service bus 也支援 request/reply 模式,你也可以用 HTTP 來做射而不理。兩個招數可以與我們現存的技術堆疊水平擴展。Jasper 最終會支援 HTTP 傳輸以及更有效率的 request/reply,這讓情況更混亂。如果你感覺不是很清楚哪個方向才對,那你的團隊所熟悉的方法會是較可接受的選擇。很可能,這意謂著,使用常見的 ASP.NET Core 堆疊給 HTTP Service 使用,而不是我們今天定做的 service bus 技術。
## 避免以下整合的方式
因為外部客戶端的關係,我們會必須使用下列的方式。但是非常強烈建議不要這麼做:
* publish 檔案到檔案系統及監控目錄
* publish 檔案到 FTP server
* 使用共享資料庫。關聯式資料庫的排隊機制不是很有效率,而且我們也不想要服務之間藉著共享資料庫而有太硬的耦合。
不同意嗎?還有什麼要加的?不用客氣,請幫我讓這個列表更圓滿,可以在下方留言。
原文連結:https://jeremydmiller.com/2017/05/24/how-should-microservices-communicate/
我們在工作上做過一些分散式的開發與服務間的溝通。有些是透過開放 HTTP 服務。對於系統間的非同步訊息傳送,我公司使用 FubuMVC 與它的 .Net Core 取代物 "Jasper" 做為 service bus (translate "Jasper" to "MassTransit" or "NServiceBus" when you read this). 此格文是給我們團隊的架構的建議的草案,讓我們團隊為產品選擇何者做為微服務架構的一部份時有個參考。如果我同事看到這篇而有不同意的話,不用擔心。這份文件是活的,總是能討論的。
微服務通常需要傳送訊息給別人或處理別人的訊息,也許是微服務或客戶端。因此,為服務間通訊好好思考是值得的。
我們通常使用 HTTP 或 Jasper/FubuMVC service bus 做為服務間溝通。在思考如何選擇服務間溝通的工具之前,先要想想你的訊息的要求是什麼。服務間溝通約略是以下幾個分類:
1. Publish/Subscribe 非同步廣播一個訊息到所有的訂閱者,不預期一個立即的回應。它與「射後不理」的差異是隱含「保證送達」,也就是訊息會持續保留,直到它被發布出去。Jasper/FubuMVC service bus 有做到「保證送達」,它透過在 LightingQueue 的持續式 "store and forward" 機制,而且最後我們把 RabbitMQ 放進 Docker'ized hosting。
2. Request/Reply 呼叫另一個服務且期待一個回應。從 web service 查詢資料是一個例子。透過 service bus 送訊息且期待一個回應也是一個例子。query handler 就是 request/reply 的範例。
3. Fire and Forget 送出一個 request,然後不管任何回應,不在乎回應是否有來。這種模式多用在效能優先且訊息不是很要緊的情況。Jasper/FubuMVC 使用在 node 內通訊,用以協調訂閱與健康檢查,這是透過 LightningQueue 在 "fire and forget" 的模式來做。
## 以下情況使用 HTTP Service:
* 你的服務要開放 API 給外部使用者。
* 你的服務要給網頁瀏覽器使用。
* 你要開放查詢端點( query endpoint) 給其他服務,它們需要拿到資料馬上使用的方式。
* 你不需要「保證送達」。
* 你在前期不清楚未來你的服務的客戶端會是什麼其他的機制。目前 HTTP 普通存在於所有平台。
* 你需要開放你的服務給「非.Net」客戶端。用現存其他平台的 service bus 是完全可能的,但在這個情況,用 HTTP 端點會比較少阻力。
## 以下情況使用 Service Bus:
* 你需要耐用的 publish/subscribe 的模式。如果你的服務不需要等待下家系統的回應,你需要的可能是 publish/subscribe。
* 如果你會同一個訊息給不同的訂閱者。
* 如果你需要支援「動態訂閱」。也就是讓其他服務可以到你的服務註冊,然後從你的服務接收訊息。
* 如果你要「射後不理」的訊息方式,使用 service bus 在 LightningQueue 的 non-persistent mode。(參考 ZeroMQ)
* 你也許需要 Jasper/FubuMVC 裡的 "delayed message" 的好處。
* 你需要實作長命服務,例如 saga workflow
* 雖然可利用限縮 HTTP request 來控制,但透過 servcie bus 後面的 message queue 來處理大量負載會更簡單有效。
* 如果 message 處理順序很重要,你需要在 servcie bus 排隊。
## 灰色地帶
比較 HTTP 與 service bus 不是完全黑與白的選擇。service bus 也支援 request/reply 模式,你也可以用 HTTP 來做射而不理。兩個招數可以與我們現存的技術堆疊水平擴展。Jasper 最終會支援 HTTP 傳輸以及更有效率的 request/reply,這讓情況更混亂。如果你感覺不是很清楚哪個方向才對,那你的團隊所熟悉的方法會是較可接受的選擇。很可能,這意謂著,使用常見的 ASP.NET Core 堆疊給 HTTP Service 使用,而不是我們今天定做的 service bus 技術。
## 避免以下整合的方式
因為外部客戶端的關係,我們會必須使用下列的方式。但是非常強烈建議不要這麼做:
* publish 檔案到檔案系統及監控目錄
* publish 檔案到 FTP server
* 使用共享資料庫。關聯式資料庫的排隊機制不是很有效率,而且我們也不想要服務之間藉著共享資料庫而有太硬的耦合。
不同意嗎?還有什麼要加的?不用客氣,請幫我讓這個列表更圓滿,可以在下方留言。
原文連結:https://jeremydmiller.com/2017/05/24/how-should-microservices-communicate/
訂閱:
文章 (Atom)