VScode SFTP 快速同步文件到 Server

當 Server 環境使用白名單搭配 Reverce-Proxy 時,或是 dev、test 環境不供外部使用時,或許會將部分 code 存在只能靠內網連線的主機上,並透過 OpenSSH 供內部遠端操作。 而 PHP 快速部屬的便捷在於替換單一檔案不須重啟 Server (前提是並非把檔案載進 Memory 或轉化守護進程),此時可以依靠 FTP 上傳單一檔案即好。但每次改個 code 還要想辦法上傳程式碼實在是太浪費時間了,如標題所述,如何快速同步 code 到 Server 上呢。 vscode-sftp 是一個在 VScode 中非常方便的擴充套件,上傳/下載/同步、單一/多伺服器、ftp/sftp,僅需設置一份或多份的設定檔便能(偷懶不切視窗)上傳檔案到 Server。然而正是環境 (production) 還是走正常 CI/CD 比較好。 安裝 首先在 VScode 中的市集,或是快捷鍵 ctrl+shift+P (或 F1) 打開指令窗口後輸入 extension:install。並搜尋 SFTP,認名作者 liximomo 點一下玩一年,上傳不花一分錢(支持者可以拉到下面點選 donate)。 設定上傳環境/參數 接著同樣打開指令窗口並輸入 SFTP: Config 注意由於是 JSON 格式,不能註解 主要配置好host, port, username, privateKeyPath, remotePath, ignore这参数即可: name : 檔案暱稱 host : server IP/URL port : 若 server 建置好 ssh 環境,可將 port 端口改為 22 username : 在 server 中的使用者名稱 remotePath : 欲上傳的目錄位置 privateKeyPath : 私鑰 password : 若有設私鑰則可有(null)可無 uploadOnSave : 自動上傳,個人是沒有開啟(經常性按 ctrl + S) ignore : { "name": "my_work_space", "host": "192.168.X.X", "port": 22, "protocol": "sftp", "username": "centos", "remotePath": "\\home\\centos\\***\\", "privateKeyPath": "C:\\***.pem", "uploadOnSave": false, "syncMode": "update", "ignore": [ "**/.vscode/**", "**/.git/**", "**/.svn/**", "**/.DS_Store" ] } 同步所有檔案 儲存後按下同樣打開指令窗口並輸入「SFTP: Sync Local -> Remote」,再選取剛剛設定中的 name(ex.my_work_space) 便可以重部整份資料夾/工作區到遠端伺服器上囉。 ...

2020-01-20 · 1 min · 146 words

Evaluate mathematical expression in PHP

四則運算,不多,不就是加減乘除而已嗎,怎麼會在 Codewars 中被標記為 2 kyu 的題目呢? 總覺得這篇標題應該改為「Codewars 從入坑道棄坑,只需要一題就搞定」。首先我是在 2019 年底才接觸 Codewars,這種打怪練功的感覺讓我一下就上癮了,每天都在想今天能不能再拚一階,或是這題用另外一個語言會不會比較省時間。直到遇到了這題,足足卡了一整天。下面就來介紹一下四則運算在 PHP 中的解法吧。 先乘除後加減,看到括號先做 先舉一個簡單的例子 a+b 該怎麼做呢,有學過一點資料結構的應該很快就會回想起「中序轉後序」。 首先會需要將引入的字串轉為中序 // 123 + 456 * -789 // => // ['123', '+', '456, '*', '-', '789'] function isOp(string $s): bool { return strpos("+-*/", $s) !== false ? true : false; } function changeStringToInfix(string $expression): array { $infix = []; $count = strlen($expression); for ($i = 0; $i < $count; $i++) { if (isOp($expression[$i]) === false) { $j = $i; while ($i < $count && (isOp($expression[$i]) === false)) { $i = $i + 1; } $infix[] = substr($expression, $j, $i - $j); $i = $i - 1; } else { $infix[] = substr($expression, $i, 1); } } return $infix; } 這時候可能有眼尖的會發現,不對阿中序怎麼可以兩個運算子(’*’, ‘-’)連在一起,恭喜你踩進四則運算第一個坑:負號可能是負號也可能是減號。於是可以使用一個偷吃步的方式,將運算子後的負號一率改成另一個代表負號的特殊符號,比如「@」。而這步可以使用正規表達式輕鬆辦到。 ...

2020-01-16 · 3 min · 520 words

PHP ENUM 偽實現

Enumerations 又可簡稱為 Enum ,在眾多語言中都可以讓程式碼更高效簡潔,例如我們可以在 python 中這麼宣告,並且用 requests 模組打一個 request,即可透過 Enum 來模組化 Response import enum import request class HTTPResponsecode(enum.Enum) OK = 200 BAD_REQUEST = 400 NOT_FOUND = 404 r = requests.get('https://omegaatt.com/') print(r.status_code == HTTPResponsecode.OK) # True 但是在 PHP 中原生是沒有內建 Enum 的,必須安裝 perl 的 SplEnum 類套件庫,方能直接使用 Enum 的功能。或是可以透過以下的方式達到接近的效果。 極簡易版 Enum 首先,建立一個 Enum 類,一樣舉例為 HTTP 的 response code abstract class HTTPResponsecodeEnum { const OK = 200; const BAD_REQUEST = 400; const NOT_FOUND = 404; } 這樣就完成最基本的 Enum 拉,只要透過簡單的 if 判斷便能輕鬆享受打包的方便 if($status_code == HTTPResponsecodeEnum::OK){ // foo(); } 具有驗證功能的 Enum 根據防禦性程式寫法,我們知道千萬不要相信使用者傳過來的東西,必須去驗證資料是否正確時,極簡版本已經無法勝任。這時候可以使用 ReflectionClass 這個這個類別協助,由這個類來取得 Class 中的常數。 ...

2020-01-15 · 2 min · 298 words