Daily Digest

每日新聞摘要

2026年07月22日

今日總結

內容會跟隨語言切換。

📝 今日焦點 - Java/MySQL 字元集需全鏈路統一為 utf8mb4,避免 Incorrect string value。 - Spring AI 可接 LM Studio,本機直接跑聊天與嵌入模型。 - Kotlin reified 補足型別擦除,讓泛型在執行期更好用。 - Android 建置可用 convention plugin 集中規則,提升模組化維護。 🔧 效能最佳化 - Android 開發應善用背景處理、Gradle 優化與分析工具,避免瓶頸。 - JDBC cursors 搭配 Kotlin sequences 可取代低效批次,實測快 80 倍。 🏗 架構設計 - Android 建議以 Kotlin、Jetpack、MVVM、Room 與 Compose 建立穩定架構。 - 團隊應依需求選擇 Retrofit、Flutter 或 React Native,並持續調整技術棧。 ✅ 測試與品質 - CI/CD、Lint、除錯與資源管理可縮短交付時間並提升版本品質。 - 協程例外需正確向上管理,避免 try/catch 失效導致應用崩潰。 🚀 語言演進 - Kotlin 持續以空值安全、精簡語法與 reified 強化開發體驗。 - 低內容文章多屬系列導讀,涵蓋控制流程、記憶體與 Compose 主題。

01

How to Fix MySQL java.sql.SQLException: Incorrect string value

Baeldung 作者:Hiks Gerganov 發布:07-22 11:19

如何修正 MySQL java.sql.SQLException: Incorrect string value

最可靠的作法通常是將 MySQL、資料庫及其各組件都設定為完整的 Unicode 支援。

重點摘要

將資料庫、資料表與欄位改用 utf8mb4。
調整 JDBC 連線參數以正確處理 Unicode。
檢查伺服器字元集設定並更新過時驅動程式。

本文說明 Java 應用程式在寫入 MySQL 時,為何會遇到 java.sql.SQLException: Incorrect string value,常見原因是字元集無法表示某些 Unicode 資料,例如表情符號。解法通常是讓各層編碼一致:把資料庫、資料表與欄位改為 utf8mb4,設定 JDBC 連線以支援 Unicode,並檢查 MySQL 伺服器的字元集變數,更新預設值後重新啟動服務。文章也提醒,若只修正單一環節、建立新物件時仍用舊編碼,或使用過時的 Connector/J,錯誤仍可能發生。

02

Integrating Local LLMs with Spring AI Using LM Studio

Baeldung 作者:Manfred Ng 發布:07-22 11:24

使用 LM Studio 將本地 LLM 整合至 Spring AI

Spring AI 可透過 LM Studio 相容 OpenAI 的 API,連接本機部署的聊天與嵌入模型。

重點摘要

LM Studio 可在本機下載、管理並以 REST API 提供 LLM 與嵌入模型。
教學採用 Spring AI OpenAI starter,設定 dummy API key 與 /v1 base URL。
透過聊天與 embedding 兩個端點,驗證本地模型可正常運作。

本文介紹如何將 Spring AI 與 LM Studio 整合,讓 Spring Boot 應用程式使用本機部署的聊天模型與嵌入模型。LM Studio 提供桌面介面,可輕鬆下載與管理模型,並以相容 OpenAI、Anthropic 的 REST API 對外服務。文章說明因 Anthropic 依賴不支援 embedding,因此選擇 Spring AI OpenAI starter;接著示範如何在 application.yml 中設定 dummy API key、本機 base URL(需加上 /v1)及模型名稱。最後以兩個範例端點與 curl 測試確認整合成功。

03

Mastering Android App Development: Essential Hacks for Developers

Dev.to Kotlin 作者:Chirag rao 發布:07-22 12:18

精通 Android App 開發:開發者必備技巧

效率、效能與可維護性至關重要,而一些實用技巧能將你的開發能力提升到新層次。

重點摘要

採用 Kotlin,讓程式更精簡、安全且易維護。
運用 Jetpack 與 MVVM,降低樣板碼並分離責任。
透過效能分析、乾淨程式碼與 CI/CD 工具提升品質。

本文整理多項提升 Android 開發效率的實用方法。作者建議以 Kotlin 作為主要語言,利用其精簡語法、空值安全與 Java 相容性,提升程式可讀性與可維護性;同時善用 Android Jetpack 的 LiveData、ViewModel 與 Room 等元件,讓應用更模組化、更穩定。文章也強調採用 MVVM 架構來分離 UI 與商業邏輯,並使用除錯與效能分析工具找出瓶頸。此外,還提醒避免硬編碼、妥善管理資源,並透過背景執行、Gradle 優化、Lint 與 CI/CD 管線來縮短建置時間、提升發佈品質。

04

Mastering Android App Development: A Comprehensive Guide

Dev.to Kotlin 作者:Chirag rao 發布:07-22 12:18

精通 Android App 開發:完整指南

透過採用 Kotlin、Jetpack Compose 與架構最佳實踐,開發者能打造高品質且高效能的應用程式。

重點摘要

Kotlin 是現代 Android 開發的首選語言。
Jetpack Compose 以宣告式方式簡化 UI 建構。
MVVM、Retrofit 與 Room 有助於打造可維護、可連網且支援離線的應用。

本文整理了建立穩健 Android 應用所需的核心技術與實務做法。內容先介紹 Kotlin 作為現代開發主力語言,也提到 Java 在舊系統與既有函式庫中的重要性,接著說明 Android SDK、用於宣告式介面的 Jetpack Compose,以及有助於提升可維護性的 MVVM 架構。文章同時涵蓋用於網路請求的 Retrofit 與本機資料儲存的 Room,最後比較 Flutter 與 React Native 兩種跨平台方案。整體重點是依需求選擇工具,並持續跟上 Android 生態的演進。

05

One Tap, Three Threads: Where Does the Work Actually Run?

Medium Kotlin 作者:Angelina Andronova 發布:07-22 07:33

一次點擊、三條執行緒:工作實際跑在哪裡?

按下按鈕後,螢幕背後仍有真正的工作必須完成。

重點摘要

一次點擊會觸發介面背後的實際工作。
文章聚焦於這些工作究竟在哪裡執行。
例子包括解析檔案、解碼圖片與處理資料。

文章從一個實際又常見的問題切入:使用者按下按鈕後,真正的工作到底在哪裡執行?內文提到解析檔案、解碼圖片與處理資料等操作,說明這些動作都必須在介面背後某處完成。雖然摘錄內容很短,但主題明確指向點擊事件觸發後的執行環境,並帶出執行緒與背景處理的概念。

06

Control flow

Medium Kotlin 作者:Aly Route 發布:07-22 08:23

控制流程

Functions — Continue reading on Medium.

重點摘要

文章標題為〈Control flow〉。
作者是 Aly Route。
內文僅有 Medium 預告,未提供實質內容。

這篇文章提供的內容非常有限,只能看到標題〈Control flow〉、作者 Aly Route,以及一段 Medium 的簡短提示「Functions Continue reading on Medium」。由於沒有後續正文,無法得知文章對控制流程的具體說明、範例或技術細節。就現有資訊來看,主題應與控制流程有關,但原文精華並未出現在這段摘錄中,因此只能如實反映其內容不足。

07

How to Master Android Modularization with Convention Plugin

Medium Kotlin 作者:Simone Cocco 發布:07-22 08:49

如何透過 Convention Plugin 掌握 Android 模組化

透過集中式的建置邏輯,讓開發更順暢地擴展規模。

重點摘要

停止依賴脆弱的傳統巨石式架構。
以集中式建置邏輯支援模組化。
透過 convention plugin 讓 Android 開發更容易擴展。

本文主張 Android 團隊應從脆弱的傳統巨石式架構,轉向以集中式建置邏輯支撐的模組化設計。透過 convention plugin,開發者可以統一建置設定、減少重複配置,並讓大型程式碼庫更容易維護。文章強調,當建置規則集中管理時,模組化能成為更務實、也更能平順擴展開發規模的方法。

08

The Anatomy of a Coroutine Crash: Handling Exceptions the Right Way

Medium Kotlin 作者:Avik Sharma Chowdhury 發布:07-22 09:45

協程崩潰剖析:正確處理例外的方法

try/catch 的運作方式,並不如你以為的那樣。

重點摘要

說明 Kotlin 協程中的例外為何可能無法被預期地攔截。
解析協程拋出錯誤時,實際上會發生什麼事。
聚焦於如何避免一次失敗讓應用程式整體崩潰。

本文指出 Kotlin 協程中常見的例外處理誤區:try/catch 並不一定能像開發者想像的那樣攔截協程內拋出的錯誤。文章以崩潰情境為切入點,說明例外在執行時的實際傳播方式,以及為什麼看似被保護的區塊仍可能失效。接著,作者強調應以正確方式管理協程失敗,避免單一例外擴散並拖垮整個應用程式。

09

Ultimate Guide to Android Memory Architecture-Part 5

Medium Kotlin 作者:Dhiraj Kumar 發布:07-22 12:52

Android 記憶體架構終極指南:第 5 部分

理解記憶體。

重點摘要

延續 Android 記憶體架構系列。
內容主題聚焦於理解記憶體。
目前僅提供極短的原文片段。

這篇文章標題為 Dhiraj Kumar 撰寫的《Android 記憶體架構終極指南》第 5 部分。不過,提供的內文只有極短片段「Understanding Memory Continue reading on Medium »」,因此無法從現有文字提取更多實質內容。就可見資訊來看,本文應屬於 Android 記憶體架構系列的一部分,主題圍繞記憶體理解與相關技術脈絡,但詳細論述、範例與結論都未包含在目前提供的內容中。

10

Reified in Kotlin: The Missing Piece Behind Runtime Generics

Medium Kotlin 作者:Nemat 發布:07-22 03:51

Kotlin 中的 reified:運行時泛型背後缺少的關鍵

你是否曾想過,Retrofit、Koin、Gson 這類函式庫為何能直接寫出 get<User>() 或 fromJson<User>(),而不必傳入 User::class.java?

重點摘要

說明 Kotlin 泛型在執行時通常會被擦除
介紹 reified 類型參數如何保留型別資訊
以 Retrofit、Koin、Gson 為實際例子

本文以 Retrofit、Koin 與 Gson 等常見函式庫為例,介紹 Kotlin 的 reified 類型參數概念。文章指出,泛型在一般情況下會遇到型別擦除問題,導致執行時無法取得完整的型別資訊,因此平常需要額外傳入 User::class.java 之類的參數。reified 被視為補上這塊缺口的關鍵,讓 Kotlin 能更自然地在執行時使用泛型型別,提升 API 的便利性與可讀性。

11

Course Review: Jetpack Compose Crash Course @ Udemy

Medium Kotlin 作者:Saidel López 發布:07-22 04:10

課程評測:Udemy 的 Jetpack Compose Crash Course

雖然內容有點過時,但我真的很喜歡這門課。

重點摘要

作者對這門課的整體評價正面。
內容被認為稍微有些過時。
這是一篇簡短的課程評論。

這篇文章是 Saidel López 對 Udemy《Jetpack Compose Crash Course》的簡短評測。作者表示,雖然課程內容有點過時,但整體上真的很喜歡這門課。摘錄中沒有更多課程細節,但可以看出作者對課程持正面態度,只是提醒讀者內容年代略久。

12

Jetpack Compose Fundamentals — Part 5: Understanding Modifiers and Modifier Order

Medium Kotlin 作者:Vaibhavi Rana 發布:07-22 05:22

Jetpack Compose 基礎 — 第 5 部分:理解 Modifier 與 Modifier 的順序

在本系列的上一部分中,我們探討了 Jetpack Compose 的基本版面配置 composable。

重點摘要

介紹 Jetpack Compose 基礎系列的下一個主題。
回顧上一部分曾討論 layout composable。
提供的是延續閱讀提示,未包含更多技術細節。

這段內容只是 Jetpack Compose Fundamentals 系列第 5 部分的開頭提示,說明上一部分已探討 Jetpack Compose 的基本版面配置 composable,並引導讀者前往 Medium 繼續閱讀。由於提供的內文僅有過渡句,未出現關於 modifier 或 modifier 順序的進一步技術說明,因此這裡主要是承接全文的導語,而非完整內容本身。

13

When Batching Backfires: How JDBC Cursors and Kotlin Sequences Gave Us an 80x Speedup

Medium Kotlin 作者:Jeroen Rosenberg 發布:07-22 06:01

當批次處理適得其反:JDBC Cursor 與 Kotlin Sequences 帶來 80 倍提速

我們正在打造一個集中式總帳閘道,取代多個用來建立日誌分錄的舊系統。

重點摘要

此平台用來整合舊系統的日誌分錄建立流程。
原本以為有效的批次處理,在這個情境下反而拖慢效能。
改用 JDBC cursor 與 Kotlin sequences 後,速度提升 80 倍。

文章介紹團隊正在打造一個集中式總帳閘道,用來取代多個舊系統以建立日誌分錄。原本被視為可提升效率的批次處理,在這個流程中卻沒有帶來預期效果,甚至可能造成反效果。團隊改用 JDBC cursors 與 Kotlin sequences 後,效能大幅提升,達到 80 倍加速。本文重點在於:選對資料存取方式,往往比一味採用批次處理更關鍵。