又到了年末盤點自己技術成長的時間。2023 真是充滿驚奇的一年,年初 ChatGPT 橫空而出,在江湖捲起千堆雪,緊接 LK-99 常溫超導體的新聞,有種人類文明居然要在一年內翻轉兩次的錯覺。不過,隨著時間過去,LK-99 證實是場空歡喜,而我現在則以平常心看待 AI,摸清楚現階段它的限制與能耐,不莫名恐慌也不過度期待,把它想成當年 Google,問市之後每個人都要學,以免落入舉世皆會我獨廢的競爭劣勢。這個世界的起跑線已推進到「人人有 AI 工具可用」的標準,得快點跟上。

如往例,在最後一天回顧 2023 年我在部落格上寫的廢文,檢視這一年的足跡。

ChatGPT 與 AI 大驚奇

身處資訊圈,很難不觀注 ChatGPT / Github Copilot 的發展,當所有人把 AI 工具視為工作及生活的日常,若沒跟上,很快會感受到時代的巨輪... 正從背上輾過去。

年初讀了一批 GPT-4 相關研究,心中默默為這波 ChatGPT AI 革命定調:

  • LLM 不是 AGI,但 GPT-4 與 3.5 相比,擁有連 OpenAI 都難以解釋的推理能力,可能源自「湧現(Emerge)」。
  • 別糾結於 ChatGPT 不時會給錯誤答案,幻覺是生成式 AI 不可分的一部分,挑剔它對你沒好處,取其長處幫你省時省力才是聰明之舉。
  • 所謂 AI 取代人,不一定是資遺員工改用 AI 做他們原本的工作。當兩個人用 AI 可以做三個人的事,便會減少一個職缺,也是種潛在的取代。
  • 想在 AI 時代存活,不是跟 AI 比賽,而是要跑得比你的競爭者快。

thumbnail

還陸續分享了一些 ChatGPT 實測,ChatGPT 將 jQuery 改寫成香草版的表現讓人驚豔,處理 人口統計資料轉圓餅圖、長條圖也是小菜一碟,網頁 / PDF 自動摘要的功能則差強人意,易錯失親自閱讀被某些細節引發共鳴的機會,我認為只能視為預覽或消化不重要文章,真想取其精華,仍得靠自己精讀。

然而,AI 時代寫程式,我愛 Github Copilot 遠勝於 ChatGPT,靠它完成我本來也會寫但現在不必打字就會冒出來的 Code;面對沒寫過不知解法的需求,則是敲註解請 Copilot 露一手,但務必會看懂邏輯,花點時間研究其中沒看過的語法跟沒用過 API 再繼續往後寫。有時爬文過程衍生新疑問,一路查詢相關資料,要花半小時以上,但我仍覺得值得。 寫程式這檔事,我覺得人怎麼都得當正駕駛,該走國道還是繞山路由我決定,但全程注意路況控制油門剎車太累,Copliot 你來。

總之,我逢人就推 Github Copilot,一個月花兩個便當錢擁有黑魔法,Why Not? (註:學生還能免費用)

AI 應用

除了使用 ChatGPT、Github Copilot,今年我也開始學著寫程式整合應用 OpenAI API,AI 語音處理... 以下是一些成果:

Azure 雲端與 Docker 容器

Azure 雲端應用部分,我嘗試了一些 Cloud Native 的用法,像是建立私有 Docker Registry、直接用 Docker 容器建立 Azure App Service 網站讓 ASP.NET 網站依負載自動擴增縮減練習用 Azure Key Vault 儲存連線字串與密碼... 等。

而 Azure 管理方面,我從網頁介面操作換成 Azure CLI、Azure PowerShell,用 PowerShell 搞定 Azure VM 之 RDP/SSH 開放來源 IP 批次更新等日常瑣碎作業,並將最常用的 Nnginx + Cerbot + Docker 網站用 Azure VM 主機新增安裝程序精鍊成一行指令搞定

另外,今年打了一個副本 - 搞懂 Azure AD (現已更名 Microsoft Entra ID) 與地端 AD 整合。我學了 安裝 AD FS 服務設定地端雲端 AD 同步,並練習使用 AD 登入第三方網站

PowerShell 小工具

在資安管制森嚴環境寫自動化工具或批次作業,用 PowerShell 比 .NET 簡單十倍。論程式語言 C# 肯定比 PowerShell 強大好寫,但 PowerShell 有項壓倒性優勢 - PowerShell 是明碼腳本,程式做什麼全部攤開來不怕你看。拎杯光明磊落坦蕩蕩,說程式有問題的給我拿出證據來。(就算看不懂,找人驗一下很難嗎?)

反觀,一旦程式被編譯成二進位執行檔,局面當場逆轉,連圍觀大嬸都能碎唸上兩句:「唉喲,不知道裡面是不是藏病毒有木馬要偷資料呢?」啃! 你從肚子掏出一碗粉還不一定能自清。

thumbnail

於是乎,2023 年王藍田不意外地用 PowerShell 寫了一堆小工具,防止自己被重複手工煩躁到中風,包含自動補齊離線安裝 NuGet 套件將複製文字轉為鍵盤輸入比對 JSON 物件陣列盤點 IIS 站台設定設定 IP/Gateway/DNS、更改電腦名稱列舉傾聽的 TCP Port 與其對應程式讀取 SQL 執行計劃

密碼學好好玩

密碼學相關議題是我今年的研究主軸之一,重要成是學會自製比珍奶還便宜的 USB 實體金鑰,用它結合 GPG 可實現超安全的加解密與數位簽章,還能自己寫 C# 用 USB 實體金鑰加解密。另外,我還試了在 Windows 安裝 OpenSSH 伺服器,學會從 Windows 使用金鑰免密碼登入 SSH/SFTP/SCP,或用實體金鑰免密碼登入 SSH/SCP/SFTP讓安全更上層樓。

另一項進展是年底入手了大名鼎鼎的 YubiKey,研究了無密碼登入,對 WebAuthn 與 Passkey 做了一番深入了解,體驗使用手機免密碼登入 Google 帳號,還意外學到 WebAuthn 無密碼登入不等於 Passkey的冷知識。

今年有個發現:RSA 公私鑰加密與簽章早已非公私鑰的主流,ECC 橢圓曲線密碼學、Ed25519、Curve 25519才是,比特幣、乙太幣早已改用 ECC 很久了,GnuPG 軟體的金鑰預設選項也都是 ECC,誰跟你還在 RSA?

至於密碼學演算法發展方面,我寫了一篇 資安科普說明為什麼 MD5 不再安全?,寫 .NET 程式試玩了 SHA256 密碼雜湊暴力破解,也在單檔 HTML 文件研究中玩了 SHA 密碼雜湊攻防 / 加鹽翻炒版香草 JavaScript 執行 AES 加解密,算是對 SHA、AES 做了深度體驗。

另外,我學到 Have I Been Pwned (HIBP) 外洩密碼查詢平臺有個 API,使用者自己先算好密碼的 SHA1 雜湊,用雜湊前五碼當查詢條件,API 傳回所有前五碼相符的密碼雜湊,以及該筆密碼在資料庫出現次數。查詢者取回清單自行比對後 35 碼,若找到就代表該筆密碼已被收錄,次數愈高代表愈多人用,認證為菜市場密碼無誤。使用者可確認密碼是否在資料庫中,而 HIBP 站方只知前五碼,無從得知使用者想查的密碼雜湊是哪一筆,兼顧方便與安全,是個聰明做法。於是我寫了個 PowerShell 小工具快速檢測密碼是否外洩或被列入已知清單,並找到方法簡單估算不同密碼長度與複雜度所需暴力破解時間

最後,量子電腦(延伸閱讀:YT 筆記 - 搞懂量子糾纏、疊加態、測不準原理)是 AI 之外另一項在未來十年會影響人類文明的科技進展,除了對於醫學、物理化學、AI 等科學研究帶來極大助力,量子電腦有讓當今依賴的資安防線崩潰而帶來危機,故 Y2Q 倒數與 Q-Day 是值得關心的議題。

自己動手樂無窮

今年照例做了不少家庭水電手工,也胡亂玩了一些 Arduino (ESP) 開發:

RPA 與壓力測試

標榜 No Code/Less Code 的 RPA 軟體向來不是我的菜,我這麼愛寫程式怎能不自己來,今年多學會微軟 Playwrite,網頁自動化火砲再添一台。

另外,在壓力測試工具方面,先學了 JMeter,很快被讀者推坑,愛上讓開發人員如沐春風的壓力測試工具 - K6,配合 K6 研發自己寫 C# WebAPI及用 Windows 內建 CLI 工具 - typeperf監測 CPU、RAM、Disk 效能數據,做到壓測同時蒐集 CPU 使用率挑戰網站極限逼出 HTTP 503,最後再做到將壓力測試結果自動轉圖表,完成壓測生產線,方便反覆測試。

而歷測過程學到新時代 .NET ThreadPool 程式寫法以及為什麼該改用 async/await,並透過 ASP.NET 網站壓力測試驗證 async/await 效果,是額外收獲。

桌面程式

近兩年我喜歡用 Minimal API 寫桌面小工具,沿用前端開發技能,省下多學 XAML 的時間。今年持續投入優化這條路線,加上工作列圖示將 ASP.NET Core 變成 Windows 桌面常駐程式,最後一不做二不休,直接包含 NuGet 套件,讓 ASP.NET Core Minimal API 快速轉桌面常駐小工具

ASP.NET Core MinAPI 開發桌面常駐工具

演算法與程式語言

年初一次 BFS 面試考題的幼稚挑戰讓我萌生挑戰重讀演算法書的想法,想拉近自己跟本科生的距離,去圖書館借了一堆快樂兒童餐等級的演算法入門書,後續衍生一些研究小心得,例如 找出 .NET 陣列用什麼演算法排序及其 Big O、認識 演算法作業好朋友 - BigIntegerPadding 填充如何表示原始資料長度?CRC 檢查碼除法演算從比對原始資料改為比對 SHA256 會慢多少?

另外,寫了程式語言排行、VB/C# 比較,跟資料庫排行的評估心得:滄海桑田一甲子,熱門程式語言演變史增廣見聞 - 資料庫引擎排行榜前 20 名盤點閒聊 - C#、VB.NET 之開發者人數、定位與發展策略比較

還有一件,看到小閃光在用 Dev C++ 寫 C,理由是 VSCode 的 C++ 環境裝不起來!

登楞! 身為 Windows / VSCode 推坑人,這如同 KPI 沒達成,況且還在我眼皮子底下發生,那可不成!

於是我跨界研究了一下,寫了 Windows VSCode C/C++ 開發環境安裝指令懶人包,除了成功將小閃光推坑,意外也幫到一些同學,善哉。

資料庫

今年在資料庫方面著墨不多,盤點之下只有年初研究 SQL 索引欄位包含 OR 比對項目對效能的影響、 練習 LINQ 動態組裝 Expression 產生 WHERE 條件,以及遇到經典 「網站執行 Stored Procedure 爆慢,移到 SSMS 跑卻飛快」問題,對 SQL Parameter Sniffing 與執行計劃效能多了一番認識。

ASP.NET

古蹟維護還是我的重要日常,今年的幾個大心得是做了 WebForm 版 js/css 版本化網址,深入 Cache-Control vs 版本化網址(雜湊指紋參數) 比較,同時新增 網路下載鎖定造成 System.Web.AspNetHostingPermission 安全錯誤經驗,以及補完 ODP.NET 元件註冊 SOP

.NET 8

年底剛推出的 .NET 8 為 LTS 版,又到了企業該評做切換更新的時機,我自己在小專案上試跑,不料連踩兩坑(DI 多建構式設定 Breaking ChangeSystem.Data.SqlClient 不支援),所幸都找到解法。不支援 System.Data.SqlClient 恐會是升級 .NET 8 的一大障礙,整理 System.Data.SqlClient 轉移 Microsoft.Data.SqlClient 經驗 供要邁上 .NET 8 之路的勇者們參考。

實用小技巧

今年累積的實用小技巧如下:

生活小常識

最後,與技術無關,補充幾則生活知識

結語

2023 年將盡,祝大家 2024 健康平安,又是收獲滿滿的一年。


Comments

# by Fatina

今年多學會微軟 Playwrite,超連結有誤?

# by Jeffrey

to Fatina, 已更正,感謝。

Post a comment