Yish

Hey, I’m Yish, the minimalist and an engineer.

Pest

Pest 對我來說提供了更便捷的測試方式和直譯式的寫法,類似 JS 相關的測試框架,同時又保留了 Laravel 和 PHP 龐大的輔助函數和功能。 official laracasts 主結構 $ composer require pestphp/pest --dev --with-all-dependencies $ ./vendor/bin/pest --init $ ./vendor/bin/pest folders: ├── 📂 tests │ ├── 📂 Unit │ │ └── ExampleTest.php │ └── 📂 Feature │ │ └── ExampleTest.php │ └── TestCase.php │ └── Pest.php ├── phpunit.xml 簡單示例 這邊可以自己添加 phpunit.xml 對應路徑,可以看到 Pest.php 實現細節: 這邊表示注入 TestCase 到 Feature 底下,可以使用 TestCase 裡面所提供的方法,當然也可以注入對應的方法到指定的 folder 底下: uses( Tests\TestCase::class, // Illuminate\Foundation\Testing\RefreshDatabase::class, )->in('Feature'); SumTest...

March 21, 2023 Â· 2 min Â· Yish

Laravel Eloquent Mutators

新版本的 Laravel 提供了一種更便捷的作法來定義 accessor 和 mutator,下面將會比較新舊版本之間的差異,原有方式在新版本當中還是有作兼容,但新的寫法是相對來說更加清晰好懂。 原做法 // 假定 users 有 name: // accessor protected function getNameAttribute($value) { return Str::mask($value, '*', 2); } // mutator protected function setNameAttribute($value) { $this->attributes['name'] = 'Mr.'.$value; } // 要偽裝一個不存在的欄位 accessor protected function getFirstNameAttribute($value) { return ucfirst($this->name); } 新做法 doc,將原有 accessor 和 mutator 綜合為同一個方法進行操作。 // 假定 users 有 name: protected function name(): Attribute { return Attribute::make( get: fn (string $value) => Str::mask($value, '*', 2), set: fn(string $value) => 'Mr....

March 17, 2023 Â· 2 min Â· Yish

Laravel Sail

這個工具是 Laravel 官方所提供使用 docker 作為本地開發環境的 image,這邊紀錄一下關於相關配置和安裝設定。我本地端還是有配置 Laravel Valet,所以很顯然的是我必須調整 port 和相關兼容避免 port aleady in use。 先決配置 Docker 安裝步驟 從遠端取得對應 shell script,並且執行 curl -s "https://laravel.build/<你的專案名稱>" | bash # curl -s "https://laravel.build/example-app" | bash 執行完畢後 cd 進去 開始配置對應 port -> .env,相關對應變數名稱可以參考 docker-compose.yml: APP_PORT=8088 # http port FORWARD_DB_PORT=33062 # db port FORWARD_MAILPIT_PORT=1026 # mailpit FORWARD_MAILPIT_DASHBOARD_PORT=8026 # mailpit dashboard FORWARD_REDIS_PORT=6380 # redis 拜訪 http://localhost:8088 測試相關對應數據庫連線,查看對應 .env DB_USERNAME=sail DB_PASSWORD=password 連入 app container 進行 composer 指令操作 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9463d63df32b sail-8....

March 15, 2023 Â· 1 min Â· Yish

Zk Rollups & Optimistic Rollups 零知識證明與樂觀證明

先前在很多文章都有提及以太鏈的解決方案 ZK Rollups 與 Optimistic Rollups 但一直對於這兩個 rollups 的概念都很模糊,趁著邦妮發了一篇快速解釋這個機制也順便深入了解與紀錄。 幣圈高手都不一定會!正在起飛的超難趨勢! Rollups 解決方案 Layer 1: 區塊鏈 Layer 2: Rollups 所處 (擴容解決方案) 一個技術的概念的提出勢必是要解決一個實際存在的需求,rollups 主要是用來解決區塊鏈可擴展性問題,由於每個區塊大小跟處理能力是有限的,在高負載情況下會面對壅塞跟高 gas fee 問題(每個人都希望自己交易能夠先被執行),而 rollups 透過將大量交易 bundle 起來之後再一次提交到主鏈上,在不影響主鏈處理能力情況下提高吞吐量跟降低交易手續費。 Rollups 機制都是在鏈外或鏈下進行計算和處理後再將交易數據提交到鏈上,從而解決交易吞吐與費用問題。 鏈下處理通常指的是將某些計算或交易處理放在與主鏈不同的另一條鏈上。 鏈外處理則是將某些計算或交易處理放在完全獨立的環境中進行處理。 TL;DR ZK Rollups: (鏈外) 在鏈外將大量交易 bundle 一起,並透過零知識證明(特殊算法)計算處理後生成證明(Validity Proof),來證明數據正確性(交易的处理和验证是在本地计算机上使用zk-SNARKs或STARKs等技术生成证明),最後再將證明提交到主鏈上,提高處理效率,降低主鏈負擔,每個人都可以驗證證明正確性。 Optimistic Rollups: (鏈下) 交易提交到鏈下(rollup 鏈)的 Rollups 合約(智能合約)(不是直接提交到主鏈上),將交易 bundle 後使用 hash 代表區塊所有交易,提交 hash 到 rollup 鏈上。合約會有挑戰期,一定時間內如果有人提交證據證明 hash 是錯誤的,合約會 rollback 整塊交易,並按照交易順序重新執行交易,如沒有人提出則認為有效,將所有交易提交到主鏈上。(接受並產生交易塊與證明的人必須先提交保證金進行運算,如果交易正確則獲得獎勵,而被挑戰後確定錯誤則會沒收保證金並且提出挑戰者會獲得獎勵)...

March 14, 2023 Â· 1 min Â· Yish

Goroutine Channel 理解筆記

此篇是用來紀錄我理解的 go routine 與相關範例代碼,藉由 ChatGPT 輔助理解和相關解釋,並配合實際嘗試與筆記來理解功能與特性。 Go routine ChatGPT 解釋: Go 語言的 goroutine 是一個非常輕量級的執行緒,它可以在一個程序中同時執行多個任務。和傳統的執行緒相比,goroutine 的開銷非常小,可以同時啟動數千甚至數萬個 goroutine,而不會造成系統資源的浪費和效能下降。Go 語言提供了 go 關鍵字來啟動一個新的 goroutine。當遇到 go 關鍵字時,Go 語言會在新的 goroutine 中執行該函數,而不會阻塞主執行緒的運行。這意味著我們可以同時執行多個任務而不需要等待前一個任務完成。 可以啟動多執行緒,也不會阻擋主程序的進程,以我理解的方式就是 Redis Queue 的運作,但一個是 service 一個則是內存功能,可能有些不太一樣的部分但如果是這樣理解會對我會比較好明白。就是執行到時不會阻塞主要流程。 相關範例代碼: package main import ( "fmt" "time" ) func count(name string) { for i := 1; i <= 5; i++ { fmt.Println(name, "count:", i) time.Sleep(time.Second) } } func main() { go count("goroutine") // 啟動 goroutine count("main") // 在主 goroutine 中執行 count } // output: // main count: 1 // goroutine count: 1 // main count: 2 // goroutine count: 2 // main count: 3 // goroutine count: 3 // main count: 4 // goroutine count: 4 // main count: 5 // goroutine count: 5 這邊會看到是交叉的出現計數,為什麼需要放入 time....

March 13, 2023 Â· 3 min Â· Yish

使用 ChatGPT 進行電子書高品質翻譯

最近大範圍的研究 ChatGPT 能應用跟結合哪些既有服務,這篇文章是用來紀錄將 ChatGPT 應用在電子書翻譯的狀況。 代碼解析 首先我使用 Bilingual Book Maker 這個專案協助進行與 ChatGPT 的溝通,它這邊就是作兩個主要動作,呼叫 OpenAI API 和處理一些細節文本轉換,具體可以看以下片段代碼: GPT-3.5-turbo model # 調用 openai pkg 的方法 completion = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ { "role": "user", # english prompt here to save tokens # prompt 告訴 OpenAI 請協助文本翻譯到 target language,並且回文內容不要包含原本的文本 "content": f"Please help me to translate,`{text}` to {self.language}, please return only translated content not include the origin text", } ], ) ... 如果是使用 GPT-3 model 則是以下:...

March 10, 2023 Â· 1 min Â· Yish