如何在CLion上用Rust玩LeetCode

之前花了不少時間在goland上跑起leetcode plugin,需要一些設定才可以讓整個goland跑起來。現在多了一個Rust可以玩解題,那我們首先還是要先把整個環境搭起來啦!

需要條件

  • CLion。官方Rust套件是比較prefer CLion,我不太確定其他的JetBrains系列IDE能不能跑,反正我是用CLion跑起來就是了。
  • Cargo/rustc 這在裝官方的rust套件應該就已經裝上去了。如果你不知道這是啥的話,先把rust學熟在想著用rust解題吧….
  • IntelliJ Rust Plugin,雖然官方建議用CLion跑,不過看這名字….應該可以在IntelliJ跑起來?
  • LeetCode Editor or LeetCode Editor Pro ,兩者其實差異不大,只差在後者login比較方便,前者要去找session ID。我是覺得他對我幫助很大,我就付費支持啦。
Read more “如何在CLion上用Rust玩LeetCode”
Leave a comment

Go 1.18:Generic and Fuzz

錯誤的種類

在講這個之前,先提一下主流語言通常「錯誤檢出」方面通常分為三個階段:

  • 編譯前階段 (pre-compile time)
    • 指的是這個錯誤不需要被編譯即可被檢出
    • 很多語言沒有這東西,他需要language server protocol(LSP)支援,如gopls
    • 很多IDE各語言的賣點就是自己獨到的LSP,但是剛好拿來做利子的C++擁有非常混亂的LSP實作,常常pre-compile time報錯,但是compile下去沒問題,以及反之….主要也是因為C++實在是過於複雜。
  • 編譯階段 (compile time)
    • 指的是這個錯誤在編譯的時候就可以找出來
    • 前兩者也可以並稱為compile time,如果沒有要特別指名LSP提供的功能的話。
  • 執行階段 (runtime)
    • 指的是這個錯誤需要在執行期才會發作

而go是一個滿特殊的語言,他能夠把一些runtime才能檢出的東西藉由gopls以及go vet 做結構性語法檢查下,將錯誤把runtime提前到pre-compile time。

Read more “Go 1.18:Generic and Fuzz”
Leave a comment

用tag實作Password Mask

我其實滿驚訝目前好像沒有任何library有實作這個,或者有但是我找不到,所以我就實作了一個。別看這功能看起來很小巧簡單,這個需要對reflect有相當的認識,所以把製作心得記錄下來。

成品網址

https://github.com/Rayer/hood

需求

通常我們server boot up的時候需要印出很多log,有時候無可避免的要把整個config給印到log上,這樣會產生一個問題:要是config內含敏感資訊,如帳號跟密碼,這就會產生一些資安問題:

log.Infof("bootup with config : %+v", config)

印出來就會像這樣(標準的%+v會印出來的格式)

{Host:192.168.1.1 User:username Password:mypassword123}


顯然,這是不太恰當的,所以我們總歸來講有幾種作法

  1. 把他轉json再印,把敏感的地方用 json:"-"讓他不被印出來
  2. 實作 func String() string,把敏感資料手動by key抹除掉
Read more “用tag實作Password Mask”
Leave a comment

將服務遷移到Google Cloud Functions

最近開始把腦筋動到每個月要吃掉我20鎂的linode,看看能不能用Google Compute Platform來取代掉單純的VM。GCP本身有提供Free Tier, 所以只要小心地控制用量,搬遷應該是可以省下一筆,而且也可以玩玩GCP的一些新功能。

需求分析

我這次先搬遷之前寫的一個爬蟲服務,這個爬蟲服務應該是我現有服務裡面最簡單的一個,首先先分析一下他有什麼特性:

  • 需要定時被喚醒(設計上大概10分鐘一次就夠了)
  • 需要一個地方存放爬下來的分析資料
  • 不需要實體上的Database
  • 程式本體相當小
Read more “將服務遷移到Google Cloud Functions”
Leave a comment

沒原生Thread Pool,那我們自製Worker Group

可以先看看上一篇沒Thread Pool,Limiter也好?真的嗎? 來個前情提要。

Worker Group其實基本概念跟Thread Pool很像,就是:

  • 一堆Worker在跑,等著接收參數並且輸出結果
  • 單一Worker擁有一個用來輸入參數的channel,以及一個用以輸出結果的channel
  • Worker可被context的Done()終結,或者:
  • 可被WaitGroup終結

不過由於go沒有generic(目前版本是1.16,在1.17/1.18會支援),所以這兩個channel都沒辦法寫得很漂亮,這也是大多數Worker Pool要不就是得用chan interface{}來寫,不然就是寫不出來。不過Worker Group這種東西其實夠輕量,輕量到其實自己打造都是可以的,這邊就介紹一下怎麼自己打造一個Worker Pool,以及揭秘為什麼很多CLI/UI都需要有一個自己的UI Thread(go沒thread,所以稱為UI routine吧)。

Read more “沒原生Thread Pool,那我們自製Worker Group”
One Comment

沒Thread Pool,Limiter也好?真的嗎?

眾所皆知Go是沒有原生的Thread Pool這種東西,這在寫Crawler的時候會造成一些小小的不便。比方說你想要crawl PTT,這樣打一打大概2秒內DDoS protection就把你擋起來了:

docUrlList, _ := GetDocUrlList() //拿到某個版的文章列表
for _, docUrl := range docUrlList {
	go func() {
		docUrl := docUrl
		p, _ := ParseSingleRawDocument(docUrl)
		parseChannel <- p
	}()
}
Read more “沒Thread Pool,Limiter也好?真的嗎?”
2 Comments

把資料(包含本站)從崩潰的Linode VM救出來

大約在2021.05.26的時候,我架在Linode上的站做了一次升級從Ubuntu 17.10=>20.04,我本來打的如意算盤是,我既然每個月都有額外交五塊錢給linode做備份,那升級後要是有什麼問題,理論上從備份回復就沒事了吧!

我先直接講結論,他的確是有備份,但是…. mount不回去,乾,那我要你這備份幹嘛!

Read more “把資料(包含本站)從崩潰的Linode VM救出來”
Leave a comment

目前Macbook M1開發環境測試

這是一張列表,從今天(1/11)看我用到的開發工具的測試,看看能不能使用。

Jetbrains IDEs

可用,而且有特別的Apple Silicon版本。目前僅有AppCode(取代Xcode)沒有而已,其他主流開發的IDE應該都有了。

OpenJDK

目前無法從Homebrew安裝OpenJDK,AdoptOpenJDK似乎也還沒跟上(雖然x86版本似乎是可以用)。普通來講是建議從azul去取得arm64的OpenJDK來跑比較好。

其他版本可以參考Azul的官方公告

Go

從homebrew裝的沒啥問題,不過delve(go的debugger)目前沒有m1 build,會造成go無法debug。根據小道消息表示應該要等到二月delve才有辦法支援m1,不想等的人可以到這裡去取得arm branch自己編譯一個,也可以取代掉GoLand裡面的delve

Docker

需要使用Technical Preview 3.0.0才能正常使用,使用上沒什麼問題。

Homebrew

沒太大問題。有不少keg/bottle會出現ad-hoc signature sign fail(比方說你試圖安裝wget就可重現),不過似乎沒碰到太嚴重影響開發的套件問題就是。

C++/Clang

用起來沒啥問題,也不該有啥問題就是…

Xcode / CocoaPods

CocoaPods會無法安裝,這邊有workaround讓你的系統能裝起來CocoaPods,跑起來沒碰到啥問題。Xcode12就….不說了,IB出來一個樣,Application出來一個樣,這個版本在編譯傳統obj-c有相當嚴重的問題(可能跟M1無關),非常不建議使用。

Leave a comment

偵測Apple產品NCC發照情況的telegram channel

先不廢話,直接上網址 https://t.me/appletwspy

Source Code : https://github.com/Rayer/AppleTwNCCSpy

Apple的NCC發照並不代表立即會發售,但是也是一個指標:無論如何都要有NCC證號才會開賣。這個channel的bot會自動每五分鐘去爬蟲https://www.apple.com/tw/nccid/一次,裡面有東西變化(以Model為準)就會發出通知。

有興趣的去subscribe吧。

Leave a comment

程式跑在Container內跟以原生來跑,到底哪些會不一樣?

理論上來講Docker這東西,把Application包成image在跑container,應該行為要跟原生跑的一樣才對。即使不同,我們也會利用-v跟-p把volume以及port掛上去,讓他能直接對應到host裡面的某些東西。 然而,某些東西,尤其是API Server,我們總會碰到一些跑原生以及跑Container行為大不相同的地方,我把我開發中碰到的一些例子跟大家分享一下。