生產力作為一種聖杯

這篇是我的 2026 年 4 月份 BlogBlog 同樂會 投稿,本月主題是「生產力」。如果你有自己的部落格,歡迎一起來參加!
如果你跟我一樣想看其他朋朋的文章看到爽,可以到:BlogBlog 同樂會(2026 年 4 月): 生產力 底下的「已投稿清單」,有各式各樣的優質文讓你三餐配飯、一次滿足。

警告:本篇文章的分類為「murmur」代表內文充滿主觀、偏見、碎碎念,以及一些應該寫到 Timeline 但不小心寫太長只好發成文章的東西,服用時請做好隔離作業,謝謝您的配合。


我其實對近年遊戲經常採用的一個設計有點不滿,就是「戰力指數」。

在一些傳統(?)的遊戲裡,一個角色或人物可能擁有許多屬性,像是力量、智力、敏捷、幸運。更進階的可能牽涉到技能或個性,像是口才、射箭、劍術、竊盜。

這些能力代表了不同的面向,在不同情境下有不同的作用,對不同職業或是不同角色也有不同效果,甚至在某些遊戲裡,屬性之間的搭配還會帶來更多複雜的屬性,甚至會是劇情路線和特定操作的門檻。

所以,我們遊玩時就必須研究這些屬性帶來的效益,並規劃自己要分配的屬性和成長路線(也就是常說的配點)。例如盜賊可能依賴敏捷與幸運;法師可能需要魔力。又或是當我們想扮演一名聖騎士,就同時需要力量和信仰。想要在某個特定事件中勝出並拿到道具,需要優先讓體魄的屬性達到 20 點並具備某某特性……諸如此類,屬性是複雜的,也是迷人的

但也許是因為這些數值實在太不直觀了,還變相拉高了遊戲的進入門檻,於是產生了一個更加親和且通用的衡量單位,那就是「戰力」。

戰力會將玩家角色或隊伍持有的屬性和各項數值進行計算,按照公式直接估出一個代表整體戰鬥能力的數值。有了這個戰力的數值,玩家只需要看一眼,就可以說「哦!我的角色大概有 8,000 戰力這麼強」「他的角色大概有 1 萬戰力這麼強」

……但這個八千「戰力」和一萬「戰力」,到底代表什麼呢?

戰力變成一個非常扁平化的指標,遮住了背後所有的邏輯,只留下一個簡單粗暴的數值,很方便,但也很模糊。

「生產力」也是這樣的。

……

閱讀全文



鴛鴦鍋就是要分成涮肉區和煮湯區才符合單一職責吧?

這篇是我的 2026 年 2 月份 BlogBlog 同樂會 投稿,本月主題是「只有我這樣嗎?」。如果你有自己的部落格,歡迎一起來參加!

如果你跟我一樣想看其他朋朋的文章看到爽,可以到:「只有我這樣嗎?」──2026 年 2 月 BlogBlog 同樂會回顧 底下的「已經投稿的作者清單」,有各式各樣的優質文讓你三餐配飯、一次滿足。

參加了「只有我這樣嗎?」的投稿之後,發現原來真的不只我這樣!
感謝 Shuo-jen 的這篇〈火鍋界的「微積分大戰」
在追求鴛鴦鍋最佳實踐的路上,我們都不孤單,歡迎更多朋友加入我們!

看到這個月 BlogBlog 同樂會的主題「只有我這樣嗎?」的當下,文章主題就已經確定了。

畢竟曾經在現實生活問過一圈,完全沒有遇到過同樣做法的朋友,當時的想法就真的是「哇,不會只有我們這樣吧?」如此如此,正好寫文一篇,順便推廣推廣。

雖然很想直奔主題,但就像系統設計常說的「脫離問題脈絡、直接討論解決方案,就是耍流氓」,所以讓我們從一些背景脈絡開始聊聊吧。


首先,標題的鴛鴦鍋有一個重要的前提:吃到飽。

認識我的朋友都知道我是一個無肉不歡的人,凡是聚餐必定要大口吃肉、只要進食就一定要大口吃肉,反正就是要大口吃肉。因此我和吃到飽餐廳的關係,就像斷頭台的刀刃和路易十六的脖子,是一場命運般的奔赴:我不是正在吃到飽餐廳,就是正在前往吃到飽餐廳的路上。

而在數以百計的吃到飽餐廳種類中,火鍋又是金字塔的頂端,在煮沸的高湯涮上幾秒鐘,就有熱騰騰香噴噴的肉可以品嘗,從「肉量/每秒」為單位的進食效率來看,可以說是沒有比火鍋更方便的了。連續涮上幾片肉,裹上一些蔥蒜醬料,咬下的瞬間,肉汁和奶香味充盈鼻腔,恍惚間彷彿回到遠古時代的高原上跟野人祖先們一起撕咬獵物,這種感覺實在令人欲罷不能。

為了追求這份歡愉,我踏過了小蒙牛、新馬辣、向辣等戰場,用脂肪累積著戰士的勳章。但是,在這條偉大的火鍋征途上,仍然有一片巨大的陰影,那就是

經常吃吃到飽火鍋的人都知道:只要涮的肉多了,煮到後面湯上面都有一層油,而且浮沫四溢、雜質四散,通常煮到這個程度,這鍋湯也就廢了。

原本該是火鍋主角之一的湯,就這樣淪為了龍套中的龍套,只為了把肉燙熟而服務。尤其像大學生聚餐這種眾菜拱肉的場合,更是連給旁邊火鍋料提鞋兒也不配,什麼湯頭帶來的濃厚、甘甜、溫暖和高普林,根本沒人在乎。散場的時候,也就只留下一灘陰暗扭曲的雜質鍋,跟離職前輩留下來的程式碼一樣,可以說是悲劇中的悲劇,實在令人唏噓。

但如果、如果我們既要又要--既想大口吃肉,又想大口喝湯,該怎麼辦呢?

……

閱讀全文



菜雞抓蟲:AutoMapper 出現奇怪的型別對應錯誤嗎?貼心的慣例式映射可能正在造訪你家

部門朋朋前陣子忙著把一卡車陳年專案升級到 .Net 8,原本吃著火鍋唱著歌、升級升得好好的,眼看三下五除二就要升級完畢,但就在這一片祥和安寧之中,突然有個專案升級後 API 就原地死去,只留下 AutoMapper 的錯誤訊息,兇案調查也就此開始……


俗話說得好:不看錯誤訊息的偵探不是好偵探。

讓我們先看看以下片段(為保護當事欄位,已做混淆處理):

---> AutoMapper.AutoMapperMappingException: Error mapping types.

Mapping types:
BooDataModel -> BooDto
NiceProject.Repositories.DataModel.BooDataModel -> NiceProject.Services.Dto.BooDto

Type Map configuration:
BooDataModel -> BooDto
NiceProject.Repositories.DataModel.BooDataModel -> NiceProject.Services.Dto.BooDto

Destination Member:
ProductOrder

---> AutoMapper.AutoMapperMappingException: Missing type map configuration or unsupported mapping.

Mapping types:
OrderedEnumerable`1 -> Int32
System.Linq.OrderedEnumerable`1[[Product...]] -> System.Int32

對第一現場進行勘驗,發現幾個值得注意的點:

  • 來源類別並沒有 ProductOrder 這個欄位,但目標類別有
  • MapperConfiguration 並沒有明確要求 Ignore ProductOrder,但原本的版本運行得好好的,升級 .Net 後才出錯

現在我們已經收集了案發現場的線索,但我們還需要回答一個關鍵的問題:錯誤訊息中的 AutoMapper 在案發時究竟做了什麼?

……

閱讀全文



從紙筆到電子白板,我的 Heptabase 使用場景

這篇是我的 2026 年 1 月份 BlogBlog 同樂會 投稿,本月主題是「推坑」。如果你有自己的部落格,歡迎一起來參加!

如果你跟我一樣想看其他朋朋的推坑文看到爽,可以到:「推坑」──2026 年 1 月 BlogBlog 同樂會回顧 ,有各式各樣的推坑文讓你三餐配飯、一次滿足。

本月主題是「推坑」,原本想不太到要推坑什麼,但看到 PJ 留言「問就是推坑 Heptabase」後,心想:「對呀,我每天都在用 Heptabase,不如就推坑一篇吧!」


按照慣例,推坑開始之前還是要介紹一下什麼是 Heptabase

這邊直接引用官方 Wiki 和教學影片,基本上看了影片就能馬上知道這軟體是做什麼用的:

Heptabase 是一個專門幫助你學習和研究複雜主題、對事物建立深度理解的視覺化筆記軟體。


雖然說要寫一篇來推坑,但關於 Heptabase 的介紹和教學已經一抓一大把了。

例如官方 Wiki 上就有足夠的使用案例和說明:

或是 Alan 分享的使用流程(當初就是因為這篇文章和裡面那部四小時的示範影片才入坑的):

當然還有更多介紹文,丟幾篇我個人喜歡的:

如果看見這篇文章的人,是想學習使用 Heptabase,那麼上面的資訊已經相當充足了。

那麼,所謂的「推坑文」到底需要什麼呢?果然還是需要推坑者使用的場景和心得吧。

綜上所述,接下來的篇幅就用來介紹我覺得好用的幾個地方了。以下全是個人經驗和主觀意見,充滿大量五星好評吹捧,想到什麼寫什麼。

如果看完發現沒什麼幫助,還請看在前面丟了一堆(別人的)資源的份上原諒我,阿彌陀佛。

……

閱讀全文



記一次把部落格圖片從 Imgur 搬到 Cloudflare R2 的過程

1753973862036

在上個月的 Imgur 一直 temporarily over capacity 嗎?先檢查網路看看吧 提到,因為 Imgur 不給上傳圖片了,現在寫個文章還得開 VPN 才能貼圖片。

拖著拖著七月也要過了,決定趁休假的時候來把圖床搬一搬。

比起實作上的拖延,搬家目標則早早決定好要嘗試這篇「Imgur 封鎖台灣 IP,我把圖床搬到 Cloudflare R2 - Code and Me」提到的 Cloudflare R2

畢竟出口流量免費實在太香了,不愧是賽博菩薩。這就馬上前來皈依。


考慮到每位朋朋的部落格選型不同,先說明一下我家的狀況:

  • 使用 Hugo 建置,直接丟在 Github Pages
  • 圖片目前放在 Imgur

這代表有些較為暴力的操作可能只適用於我目前的狀況,例如直接在檔案裡搜尋 imgur 來抓圖等等(所以如果你是從關鍵字搜尋進來這篇文章的,請從右手邊的文章目錄直接前往你需要的小節)

這次圖床搬家主要進行了以下步驟:

如此如此,說搬就搬,這篇就紀錄一下這次的圖床搬家過程。

……

閱讀全文



C#: 使用 PDFSharp 在 PDF 加上浮水印和檔案密碼吧

接續前一篇 C#: 使用 DinkToPdf 把 HTML 轉成 PDF,這篇要來用 PDFSharp 對 PDF 檔案進行一些小小的調整。基本上就是紀錄一下這次遇到的需求和一些坑,主要的內容會有:

  • 替 PDF 加上浮水印
  • 實作 FontResolver 以支援中文字,避免 ⎕⎕⎕
  • 替 PDF 加上檔案密碼

首先當然是要先安裝 PDFSharp 套件:

接續上次的進度,我們把 PDF 檔案弄成了一組 byte[]

// 在上一篇文章,我們使用 DinkToPdf 把 Html 轉成了 PDF 檔案的 byte[]
var pdfBytes = converter.Convert(doc);

// 或是打開已存在的 PDF 檔案(留著讓我以後複製貼上)
// var pdfBytes = File.ReadAllBytes(@"C:\temp\output.pdf");

// 使用 PdfSharp 由記憶體串流讀取轉換後的 PDF,開啟模式設定為 Modify(可以進行修改)
using var document = PdfReader.Open(new MemoryStream(pdfBytes), PdfDocumentOpenMode.Modify);

現在我們已經用 PDFSharp 開啟這個 PDF 檔案了,接著就讓我們從加上簡單的浮水印開始吧!

……

閱讀全文



.Net: 善用 IServiceCollection Extension 和自製 Builder,讓服務註冊更有約束吧

在之前的依賴注入文章的「組合根請稍作分類」小節,我們介紹過使用 IServiceCollection 的擴充方法來對要註冊的服務進行分類和管理的做法:

public static class ServiceCollectionExtensions
{
    /// <summary>
    /// 註冊 Nice Service
    /// </summary>
	public static IServiceCollection AddNiceServices(this IServiceCollection services)
	{
		services.AddScoped<INiceService, NiceService>();
        // ...一些相關的註冊

		return services;
	}
}
// Program.cs
builder.Services.AddNiceServices();

一直以來我都採用這個方法來簡單地拆分我的服務註冊,在大多數的場合已經足夠使用(尤其是只關注目前的專案時)。

但前幾天在看某個套件的實作時,開發的朋朋跟我分享了一些延伸的做法,感覺合理又常見,屬於有注意到就會記得的小技巧,決定馬上來記錄一篇筆記。

……

閱讀全文



Imgur 一直 temporarily over capacity 嗎?先檢查網路看看吧

直接先講結論,給正在查這條錯誤訊息而來到這邊的朋朋參考:

  1. 先看 imgur status 確定 Imgur 服務有沒有正常
  2. 優先判斷是不是網路問題:如果有其他網路,更換網路試試看
  3. 如果開著 VPN,關掉再試試看; 反之如果沒開 VPN,找一組跳去外國試看看
  4. 到這邊還是不行的話,代表你遇到的狀況跟我不一樣,就,祝你好運

“Imgur is temporarily over capacity” 這組錯誤訊息除了服務異常,也有可能是 IP 或地區被阻擋。目前(2025/06/14)在 PTT巴哈也有台灣 IP 被擋(官方未證實)的討論。
因此有遇到並且找到這篇文的朋友,請先從網路問題開始檢查,最好能用 VPN 之類的跳到國外驗證試試,祝順利。

前陣子寫文章要上傳圖片的時候一直無法上傳,覺得奇怪就去 Imgur 看了一下,結果登入按了啥反應也沒有,忘記密碼也沒反應。

開 F12 只看到 “Imgur is temporarily over capacity. Please try again later.",例如忘記密碼的回應:

{
    "data": {
        "error": "Imgur is temporarily over capacity. Please try again later."
    },
    "success": false,
    "status": 500
}

奇怪的是用手機的 Imgur 可以正常登入,但換成筆電仍然是不能登入。但既然錯誤訊息都說它們已經 over capacity 了,這點輕微的靈異現象應該也都是合理的(吧)

本來想說「那就等等唄,誰系統沒壞過」,秉持一份工程師不為難工程師的善心,大不了就等系統恢復再用就好

但幾天過去了,感覺事情越來越不對勁……

……

閱讀全文



Windows: 關閉 OneDrive 同步,並把我的文件移回預設路徑

Image

最近因緣際會必須重灌電腦,安裝過程中忘記把 OneDrive 取消掉,結果進 Windows 才發現我的文件夾跑去 C:\Users\xxx\OneDrive\文件,差點昏過去囧

先不論我一堆遊戲存檔都在 Documents 資料夾裡,預設的 5GB 根本吃不下(硬吃還會導致信箱不能收信),一些自己寫的小腳本都已經把 C:\Users\xxx\Documents 當作「我的文件」的預設路徑了,實在不想為了 OneDrive 調整…

因此決定留一篇筆記,把「我的文件」從 C:\Users\xxx\OneDrive\文件 搬回 C:\Users\xxx\Documents,給下次重灌的我(對,我下次還是會忘記的),順便也給網路上遇到同樣問題的朋朋跟他們的 AI Search 參考。

備註:如果你是遇到 OneDrive 名稱自動帶了空格跟中文(例如 “OneDrive - 超棒公司”,像是微軟社區的這個問題)導致一堆路徑沒加引號的腳本炸掉,但又不打算關閉 OneDrive 同步功能的話,只需要用改名的方式來迴避就可以了。請參考 更改 OneDrive 預設資料夾名稱

……

閱讀全文



C#: 使用 DinkToPdf 把 HTML 轉成 PDF 吧

Image

最近做的一項需求是要把 HTML 轉換成 PDF,過程中決定使用 DinkToPdf 來處理這一段。

考慮到現在拿到的一些文件模板都是 HTML 檔了,感覺以後會蠻常碰到這個場景,決定來筆記一篇,給未來的我複製貼上。

環境準備

首先,當然是要先到 Nuget 安裝這篇的主角:DinkToPdf

Image

由於 DinkToPdf 只負責包裝給 C# 這段,實際上要產出 PDF 還得用到 wkhtmltopdf 這個工具,因此還需要先弄到 wkhtmltopdf 的檔案。

不過作者也知道大家不是很想另外跑去找,所以 wkhtmltopdf 的組件檔案可以直接從 DinkToPdf 的 Repo 拿。但要記得要按照作業系統下載對應的 wkhtmltopdf 檔案:

  • Windows => libwkhtmltox.dll
  • Linux => libwkhtmltox.so
  • macOS => libwkhtmltox.dylib

但全部都載也不會有人阻止你就是了。

最後把 libwkhtmltox 放到專案的根目錄底下,DinkToPdf 就呼叫得到囉!
(問就是魔法,不服的自己去啃 P/Invoke

……

閱讀全文



系列文

最近文章

最近動態

轉貼推薦

分類

友鏈

標籤

統計資訊

  • 文章總數:111
  • 累積字數:426132
  • 瀏覽次數:-
  • 本站訂閱:RSS (index.xml)

工商服務

    DDDTaiwan