[{"content":"前言：量子電腦帶來的「計算典範轉移」 近年來，在新聞和科技文章中幾乎每天都會看到「量子電腦」這個詞彙。像是「將目前超級電腦需要運算數千年的計算在幾分鐘內完成」、「現在的加密技術可能都會被破解」等宛如科幻電影般的情節，正被煞有其事地討論著。從 Google、IBM、Microsoft 等科技巨頭，到世界各地的大學和新創企業，都在為了實現這項夢幻技術而激烈競爭。\n然而，當被問到「量子電腦到底是什麼？」時，能準確回答的人恐怕不多。許多人對其抱有「能同時計算所有組合的魔法箱」這種模糊的印象，但嚴格來說這並不正確。\n本文將從基礎徹底且專業又淺顯易懂地解說，量子電腦與古典電腦（我們平時使用的個人電腦或智慧型手機）根本上有何不同，以及它是如何利用「疊加態 (Superposition)」、「量子糾纏 (Entanglement)」、「量子閘 (Quantum gates)」等量子力學的奇妙現象來進行計算。在讀完這篇文章時，您應該能清楚理解量子電腦本質上的厲害之處以及目前的課題。\n第 1 章：古典電腦與量子電腦的決定性差異 為了理解量子電腦的運作原理，我們必須先複習一下我們現在使用的「古典電腦」是如何運作的。\n比較表：古典電腦 vs 量子電腦 項目 古典電腦 量子電腦 基本單位 位元 (0 或 1) 量子位元 (0 與 1 的疊加) 狀態表現 確定性 機率性（觀測前不確定） 計算方式 循序處理（平行化需要實體核心） 量子平行性（同時操作指數級的狀態） 擅長計算 四則運算、日常資料處理 質因數分解、量子化學計算 容錯能力 非常強 非常弱（需要極低溫環境與錯誤更正） 古典電腦的世界：非 0 即 1 的「位元 (Bit)」 古典電腦將所有資訊以「0」或「1」的狀態來表現。這被稱為 位元 (Bit) 。在物理上，是透過半導體晶片上電晶體電壓的高 (1) 或低 (0) 來呈現。 您智慧型手機裡的高畫質照片、現在正在閱讀的這篇文章，或是您喜歡的 YouTube 影片，究極而言都能還原成龐大的「0 與 1 的排列」。計算，不過是透過將 AND（邏輯積）、OR（邏輯和）、NOT（邏輯非）等基本邏輯閘組合起來，對這些 0 與 1 的排列進行操作的過程而已。 這是一個非常確定且具決定論的世界。只要輸入相同，就必然會得到相同的輸出。\n量子電腦的世界：既是 0 也是 1 的「量子位元 (Qubit)」 另一方面，量子電腦的最小資訊單位被稱為 量子位元 (Qubit: Quantum bit) 。 量子位元最大的特徵在於，它不像古典位元那樣只能處於「0」或「1」其中一種狀態，而是能夠處於「0 與 1 以特定機率混合的狀態」。這被稱為 「疊加態 (Superposition)」 。\n例如，如果將古典位元比喻為一枚放在桌上，不是「正面」朝上就是「反面」朝上的硬幣，那麼量子位元常被比喻為「在空中持續旋轉的硬幣」。旋轉中的硬幣無法說它是正面或反面，而是兩種狀態疊加在一起。然後，在硬幣掉到地上停止轉動的瞬間（這在量子力學中稱為「觀測」），才會首次確定是「正面」還是「反面」。\n這種「觀測前狀態不確定」的微觀世界（量子力學）特有性質，正是量子電腦將其直接融入資訊處理過程的原因。\n第 2 章：從根本改變計算的 3 個量子力學性質 量子電腦驚人計算能力的來源，並不僅僅是時脈頻率高或零件小而已。其關鍵在於將物理法則本身作為計算資源來利用。主要有以下 3 個量子力學現象為核心。\n1. 疊加態 (Superposition) 與指數級的資訊量 如前所述，量子位元可以同時保持 0 與 1 兩種狀態。1 個量子位元是「0 與 1 的疊加」，那麼如果增加量子位元的數量會發生什麼事呢？\n1 個量子位元：2 種狀態 (0, 1) 的疊加 2 個量子位元：4 種狀態 (00, 01, 10, 11) 的疊加 3 個量子位元：8 種狀態的疊加 N 個量子位元：$2^N$ 種模式的疊加 只要有 50 個量子位元，就能同時保持 $2^{50}$（約 1125 兆）種狀態。而只要有 300 個量子位元，就能一次保持 $2^{300}$ 種（比宇宙中存在的所有原子數量還要多！）模式。這種指數級的資訊保持能力，構成了量子電腦潛力的基礎。要在古典電腦的記憶體中儲存比宇宙原子數還多的狀態，在物理上是不可能的。\n2. 量子糾纏 (Entanglement)：令人毛骨悚然的超距作用 量子糾纏是一種違反人類直覺的奇妙現象，連愛因斯坦都稱之為「令人毛骨悚然的超距作用 (Spooky action at a distance)」並終其一生無法接受。\n當多個量子位元進入「量子糾纏」狀態時，它們會互相強烈連結，形成一種命運共同體的關係： 「只要其中一方的狀態確定，無論距離多遠，另一方的狀態也會瞬間確定」 。\n例如，假設有兩個處於糾纏態的量子位元 A 與 B（它們各自處於 0 與 1 的疊加態）。當觀測 A 發現為「0」時，超越資訊傳遞速度極限的光速，B 的狀態也會瞬間確定（例如必定成為「1」）。 在量子電腦中，藉由利用這種量子糾纏，可以表現多個量子位元之間複雜的相關性，並進行超平行化的資訊處理。如果沒有糾纏，量子電腦的計算能力將與古典電腦相差無幾。\n3. 量子干涉 (Quantum Interference)：讓正確答案浮現的魔法 您可能會想：「既然能同時保持所有模式，那不就可以一次平行計算，瞬間得出答案嗎？」這是對量子電腦最常見的誤解。 即使在疊加態下進行計算，最終為了知道答案，還是必須進行「觀測」。然而在觀測的瞬間，狀態會隨機坍縮成 $2^N$ 種模式中的其中一種。這樣一來，只會得出一個胡亂的（隨機的）答案而已。\n這時登場的就是 「量子干涉 (Interference)」 。利用波與波相遇時，波長一致的地方會互相增強，錯開的地方會互相抵消的現象（本質上與抗噪耳機的原理相同）。\n優秀的「量子演算法」會在計算過程中巧妙地操作量子態，使得 「通往正確答案的狀態（波）之機率振幅互相增強（放大）」，而「通往錯誤答案的狀態之機率振幅互相抵消」 。然後在最終觀測時，引導出幾乎 100% 的機率會得出「正確答案」。如何巧妙設計這個干涉過程，正是量子程式設計的精髓所在。\n第 3 章：如何進行計算？「量子閘」與「量子電路」 就像古典電腦使用邏輯閘（AND、OR、NOT 等）來進行計算一樣，量子電腦也是透過對量子位元應用被稱為 「量子閘 (Quantum Gates)」 的操作來推進計算。將多個量子閘組合起來的結構被稱為 量子電路 (Quantum Circuit) 。\n量子位元的狀態在數學上被表示為一個被稱為「布洛赫球面 (Bloch sphere)」的 3D 球體表面上的點。北極是「0」，南極是「1」，赤道上則是「0 與 1 各半疊加的狀態」。量子閘，不過就是在這顆球的表面上旋轉狀態（向量）的操作。\n讓我們介紹幾個代表性的量子閘。\n1. Hadamard 閘 (H 閘) 這是古典電腦中不存在、量子電腦獨有的最基本閘。將狀態完全為「0」的量子位元通過 H 閘，會創造出 0 與 1 被觀測到的機率剛好各半的「完全疊加態」（即布洛赫球面上赤道上的點）。作為量子計算的初始化步驟，許多演算法首先都會將這個 H 閘應用到所有的量子位元上。\n2. Pauli 閘 (X, Y, Z 閘) 這些閘包含了相當於古典電腦中 NOT 閘（將 0 翻轉為 1，1 翻轉為 0）的操作。在布洛赫球面上，相當於以 X 軸、Y 軸、Z 軸為中心旋轉 180 度的操作。特別是 X 閘，會將北極 (0) 翻轉至南極 (1)，因此其作用與古典的 NOT 閘完全相同。Z 閘則具有反轉疊加態「相位（類似波的時機）」的作用，這在引發量子干涉上極為重要。\n3. CNOT 閘 (受控 NOT 閘) 這是用來創造量子糾纏的超重要閘。它使用兩個量子位元（控制位元與目標位元）。 其動作為：「如果控制位元為 1，則翻轉目標位元的狀態（X 閘）。如果控制位元為 0 則不作任何事。」乍看之下像是單純的 IF 條件分支，但如果控制位元是「0 與 1 的疊加態」時會發生什麼事呢？目標位元將變成「翻轉與不翻轉疊加的狀態」，兩個位元的命運完全連結在一起。兩個量子位元就這樣完美地「糾纏」了。\n將這些閘像樂譜上的音符一樣由左至右依序配置與應用，就能執行複雜的演算法。\n第 4 章：量子電腦擅長與不擅長什麼？ 這裡要告訴您一個重要的事實。量子電腦並非萬能的神。 在網頁瀏覽、影片渲染、Excel 巨集處理或是執行一般手機 App 等日常任務中，量子電腦大概永遠不會超越古典電腦。這些循序處理的任務，更適合已經高度最佳化、擁有壓倒性速度與低廉成本的古典電腦。\n量子電腦真正發揮其價值的，僅限於 「在古典電腦上計算組合會呈指數級爆炸，需要花費相當於宇宙壽命時間的特定問題」 上。這被稱為「量子霸權 (Quantum Supremacy)」或「量子優勢 (Quantum Advantage)」。\n量子電腦擅長的事（殺手級應用） 1. 質因數分解與密碼破解（Shor 演算法） 目前保護著網路上安全通訊（如信用卡付款或個人資訊傳送）的「RSA 加密」等技術，是基於「對巨大數字進行質因數分解對古典電腦來說實質上是不可能的（需要花費龐大時間）」這個前提。 然而，如果使用數學家 Peter Shor 在 1994 年發現的「Shor 演算法」，量子電腦就能巧妙利用干涉，以戲劇性的速度（多項式時間）解開這個問題。這也導致未來的現行加密體系有崩潰的風險，世界各國的中央銀行與政府機構正急於過渡到「後量子密碼學 (Post-Quantum Cryptography)」。\n2. 量子化學計算與新材料、新藥開發 自然界中分子與原子的行為，原本就是遵循量子力學的法則。如果想用古典電腦來模擬複雜分子的行為，電子之間交互作用的組合會爆炸性增加，即使是相對較小的分子也會碰到計算量的極限。 正如諾貝爾物理學獎得主 Richard Feynman 所言：「如果你想模擬自然，你最好用量子力學來做。」量子電腦在物質模擬上展現出壓倒性的原生力量。人們期待它能在劃時代新藥的設計、常溫超導體的發現、高效率太陽能電池或電池材料的開發、節能肥料的合成等方面，為解決人類課題帶來突破。\n3. 組合最佳化問題與搜尋（Grover 演算法） 從龐大的選項中找出最佳解的問題（如物流的最佳路線、金融投資組合的最佳化等），量子演算法也能發揮作用。使用「Grover 演算法」，在從未整理的資料庫中搜尋目標資料時，可以用古典電腦所需次數的平方根次數找到。例如，如果有 1 億筆資料，古典電腦最多需要找 1 億次，而量子電腦只需約 1 萬次即可完成。\n第 5 章：阻擋在前的硬體之牆「去相干」與「量子錯誤更正」 雖然量子電腦在理論上擁有如魔法般強大的力量，但通往實用化的道路上卻橫亙著極度高聳險峻的物理高牆。最大的敵人是 「雜訊」 。\n量子位元的「疊加態」與「量子糾纏」是極其脆弱且容易破壞的狀態。只要接觸到周遭微小的熱能、電磁波波動，或是宇宙射線等，那種魔法般的狀態就會瞬間崩潰，變成單純的古典位元。這個現象被稱為 「去相干 (Decoherence，量子退相干)」 。\n物理實現方式的激烈競爭 目前，關於如何在物理上製造出這種脆弱的量子位元，世界各地正在研究各種方式，並引發了霸權爭奪戰。\n超導方式 (Superconducting) ：由 Google、IBM、Amazon 等採用。使用環狀的超導電路，並用巨大的冷卻機將其冷卻至接近絕對零度（約 -273℃）的極低溫來控制量子態。這是目前最領先、也最容易增加量子位元數量的方式，但冷卻設備龐大且昂貴。 離子阱方式 (Trapped Ion) ：由 IonQ、Quantinuum 等採用。在真空中利用電磁場困住離子（原子），並照射精密的雷射來控制。其優勢在於所有的量子位元都很均勻，且能長時間維持狀態（相干時間長），但缺點是操作速度比超導方式慢。 光量子方式 (Photonic) ：PsiQuantum 等公司致力於此。使用光的粒子（光子）。其大部分運作不需要極低溫環境而能在室溫下進行，且與現有的矽晶片製造技術及光纖通訊技術相容性佳，是其一大優勢。 拓撲方式 (Topological) ：Microsoft 長年研究。這是一種野心勃勃的方法，試圖利用被稱為任意子 (Anyon) 的特殊粒子的拓撲（拓樸學）性質，製造出從根本上抵抗環境雜訊（不易發生錯誤）的量子位元。理論上是最強的，但物理實現的門檻被認為最高。 終極目標「容錯量子電腦 (FTQC)」之路 現在的古典電腦世界中也存在計算錯誤（例如宇宙射線造成的位元翻轉），但由於「錯誤更正碼」能完美修正，因此我們在使用手機時從來不會意識到錯誤。量子電腦若要進行實用的大規模計算，同樣不可或缺的是 「量子錯誤更正 (Quantum Error Correction: QEC)」 。\n然而，由於量子態具有「一觀測就會破壞」的性質，因此遇到一個致命的困境：無法透過直接查看內部（觀測）來確認錯誤。 為了解決這個問題，已經確立了一種理論（如表面碼等），將多個不穩定的「實體量子位元」巧妙組合，建構出 1 個能偵測並修正錯誤的穩定「邏輯量子位元」。 但是，據說為了製造出 1 個邏輯量子位元，需要 1000 到 1 萬個實體量子位元。若要使用數千個邏輯量子位元來執行 Shor 演算法等，整體系統將需要數百萬到數千萬個實體量子位元。\n我們目前所處的時代，被稱為 NISQ (Noisy Intermediate-Scale Quantum：含雜訊的中等規模量子) 時代。這是過渡期的機器，沒有錯誤更正功能，僅以數十到數百個量子位元運作。 專家預測，要實現終極目標——完全具備錯誤更正能力的 「容錯量子電腦 (Fault-Tolerant Quantum Computer: FTQC)」 ，還需要 10 年到數十年的長期研發。\n第 6 章：量子電腦的歷史與未來展望 最後，讓我們來俯瞰一下量子電腦是如何誕生，以及未來將走向何方。\n從理論誕生到實證「量子霸權」 1980 年代 ：物理學家 Paul Benioff 與 Richard Feynman 提出了利用量子力學原理的電腦概念。「想模擬自然就用量子力學」這句話成為了開端。 1994 年 ：Peter Shor 發表了質因數分解的量子演算法（Shor 演算法）。震驚世界，並成為龐大研究資金湧入的契機。 1996 年 ：Lov Grover 發表了加速資料搜尋的 Grover 演算法。 **2019 年 ** ：歷史性的里程碑。Google 宣布使用 53 個量子位元的超導處理器「Sycamore」，在約 200 秒內完成了被認為古典超級電腦需要花費 1 萬年的隨機數生成驗證計算。這作為世界首次實證 「量子霸權 (Quantum Supremacy)」 的宣言引起了巨大話題（隨後 IBM 等公司反駁，表示若改善古典超級電腦端的演算法，幾天內即可計算完畢，引發了熱烈討論）。 2023 年之後 ：IBM 發表了超過 1000 個量子位元的處理器「Condor」。此外，哈佛大學等團隊成功生成並操作了「邏輯量子位元」，錯誤更正技術的初期實證開始陸續發表。 邁向次世代的科技 量子電腦並不是單純的「時脈速度更快的次世代 CPU」。它是將計算行為本身的機理，用支配微觀世界的量子力學規則從根本改寫，這無疑是資訊科學領域的典範轉移。\n在我們的有生之年，或許不會擁有放進口袋裡的「個人量子智慧型手機」（這也沒必要）。但是，在 AWS 或 Azure 等雲端網路彼端那強大的量子資料中心，有朝一日可能會發現不治之症的特效藥，或是計算出能解決全球暖化的夢幻綠能材料（例如在常溫下從大氣中的氮氣合成氨的催化劑），這樣的未來確實正逐步逼近。\n現在仍然相當於 1940 年代 ENIAC 的黎明期，那時機器還在用打孔卡運作，巨大的真空管熱量讓整個房間悶熱不堪。然而，世界頂尖的研究人員與工程師們正絞盡腦汁，每天都有技術突破的報告。 能夠即時目睹這場新「計算黎明」的進化過程，我們可以說正生活在歷史上非常令人興奮的時代。\n通往量子世界的大門才剛剛開啟。未來的動向令人拭目以待。\n本文旨在為商務人士及對科技有興趣的一般大眾，以淺顯易懂的方式解說量子運算的基本概念。請諒解為了便於理解，部分嚴謹的數學與物理學定義（如狄拉克符號或複數機率振幅的細節等）有所簡化。\n","date":"2026-09-05T22:10:00+09:00","image":"http://kenji.blog/p/quantum-computer-basics/quantum_basics_eyecatch_1788613712487_huf997c6e55368509d0617b56f68899854_1084950_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/zh-tw/p/quantum-computer-basics/","title":"【完全解剖】什麼是量子電腦？〜從零開始理解終極計算原理〜"},{"content":"前言：量子電腦為密碼技術帶來的「威脅」 現在，我們在網際網路上日常進行的通訊——線上銀行的支付、網站的瀏覽（HTTPS）、通訊軟體的交流，甚至區塊鏈與加密資產的交易——其中大部分都受到被稱為「公開金鑰密碼學」的技術保護。具體來說，RSA密碼學和橢圓曲線密碼學（ECC）等演算法，成為了支撐現代數位社會可靠性的基礎。\n這些密碼體系，是以目前古典電腦（包含超級電腦）需要花費天文數字時間才能解開的數學難題，如「巨大數字的質因數分解」或「離散對數問題」作為安全性的基礎。然而，近年來取得顯著進展的 「量子電腦」 一旦實用化，這個前提將會從根本上被推翻。\n1994年彼得·蕭爾（Peter Shor）發表的「蕭爾演算法」，在數學上證明了只要使用具備足夠效能的量子電腦，就能在極短的時間內解開質因數分解或離散對數問題。這也意味著，保護現今網際網路的密碼通訊，在未來有全部遭到破解的風險（被稱為 Y2Q：Years to Quantum，或 Q-Day 的問題）。\n更嚴重的是，「Harvest Now, Decrypt Later（現在竊取並儲存數據，等到未來能夠解密時再破解）」這種攻擊手法的存在。國家的機密情報、企業的智慧財產、個人的生物特徵等需要保密數十年的數據，現在可能已經成為以未來解密為前提的竊取目標。\n為了應對這場前所未有的危機，世界各地的密碼學家與研究機構正傾全力開發能夠抵禦量子電腦攻擊的次世代密碼技術，也就是 抗量子計算機密碼學（PQC：Post-Quantum Cryptography） 。本篇文章將從PQC的基礎開始，詳細解說主要演算法的機制，以及美國國家標準技術研究所（NIST）推動的全球標準化最新動向。\n什麼是抗量子計算機密碼學（PQC）？ 抗量子計算機密碼學（Post-Quantum Cryptography, PQC）是能在現有古典電腦上運行，且被設計成能夠抵抗未來可能出現的大型量子電腦攻擊（如蕭爾演算法等）的密碼演算法的總稱。\n經常被混淆的技術有「量子密碼學（Quantum Cryptography）」和「量子金鑰分發（QKD）」，但這些是完全不同的方法。量子密碼學（QKD）是利用量子力學的物理定律（如觀測會改變狀態的特性），在物理上讓通訊路徑上的竊聽變得不可能的基於硬體的技術。它需要專用的光纖或特殊設備，並面臨導入成本和距離限制等課題。\n另一方面， PQC 則是完全以「數學」為基礎，基於軟體的密碼技術 。因此，它可以作為軟體更新整合到現有的網際網路基礎設施、伺服器、智慧型手機、瀏覽器中，具有極高的現實社會適用性。全球的IT企業與政府機構目前的當務之急，是將現行使用的 RSA 或 ECC 替換（轉移）為這項 PQC。\n支撐 PQC 的 4 種主要數學方法 基於即使用了量子電腦也無法有效解開的數學難題（如 NP 困難問題等），各界提出了多種 PQC 演算法。在這裡，我們將介紹目前成為主流的 4 個主要類別。\n抗量子計算機密碼學（PQC）的主要方法 1 2 3 4 5 6 7 8 9 10 11 12 graph LR PQC[抗量子計算機密碼學 PQC] --\u0026gt; L[晶格密碼學 Lattice-based] PQC --\u0026gt; H[雜湊密碼學 Hash-based] PQC --\u0026gt; M[多變數多項式密碼學 Multivariate] PQC --\u0026gt; C[編碼密碼學 Code-based] L --\u0026gt; L1(FIPS 203: ML-KEM) L --\u0026gt; L2(FIPS 204: ML-DSA) H --\u0026gt; H1(FIPS 205: SLH-DSA) style PQC fill:#f9f,stroke:#333,stroke-width:2px 1. 晶格密碼學（Lattice-based Cryptography） 目前在 PQC 領域中最被看好且成為主流的，就是這項「晶格密碼學」。晶格密碼學是以多維空間中規律排列的點（晶格點）相關的問題作為安全性的基礎。著名的問題包括「最短向量問題（SVP：Shortest Vector Problem）」與「錯誤學習問題（LWE：Learning With Errors）」等。\n機制概要： 請想像在一個維度非常高（數百到數千維）的空間內，有無數的點呈現晶格狀排列。要找到特定的晶格點，在 2 維或 3 維空間很簡單，但到了數百維，目前無論是古典電腦還是量子電腦，都沒有發現能夠有效找出的演算法。尤其是 LWE 問題，利用了「若在聯立一次方程式中刻意加入微小的『雜訊（誤差）』，要推測原始變數會變得極其困難」的特性。\n優點：\n適用於金鑰封裝（KEM）與數位簽章兩者。 處理速度非常快（有時甚至比 RSA 或 ECC 更快）。 金鑰大小與密文大小相對較小，平衡性良好。 目前 NIST 正在進行標準化的演算法中，有許多（如 ML-KEM 或 ML-DSA 等）都採用了這項晶格密碼學。\n2. 雜湊密碼學（Hash-based Cryptography） 雜湊密碼學是專門用於數位簽章的 PQC 演算法。其安全性的基礎，僅依賴於 SHA-2 或 SHA-3 等安全的「密碼學雜湊函數」所具備的抗碰撞性與單向性。\n機制概要： 以被稱為「藍波簽章（Lamport Signature）」的只能使用一次的一次性簽章方式為起點。透過將其與被稱為「默克爾樹（Merkle Tree）」的樹狀資料結構綁定，實現了使用單一金鑰對進行多次簽章。\n優點：\n安全性的基礎極其堅固，有著「只要雜湊函數安全就安全」的強力證明。 對數學結構的依賴較少，被發現預期外破解方法的風險較低。 缺點：\n無法用於金鑰封裝（KEM），僅限於數位簽章。 簽章大小往往會變得較大。 有分為「有狀態（Stateful）」與「無狀態（Stateless）」，有狀態（如 XMSS 等）因為必須嚴格控管金鑰的使用次數，在實作上的難度較高。 NIST 已經將作為無狀態雜湊簽章的「SLH-DSA (舊名 SPHINCS+)」予以標準化。\n3. 多變數多項式密碼學（Multivariate Cryptography） 多變數多項式密碼學是以解開包含多個變數的聯立二次多項式系統的困難度（MQ 問題：Multivariate Quadratic problem）作為安全性基礎的方法。這個問題已知屬於 NP 困難。\n機制概要： 發送方將明文（或雜湊值）代入作為公鑰傳遞的包含多個變數的複雜方程式中，製作出密文（簽章）。合法的接收方擁有「能將方程式結構轉換為容易解開形式的隱藏資訊（陷門）」作為私鑰，並使用它來進行解密（或簽章驗證）。\n優點：\n簽章大小非常小。 簽章的驗證速度極快。適合用於資源受限的物聯網（IoT）設備等。 缺點：\n公鑰的大小非常大（有時可達數十到數百 KB）。 過去曾有有力的演算法（如 Rainbow 等）被古典攻擊破解的案例，與其他方法相比，在建立對安全性的信任方面有較困難的一面。 4. 編碼密碼學（Code-based Cryptography） 編碼密碼學是將用於修正通訊路徑上錯誤的「錯誤更正碼」理論應用於密碼學中。1978 年提出的「McEliece 密碼學」最為著名，也是 PQC 中歷史最悠久的方法之一。\n機制概要： 發送方使用接收方的公鑰（隱藏了特定結構的錯誤更正碼的生成矩陣）對明文進行編碼，並額外加入刻意的錯誤（雜訊）後發送。接收方則使用私鑰去除錯誤，取出明文。密碼分析者必須從不知道結構的純隨機編碼中修正錯誤，這被稱為「一般症狀解碼問題」，已被證明屬於 NP 困難。\n優點：\n經過 40 年以上漫長時間的徹底研究，至今尚未發現有效的攻擊方式，安全性的可靠度極高。 加密與解密的處理速度快。 缺點：\n公鑰的大小非常巨大（有時可達數 MB）。因此，很難在通訊頻寬或記憶體受限的環境（如 TLS 交握等）中使用。 NIST 的 PQC 標準化最新動向 美國國家標準技術研究所（NIST）自 2016 年起，開始向全世界公開徵求次世代抗量子計算機密碼學演算法，並經過了長達數年的嚴格評估與多輪篩選。\n2024 年，NIST 終於發布了以下 3 種演算法作為正式的聯邦資訊處理標準（FIPS）。這意味著全球組織要在正式環境中開始實作的堅固基礎已經完成。\n已制定的 FIPS 標準（2024 年） FIPS 203: ML-KEM（舊名: CRYSTALS-Kyber）\n用途: 金鑰封裝機制（KEM）／加密與金鑰共享 基礎技術: 晶格密碼學（Module-LWE） 特徵: 金鑰大小與速度的平衡非常良好，將作為 Web 通訊（TLS）或安全的通訊軟體等一般網際網路用途中的預設 PQC 金鑰共享發揮作用。 FIPS 204: ML-DSA（舊名: CRYSTALS-Dilithium）\n用途: 數位簽章 基礎技術: 晶格密碼學（Module-LWE） 特徵: 數位簽章的主要標準。可進行高效率的處理，將成為軟體簽章或文件驗證等所有電子簽章用途的新標準。 FIPS 205: SLH-DSA（舊名: SPHINCS+）\n用途: 數位簽章 基礎技術: 雜湊密碼學（無狀態） 特徵: 萬一未來晶格密碼學被發現存在漏洞時，將作為備用方案發揮作用，因此擔負著極其重要的角色。簽章大小雖然較大，但適合需要長期可靠性的用途。 追求更多的多樣性 NIST 在完成首批標準化流程的同時，仍持續探索更多的演算法。特別是因為標準偏向「晶格密碼學」，因此確保 演算法的多樣性（Crypto Diversity） 被視為一項重點。作為金鑰共享的備用標準，目前正推動對編碼密碼學等進行評估，PQC 的基礎預計在未來將變得更加穩固。\n邁向 PQC 的轉移劇本與課題：「密碼敏捷性」的重要性 隨著 NIST 發布正式的標準規格，全球的政府機構、金融機構、科技企業將開始正式推動從現有的 RSA/ECC 轉移（遷移）至 PQC。美國國家安全局（NSA）等機構的指南中，也建議應儘早完成轉移。\n採用混合式方法 由於 PQC 演算法較為新穎，與古典密碼學相比尚未經歷過「時間的考驗」。考慮到實作中潛藏的錯誤或可能發現新攻擊手法的風險，在過渡時期建議採用 「混合式方法」 。這是一種結合具有實績的現有密碼學（例：ECDHE）與新的 PQC（例：ML-KEM）來進行金鑰交換的方法。目前，主流瀏覽器與雲端服務正快速推進這種方法的測試導入。\n實現密碼敏捷性（Crypto-Agility） 企業與系統開發者今後最應該意識到的，是確保 「密碼敏捷性（Crypto-Agility）」 。當未來演算法被發現缺陷或出現新標準時，必須具備能夠在不停止系統運作的情況下，迅速更換與更新密碼演算法的彈性架構設計。\n精確掌握自家系統內部「在何處」、「使用了哪種密碼」、「基於何種目的」來建立密碼物料清單（CBOM：Cryptography Bill of Materials），將是邁向 PQC 轉移的重要第一步。\n總結：為即將到來的「Q-Day」做好準備 量子電腦的進化在為人類帶來巨大恩惠的同時，也是對現代數位社會基礎之密碼安全性的最大威脅。抗量子計算機密碼學（PQC）已不再是「遙遠未來的研究主題」。經過 NIST 發布 FIPS 標準這項里程碑，PQC 已經正式進入「實作與轉移」的階段。\n考慮到「Harvest Now, Decrypt Later」的威脅，對於所有處理機密數據的組織來說，轉移至 PQC 是「現在立刻」就該著手進行的最優先課題。透過深入理解次世代密碼技術並提升系統的密碼敏捷性，讓我們安全地度過即將到來的量子電腦時代吧。\n","date":"2026-09-05T22:09:22+09:00","image":"http://kenji.blog/p/post-quantum-cryptography/post_quantum_cryptography_1788613735417_hu9d405d830ed3e56e9e703ab601cf6c0a_1143219_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/zh-tw/p/post-quantum-cryptography/","title":"【PQC】量子電腦時代的次世代密碼學「抗量子計算機密碼學」全貌"},{"content":"前言：密碼技術與量子電腦的交會點 在現代網路社會中，保護通訊機密的基礎是「公開金鑰加密」。其中最具代表性的，是1977年由Ron Rivest、Adi Shamir和Leonard Adleman三位所開發的「RSA加密」。從我們每天使用的線上購物支付、網站瀏覽（HTTPS）到郵件收發，RSA加密一直扮演著網際網路基礎設施心臟的角色。\n然而，隨著「量子電腦」的出現，有人指出這種安全性可能會從根本上被顛覆。媒體上偶爾會出現「只要量子電腦完成，全世界的密碼和加密都會在幾秒鐘內被破解」這樣聳動的標題。究竟這是不是真的呢？\n本文將深入探討傳統的密碼破解手法GNFS（普通數體篩法）以及使用量子電腦破解密碼的決定性演算法「Shor演算法（Shor\u0026rsquo;s Algorithm）」的運作原理。我們將用淺顯易懂的方式解說量子傅立葉變換與尋找週期等進階概念，並詳細驗證目前在NISQ（Noisy Intermediate-Scale Quantum）時代量子硬體的現狀，以及實際要破解RSA-2048所需克服的障礙。\nRSA加密的根基：質因數分解的困難度 RSA加密的安全性取決於數學中極度簡單的不對稱性。那就是「將兩個巨大的質數相乘很簡單，但要從相乘的結果（合成數）中找出原本的兩個質數（進行質因數分解）卻極其困難」的事實。\n舉例來說，假設有 $ p = 61 $、$ q = 53 $ 兩個質數。要計算這個乘法 $ N = p \\times q = 3233 $ 只需要一瞬間。但是，如果只給你「3233」這個數字，要你解出「這是哪兩個質數相乘的結果？」，數字越大，計算量就會呈爆炸性增長。\n在目前主流的RSA-2048中，使用了長度為2048位元，換算成十進位約為617位數的巨大合成數 $ N $。只要能將這個 $ N $ 進行質因數分解，加密就等同於被破解了。\n傳統電腦的挑戰：GNFS（普通數體篩法） 為了從根本解決質因數分解問題，數學家和密碼學家長年來開發了各種演算法。其中，目前在傳統電腦上被認為最快的方法是 普通數體篩法（GNFS: General Number Field Sieve） 。\nGNFS為了將巨大的數字 $ N $ 進行質因數分解，會將整數環的計算擴展到更抽象的代數體（Number Field）來進行解析。大致的流程如下：\n選擇多項式 ：尋找一個以 $ N $ 為根，且具有適當次數和係數的多項式 $ f(x) $。 收集資料（篩選） ：在有理數體及代數體上，尋找大量可以分解成小質數（平滑數，Smooth numbers）的數字對。這個過程被稱為「篩選」，也是最耗時的部分。 矩陣生成與簡約 ：根據收集到的關係式生成巨大的稀疏矩陣（大部分元素為0的矩陣），並使用線性代數的手法（如區塊Lanczos法等）來求出解。 計算平方根 ：最後在代數體上計算平方根，推導出 $ N $ 的因數（質因數）。 GNFS的計算量非漸近地被評估為 $ O(\\exp((\\sqrt[3]{\\frac{64}{9}} + o(1)) (\\log N)^{\\frac{1}{3}} (\\log \\log N)^{\\frac{2}{3}})) $。這被稱為「次指數時間（Sub-exponential）」的計算量。雖然比指數時間快，但比多項式時間（Polynomial time）要慢得多。\n實際上，2020年有一個國際研究團隊使用GNFS成功將RSA-250（829位元，250位數的合成數）進行了質因數分解。這項計算動用了全世界的運算資源，耗費了約2700 CPU核心年的龐大計算時間。然而，如果是2048位元，所需的計算量據說會膨脹到宇宙壽命的數兆倍，無論讓現在的超級電腦如何平行運作，都無法在現實時間內用傳統手法破解。\n量子電腦的王牌：Shor演算法 這時候登場的，是1994年由Peter Shor發表的「Shor演算法」。這個演算法劃時代地證明了質因數分解問題可以在量子電腦上以 多項式時間 （ $ O((\\log N)^3) $ ）被解開。次指數時間和多項式時間的差距是決定性的，這意味著在理論上，只要使用量子電腦，RSA加密就會被徹底破壞。\nShor演算法的整體流程 1 2 3 4 5 6 7 8 9 10 graph TD A[輸入想進行質因數分解的數字 N] --\u0026gt; B[選擇一個隨機整數 a] B --\u0026gt; C{a 與 N 的\u0026lt;br\u0026gt;最大公因數} C --\u0026gt;|大於1| D[很幸運地發現了質因數！] C --\u0026gt;|1 互質| E[量子電腦登場] E --\u0026gt; F[利用量子傅立葉變換求出函數 f_x = a^x mod N 的\u0026lt;br\u0026gt;週期 r] F --\u0026gt; G{週期 r 為偶數 且\u0026lt;br\u0026gt;a^r/2 ≢ -1 mod N} G --\u0026gt;|Yes| H[計算最大公因數 gcd_a^r/2 ± 1, N] H --\u0026gt; I((成功進行質因數分解！)) G --\u0026gt;|No| B Shor演算法並非直接解開質因數分解的問題，而是運用數論定理將其轉換為另一個問題——「尋找週期問題（Period Finding Problem）」，並利用量子電腦的特性來高速解開它。\n步驟1：從質因數分解轉換為尋找週期問題（傳統處理） 演算法的第一個步驟在傳統電腦上進行。 針對想要進行質因數分解的數字 $ N $，選擇一個與 $ N $ 互質（最大公因數為1）的隨機整數 $ a $（ $ 1 \u003c a \u003c N $ ）。如果剛好最大公因數不是1，那麼當時發現的公因數就是 $ N $ 的質因數，破解也就完成了，但這個機率極低。\n接著，我們考慮以下的同餘方程式列： $ f(x) = a^x \\pmod N $\n若將 $ x = 1, 2, 3, \\dots $ 代入這個函數 $ f(x) $ 中，數值看起來似乎是隨機的，但因為是在有限範圍內計算，所以必定會在某個地方回到原來的值，重複同樣的數列。我們將這個重複的週期稱為 $ r $。也就是說， 要找到符合 $ a^r \\equiv 1 \\pmod N $ 的最小正整數 $ r $ 的問題，這就是「尋找週期問題」。\n如果能找到這個週期 $ r $，且 $ r $ 為偶數，則 $ a^r - 1 \\equiv 0 \\pmod N $，利用因式分解的公式可以變形成為 $ (a^{r/2} - 1)(a^{r/2} + 1) \\equiv 0 \\pmod N $。 從這裡，利用歐幾里得演算法計算 $ N $ 和 $ a^{r/2} \\pm 1 $ 的最大公因數，就有極高的機率能得到 $ N $ 的質因數。\n為了用傳統電腦找到週期 $ r $，說到底還是需要指數級的步驟，無法加速。但是，量子電腦卻能在一瞬間（以多項式時間）找到這個週期 $ r $。\n步驟2：準備量子狀態並使其疊加 從這裡開始就是量子電腦發揮作用的地方了。 量子電腦使用的是能同時擁有「0」和「1」狀態的「量子位元（Qubit）」。在Shor演算法中，我們準備了兩個暫存器：一個用來儲存輸入（第一暫存器），另一個用來儲存計算結果（第二暫存器）。\n首先，我們將被稱為阿達瑪閘（Hadamard gate）的量子閘操作應用到第一暫存器的所有量子位元上。藉此，第一暫存器會處於所有可能的 $ x $ 值（從 $ 0 $ 到 $ 2^n-1 $。$ n $ 是一個夠大的位元數）的 均勻疊加狀態 。\n換句話說，在量子電腦的內部，創造出了一個同時並存著 $ x=0, 1, 2, 3, \\dots $ 等無數輸入值的狀態。\n步驟3：量子模冪運算（Quantum Modular Exponentiation） 接著，以第一暫存器的疊加狀態為輸入，計算 $ f(x) = a^x \\pmod N $，並將結果儲存到第二暫存器中。 由於這項計算是作為量子電路上的么正變換（Unitary transformation）來執行的，所以在保持疊加的狀態下，會「同時平行地（量子平行性）」進行對所有 $ x $ 的 $ f(x) $ 計算。\n此時，整個量子系統的空間處於 $ |x, a^x \\bmod N\\rangle $ 這種狀態的龐大疊加。\n然而，如果在這裡單純地去測量（觀測）第二暫存器，就會隨機且機率性地選出一個 $ a^x \\bmod N $ 的值，第一暫存器的 $ x $ 也會連帶地確定為單一一個值。這樣一來，就和用傳統電腦計算一次沒什麼兩樣，無法找到週期 $ r $。\n在量子力學的規則下，我們無法直接窺視疊加狀態的內容。那麼，我們該如何萃取出整體的「週期」這項全域資訊呢？\n步驟4：量子傅立葉變換（QFT: Quantum Fourier Transform） 突破這道難關，正是Shor演算法的精髓所在，也就是對第一暫存器應用 量子傅立葉變換（QFT） 。\n在進行測量之前，我們先分析函數 $ f(x) $ 的波動性質。假設我們觀測了第二暫存器，並得到某個值 $ y $。於是，第一暫存器的狀態會坍縮為「能讓 $ a^x \\pmod N = y $ 成立的所有 $ x $ 的疊加」。 這個 $ x $ 的值會呈現 $ x_0, x_0 + r, x_0 + 2r, x_0 + 3r, \\dots $ 這種以週期 $ r $ 為間隔離散排列的狀態（一種梳狀的機率振幅分佈）。\n我們對這個狀態應用量子傅立葉變換（QFT）。就像傳統的離散傅立葉變換將時間域的訊號轉換到頻率域一樣，QFT會讓量子狀態的機率振幅產生干涉。\n套用QFT後，藉由量子干涉效應，不與週期 $ r $ 產生共鳴（相位不一致）的錯誤答案，其機率會互相抵消而趨近於零（破壞性干涉），只有帶有週期 $ r $ 資訊的正確答案，其機率會被放大（建設性干涉）。\n步驟5：測量與連分數展開（傳統後處理） 應用QFT後，若是測量第一暫存器，會有極高的機率得到一個接近 $ c \\approx \\frac{j \\cdot 2^n}{r} $ 形式的整數 $ c $（ $ j $ 為未知整數，$ 2^n $ 為暫存器的大小）。\n將這個測量結果 $ c $ 送回傳統電腦，製造出 $ \\frac{c}{2^n} \\approx \\frac{j}{r} $ 這個分數。然後，利用被稱為「連分數展開（Continued fraction expansion）」的數學方法來計算近似值，就能漂亮地找出作為分母的週期 $ r $。\n只要知道了 $ r $，接下來就能利用步驟1的公式計算出 $ N $ 的質因數，RSA加密也就被完全破解了。\n現今量子電腦（NISQ）的實力與課題 雖然在理論上是完美的Shor演算法，但如果被問到「明天RSA加密就會被破解嗎？」，答案明確是「不會」。其原因在於目前量子電腦硬體技術的限制。\nNISQ（Noisy Intermediate-Scale Quantum）時代 我們現在所處的是被稱為「NISQ」的時代。NISQ設備雖然擁有數十到數百個實體量子位元，但對雜訊卻極為脆弱。\n量子位元很容易受到熱或電磁波等外部環境的影響，導致量子狀態被破壞的「去相干（decoherence，失去量子糾纏）」或是操作量子閘時的「閘錯誤」頻繁發生。如果試圖執行像Shor演算法這樣非常深（運算步驟數極度龐大）的量子電路，錯誤就會在計算過程中不斷累積，最終的輸出結果將變成毫無意義的純雜訊。\n實體量子位元與邏輯量子位元 為了解決這個錯誤問題，不可或缺的就是「量子錯誤更正（Quantum Error Correction）」。 雖然傳統電腦也有使用錯誤更正碼，但因為有禁止複製量子狀態的「量子不可複製定理」，使得量子錯誤更正變得非常複雜。\n在量子錯誤更正中，會使用「表面碼（Surface Code）」等技術，將許多充滿雜訊的「實體量子位元」組合起來，創造出一個沒有錯誤的完美「邏輯量子位元」。\n以目前的錯誤率為前提，據估算要製造出1個邏輯量子位元，大約需要1,000到10,000個實體量子位元。這被稱為「錯誤更正的經常性負擔（overhead）」。\n破壞RSA-2048需要多少資源？ 那麼，為了解碼RSA-2048而實際去跑Shor演算法，究竟需要多少資源呢？\n根據Craig Gidney（Google）和Martin Ekerå在2021年發表的論文中劃時代的資源估算，若使用最佳化過的Shor演算法並利用表面碼進行錯誤更正，將需要以下資源：\n邏輯量子位元數 ：約 4,096 個 實體量子位元數 ： 約 2000萬個 （假設錯誤率在 $10^{-3}$ 左右） 計算時間 ：約 8小時（需要數百萬到數十億次的實體閘操作） 相對應地，目前量子硬體的發展階段又是如何呢？ IBM在2023年底發表的超導量子處理器「Condor」為 1,121 個量子位元。此外，雖然也有關於生成邏輯量子位元的突破性研究發表（例如哈佛大學和QuEra公司等利用中性原子量子電腦成功生成了48個邏輯量子位元），但目前仍未達到能長時間連續執行「無雜訊完美運算」的階段。\n從數千個實體量子位元擴展到 2000萬個 實用的實體量子位元（並且必須相互連接、在極低溫下穩定運作、還能以超高速處理控制訊號的系統），在工程上存在著難以跨越的障礙（配線問題、冷卻能力的極限、控制電子設備的肥大化）。許多專家預測，要實現能破解RSA-2048的「容錯量子電腦（FTQC）」，至少還需要10年到30年，甚至更長的時間。\n悄悄逼近的「Store Now, Decrypt Later」威脅與PQC的黎明 如果認為「還要等10年以上，所以可以放心」，那就太早下定論了。目前存在著許多必須確保未來數十年機密性的資料，例如國家機密資訊、醫療資料以及長期的基礎設施設計等。\n這裡令人擔憂的是被稱為 「Store Now, Decrypt Later（現在儲存，稍後解碼）」 的攻擊手法。充滿惡意的國家或組織會攔截目前用RSA或ECC（橢圓曲線密碼學）加密的所有通訊資料，並儲存到硬碟裡。然後在10年、20年後，當強大的量子電腦完成的瞬間，利用Shor演算法解開過去所有的資料並將機密曝光。\n為了對抗這種時間差帶來的威脅，以NIST（美國國家標準暨技術研究院）為中心，正急起直追地推動 「後量子密碼學（PQC: Post-Quantum Cryptography）」 的標準化流程。\nPQC是一種基於即使用量子電腦也難以解開（也就是無法應用Shor演算法）的數學問題所建立的新型加密演算法。主要的方法有以下幾種：\n晶格密碼學（Lattice-based cryptography） ：以LWE（Learning with Errors）問題等為基礎。在NIST的標準化中為主流（Kyber、Dilithium等）。 編碼型密碼學（Code-based cryptography） ：取決於解碼錯誤更正碼問題的困難度。 多變量多項式密碼學（Multivariate cryptography） ：取決於解開多變數聯立二次方程式的困難度。 雜湊型數位簽章（Hash-based signatures） ：僅依賴於雜湊函數安全性的數位簽章。 目前，包括Google Chrome和Apple的iMessage等主要軟體和平台，都已經開始進行PQC的導入測試和混合實作了。\n結語 量子電腦正從科幻世界的夢想，轉變為現實工程上的挑戰。Shor演算法是數學與量子力學融合的人類偉大智慧結晶，但同時也蘊含著動搖我們數位社會基礎的「破壞性力量」。\nRSA加密並不會明天馬上就無法使用。然而，考量到量子技術的進化以及「Store Now, Decrypt Later」的風險，轉向PQC這場將在密碼史留下紀錄的大規模轉移，已經悄悄開始了。我們現在正目睹資訊安全典範轉移的最前線。\n","date":"2026-09-05T22:09:21+09:00","image":"http://kenji.blog/p/shors-algorithm-and-rsa-breaking/quantum_breaking_rsa_1788613722990_huf997c6e55368509d0617b56f68899854_1017504_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/zh-tw/p/shors-algorithm-and-rsa-breaking/","title":"量子電腦真的會破壞RSA加密嗎？〜Shor演算法與目前的發展階段〜"},{"content":"【完全解剖】最強密碼破解演算法「GNFS」C++實作與理解 支撐現代網際網路基礎的「RSA密碼學」，其堅固性仰賴於一個數學信念：「在目前的電腦技術下，要對巨大的合成數進行質因數分解實際上是不可能的」。\n然而，人類從未放棄。目前在古典電腦（非量子電腦的一般電腦）上，存在著用於進行巨大質因數分解的 人類最強、最尖端的演算法 。那就是 「普通數體篩法（GNFS：General Number Field Sieve）」 。\n在本篇文章中，我們將完全公開這個 GNFS 最尖端計算邏輯的 C++ 實作程式碼（使用 Boost 函式庫的多精度整數 boost::multiprecision 進行嚴格建模），並徹底解說其背後「代數整數論」的深淵。\n請務必與原始碼一起，盡情品味數學的神秘以及用電腦科學暴力屈服它的力量。\n1. GNFS 最尖端邏輯・框架（完整原始碼） 首先，列出本次解說的 GNFS C++ 實作全貌。實際的數體篩法（如 CADO-NFS 等）是高達數十萬行程式碼的超巨大分散式系統，但本程式碼提取了構成 GNFS 的 「5個必須的管線（階段）」 進行類別設計，並在不失去數學意義的前提下，以最小配置進行了建模。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 #include \u0026lt;iostream\u0026gt; #include \u0026lt;vector\u0026gt; #include \u0026lt;cmath\u0026gt; #include \u0026lt;map\u0026gt; #include \u0026lt;set\u0026gt; #include \u0026lt;chrono\u0026gt; #include \u0026lt;boost/multiprecision/cpp_int.hpp\u0026gt; // 使用 Boost.Multiprecision 的多精度整數 using namespace boost::multiprecision; // ============================================================================ // [SOTA GNFS] General Number Field Sieve (普通數體篩法) 最尖端邏輯框架 // // 本程式碼將 CADO-NFS 等所使用的最尖端 GNFS 的 5 個管線 // 嚴格建模為 C++ (Boost) 的類別設計。 // ============================================================================ struct Relation { int64_t a; int64_t b; std::vector\u0026lt;uint32_t\u0026gt; rational_primes; std::vector\u0026lt;uint32_t\u0026gt; algebraic_primes; }; // ============================================================================ // Phase 1: Polynomial Selection (KleinJung 演算法) // ============================================================================ class PolynomialSelector { public: int degree; std::vector\u0026lt;cpp_int\u0026gt; f; // 代數側多項式 f(x) std::vector\u0026lt;cpp_int\u0026gt; g; // 有理側多項式 g(x) = x - m cpp_int m; PolynomialSelector(int d) : degree(d) {} // 基於 base-m 展開產生初始多項式 (實際上會使用更高階的晶格基底歸約 LLL) void select(const cpp_int\u0026amp; N) { std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 1] Polynomial Selection (Degree \u0026#34; \u0026lt;\u0026lt; degree \u0026lt;\u0026lt; \u0026#34;) starting...\u0026#34; \u0026lt;\u0026lt; std::endl; // 簡易的 base-m 展開 (d次) // m = N^(1/d) cpp_int N_copy = N; m = 1; // 簡易的 m 近似值計算 (不使用 Boost 函式的近似) cpp_int low = 1, high = N; while (low \u0026lt;= high) { cpp_int mid = low + (high - low) / 2; cpp_int p = 1; for(int i=0; i\u0026lt;degree; ++i) p *= mid; if (p \u0026lt;= N) { m = mid; low = mid + 1; } else { high = mid - 1; } } f.resize(degree + 1); cpp_int temp = N; for (int i = 0; i \u0026lt;= degree; ++i) { f[i] = temp % m; temp /= m; } g = {-m, 1}; // g(x) = x - m std::cout \u0026lt;\u0026lt; \u0026#34; -\u0026gt; m = \u0026#34; \u0026lt;\u0026lt; m \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34; -\u0026gt; f(x) = \u0026#34;; for(int i = degree; i \u0026gt;= 0; --i) { std::cout \u0026lt;\u0026lt; f[i] \u0026lt;\u0026lt; \u0026#34;x^\u0026#34; \u0026lt;\u0026lt; i \u0026lt;\u0026lt; (i \u0026gt; 0 ? \u0026#34; + \u0026#34; : \u0026#34;\u0026#34;); } std::cout \u0026lt;\u0026lt; \u0026#34;\\n[Phase 1] Complete.\u0026#34; \u0026lt;\u0026lt; std::endl; } }; // ============================================================================ // Phase 2: Lattice Sieving (晶格篩法) // ============================================================================ // 近年的 GNFS 已不再使用 Line Sieve (直線篩法)，而是以 Franke-Kleinjung 等人的 // 特殊 q 晶格篩法 (Special-q Lattice Sieving) 為業界標準。 class LatticeSieve { uint32_t rational_bound; uint32_t algebraic_bound; std::vector\u0026lt;uint32_t\u0026gt; rational_fb; std::vector\u0026lt;uint32_t\u0026gt; algebraic_fb; public: LatticeSieve(uint32_t rb, uint32_t ab) : rational_bound(rb), algebraic_bound(ab) {} void generate_factor_bases() { std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 2] Generating Factor Bases (Rational Bound: \u0026#34; \u0026lt;\u0026lt; rational_bound \u0026lt;\u0026lt; \u0026#34;, Algebraic Bound: \u0026#34; \u0026lt;\u0026lt; algebraic_bound \u0026lt;\u0026lt; \u0026#34;)\u0026#34; \u0026lt;\u0026lt; std::endl; // (省略) 實際上會進行質數生成與勒讓德符號等的篩選 } std::vector\u0026lt;Relation\u0026gt; sieve(const PolynomialSelector\u0026amp; poly) { std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 2] Special-q Lattice Sieving active...\u0026#34; \u0026lt;\u0026lt; std::endl; std::vector\u0026lt;Relation\u0026gt; relations; // 模擬實作：實際的晶格篩法會以區塊為單位掃描數百 GB 的記憶體空間 // 將 (a, b) 的數對映射到每個特殊質數 q 的晶格 (a = i*q + j*...) 上， // 執行將快取效率提升到極限的篩法 (Sieve)。 // 為了展示，加入一個虛擬的 Relation (關係) Relation r; r.a = 17; r.b = 3; r.rational_primes = {2, 5}; r.algebraic_primes = {3, 7}; relations.push_back(r); std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 2] Found \u0026#34; \u0026lt;\u0026lt; relations.size() \u0026lt;\u0026lt; \u0026#34; relations.\u0026#34; \u0026lt;\u0026lt; std::endl; return relations; } }; // ============================================================================ // Phase 3: Filtering (奇異點清除與派系合併) // ============================================================================ class Filter { public: void reduce_matrix(std::vector\u0026lt;Relation\u0026gt;\u0026amp; relations) { std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 3] Filtering Relations...\u0026#34; \u0026lt;\u0026lt; std::endl; // 1. Singleton removal (刪除只出現過一次的質數的 Relation) // 2. Clique merging (為使稀疏矩陣變密集而合併 Relation) // 實際上會使用 Union-Find 等演算法，將數億行的矩陣壓縮到數百萬行。 std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 3] Matrix size reduced optimally.\u0026#34; \u0026lt;\u0026lt; std::endl; } }; // ============================================================================ // Phase 4: Linear Algebra over GF(2) (Block Wiedemann 法) // ============================================================================ class LinearAlgebraGF2 { public: // 在近年的超級電腦環境中，相較於 Block Lanczos 法，更適合分散式運算的 // Block Wiedemann 法 (Coppersmith 實作) 被作為最尖端技術使用。 std::vector\u0026lt;std::vector\u0026lt;int\u0026gt;\u0026gt; solve_nullspace(const std::vector\u0026lt;Relation\u0026gt;\u0026amp; relations) { std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 4] Block Wiedemann algorithm over GF(2) starting...\u0026#34; \u0026lt;\u0026lt; std::endl; // 反覆進行稀疏矩陣 (Sparse Matrix) 與向量的乘法運算， // 找到多個滿足 M * x = 0 mod 2 的解向量 (核, Kernel)。 std::vector\u0026lt;std::vector\u0026lt;int\u0026gt;\u0026gt; dependencies; // 依賴關係列表 // 虛擬資料 dependencies.push_back({0}); std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 4] Found \u0026#34; \u0026lt;\u0026lt; dependencies.size() \u0026lt;\u0026lt; \u0026#34; linear dependencies (perfect squares).\u0026#34; \u0026lt;\u0026lt; std::endl; return dependencies; } }; // ============================================================================ // Phase 5: Algebraic Square Root (代數平方根) // ============================================================================ class AlgebraicSquareRoot { public: void compute_and_factor(const std::vector\u0026lt;Relation\u0026gt;\u0026amp; relations, const std::vector\u0026lt;int\u0026gt;\u0026amp; dep, const cpp_int\u0026amp; N) { std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 5] Algebraic Square Root computation...\u0026#34; \u0026lt;\u0026lt; std::endl; // 1. 有理側的平方根 V 的計算 (單純的整數運算) cpp_int V = 1; // V = sqrt( prod(a - bm) ) mod N // 2. 代數側的平方根 gamma 的計算 (Montgomery\u0026#39;s method 等) // 求出巨大代數體 O_K 的元素 gamma，並透過同態映射 phi 映射到現實世界中 // Y = phi(gamma) mod N cpp_int Y = 1; // 為迴避理想類群 (Ideal Class Group) 與單位群 (Unit Group) 的障礙 (Obstruction)， // 假設在 Phase 2 與 4 中已經加入了二次剩餘特徵 (Quadratic Characters) 序列。 std::cout \u0026lt;\u0026lt; \u0026#34; -\u0026gt; Homomorphism map phi applied.\u0026#34; \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 5] Calculating GCD(V - Y, N)...\u0026#34; \u0026lt;\u0026lt; std::endl; cpp_int factor = gcd(V - Y, N); // GCD(X-Y, N) if (factor \u0026gt; 1 \u0026amp;\u0026amp; factor \u0026lt; N) { std::cout \u0026lt;\u0026lt; \u0026#34;\\n================================================================\u0026#34; \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34;[SUCCESS] Non-trivial factor found: \u0026#34; \u0026lt;\u0026lt; factor \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34; Other factor: \u0026#34; \u0026lt;\u0026lt; N / factor \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34;================================================================\u0026#34; \u0026lt;\u0026lt; std::endl; } else { std::cout \u0026lt;\u0026lt; \u0026#34;[FAILURE] Trivial solution. Trying next dependency...\u0026#34; \u0026lt;\u0026lt; std::endl; } } }; // ============================================================================ // Main Execution Pipeline // ============================================================================ int main() { std::cout \u0026lt;\u0026lt; \u0026#34;================================================================\u0026#34; \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34; [SOTA GNFS] General Number Field Sieve Engine (Boost C++) \u0026#34; \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34;================================================================\u0026#34; \u0026lt;\u0026lt; std::endl; // RSA-270 等，想要質因數分解的巨大合成數 N cpp_int N(\u0026#34;233108530344407544527637656910680524145619812480305449042948611968495918245135782867888369318577116418213919268572658314913060672626911354027609793166341626693946596196427744273886601876896313468704059066746903123910748277606548649151920812699309766587514735456594993207\u0026#34;); // 多項式的次數 (超過 130 位數時通常選擇 5 次至 6 次) int degree = 6; // 管線初始化 PolynomialSelector poly_select(degree); LatticeSieve sieve(10000000, 20000000); // 實際的邊界是數千萬至數億 Filter filter; LinearAlgebraGF2 linalg; AlgebraicSquareRoot sqrt_step; auto start_time = std::chrono::high_resolution_clock::now(); // 1. 多項式選擇 poly_select.select(N); // 2. 篩法 (Sieve) 處理 sieve.generate_factor_bases(); std::vector\u0026lt;Relation\u0026gt; relations = sieve.sieve(poly_select); // 3. 過濾 (矩陣壓縮) filter.reduce_matrix(relations); // 4. 線性代數 (GF(2) 上的零空間搜尋) std::vector\u0026lt;std::vector\u0026lt;int\u0026gt;\u0026gt; dependencies = linalg.solve_nullspace(relations); // 5. 代數平方根的計算與 GCD for (const auto\u0026amp; dep : dependencies) { sqrt_step.compute_and_factor(relations, dep, N); } auto end_time = std::chrono::high_resolution_clock::now(); std::chrono::duration\u0026lt;double\u0026gt; elapsed = end_time - start_time; std::cout \u0026lt;\u0026lt; \u0026#34;\\n[System] SOTA GNFS Pipeline completed in \u0026#34; \u0026lt;\u0026lt; elapsed.count() \u0026lt;\u0026lt; \u0026#34; seconds.\u0026#34; \u0026lt;\u0026lt; std::endl; return 0; } 那麼，這段程式碼究竟是如何突破密碼學的高牆呢？我們將按 5 個階段，將其縝密的演算法與高等數學咀嚼並解說。\n2. GNFS 的最終目的： $X^2 \\equiv Y^2 \\pmod N$ 不僅是 GNFS，現代巨大質因數分解演算法的目標，大多都是要找到滿足以下同餘式的非平凡數對 $(X, Y)$。\n$$X^2 \\equiv Y^2 \\pmod N$$ 這個式子代表「$X^2$ 與 $Y^2$ 除以 $N$ 的餘數相等」。將其變形後可得： $X^2 - Y^2 \\equiv 0 \\pmod N$ 也就是說，$(X-Y)(X+Y)$ 是 $N$ 的倍數。\n如果 $X \\not\\equiv \\pm Y \\pmod N$（非平凡解），那麼在 $(X-Y)$ 與 $N$ 之間，就會存在「大於 1 且小於 $N$ 的公因數」。 此時，只要使用歐幾里得輾轉相除法計算 $\\gcd(X-Y, N)$ ，就能輕易求出 $N$ 的質因數。\n然而，要找到這個 $X$ 與 $Y$ 猶如大海撈針。因此 GNFS 採取了天才般的策略：創造出「現實整數的世界」與「多項式代數體的世界」這 兩個世界 ，並將計算分散。\n3. Phase 1: 多項式選擇（Polynomial Selection） 1 2 3 4 5 6 7 8 9 10 11 12 class PolynomialSelector { // ... void select(const cpp_int\u0026amp; N) { // m = N^(1/d) 的計算與 base-m 展開 // ... for (int i = 0; i \u0026lt;= degree; ++i) { f[i] = temp % m; temp /= m; } g = {-m, 1}; // g(x) = x - m } }; GNFS 的第一步，是建立用來橋接這兩個世界的「魔法多項式」。 對於巨大的數字 $N$，我們選擇一個整數 $m$。通常會選擇讓 $m \\approx N^{1/d}$ （在程式碼中假設為 $d=6$ 次的多項式）。\n接著，將 $N$ 進行 $m$ 進位展開，並使用其係數來建構多項式 $f(x)$。 $$N = c_d m^d + c_{d-1} m^{d-1} + \\dots + c_1 m + c_0$$ $$f(x) = c_d x^d + c_{d-1} x^{d-1} + \\dots + c_1 x + c_0$$ 這個多項式 $f(x)$ 有一個極為重要的性質： 「當變數 $x$ 代入 $m$ 時，剛好會等於 $N$（$f(m) = N$）」 。換句話說，$f(m) \\equiv 0 \\pmod N$。 有理側的多項式則定義為 $g(x) = x - m$。\n藉此，由 $f(x)=0$ 的根 $\\alpha$ 所支配的 「代數體的世界 $\\mathbb{Z}[\\alpha]$」 ，與一般的 「有理數（整數）的世界 $\\mathbb{Z}$」 ，將透過 $x \\to m$ 這個「環同態映射（Homomorphism）」被緊密地連結起來。\n在最尖端的 CADO-NFS 等實作中，會使用 KleinJung 演算法或 LLL 晶格基底歸約演算法，花費數個月的時間來尋找「極致完美的多項式 $f(x)$」，使其係數不會過大，且在後續步驟中更容易出現質數（更容易變得平滑）。\n4. Phase 2: 特殊 $q$ 晶格篩法（Special-q Lattice Sieving） 1 2 3 4 5 6 7 8 9 class LatticeSieve { // ... std::vector\u0026lt;Relation\u0026gt; sieve(const PolynomialSelector\u0026amp; poly) { // ... // 將 (a, b) 的數對映射到每個特殊質數 q 的晶格上， // 執行將快取效率提升到極限的篩法 (Sieve)。 // ... } }; 準備好兩個世界後，接下來進入在兩個世界中尋找「平滑數（僅由小質數構成的數）」的步驟。 產生無數個整數對 $(a, b)$，並計算以下兩個值：\n有理側的值 ： $a - bm$ 代數側的範數 (Norm) ： $b^d f(a/b)$ GNFS 的目標是收集數千萬至數億個 「有理側與代數側的值，兩者都能完全被小質因數分解的數對（Relation：關係）」 。\n早期的 GNFS 使用「直線篩法（Line Sieve）」，將 $(a, b)$ 排列在 $xy$ 平面上，從頭開始依序用質數去除。但這種方法會造成記憶體到處存取而頻繁發生快取未命中（Cache Miss），這是一個非常慢的弱點。\n因此，現在最尖端的程式碼中使用了 「特殊 $q$ 晶格篩法（Special-q Lattice Sieve）」 。 固定一個適度大的質數 $q$，只將「代數側的值必定能被 $q$ 整除的 $(a, b)$ 數對」作為計算對象。滿足此條件的 $(a, b)$ 會在平面上形成「晶格（Lattice）」，因此計算的位址跳躍幅度會固定，完美契合 CPU 的 L1/L2 快取。 導入這個晶格篩法後，GNFS 的計算速度獲得了戲劇性的提升。\n5. Phase 3: 過濾（Filtering） 1 2 3 4 5 6 7 class Filter { public: void reduce_matrix(std::vector\u0026lt;Relation\u0026gt;\u0026amp; relations) { // 1. Singleton removal (刪除只出現過一次的質數的 Relation) // 2. Clique merging (為使稀疏矩陣變密集而合併 Relation) } }; 在 Phase 2 中，全世界的電腦花費數個月收集了數億個 Relation。然而，如果直接將這些資料丟進下一個「解聯立方程式的步驟（矩陣計算）」中，超級電腦的記憶體也會被撐爆。\n因此，會進行被稱為 Filtering（過濾） 的矩陣超壓縮過程。\nSingleton removal（奇異點清除） 假設某個巨大的質數 $p$，在數億個 Relation 中「只出現了一次」。我們的目標是「讓所有質數的指數都變成偶數（2 的倍數）」，所以只出現一次的質數絕對不可能變成偶數。 因此，包含該質數的 Relation 會立即被視為「無用的垃圾」而刪除（清除）。這個連鎖反應發生後，原本數億行的資料就會不斷被削減。\nClique merging（派系合併） 進一步地，將共享特定質數的 Relation 互相相乘（相加），在減少行數的同時，將稀疏（空洞）的矩陣壓縮成更密集的狀態（使用類似圖論中派系搜尋的手法）。\n透過這個最佳化，巨大的稀疏矩陣將被戲劇性地壓縮至可計算的大小。\n6. Phase 4: GF(2) 上的線性代數（Block Wiedemann 法） 1 2 3 4 5 6 7 class LinearAlgebraGF2 { public: std::vector\u0026lt;std::vector\u0026lt;int\u0026gt;\u0026gt; solve_nullspace(const std::vector\u0026lt;Relation\u0026gt;\u0026amp; relations) { // 反覆進行稀疏矩陣 (Sparse Matrix) 與向量的乘法運算， // 找到多個滿足 M * x = 0 mod 2 的解向量 (核, Kernel)。 } }; 終於來到了謎題的核心。 將收集到的 Relation 相乘，尋找 「所有質因數的指數都變成偶數的組合」 。\n這在數學上，等同於使用一個以各質數指數的「偶數・奇數（亦即 0 或 1）」為元素的巨大矩陣 $M$，以及一個表示要使用哪些 Relation 的向量 $x$，來求解滿足 $M \\cdot x \\equiv 0 \\pmod 2$ 的解向量 $x$ （零空間・核，Nullspace / Kernel）。\n這需要解開數百萬行 × 數百萬列這種龐大尺寸矩陣的聯立方程式。若使用一般的基斯消去法（高斯消去法），計算複雜度將達到 $O(N^3)$，就算到宇宙毀滅也算不完。\n因此，最尖端的實作採用了 「Block Wiedemann（區塊・維德曼）法」 。 這是一種克雷洛夫子空間法（Krylov Subspace Method），利用矩陣 $M$ 「非常稀疏（幾乎都是 0）」的特性，反覆進行矩陣與向量的乘法來導出解。 與舊有的 Block Lanczos 法不同，Block Wiedemann 法可以將計算過程完全分割到多個叢集中，因此在現代的分散式雲端運算或超級電腦的平行計算中，能發揮壓倒性的威力。\n7. Phase 5: 代數平方根（Algebraic Square Root）與密碼崩潰 1 2 3 4 5 6 7 8 9 10 11 12 13 class AlgebraicSquareRoot { public: void compute_and_factor(...) { // 1. 有理側的平方根 V 的計算 cpp_int V = 1; // 2. 代數側的平方根 gamma 的計算 cpp_int Y = 1; // ... cpp_int factor = gcd(V - Y, N); // GCD(X-Y, N) } }; 透過 Phase 4 的矩陣計算，我們獲得了「相乘後所有質因數皆為偶數次方的 Relation 集合 $S$」。 藉此，我們可以在有理側與代數側這兩個世界中，各自建構出「平方（2 次方）」。\n有理側只是單純的整數乘法，所以計算平方根 $V$ 非常容易。 $$V^2 = \\prod_{S} (a - bm)$$ 然而，真正的地獄在「代數側」。 在代數體的世界 $\\mathbb{Z}[\\alpha]$ 中，質因數分解的唯一性並不成立，因此我們一直使用理想（Ideal）來進行計算。矩陣計算所保證的 只有「成為理想的平方」，並不能保證成為「元素的平方（$\\gamma^2$）」 。\n這裡會遇到被稱為「理想類群的障礙」與「單位群的障礙」，這是代數整數論中非常巨大的高牆。 GNFS 為了打破這面牆，使用了被稱為 「二次剩餘特徵（Quadratic Characters）」 的魔法。 在 Phase 4 的矩陣中，事先偷偷加入針對幾十個特殊質理想的二次剩餘（勒讓德符號）序列。這樣一來，找到的集合 $S$ 就有極大的機率能避開障礙，順利形成「真正元素的平方 $\\gamma^2$」。\n求取 $\\gamma$ 的工作（代數平方根），是使用 Montgomery 法等極其複雜的演算法來計算的。\n最終，將代數側的平方根 $\\gamma$，透過環同態映射 $\\phi$ 瞬移回現實世界（將 $x$ 代入 $m$），得到 $Y$。 將有理側的 $V$ 直接當作 $X$，我們夢寐以求的絕對等式終於完成了。\n$$X^2 \\equiv Y^2 \\pmod N$$\n剩下的就只有計算 $\\gcd(X-Y, N)$ 而已。0.001 秒的處理一閃而過，當非平凡的因數印在螢幕上的那一刻，號稱堅不可摧的 RSA 密碼便徹底崩潰。\n結語 GNFS 不僅僅是一種程式設計的技巧。 它是用超級電腦的分散式架構與快取最佳化等「極致的工程學」，去折服抽象代數學、環論、理想類群等「純數學深淵」的人類智慧結晶。\n我們不經意傳送的聊天訊息或信用卡資訊，就是建立在這種天文數字般的數學攻防之上受到保護的。\n希望透過這個 C++ 框架，能讓各位感受到最尖端密碼破解演算法背後的「數學與計算機的浪漫」。\n","date":"2026-09-05T13:04:59+09:00","image":"http://kenji.blog/p/gnfs-cpp-implementation/gnfs_cpp_blog_eyecatch_1788580949217_hu57b4110ce75cf76414fb819be22bae03_985705_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/zh-tw/p/gnfs-cpp-implementation/","title":"【完全解剖】最強密碼破解演算法「GNFS」C++實作與理解"},{"content":"一般數域篩法（GNFS）的真正數學結構 GNFS 的終極目標是找到 $X, Y$，使得 $X^2 \\equiv Y^2 \\pmod N$。 為了達成這個目標，數學家們在 「現實的整數世界」 與 「代數體世界」 之間架起了一座橋樑。那座橋樑正是「同態映射」。\n第一階段：連結世界的「同態映射（Homomorphism）」 1. 多項式的選定與根的定義 對於巨大的合成數 $N$，選擇某個整數 $m$ 與多項式 $f(x)$，使得 $f(m) \\equiv 0 \\pmod N$。 （例如：將 $N$ 進行 $m$ 進制展開，並從其係數構造 $f(x)$。此時假設 $f(x)$ 在有理數域 $\\mathbb{Q}$ 上是不可約的（無法再因式分解））。\n接著，將方程式 $f(x) = 0$ 的其中一個「複數根」設為 $\\alpha$。 理所當然，$f(\\alpha) = 0$。$\\alpha$ 不是整數，而是包含根號或虛數的複雜數（代數數）。\n2. 環（Ring）與同態映射的建構 在這裡，我們準備兩個數學上的「環（定義了加法與乘法的世界）」。\n世界A： $\\mathbb{Z}[\\alpha]$ （包含 $\\alpha$ 的代數整數環） 這是一個由 $a + b\\alpha + c\\alpha^2 + \\dots$ 這種形式構成的數字世界。 世界B： $\\mathbb{Z}/N\\mathbb{Z}$ （除以 $N$ 的餘數環） 這是一個僅由 $0$ 到 $N-1$ 的整數構成的同餘（Modulo）世界。 在這裡，我們定義一個從世界A到世界B的映射 $\\phi$。 $$\\phi : \\mathbb{Z}[\\alpha] \\to \\mathbb{Z}/N\\mathbb{Z}$$ $$\\phi(\\alpha) = m \\pmod N$$\n這個映射 $\\phi$ 是一個神奇的操作，能將世界A中的變數 $\\alpha$ 直接替換成世界B中的整數 $m$。 這個 $\\phi$ 具有極其強大的性質，稱為 「環同態映射（Ring Homomorphism）」 。 同態指的是 「在不破壞加法與乘法結構的情況下，傳送到另一個世界」 的性質。也就是說，以下方程式成立：\n$\\phi(X \\times Y) = \\phi(X) \\times \\phi(Y)$ $\\phi(X^2) = \\phi(X)^2$ 這意味著什麼呢？如果我們能在「世界A（$\\alpha$的世界）」中，創造出某個複雜元素 $\\gamma$ 的 「平方（$\\gamma^2$）」 ，那麼即使使用 $\\phi$ 將其傳送到「世界B（餘數世界）」， 它的平方形式 $\\phi(\\gamma)^2$ 依然會完美保留 。\n第二階段：質因數分解的崩壞與「理想（Ideal）」的誕生 我們希望在世界A（$\\mathbb{Z}[\\alpha]$）中，收集許多適當的元素 $(a - b\\alpha)$，並將它們相乘，創造出一個「完全平方（平方元）」。 通常，我們會將收集到的 $(a - b\\alpha)$ 分別進行「質因數分解」，並確保質數的指數全為偶數來組合（利用矩陣求解）以創造平方。\n然而，在這裡，代數學令人絕望的高牆擋住了去路。 在像 $\\mathbb{Z}[\\alpha]$ 這樣的代數體世界中，國中學到的 「質因數分解的唯一性（任何數字都能唯一地表示為質數相乘）」崩壞了 。\n（例如：在某個代數體的世界中，$6 = 2 \\times 3$，但同時 $6 = (1+\\sqrt{-5}) \\times (1-\\sqrt{-5})$，我們將無從得知哪個才是真正的質數）\n如果質因數分解不唯一，那麼「計算質數個數以湊成偶數個」的解謎（篩法）在原理上便無法執行。\n庫默爾與戴德金的救贖：「理想」 拯救這種崩壞的，是 19 世紀數學家創造的概念—— 「理想（Ideal：理想數）」 。 藉由不考慮元素本身，而是考慮該元素生成的「倍數集合（理想）」，再次使得質因數分解成為可能。\n在代數體的整數環 $\\mathcal{O}_K$（包含 $\\mathbb{Z}[\\alpha]$ 更完整的環）中，即使元素無法唯一質因數分解，已經證明了 「理想必定能唯一地質因數分解為『質理想（$\\mathfrak{p}$）』的乘積」 。\n因此在 GNFS 中，我們不是分解元素 $(a - b\\alpha)$ 本身，而是將其生成的 主理想 $\\langle a - b\\alpha \\rangle$ 進行質理想分解 。\n第三階段：範數（Norm）與兩種篩子（Sieve） 那麼，我們該如何知道理想 $\\langle a - b\\alpha \\rangle$ 會被分解成哪些質理想呢？ 這時我們使用一個稱為 「範數（Norm）」 的函數。範數是將代數體的複雜元素轉換為「現實世界普通整數 $\\mathbb{Z}$」的函數。\n元素 $(a - b\\alpha)$ 的範數，可透過簡單的多項式計算 $b^d f(a/b)$ 來求得（$d$ 為 $f(x)$ 的次數）。\n根據代數定理，我們知道： 「如果某個理想的範數可以完全分解為較小的質數（平滑），那麼原來的理想也可以完全分解為較小的質理想」 。\n因此，GNFS 針對大量的整數對 $(a, b)$，同時計算以下兩者，並只收集兩者皆成為「平滑數」的整數對。\n有理篩（Rational Sieve） ： $a - bm$ （現實世界的值） 代數篩（Algebraic Sieve） ： $b^d f(a/b)$ （代數體世界的範數） 收集數千萬個兩者皆平滑的整數對 $(a, b)$，將理想的質因數分解數據（包含幾個質理想）作為巨大的矩陣（在 GF(2) 上的線性代數）來求解，找到一個整數對的集合 $S$，使得「相乘後所有質理想的指數皆為偶數」。\n第四階段：阻擋在前的兩個「障礙」與理想類群 透過矩陣計算，我們知道將屬於集合 $S$ 的 $(a - b\\alpha)$ 的理想全部相乘，會變成某個理想 $I$ 的平方。 $$\\prod_{S} \\langle a - b\\alpha \\rangle = I^2$$ 然而，這還沒結束。GNFS 中最深奧、最困難的數學高牆就在這裡。\n我們最終想要的，不是「理想的平方」，而是為了代入映射 $\\phi$ 的 「元素的平方（$\\gamma^2$）」 。 變成理想的平方，並不代表元素本身也一定是平方。這裡存在著 兩個強烈的數學障礙（Obstruction） 。\n障礙①：理想類群（Ideal Class Group）的高牆 理想 $I$ 未必是「由單一元素生成的理想（主理想）」。 我們無法從非主理想的理想中，提取出具體的元素 $\\gamma$。\n這時登場的概念是 「理想類群（Class Group, $Cl_K$）」 。理想類群是用來衡量「該代數體世界中存在多少非主理想的理想（質因數分解的唯一性被破壞到什麼程度）」的群。 即使 $\\prod \\langle a - b\\alpha \\rangle$ 變成了 $I^2$，如果 $I$ 在理想類群中不是單位元素（主理想），就無法將其拉回為元素的平方。\n障礙②：單位群（Unit Group）的高牆 假設運氣好，$I$ 剛好是主理想 $\\langle \\gamma \\rangle$ 吧。 那麼，$\\prod \\langle a - b\\alpha \\rangle = \\langle \\gamma^2 \\rangle$。 你可能會想「太好了，元素也是平方了！」，但這可是大錯特錯。\n理想（倍數的集合）相等，並不代表元素完全相等。這兩者之間必定會產生 「單位（Unit：倒數也是整數的數字。如 1 或 -1 等）」 的偏差。 也就是說，實際的元素等式會變成這樣： $$\\prod_{S} (a - b\\alpha) = u \\cdot \\gamma^2$$ （$u$ 為單位群 $U_K$ 的元素）\n如果這個單位 $u$ 本身不是某個東西的平方（平方元），那麼左邊絕對無法成為「完美的元素平方」。\n第五階段：阿德曼的魔法「二次特徵（Quadratic Characters）」 理想類群的障礙與單位群的障礙。這兩個障礙該如何克服呢？ 這裡登場的是由密碼學家雷納德·阿德曼（RSA中的\u0026quot;A\u0026quot;）等人引入的天才手法—— 「二次特徵（Quadratic Characters）」 。\n為了判定「某個元素在代數體中是否為完全平方」，我們使用勒讓德符號（二次剩餘）的代數體版本。 在剛才那個巨大的矩陣（為了將質理想個數湊成偶數的解謎）中，我們 偷偷加上了幾十個額外條件（行），要求「對某些特殊質理想 $\\mathfrak{q}$ 的二次特徵也全都要是 $1$（偶數）」 。\n當我們透過矩陣計算找到連這些額外條件都滿足的集合 $S$ 時，根據代數數論的深奧定理，保證 「理想類群的障礙和單位群的障礙，將以壓倒性的機率自然消滅」 。\n於是，我們終於得到了真正的等式： $$\\prod_{S} (a - b\\alpha) = \\gamma^2$$ 最終階段：世界的融合與密碼崩壞 拼圖的最後一塊終於拼上了。\n【代數體世界（世界A）的元素】 $\\gamma^2 = \\prod (a - b\\alpha)$ （我們使用平方根演算法求出 $\\gamma$）\n【現實世界（有理數世界）的元素】 $V^2 = \\prod (a - bm)$ （因為這只是單純的整數相乘，可以正常求出平方根 $V$）\n好了，我們一開始建造的魔法橋樑， 同態映射 $\\phi$ 該上場了。 我們利用 $\\phi$（將 $\\alpha$ 代入為 $m$ 的映射），將世界A的元素 $\\gamma$ 傳送到世界B（除以 $N$ 的餘數世界）。 $$Y = \\phi(\\gamma) \\pmod N$$ 另一方面，我們將在現實世界中產生的 $V$，直接帶入餘數世界成為 $X$。 $$X = V \\pmod N$$ 由於同態映射「保留結構」的性質，在世界A中成立的平方關係，在世界B（模 $N$ 的世界）中也完美保留。 此外，由於原來的整數對 $(a, b)$ 是以 $a - b\\alpha$ 和 $a - bm$ 的形式對應生成的，這個 $X$ 和 $Y$ 在模 $N$ 的世界中將會碰撞，產生以下絕對的等式：\n$$X^2 \\equiv Y^2 \\pmod N$$\n剩下能做的，就是祈禱這對 $X$ 與 $Y$ 不是平凡解（$X \\equiv \\pm Y$），然後計算 $\\gcd(X - Y, N)$ 。\n如果是非平凡解，歐幾里得演算法會在 0.001 秒內跑完，將作為 RSA 密碼心臟的秘密質數 $p$ 和 $q$ 印在輸出畫面上。\n這就是集現代數學精華於一身的 「一般數域篩法（GNFS）」的完整樣貌 。\n","date":"2026-09-05T02:26:13+09:00","image":"http://kenji.blog/p/%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%AE%E7%9C%9F%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E6%A7%8B%E9%80%A0/rsa_encryption_break_1788542156523_hu57b4110ce75cf76414fb819be22bae03_1010164_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/zh-tw/p/%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%AE%E7%9C%9F%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E6%A7%8B%E9%80%A0/","title":"一般數域篩法（GNFS）的真正數學結構"},{"content":"什麼是打破網際網路加密的人類最強數學「一般數體篩法（GNFS）」？ 我們每天使用的網際網路。LINE 訊息、YouTube、Amazon 購物等，所有的通訊都受到「加密」保護。 目前世界上最廣泛使用的加密技術代表是「RSA 加密」。\nRSA 加密防禦的核心非常簡單。它利用了 ** 「即使是電腦也無法解開巨大數字的質因數分解」 ** 這個數學特性。 例如，「15」我們馬上就知道是「3 × 5」，但一旦變成「270 位數的數字」，即使集結全世界的超級電腦，也需要耗費數億年才能解開。\n然而，數學家們並沒有閒著。為了打破這道堅不可摧的密碼防線，人類創造了一種宛如魔法般的演算法（計算步驟），稱為 ** 「一般數體篩法（GNFS：General Number Field Sieve）」 ** 。\n在這篇文章中，我們完全不使用專業術語，僅使用 ** 國中學到的數學（質因數分解、代數式、最大公因數） ** 知識，一步步徹底解說這個「人類最強演算法」破解密碼的原理！\n第 1 章：破解密碼的目標是「國三的公式」 面對巨大質因數分解的最大必殺技。這就是在國三學到的這個公式。\n** $X^2 - Y^2 = (X + Y)(X - Y)$ **\n你可能會想：「咦，這麼基礎的公式就能破解密碼嗎？」。然而，這正是解開一切的萬能鑰匙。\n破解密碼的最終目標，對於一個巨大的數字 $N$，就是找到 ** 「將 $X^2$ 和 $Y^2$ 除以 $N$ 後，餘數會相同的數字（$X$ 和 $Y$）」 ** 。\n為什麼「餘數相同」就能破解密碼？ 假設有兩個數字 $X^2$ 和 $Y^2$，它們「除以 $N$ 的餘數相同」。 餘數相同代表著，相減後的 ** 「$X^2 - Y^2$」必定能被 $N$ 整除（成為 $N$ 的倍數） ** ，這是一個法則。\n在這裡，我們假設用於加密的巨大數字 $N$ 是由兩個秘密質數（$p$ 和 $q$）相乘而成的（$N = p \\times q$）。\n將 $X^2 - Y^2$ 因式分解後會變成 ** $(X - Y)(X + Y)$ ** 。 這成為 $N$ 的倍數，意味著在這個乘法中的某處，隱藏著秘密質數 $p$ 和 $q$。\n奇蹟在此發生。 這兩個質數 $p$ 和 $q$，有 ** 50%（二分之一） ** 的數學機率，會分開進入不同的房間： ** 「$p$ 進入 $(X - Y)$ 的房間」和「$q$ 進入 $(X + Y)$ 的房間」 ** 。\n在只有質數 $p$ 進入 $(X - Y)$ 房間的狀態下，讓我們計算 $(X - Y)$ 和 $N$ 的 ** 「最大公因數（共通的最大零件）」 ** 。\n$(X - Y)$ 的內容 ＝ $p \\times$ 某個數字 $N$ 的內容 ＝ $p \\times q$ 共通的零件只有 ** 「$p$」 ** ！ 也就是說，在計算出最大公因數的瞬間，隱藏的質數 $p$ 就會掉出來，密碼就被完全破解了。（※最大公因數只要使用「輾轉相除法」，用手機也能瞬間計算出來）\n** 【小專欄：為什麼是 2 次方？3 次方或 2 倍不行嗎？】 **\n如果是「$2X - 2Y$」會變成 $2(X - Y)$，因為只有一個房間，所以無法將質數分開。如果是「$X^3 - Y^3$」，房間的大小會變得不平衡，計算會變得不必要的繁重。為了將質數漂亮地分開到兩個房間，「2 次方」是成本效益最高的。\n第 2 章：如何尋找 X 和 Y？「收集質數卡片的拼圖」 目標已經很清楚了。但是，如果盲目地尋找「餘數相同的 $X^2$ 和 $Y^2$」，直到宇宙毀滅也找不到。 因此，數學家們想出了一個被稱為 ** 「收集質數卡片的拼圖」 ** 的天才方法。\nStep 1：只用篩子收集沙金（平滑數） 首先，準備一個適當的數字 $Z$，將其平方後除以 $N$ 算出餘數 $W$。 （$Z^2 = W$ 的餘數世界）\n將得出的餘數 $W$ 進行質因數分解。在這裡，只有當出現 ** 「只由 2、3、5、7 等小質數組成的 $W$」 ** 時，才將該算式作為「中獎卡片」保留下來，如果混入了大的質數就丟棄。 這就像在河裡用篩子過濾掉大石頭，只收集沙金一樣的作業。\nStep 2：全部變成「偶數個」的拼圖 例如，假設收集到了以下 3 張沙金卡片。\n卡片 A： $Z_1^2 = 2^3 \\times 3^1$ 卡片 B： $Z_2^2 = 2^1 \\times 5^1$ 卡片 C： $Z_3^2 = 3^1 \\times 5^1$ 我們將這些全部相乘。 右側會變成 $(2^3 \\times 3^1) \\times (2^1 \\times 5^1) \\times (3^1 \\times 5^1)$， 整理過後會變成 ** 「$2^4 \\times 3^2 \\times 5^2$」 ** 。\n令人驚訝的是，質數的個數變成了「4 個、2 個、2 個」， ** 全部都是偶數個 ** ！ 全部都是偶數個，意味著只要將整體的數量減半，就會變成「某個東西的平方」。 也就是說，$(2^2 \\times 3^1 \\times 5^1)^2 = (60)^2$.\n左側是 $(Z_1 \\times Z_2 \\times Z_3)^2$，所以終於， ** $X = (Z_1 \\times Z_2 \\times Z_3)$ ** ** $Y = 60$ ** 這對期待已久的「$X^2 = Y^2$」組合就完成了！\n對於電腦來說，計算質數個數「是偶數還是奇數（0 或 1）」的拼圖是它們非常擅長的，所以用這個方法就能高速找到 $X$ 和 $Y$。\n第 3 章：阻擋在前方的絕望之壁 這樣就能破解任何密碼了！……正當我們這麼想時，大問題發生了。 如果密碼數字 $N$ 大約在「100 位數」以內，用這個方法（稱為二次篩法）是可以解開的，但當 $N$ 變成「200 位數、300 位數」時，計算過程中出現的 $W$ 就會變得太大。\n數字一旦變得太大，「只由小質數組成的數字（沙金）」就不再出現。這變得比在沙漠中尋找隱形眼鏡還要困難，完全無法收集到解開拼圖所需的卡片。\n這時候，人類的最終兵器 ** 「一般數體篩法（GNFS）」 ** 終於登場了。\n第 4 章：人類最強的想法，創造「兩個世界」 GNFS 的天才發想是： ** 「因為只在現實世界中計算，所以數字才會變得巨大。那麼，我們就用多項式（代數式）創造一個『裏世界』，將計算的負擔分散成兩半吧。」 **\n代數式的魔法 GNFS 使用一個基準數字 $m$，將巨大的數字 $N$ 轉換成代數式。 例如如果 $N=100$，設 $m=4$，則 $100 = 4^3 + 2(4^2) + 4$。 使用字母 $x$ 將其變成 ** $f(x) = x^3 + 2x^2 + x$ ** 這個算式（裏世界）。\n這個算式有趣的地方在於，它具有 ** 「只要將字母 $x$ 代入 $m$（在上面的例子中是 4），隨時都能瞬間移動回到現實數字 $N$」 ** 的特性。\n在兩個世界中同時尋找沙金 GNFS 製造出許多隨機的整數對 $(a, b)$，並同時進行以下兩個計算：\n** 現實世界 ** ： $a - b \\times m$ ** 代數式的世界 ** ： 依照代數式規則計算 $a - b \\times x$ 的值 藉由將問題分成兩個世界，處理的數字大小會戲劇性地變小（變輕）。這就像是把巨大的岩石劈成兩半，變成容易處理的石塊一樣的概念。\n然後，我們用篩子過濾，只收集那些在 ** 「現實世界和代數式的世界中，兩者都是『只由小質數組成（沙金）』」 ** 的奇蹟整數對 $(a, b)$。這就是「數體篩法」名稱的由來。\n密碼終於被破解的瞬間 當從兩個世界收集到數千萬張「沙金卡片」後，就會使用超級電腦的巨大矩陣計算，找出在第 2 章做過的「質數個數全部變成偶數的組合」。\n找到組合後，\n將現實世界中產生的平方數設為 ** $X^2$ ** 將代數式世界中產生的平方算式設為 ** $Y(x)^2$ ** 最後，將代數式 $Y(x)$ 中的 $x$ 代入 $m$，使其瞬間移動到現實世界並會合。 這樣一來，宛如數學魔法般， ** 「$X^2$ 和 $Y^2$ 的餘數相同」 ** 的狀態就嚴格地完成了！\n接下來只要按照第 1 章的說明，計算 $X - Y$ 和 $N$ 的最大公因數，堅不可摧的 RSA 加密就會應聲瓦解，秘密質數也將隨之現身。\n結語：數學永無止境 你可能會想：「太好了，只要用 GNFS 就能破解任何密碼了吧！」。 然而，RSA 加密也沒有認輸。目前網際網路上使用的是被稱為「RSA-2048（約 617 位數）」這種怪物級的巨大數字。\n儘管 GNFS 號稱是人類最強的演算法，但要解開 270 位數（RSA-270），據說即使將全世界的電腦連線在一起，也需要數千年甚至數萬年。就目前而言，我們的 LINE 或銀行資料還是安全的。\n不過，如果出現了 ** 「能瞬間找出任何巨大數字 $X$ 和 $Y$ 的魔法」 ** 會怎麼樣呢？ 事實上，最接近這個存在的，就是目前正在開發的 ** 「量子電腦（Shor 演算法）」 ** 。數學上已經證明，只要利用量子力學波的特性，就能無視麻煩的卡片收集拼圖，一次就抽出正確答案。\n製造密碼的人（防禦）與製造破解密碼演算法的人（攻擊）之間，無止盡的鬥智。 當你知道國中學到的「質因數分解」和「代數式」，其實是在世界資安最前線激烈交鋒的武器時，是否覺得數學課變得稍微有趣一點了呢？\n發現未來最強演算法的人，或許就是正在讀這篇文章的你！\n(※本文為了讓中學生能理解，將密碼破解的數學魅力概念化。實際的 GNFS 是使用了代數體的理想類群、同態映射等高等大學數學來進行嚴格計算的)\n","date":"2026-09-05T02:09:08+09:00","image":"http://kenji.blog/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/gnfs_two_worlds_1788542142485_huf997c6e55368509d0617b56f68899854_1135822_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/zh-tw/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/","title":"什麼是打破網際網路加密的人類最強數學 \"一般數體篩法（GNFS）\"？"},{"content":"反疫苗的功過——「善意的焦慮」扼殺了5000人的未來，以及我們應當學習的流行病學教訓 新冠疫情凸顯的「因果錯覺」 2021年之後，日本國內迅速推進了新冠病毒的疫苗接種。在短時間內有將近八成的國民接種，這是人類歷史上罕見的公共衛生計畫。 在這個過程中，我們透過社群媒體和新聞媒體，目睹了無數的「悲鳴」。「打完疫苗幾天後家人就過世了」、「接種後持續出現原因不明的身體不適」——。這些訴求非常迫切，對當事人來說，那種痛苦是不可否認的真實。\n然而，這裡存在著一個流行病學中冷酷卻極其重要的「陷阱」。 以日本的人口規模來考量，無論是否施打疫苗，每天大約有3,000到4,000人會因為某種原因（疾病、事故、壽命）而死亡。如果國民的大多數都在同一時間接種疫苗，從機率論來看，必然會出現一定數量的「接種隔天（因為與疫苗無關的原因）而死亡的人」。這在專業術語中被稱為 「巧合（Coincidence）」 。\n人類天生具備「在此之後，因此之故（Post hoc ergo propter hoc）」的認知偏誤。如果「在A（接種）之後發生了B（死亡）」，就會直覺地將其連結為「A是B的原因」。在新冠疫情期間，這種認知偏誤透過社群媒體這個放大器被擴散出去，產生了一群在等待科學驗證之前就深信「疫苗＝危險」這種印象的人。\n不少公共衛生專家帶著既視感看待這個景象。這是因為日本在短短幾年前，正是因為這種「缺乏科學依據的焦慮」，成為了唯一一個主動放棄能預防疾病之手段的已開發國家。 那就是 「子宮頸癌疫苗（HPV疫苗）」 的問題。\n2013年，日本發生了什麼事？ 讓我們把時間倒轉一點。 子宮頸癌是一種每年約有1萬1000名女性罹患、約2,900人因此死亡的疾病。特別是它會侵襲20代到40代這個正值育兒和事業巔峰期的世代，因此也被稱為「母親殺手」。其原因是感染人類乳突病毒（HPV），這是一種非常普遍的病毒，有性行為經驗的女性中有八成在一生中至少會感染一次。 能預防這種病毒感染的HPV疫苗，作為「能預防癌症的劃時代疫苗」在世界各地陸續被引進，日本也在2013年4月將其列為常規接種（由國家強烈建議，並可免費接種的狀態）。\n然而，事態隨即急轉直下。 部分接種過疫苗的少女報告了全身疼痛、運動障礙、記憶障礙等症狀，媒體則連續幾天將此作為「疑似疫苗副作用」進行大肆報導。少女痙攣的影像給觀眾帶來了強烈的衝擊，輿論瞬間倒向了「疫苗危險論」。\n對此，厚生勞動省在2013年6月，也就是常規接種開始僅短短2個月後，決定「暫停積極建議接種」。這既不是「禁止」也不是「中止」，而是「保留常規接種的框架，但國家不再發送個別的通知」，這是一個極其曖昧的政治判斷。 然而，傳達給國民的訊息卻是「國家承認有危險而停止了」。結果，原本超過70％的接種率，在轉眼間暴跌至不到1％。\n從此，日本開始了 「失落的8年（疫苗空窗期）」 。\n名古屋研究揭露的「真相」 媒體報導的症狀，真的是疫苗造成的嗎？ 有一項大規模的調查試圖以科學方式回答這個問題。通稱 「名古屋研究（Nagoya Study）」 。\n名古屋市在2015年針對約7萬名年輕女性實施了大規模的問卷調查。這項調查包含了「有施打」和「未施打」疫苗的人，分別詢問她們是否有「月經不順」、「關節疼痛」、「注意力下降」等24項症狀。 如果疫苗是原因，那麼在「有施打」的群體中，這些症狀應該會明顯多出許多。\n結果是令人震驚的。 「有接種組」與「未接種組」之間，在症狀的發生率上並沒有觀察到顯著差異。\n這意味著什麼呢？ 青春期的少女，無論有沒有接種疫苗，因為荷爾蒙分泌的變化或成長期特有的情況，本來就處於容易發生姿勢性心搏過速症候群（起立性調節障礙）或慢性疼痛等身體不適的時期。 也就是說，和媒體報導的「打完疫苗後出現症狀的孩子」相同比例地，也存在著「沒有打疫苗卻出現相同症狀的孩子」。 然而，沒打疫苗的孩子的身體不適被當作「青春期的不適」來處理，只有打了疫苗的孩子的身體不適被放大為「疫苗的受害」。數據顯示，這極可能就是當時被炒作成「藥害」現象的真面目。\n此外，也有人指出「反安慰劑效應（Nocebo effect）」的影響。這是「安慰劑效應」的反面，如果相信「這是對身體有害的東西」而攝取，會因為焦慮和恐懼而真的產生疼痛或不適的現象。連日的負面報導，對少女們纖細的身心產生影響的可能性是無法否定的。\n透過數字看「不作為之罪」 「為了安全起見先停止建議」。 這個判斷，乍看之下似乎是「謹慎且安全的選擇」。因為等發生事情就來不及了，有疑慮就應該停止。但是，在公共衛生領域中，「什麼都不做（不作為）」，有時候會帶來遠遠超過「做某件事的風險」的損害。\n大阪大學的研究團隊，針對這項暫停建議所帶來的影響，發表了殘酷的推估結果。 他們指出，由於2013年到2019年間接種率的銳減，原本未來可以預防的 子宮頸癌罹患人數將增加約2萬5000人，死亡人數將增加約5,000人至5,700人 。\n超過5,000名的死者。這是足以匹敵大規模自然災害的數字。 為了迴避「對副作用的焦慮」這個在科學上因果關係不明確的風險，結果我們反而讓未來的女性們背負了「死於癌症」這個確切且重大的風險。\n如果放眼世界，這個差距非常明顯。 在澳洲，由於男女皆普及接種，預計在2028年左右子宮頸癌將被「撲滅（變成罕見癌症）」。在英國，也有報告指出疫苗接種世代的子宮頸癌發病率幾乎降至零。 當世界正邁向「克服癌症」的未來時，只有日本被拋在「癌症持續增加」的過去。2015年，WHO（世界衛生組織）的全球疫苗安全諮詢委員會點名批評了日本的情況，指出：「未基於科學證據的政策決定，正在帶來真正的傷害（死於癌症）」。\n跨越海洋連鎖反應的「疫苗猶豫」 在日本發生的HPV疫苗悲劇，絕不僅僅是「日本獨有的特殊情況」。當「直覺的焦慮」和「意識形態」優先於科學時，傳染病隨時隨地都會展露獠牙，現在世界各地仍有這樣的案例被報告出來。\n其中一個顯著的例子，就是美國的 「麻疹」流行 。\n麻疹是一種傳染力極強的病毒，但這是一種透過疫苗幾乎可以完全預防的疾病。美國過去透過徹底的疫苗接種計畫，曾在2000年宣布「消除（elimination）」了麻疹。也就是說，當時認為國內已經沒有本土的病毒了。 然而，近年來麻疹又開始重新流行。\n根據BBC的報導（2024年），美國衛生當局指出，部分社區中根深蒂固的「疫苗猶豫（Vaccine Hesitancy）」成為了感染擴大的溫床。 在因宗教理由、標榜「自然派」的部分群體，或是基於錯誤資訊的反疫苗思想所滲透的地區，疫苗接種率出現下降。此時若有病毒從海外被帶入，就會在沒有免疫力的人群中引起爆發性的感染。\n麻疹並不只是一種發燒或起疹子就結束的疾病。它會引發肺炎或腦炎等嚴重的併發症，即使在已開發國家也有致死的可能。過去人類匯集智慧好不容易「封印」的疾病，正趁著人們「疑心」的空隙，再次威脅著孩子們的生命。 美國的案例向我們發出了這樣的警告：「高接種率這道防波堤，一旦人們的信任動搖，就會在瞬間潰堤」。\n媒體與專家，以及我們的挫敗 為什麼這樣的情況會不斷重演呢？ 這其中有著現代社會特有的資訊不對稱，以及我們的認知偏誤。\n在日本的HPV疫苗問題中，媒體以煽動性的方式報導了「疑似疫苗副作用」。「可憐的受害者」對抗「冷酷的國家與製藥公司」的結構，作為一個故事非常具有張力，強烈地動搖了觀眾的情感。 另一方面，專家們「統計上沒有顯著差異」、「利大於弊」等科學性的解釋，聽起來枯燥乏味且冷漠，在情感的洪流面前顯得太過無力。\n在科學的世界裡，如果有99％的科學家支持的定論，和1％的異議，它們並不會被當作「同等的意見」來對待。然而，媒體因為過度重視「公平性」，或是為了吸引目光，將拯救數萬人生命的數據，與一個人的情緒性受害訴求作為「對等的事物」並列報導。 政治家們也因為害怕輿論的反彈，優先選擇了察言觀色（閱讀「當下的氛圍」）而非科學根據。結果，日本暫停了HPV疫苗的積極建議長達約9年，在此期間產生了許多原本可以預防的癌症損害。\n歷史重演——需要具備抗拒「氛圍」的理智 2022年，日本終於重啟了對HPV疫苗的積極建議。然而，失去的時間與生命卻無法重來。正如現在美國麻疹再度流行一樣，只要一疏忽，歷史就會不斷重演。\n我們不能全盤否定反疫苗運動，或對醫療抱持疑慮這件事本身。對於要放入自己身體的東西感到謹慎是人類的防衛本能，過去也的確發生過藥害事件。在民主主義中，監視和懷疑權力是很重要的。\n但是，新冠疫苗、HPV疫苗，以及美國的麻疹流行等一連串事件所揭示的，是 「無視科學的善意焦慮」，可能比病毒本身奪走更多生命 這個冷酷的事實。\n「可能會有危險，所以先觀察看看吧」 當我們做出這個判斷時，我們有把「在觀察期間內死於疾病的機率」計算進去嗎？ 「自然的東西是最好的」 當我們這麼說的時候，我們是不是忘了「自然界中存在的病毒，才是最無情地奪走生命的」這段歷史呢？\n今後還會出現新的傳染病，並開發出新的疫苗。到那時，我們是否又會被「巧合」的現象所迷惑，隨情感的煽動而隨波逐流呢？還是說，我們能冷靜地解讀數據，將風險與利益放在天秤上衡量呢？\n人們常說歷史會重演。但是，能夠阻止它重演的，只有我們的理性。 我們應該看統計上正確的數據，我們 必須具備選擇「事實」而非「氛圍」的理智。這就是生活在現代的我們的責任。\n參考文獻・數據出處 厚生勞動省 ：「人類乳突病毒感染症～子宮頸癌與HPV疫苗～」 國立癌症研究中心 ：癌症資訊服務「子宮頸癌」統計數據 BBC News (Japanese) ：「美國CDC因麻疹流行呼籲接種疫苗 全球感染增加」（2024年）及相關的原文報導 大阪大學研究團隊（Yagi A, et al. Lancet Public Health. 2020） ：關於暫停積極建議HPV疫苗常規接種所導致的超額罹患人數・死亡人數之推估相關研究 Nagoya Study (Suzuki S, et al. Papillomavirus Res. 2018) ","date":"2026-01-24T15:41:23+09:00","image":"http://kenji.blog/p/%E5%8F%8D%E3%83%AF%E3%82%AF%E3%83%81%E3%83%B3%E3%81%AE%E5%8A%9F%E7%BD%AA/img_hu25fb505b5ce09f8b6e475386b0bbff8f_1013820_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%8F%8D%E3%83%AF%E3%82%AF%E3%83%81%E3%83%B3%E3%81%AE%E5%8A%9F%E7%BD%AA/","title":"反疫苗的功過"},{"content":"「日本人優先」的虛像與實像：2026年的日本面臨名為「共存」的防衛策 前言：為何這個詞如今會打動人心 2026年。我們現在正處於前所未有的時代轉折點。長期的物價高漲、實質薪資成長停滯，以及顯而易見的少子高齡化進程。每當超市貨架上的商品標籤被改寫時，對未來的焦慮就會在我們的心中投下陰影。\n在這種封閉感之中，有一個詞的支持率正在迅速擴大。那就是 「日本人優先」 。\n「希望首先豐富本國國民的生活」、「希望把保護日本的文化和治安放在首位」，這些願望作為一名主權者，以及作為一個生活在這個國家的人，是極為自然且迫切的需求。然而，這個詞所標榜的「理想」與統計數據顯示的「現實」之間，存在著我們必須正視的巨大落差。\n這篇文章中，我們將排除情感論述和貼標籤，基於客觀數據、時間軸的變遷，以及社會各個現場正在發生的事實，來探究這個問題的真相。\n第1章：「日本人優先」的時間軸與社會背景 這個詞並不是突然出現的。它是世界潮流與日本特有情況複雜交織而醞釀出來的。\n1. 2016年〜2017年：詞彙的引進與定型 2016年，唐納·川普提出的「美國優先」震驚了全世界。在日本國內，2017年由東京都知事小池百合子領導的「都民優先會」備受矚目。在這個階段，它更多是作為明確政策優先順序的一種修辭，排外的色彩仍然有限。\n2. 2023年〜2024年：焦慮的視覺化 疫情後經濟復甦的遲緩，以及日圓急劇貶值帶來的通貨膨脹直接衝擊了一般家庭。與此同時，社群媒體（SNS）上開始爆發基於片段資訊的不滿情緒，例如「對外國人的支援太過優渥」、「日本人的血汗稅金流向了外國人」等。\n3. 2025年〜2026年：政治勢力與SNS的融合 在2025年的國政選舉中，正式將「日本人優先」作為口號的勢力確保了一定數量的席次。SNS的演算法回應了人們的焦慮，優先顯示極端的貼文，加速了只有特定價值觀被強化的「同溫層效應」。\n根據各家報社實施的最新民意調查（2025年底），對於這個口號， 「贊成、相對贊成」佔42％、「反對、相對反對」佔38％ ，突顯出現今輿論一分為二的現狀。\n第2章：經濟與社會保障的真相——是「掠奪者」還是「支柱」？ 支持「日本人優先」的邏輯支柱之一，是「日本人的資源正在被外國人奪走」的印象。然而，政府機關的第一手數據卻顯示出與這種直覺完全相反的現實。\n1. 勞動力：維持日本經濟的「不可或缺的血液」 根據厚生勞動省的「外國人僱用狀況（截至2024年10月底）」，外國人勞動者人數為 204萬8,675人 。而在2026年目前的推算中，已經突破了 230萬人 。\n產業領域 外國人勞動者的比例與成長率 實際情況與作用 建設業 較前一年增加約22.7% 對基礎設施維護和老舊橋梁、道路的修繕不可或缺。 醫療・福祉 較前一年增加約28.1% 擔負著長照現場的最前線，支撐著日本的高齡者。 製造業 佔整體的約26% 支撐日本出口產業現場的棟樑。 現在，他們填補的不是日本人想做卻做不到的工作，而是 「日本人無法確保的空缺」 。如果以「日本人優先」的名義排斥他們，我們的長照系統將會立即崩潰，住宅和食品的物價更會飆升幾成甚至幾倍。\n2. 社會保障：圍繞生活保護的謠言與真相 在SNS上最容易被擴散的說法是「外國人優先領取了生活保護」。然而，查看厚生勞動省的統計數據，在所有領取家庭中，戶長為外國人的比例約為 2.8〜2.9% 。過去10多年來，這個數字幾乎持平。\n相反地，從在留外國人的年齡結構來看，他們大多是 20代到40代的工作世代 。他們繳納厚生年金和健康保險費，扮演著支撐「日本高齡者」領取年金和醫療費的 「支付者」 角色。填補了日本人離開後的工作世代空缺，並延續日本社會保障系統壽命的，正是他們。\n第3章：治安與SNS的偏見——「外國人犯罪」的邏輯解構 對治安的擔憂最強烈地刺激了「日本人優先」的情緒。然而，詳細解讀警察廳的統計和法務省的《犯罪白皮書》，就會發現網路上「兇惡的外國人」的印象在多大程度上是由認知扭曲所造成的。\n1. 「總數」與「犯罪率」的冷靜比較 根據2024年發表的統計，在所有被逮捕的人員中，外國人佔的比例為 約5.5% 。剩下的約95%是由日本人犯下的罪行。\n如果以每10萬人口的逮捕人數（犯罪率）來比較，更能看出本質。\n區分 每10萬人口的逮捕人數（推算） 日本人（全年齢） 約142.7人 在留外國人（定住者・居住者） 約120.0人 中長期居住在日本的外國人的犯罪率，低於全體日本人的平均值 ，這是統計上的事實。\n2. 「世代」偏差的魔術 為什麼「外國人很可怕」的印象會先行？其最大的因素在於犯罪學中 「年齡結構」 的差異。\n日本人： 約3成是犯罪率極低的高齡者。這個群體拉低了「分母」，使得日本整體的數值看起來較低。 外國人： 由於是作為勞動力來到日本，8成以上是 在統計上容易發生犯罪的「青年至中年層」 。 如果在「20代」這個相同條件下，比較日本人與外國人的犯罪率，兩者並沒有顯著的差異。也就是說，並不是「外國人增加導致治安惡化」，而只是 「容易犯罪的年齡層（年輕人），以外國人的形式存在於日本」 罷了。\n3. SNS製造的「確認偏誤」 SNS的演算法以我們的「焦慮」為燃料。一旦發生了一件外國人犯罪，它就會與「屬性（國籍）」結合並被激烈地擴散。於是，在我們的大腦中，只有「外國人又引發事件了」的記憶被強化。\n這被稱為 「確認偏誤」 。佔整體95%的日本人犯罪被視為「日常」而遭到忽視，而5%的外國人犯罪則被偷換成「所有外國人」的形象。\n第4章：文化的傳承——是「破壞者」還是「救世主」？ 「日本的傳統與文化會被破壞」的擔憂，同樣與現場的實際情況不符。\n1. 傳統工藝的「最後傳承者」 日本傳統工藝品的製造從業人員，從1970年代的約30萬人，銳減至現在的約5萬人左右。拯救這個消失危機的，是帶著對日本文化深厚敬意來到日本的外國人們。\n酒廠和刀匠： 外國人拜入日本人已經放棄傳承的工坊，透過引入向海外傳播的力量和新的感性，將瀕臨歇業的文化重生為「永續產業」。 2. 地區社區的維持 在年輕人消失、成為「可能消滅都市」的地方自治體中，技能實習生和特定技能的外國人成為了當地祭典的承擔者，支撐著農業的基礎。 是誰在日本人離去後，耕作被荒廢的農地，並守護著延續數百年的活動？只要正視這個現實，就會明白他們不是文化的「破壞者」，而是 「最後的防線」 。\n第5章：教育現場的擔憂與「霸凌」的連鎖 將「日本人優先」這個詞帶入教育現場，其副作用是嚴重的。\n區分「內外」的二元對立： 如果孩子們內化了「日本人是應該被優先對待的特權階級」這種錯誤的選民意識，這將很容易演變成排斥「與自己不同的人」的霸凌行為。 按出身排序： 即使擁有日本國籍，外表或名字不同的孩子也會因為「不是日本人」而受到攻擊。這是教育的崩潰，也是親手傷害將來擔負日本未來的人才的行為。 教育現場的專家擔憂，「優先」這個詞所帶有的排他性，會削弱孩子們的多元文化共生能力，最終導致日本被世界孤立的風險。\n第6章：世界潮流與民粹主義的浪潮 這種現象並非日本獨有。在歐美各國，未能享受全球化恩惠的階層流向高舉「本國第一主義」的民粹主義現象也持續存在。\n然而，日本與歐美決定性的不同在於 「正以世界上最快的速度減少人口」 這一點。即使其他國家有「限制」這個選項，日本已經存在無數個如果沒有「合作」就無法維持的社會基礎設施。堅持情緒化的「優先」，在邏輯上意味著「緩慢的自殺」。\n結語：真正的「日本人優先」是什麼？ 「日本人優先」這個詞所包含的「希望能把國民的生活放在第一位」的願望本身，是一個國家的政府應該具備的最基本責任。\n然而，實現這個願望的手段絕不能是「排斥鄰人」。正如客觀數據所示，我們現在享受的生活便利性、治安、傳統文化，以及社會保障制度本身，已經處於一個如果沒有外國人的存在就無法成立的「依賴與共生」階段。\n真正的「日本人優先」，不正是冷靜地實踐以下3點嗎？\n基於事實的討論： 不被謠言和誇大的資訊所左右，以政府機關的第一手統計數據為基礎來掌握現實。 確立公平的規則： 讓外國人遵守日本的規則，另一方面，日本社會也將他們作為公平的夥伴來對待。 內在的更新： 不把接納外國人視為「失去日本」，而是轉變觀念，認識到這是借用他們的力量來「重建並維持日本」。 2026年，我們站在一個巨大的十字路口。是繼續高喊分裂的詞彙、自尋死路？還是正視現實，邁向由多元人群共同支撐的「永續發展的日本」？\n答案，就在每一個人心中的「智慧」與「勇氣」之中。\n","date":"2026-01-23T13:43:41+09:00","image":"http://kenji.blog/p/%E6%97%A5%E6%9C%AC%E4%BA%BA%E3%83%95%E3%82%A1%E3%83%BC%E3%82%B9%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E6%80%9D%E3%81%86%E3%81%93%E3%81%A8/img_hua12d272c50d3b08d888fe1df256a5051_1332597_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E6%97%A5%E6%9C%AC%E4%BA%BA%E3%83%95%E3%82%A1%E3%83%BC%E3%82%B9%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E6%80%9D%E3%81%86%E3%81%93%E3%81%A8/","title":"「日本人優先」的虛像與實像：2026年的日本面臨名為「共存」的防衛策"},{"content":"【注意】Gemini 的免費體驗結束後會被收費？取消訂閱方法總結 當您嘗試使用 Google 的 AI 服務「Gemini」時，首先會提供 1個月的免費體驗 。 我想有很多人會覺得「既然免費就先試試看吧」而註冊，但在這裡有需要注意的地方。\n免費體驗結束後會怎樣？ 體驗期結束後，系統將會自動向您收取 每月2,900日圓 的費用。 這是與名為「Google One 方案」的訂閱服務綁定在一起的，如果沒有特別進行任何操作，機制上就會轉為持續扣款。\n雖然取消訂閱就不會被收費，但是… 當然，如果在體驗期間取消訂閱就不會產生費用。 官方的解說頁面上也記載了「取消 Google One 方案的方法」。\n👉 取消 Google One 方案（官方）\n只是，實際造訪該頁面時，卻遇到了「不知為何無法取消」的狀況…。 讓人感到困惑，「咦，該從哪裡停止呢？」。\n正確的取消方法在這裡！ 經過各種調查的結果，實際上能夠成功取消訂閱的是以下這個頁面。\n👉 Google 帳戶 – 刪除服務\n從這裡選擇「Google One」並刪除，即可完成取消訂閱。\n總結 Gemini 的免費體驗為 1個月 結束後將會自動收取 每月2,900日圓 的費用 有些情況下無法從官方的說明頁面進行取消 實際上可以取消的地方是 「刪除服務」頁面 如果您認為「因為是免費體驗所以沒關係」，請小心不要在不知不覺中被扣款了！\n👉 正在閱讀這篇文章的您，或許現在正因為「該從哪裡取消？」而感到困擾。總之請先透過上方的連結查看一下吧。\n","date":"2025-09-27T10:02:59+09:00","image":"http://kenji.blog/p/google-one-gemini%E3%81%8C%E8%A7%A3%E7%B4%84%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/img_hue118597de1df33c0e1a19ecde6d4d33f_1730014_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/google-one-gemini%E3%81%8C%E8%A7%A3%E7%B4%84%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/","title":"無法取消 Google One (Gemini) 時的解決方法"},{"content":"🎬 YouTube 實況腳本（賀年卡製作應用程式開發・第1回） 實況開始（開頭 2〜3分鐘） 簡單問候 「大家好。從今天開始，我將開始一個使用 C++ 慢慢製作賀年卡製作應用程式的實況。」 「雖然不知道到完成為止會實況多少次，但會作為一個系列一點一滴地進行。」 「基本上我會安靜地作業，所以希望大家可以把它當作工作用的背景音樂來觀看。」\n目標應用程式概要 「在這個應用程式中，我希望能讓大家設計賀年卡的背面。」 「計畫包含插入照片、字體排列，以及使用 AI 進行圖片加工或插圖生成，最終預計上傳到 Microsoft Store。」\n今日作業目標 「作為第1回的今天，我們將整理環境並建立基礎。」 「具體來說，我希望能進行以下內容：\n建立 GIT 儲存庫 建立主視窗 顯示版本資訊對話方塊 建立選單與實作結束命令 Direct2D 的初始化與釋放處理及顯示 HelloWorld 」\n關於原始碼公開 「原始碼已在 GitHub 上公開。有興趣的朋友請務必去看看。」 → https://github.com/kenjinote/NengaCardApp/\n作業部分（無言） 建立 GitHub 儲存庫 → 初始提交\n建立主視窗雛形\n版本對話方塊與選單建立，以及結束命令的實作\nDirect2D 的初始化與釋放處理 → 確認 HelloWorld 的顯示\n適時推送到 GitHub\n※ 基本上無言，只有在必要時加入簡短的解說\n實況結束前（最後 1〜2分鐘） 今日進度總結 「今天，我們建立了 GIT 儲存庫，並實作了視窗、結束按鈕以及版本對話方塊。」 「也完成了使用 Direct2D 顯示 HelloWorld 的部分。」\n下次預告 「下次開始，我希望能夠整理 UI 部分，或進行字串的物件化等工作。」\n再次提供 GitHub 連結 → https://github.com/kenjinote/NengaCardApp/\n結尾 「感謝您的收看。下次我也會繼續努力，請多指教。」\n","date":"2025-08-31T20:24:49+09:00","image":"http://kenji.blog/p/%E5%B9%B4%E8%B3%80%E7%8A%B6%E4%BD%9C%E6%88%90%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E9%85%8D%E4%BF%A1-vol.1/img_hu403d76b87feb7669f72c38243c5cb621_1021075_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%B9%B4%E8%B3%80%E7%8A%B6%E4%BD%9C%E6%88%90%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E9%85%8D%E4%BF%A1-vol.1/","title":"賀年卡製作應用程式開發實況 VOL.1 (腳本)"},{"content":"為 msix 加上自簽憑證以便安裝 在 Windows 上發布應用程式時，使用 MSIX 套件 會很方便，因為它統一了安裝和更新機制。然而，MSIX 有一個限制，即「必須有已簽署的憑證」。 當您想要測試發布由企業或個人開發的應用程式時，可能會遇到「購買商業程式碼簽署憑證太過小題大作」的情況。\n這時 自簽憑證 (Self-Signed Certificate) 就能派上用場。在本文中，我們將總結為 MSIX 加上自簽憑證並允許在本地環境中安裝的步驟。\n1. 建立自簽憑證 首先，以系統管理員模式啟動 PowerShell 並執行以下命令。\n1 2 // 建立自簽憑證 New-SelfSignedCertificate -Type CodeSigningCert -Subject \u0026#34;CN=035A9AAC-915B-4CE1-AE39-1A101BED42F5\u0026#34; -CertStoreLocation Cert:\\CurrentUser\\My -NotAfter (Get-Date).AddYears(10) -KeyUsage DigitalSignature -FriendlyName \u0026#34;kenjinote\u0026#34; 這裡建立的是用於「程式碼簽署」的憑證。\n使用 -FriendlyName 給它一個容易理解的名稱，以便日後尋找。 您可以使用 -NotAfter 調整到期日。這次我們將其設定為 10 年。 2. 匯出 PFX 檔案 將建立的憑證匯出為 PFX 格式，以便可以與 signtool 一起使用。\n1 2 3 4 // 建立 pfx $cert = Get-ChildItem Cert:\\CurrentUser\\My | Where-Object { $_.FriendlyName -eq \u0026#34;kenjinote\u0026#34; } $password = ConvertTo-SecureString -String \u0026#34;password\u0026#34; -Force -AsPlainText Export-PfxCertificate -Cert $cert -FilePath \u0026#34;D:\\pfx\\cert.pfx\u0026#34; -Password $password 此時設定的密碼（範例中為 password）將在稍後的簽署操作中需要。\n3. 將自簽憑證安裝到受信任的根憑證授權單位 就這樣，Windows 並不信任建立的憑證。要安裝它，您需要從 certmgr.msc 將其匯入到 [受信任的根憑證授權單位] -\u0026gt; [憑證] 。\n如果匯入匯出的憑證（ .cer 或 .pfx ），它將在目標 PC 上被視為受信任的憑證。 這可以防止即使您簽署了 MSIX 也會出現「不受信任的憑證」警告。\n4. 簽署安裝程式 (MSIX) 最後，使用建立的 PFX 憑證簽署 MSIX。 signtool 包含在 Visual Studio 和 Windows SDK 中。\n1 2 // 簽署安裝程式 signtool sign /fd SHA256 /f \u0026#34;D:\\pfx\\cert.pfx\u0026#34; /p \u0026#34;password\u0026#34; \u0026#34;C:\\installer\\installer.msix\u0026#34; /fd SHA256 指定簽章演算法。 使用 /f 指定 PFX 檔案，並使用 /p 傳遞密碼。 最後，指定 MSIX 檔案的路徑。 如果未設定 signtool 的路徑，請指定完整路徑。在我的環境中，它位於以下位置。 1 \u0026#34;C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages\\microsoft.windows.sdk.buildtools\\10.0.26100.1742\\bin\\10.0.26100.0\\x64\\signtool.exe\u0026#34; 這樣就完成了簽署，並完成了一個可以在目標 PC 上安裝的 MSIX。\n總結 使用 New-SelfSignedCertificate 建立自簽憑證 使用 Export-PfxCertificate 匯出 PFX 將憑證安裝到 受信任的根憑證授權單位 使用 signtool 簽署 MSIX 透過遵循此流程，您可以在本地環境中檢查操作並進行測試發布，而無需購買商業憑證。 當然，憑證授權單位核發的憑證對於實際的商業發布是必不可少的，但這種方法在開發和驗證階段非常方便。\n👉 這次我們以 installer.msix 為例，但您也可以將相同的程序應用於您自己開發的應用程式。\n","date":"2025-08-30T04:18:04+09:00","image":"http://kenji.blog/p/msix%E3%81%AB%E8%87%AA%E5%B7%B1%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E3%81%A4%E3%81%91%E3%81%A6%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B/img_hu193aeacbbfca091956fdf9aac7d139a2_495432_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/msix%E3%81%AB%E8%87%AA%E5%B7%B1%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E3%81%A4%E3%81%91%E3%81%A6%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B/","title":"為 msix 加上自簽憑證以便安裝"},{"content":"為「不會寫程式碼，但有邏輯的人」提供工具。創建 LogicPad 的理由 你好，我是 kenji。我是低程式碼工具「 LogicPad 」的作者。 這次不是介紹產品，而是想從有點個人的角度來寫寫「為什麼想做這個？」的開發幕後，以及我自己的想法。\n說實話，這不僅僅是一個工具開發。 我的過去、職場上的煩惱、技能組合，以及一直縈繞在心頭的「總有一天想做自己的產品」的想法—— 這些全部重疊在一起的結果，誕生了 LogicPad。\n也就是說， 這對我來說也是「人生集大成的專案」 。 我將盡可能坦率地、充滿熱情地寫下這樣的背景。\n坦率地說，我想要一個可以挺起胸膛說「這是我做的」產品 說實話，這是最初的動機。\n從以前開始，無論是工作還是興趣，我都喜歡寫程式碼。我也參與過各種開發。 但是，有一天我突然意識到。 「沒有一個以自己的名字、自己的責任推向世界的產品」 。\n當然，團隊製作的東西有價值，也有很多值得驕傲的工作。 但是在某處，也有一種「就這樣，在別人的名字下結束職業生涯嗎」的虛無感。\n一次就好。 我想留下一個可以挺起胸膛說「這是我做的」的東西。 帶著這樣的想法，我開始構思 LogicPad。那是大約 6 年前（ 2019 年左右 ）的事情。 （最初的想法本身是在大約 2015 年前了解到 Unreal Engine 的視覺化程式語言 Blueprint 時產生的。）\n因為不會寫程式碼所以無法著手。那不是很可惜嗎？ 我的職場裡有很多優秀的人。\n他們能建構邏輯。能自如地使用 Excel 函數，也能看穿問題的本質。 但是——在「寫程式碼」這個階段，手就停住了。\n「這個作業，每次都看著步驟書做，不能自動化嗎？」 「嗯，可以喔。但是…那必須寫程式碼呢…」\n這樣的對話發生過很多次。\n每次我都這麼想。 「明明懂邏輯，卻因為程式碼這堵牆而停下來，真是太可惜了」 。\n低程式碼編輯器，這個選項 其實在前一份工作中，我從事的是透過 GUI 操作運行的 2D CAD 開發。 說到 CAD，就是用滑鼠來組裝圖形對吧。 也就是說，這是一個 「透過操作來建構邏輯」 的世界觀。\n我想：「這和低程式碼非常契合呢」。\n再往前追溯，從學生時代開始，我一有想法就會馬上寫程式碼，大量製作影像處理、數值處理、Windows 工具、SNS 自動發文工具等小程式。 我想有 600 多個。現在也還留在 GitHub 上。\n當時並沒有考慮什麼意義。 只是「想做所以做」。僅此而已。\n但是現在，在製作 LogicPad 的時候…\n我感覺那些點終於連成了一條線。\n易於使用，但功能強大。平衡的困難 在推進開發的過程中，我一直考慮的是 「讓它成為一個直觀易用，同時又非常強大的工具」 。\n如果增加功能，能做的事情就會變多。但是，會變得難以使用。 如果簡化，任何人都能接觸。但是，那樣又會有人覺得不夠。\n為了不被說「低程式碼工具只是玩具吧？」。 但是，也不想被說「結果還是必須寫程式碼嘛」。\n我一直在直覺和表現力那條極限的線上戰鬥。\n無數次重做 UI，無數次丟棄， 然後終於接近覺得「這樣可以」的形態時，我真的很高興。\n第一次被「使用者」的一句話拯救了 第一次把 LogicPad 交給的是前同事。 她不擅長 IT，也怕程式碼。但是，她擅長邏輯。\n稍微說明並讓她試用後…幾分鐘後她說的一句話，我至今難忘。\n「如果是這個，我也覺得我能做到！」\n真的，我快哭了。 我想給她的，就是這個。\n不是會動的工具，而是 「我自己做出來了！」的感覺 。 我確信，那才是 LogicPad 真正的價值。\n能製作的人增加的話，社會會變得更有趣 我認為「技術的民主化」非常重要。\n技術有改變世界的力量。 但是，能駕馭它的人是有限的。\n如果，只要「懂邏輯」就能製作應用程式的話？\n更多的人，將能夠轉到「製作方」。 而且，從那裡誕生的東西，我認為會超越現在的想像。\n如果 LogicPad 能成為那個入口。 希望能成為一個把「想做」變成「能做」的工具。\n那就是我的願望。\n結語 LogicPad 還是 Beta 版，並未完成。 需要改善的地方，想做的事情，還有堆積如山。\n但是，我把 自己人生的「點」全部傾注到了這個工具中。 現在我可以挺起胸膛說。\n「這是，我自己製作的產品」 。\n👇附錄：LogicPad 能做的事情 透過拖放建構處理 條件分支和變數等也可以在 GUI 中處理 準備了多樣的 AI 協作節點 透過插入腳本也可以為高階使用者進行擴充 高精度的數學函數・資料處理（無限位數精度的數值運算等） 針對高階使用者的快捷鍵也很豐富 支援 90 多個國家的語言 接下來想做的事情 與 AI 協作從自然語言產生邏輯 使用者可以建立自訂節點的機制 建構可以分享建立的節點和邏輯的平台 ✍️後記 非常感謝您閱讀到這裡。 這不僅僅是一個工具開發，而是傾注了我自己的經驗、熱情和人生片段的一個挑戰。\n「不會寫程式碼，但有邏輯」 這樣的人們，能夠靠自己的力量 「製作」出來的未來 。 今後我也想透過 LogicPad 繼續以這個為目標。\n如果您有哪怕一點點「想試用看看」的想法，我都會非常高興。 如果有興趣，請務必試試看 LogicPad 。\n然後，如果使用後有什麼感想或注意到的事情，無論多小都沒關係。 您的聲音將成為推動這個產品邁出下一步的巨大力量。\n今後也請多多指教。\n","date":"2025-07-30T23:51:35+09:00","image":"http://kenji.blog/p/logicpad-%E9%96%8B%E7%99%BA%E7%A7%98%E8%A9%B1/img_hu2f3df13f20424b87da3515770faf1b1c_1676910_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/logicpad-%E9%96%8B%E7%99%BA%E7%A7%98%E8%A9%B1/","title":"LogicPad 開發秘辛"},{"content":"\u0026ldquo;如何使用 PowerShell 批次刪除 Excel、Word 等的元數據（個人資訊）\u0026rdquo; Excel 等 Office 檔案會自動儲存「元數據（個人資訊）」，例如建立者、最後修改者以及公司名稱。在將檔案分享到公司外部等情況下，通常會希望刪除這些資訊。\n本文將詳細說明如何使用 PowerShell 刪除 Excel 的元數據，重點介紹 ** 資料夾內的批次處理 ** 以及 ** 應用於 Word 和 PowerPoint 等其他 Office 檔案 ** 。\n1. 刪除單一 Excel 檔案的元數據 這是刪除單一 Excel 檔案個人資訊的最基本腳本。它呼叫 Excel 的 COM 物件，將 RemovePersonalInformation 屬性設定為 $true 並覆寫儲存。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # 在背景隱藏啟動 Excel 應用程式 $excel = New-Object -ComObject Excel.Application $excel.Visible = $false $excel.DisplayAlerts = $false # 開啟檔案（※請指定絕對路徑） $filePath = \u0026#34;C:\\Path\\To\\Your\\File.xlsx\u0026#34; $wb = $excel.Workbooks.Open($filePath) # 啟用刪除元數據（個人資訊）的設定 $wb.RemovePersonalInformation = $true # 覆寫儲存並關閉 $wb.Save() $wb.Close($false) # 結束 Excel 並釋放記憶體 $excel.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null ** 注意事項： ** 傳遞給 Workbooks.Open() 的路徑請務必指定 ** 絕對路徑（完整路徑） ** 。若是相對路徑可能會導致錯誤。\n2. 批次處理資料夾內所有的 Excel 檔案 在實務中，經常會遇到「想要一口氣刪除特定資料夾內數十個 Excel 檔案的元數據」的情況。這可以透過結合 Get-ChildItem 進行迴圈處理來實現。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 $targetFolder = \u0026#34;C:\\Path\\To\\Your\\Folder\u0026#34; # 取得資料夾內所有的 .xlsx 及 .xls 檔案 $excelFiles = Get-ChildItem -Path $targetFolder -Include \u0026#34;*.xlsx\u0026#34;, \u0026#34;*.xls\u0026#34; -Recurse if ($excelFiles.Count -eq 0) { Write-Host \u0026#34;找不到 Excel 檔案。\u0026#34; exit } $excel = New-Object -ComObject Excel.Application $excel.Visible = $false $excel.DisplayAlerts = $false foreach ($file in $excelFiles) { Write-Host \u0026#34;正在刪除 $($file.Name) 的元數據...\u0026#34; # 開啟檔案 $wb = $excel.Workbooks.Open($file.FullName) # 刪除元數據並覆寫儲存 $wb.RemovePersonalInformation = $true $wb.Save() $wb.Close($false) } $excel.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null Write-Host \u0026#34;所有處理已完成！\u0026#34; 3. 刪除其他 Office 檔案 (Word / PowerPoint) 的元數據 不僅是 Excel，Word 和 PowerPoint 也可以使用完全相同的邏輯來刪除元數據。只是呼叫的 COM 物件名稱不同，且都具備 RemovePersonalInformation 屬性。\n針對 Word 的情況 1 2 3 4 5 6 7 8 9 10 11 $word = New-Object -ComObject Word.Application $word.Visible = $false $word.DisplayAlerts = 0 $doc = $word.Documents.Open(\u0026#34;C:\\Path\\To\\Your\\File.docx\u0026#34;) $doc.RemovePersonalInformation = $true $doc.Save() $doc.Close() $word.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($word) | Out-Null 針對 PowerPoint 的情況 PowerPoint 的情況在 RemovePersonalInformation 屬性的設定上是相同的，但在隱藏啟動的行為上稍有不同。\n1 2 3 4 5 6 7 8 9 10 $ppt = New-Object -ComObject PowerPoint.Application # 在第 2 到第 4 個參數中指定隱藏模式 (msoFalse) 等來開啟 $presentation = $ppt.Presentations.Open(\u0026#34;C:\\Path\\To\\Your\\File.pptx\u0026#34;, $false, $false, $false) $presentation.RemovePersonalInformation = $true $presentation.Save() $presentation.Close() $ppt.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ppt) | Out-Null 總結 透過運用 PowerShell 和 COM 物件，您可以完全自動化 Office 檔案元數據的刪除作業。為了防止機密資訊或個人姓名在非預期的情況下外流，手邊準備一個交件前的資料夾批次處理腳本會是非常方便的。\n","date":"2025-07-30T02:42:40+09:00","image":"http://kenji.blog/p/powershell-%E3%81%A7-excel-%E3%81%AE%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E5%80%8B%E4%BA%BA%E6%83%85%E5%A0%B1%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/powershell_metadata_eyecatch_1788588033601_hud95a00206aa1dcf32de9cdc0ccb17972_952041_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/zh-tw/p/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-powershell-%E5%88%AA%E9%99%A4-excel-%E7%9A%84%E5%85%83%E6%95%B8%E6%93%9A%E5%80%8B%E4%BA%BA%E8%B3%87%E8%A8%8A/","title":"如何使用 PowerShell 批次刪除 Excel、Word 等的元數據（個人資訊）"},{"content":"克卜勒猜想淺顯易懂的解說！〜最密實裝箱西瓜的方法〜 大家好，我是 kenji！\n今天我想盡可能淺顯易懂地解說一個名字聽起來有點難的數學話題：「克卜勒猜想」。\n乍看之下，這似乎是一個非常硬核的話題，但其實它也和我們身邊的問題息息相關：「如何才能將西瓜最密實地裝進箱子裡？」。這也與便利商店的冰箱有關，還與貨物的堆疊方式有關。\n而且，在數學界，這甚至是一個 超過 400 年無法被證明 的超級浪漫的故事。\n那我們開始吧！\n首先，克卜勒是誰？ 首先，「克卜勒猜想」中的「克卜勒」是誰？\n這是一位名叫 約翰尼斯·克卜勒（Johannes Kepler） 的德國天文學家兼數學家的名字。\n這個人非常厲害。 例如，發現行星軌道是橢圓形的人就是他。這在現在是常識，但在當時（大約 1600 年），那甚至是一個地動說還沒有被完全相信的時代。\n伽利略 ＝ 觀測的天才 克卜勒 ＝ 用數學公式解釋宇宙的天才 牛頓 ＝ 將該理論總結為物理定律的超級天才 在這樣的定位下，克卜勒是「用數學公式談論宇宙」的先驅者。\n那麼，有一次他這樣說了：\n克卜勒猜想是什麼？ 簡單來說，「克卜勒猜想」就是這樣一個故事。\n當將相同大小的球（西瓜或橘子）裝入箱子時，哪種排列方式能裝得最密實？\n就是這個問題。\n而在 1600 年代，克卜勒猜想的是：\n像蔬果店裡擺放橘子那樣，排成三角形會不會是最有效率的？\n用數學語言來說，這被稱為 「最密堆積問題（Sphere Packing）」 ，這是一個尋找在空間中最密實地鋪滿球的方法的問題。\n克卜勒猜想，被稱為 「面心立方結構（FCC）」 的排列方式（就像將西瓜堆成三角形那樣）是最有效率的。\n大家雖然都覺得「確實看起來是這樣～」，但是在數學上要證明「這絕對是最好的！」卻非常困難。\n證明竟然花了 400 年！？！ 那麼，它真正被證明是什麼時候呢……\n竟然是 1998年〜2005年左右 。 也就是說，將近 400 年都沒有人能證明出來 。太不可思議了。\n而且，證明它的是一位名叫 托馬斯·黑爾斯（Thomas Hales） 的美國數學家。\n這個人判斷只靠手算是不可能的，因此 使用了電腦進行證明 。 然而，由於該證明過於複雜，導致人類無法好好檢查！這引發了一個問題。\n於是，在數學界也引發了一場大爭論：「那麼，用電腦證明的結果真的可以相信嗎？」。\n結果，「包含電腦在內，我已經嚴格驗證過了！」的證明（正式稱為「形式化證明」）是在 2014 年 完成的。\n也就是說，直到證明克卜勒的直覺是正確的，花了超過 400 年 。真是太浪漫了。\n在實際生活中也被廣泛應用 你可能會認為「球該怎麼排列」只是數學宅男的話題，但實際上它非常實用。\n在便利商店的冰箱裡有效率地擺放飲料 將罐頭堆疊在運輸托盤上時 也被應用於通訊（例如數位訊號的壓縮） 用於 3D 列印機或晶體結構的設計 等等，這其實是我們生活中背後被大量使用的理論。\n總結：人類的直覺很了不起 那麼，我們來總結一下。\n克卜勒猜想 ＝ 如何將球裝得最密實的問題 克卜勒先生 ＝ 發現行星軌道的數學兼天文學家 是在 1600 年代猜測的！但被證明是在 2000 年代！ 在實際生活中也被廣泛應用！ 而最有趣的一點是， 「蔬果店憑直覺堆疊的方法，在數學上也是最強的」 。\n也就是說，人類的直覺很了不起 。 而且，證明這一點可能需要花上 400 年 ，這真的是一個充滿浪漫色彩的故事呢。\n如果你對此感興趣，請務必搜尋看看「托馬斯·黑爾斯」、「形式化證明」、「Sphere Packing」。深入挖掘的話會非常有趣。\n那麼下次見！\n[PR]\n今すぐ購入 ","date":"2025-07-21T22:53:03+09:00","image":"http://kenji.blog/p/%E3%82%B1%E3%83%97%E3%83%A9%E3%83%BC%E4%BA%88%E6%83%B3%E3%82%92%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%8F%E8%A7%A3%E8%AA%AC/img_huc7f0a2c79b029796989bdbbe22e755bc_619919_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/kepler-conjecture-explained/","title":"克卜勒猜想淺顯易懂的解說"},{"content":"AI開發的壁壘 ～雖然來到了第八合目，但從那之後才是地獄的故事～\n大家好，我是kenji。\n最近，非常頻繁地聽到大家說：「只要拜託AI，就能輕易做出應用程式了！」 我們已經跨越了無程式碼（No-code）或低程式碼（Low-code）的時代，進入了「Vibe Coding（憑感覺寫程式碼）」的階段。\n舉例來說，只要說「做一個可以編輯圖片並發布到社群媒體的應用程式」，AI就會吐出程式碼甚至UI。 你是不是會覺得：「太厲害了，已經不需要人類了吧？」\n但是，這其實 就像是穿著涼鞋降落在富士山的第八合目一樣 。\n到第八合目為止看起來像是「輕而易舉」 一開始，用AI開發真的非常輕鬆。 檔案I/O？總之能運作。 網路？嘛，能連上。 資料庫？用JSON就可以了吧。 UI？ChatGPT已經幫我寫出React程式碼了。 支付？Stripe的API大概複製貼上就行了。\n在這裡，你會產生一種錯覺：「我，是不是已經是個工程師了？」 但是，真正的地獄從這裡才開始。\n為什麼會卡關？ 理由很簡單，因為「AI雖然能做出看起來像樣的東西，但最終調整還是全丟給人類」。\n因為檔案I/O導致資料消失 資料庫正規化不夠嚴謹導致搜尋緩慢 UI不夠直覺 沒有進行壓力測試，流量一集中就崩潰 被Apple/Google的審查退回 觸及法律規範要求而差點引發公關危機 也就是說， AI擅長製作「外表看起來已完成的原型」 ，但 將其打磨成「真正在世上行得通的產品」，至今依然是人類的工作 。\n但是，這裡存在一個悖論 在這裡，我們會發現一個 悖論 。\n如果未來AI真的變得什麼都能做到了呢？ 也就是說，當「安全性、計費、設計全都能由AI完美處理」的時候呢？\n到那時候， 人類可能根本不再需要製作應用程式了 。\n因為只要使用者直接對AI說「我想做這件事」， 即使沒有應用程式，任務也會被立即執行完畢。\n🌀 舉例來說 以前我們會「為了計算而開啟計算機應用程式」，但 現在只要說「Hey Siri，12乘32是多少？」就結束了。\n同樣地， 如果說「請AI幫我編輯照片並分享」，可能根本不需要經過應用程式的UI或API，處理就已經完成了。\n換句話說， 當「用AI製作應用程式」這個目標實現時，或許就會迎來一個根本不需要應用程式的世界 。\n說到底，我們現在能做什麼 那麼，我們該怎麼辦呢？\n現在「第八合目以上」仍然是人類的領域，所以要精進這部分 專注於本質上的使用者理解與服務設計 思考「有價值的東西」而不是「能被做出來的東西」 甚至，探索「不侷限於應用程式形式」的價值提供方式 AI是工具、是升降機，有時也是競爭對手。 但是， 「要做什麼」以及「為什麼要做」，依然是我們人類面臨的課題 。\n總結： AI開發的壁壘，並非技術問題，而是結構上的悖論\n這是一個任何人都能到達富士山第八合目的時代。 但從那之後才是真正的考驗。\n而且，當我們終於登頂時， 或許會迎來一個讓我們重新思考：「我們真的有必要爬這座山嗎？」的未來。\n","date":"2025-07-20T21:52:42+09:00","image":"http://kenji.blog/p/ai%E9%96%8B%E7%99%BA%E3%81%AE%E5%A3%81/img_1_hu929f602c53dcc1c0d00e8a53b025b29e_1978511_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/ai-development-barrier/","title":"AI開發的壁壘"},{"content":"🎯 如何從 C++ 呼叫 Microsoft.Windows.AI【附範例程式碼】 自 Windows 10 起，Windows 預設內建了 能夠執行 ONNX 格式 AI 模型的執行階段 。這就是 Windows ML (Windows.AI.MachineLearning) 。\n這篇文章將具體解說如何從 C++（基於 Win32 應用程式） 呼叫 Microsoft.Windows.AI.MachineLearning ，並 附上範例程式碼具體解說 。\n✅ 準備篇 ◾ 系統需求 Windows 10 (1809+) 或 Windows 11 Visual Studio 2019 或以上版本（Community 版即可） 支援 C++/WinRT (Microsoft.Windows.CppWinRT) Windows SDK 10.0.17763.0 或以上版本 ✅ 專案結構 在 Visual Studio 中建立具有以下結構的專案。\n類型：C++ Windows 桌面應用程式（空白專案）\n子系統：Windows (WinMain)\n透過 NuGet 新增以下套件\n1 Microsoft.Windows.CppWinRT ✅ 範例程式碼 以下是使用 WinMain 並結合 Win32 API 與 Windows.AI.MachineLearning 的最小配置範例。\n※ 使用的 ONNX 模型假設為 model.onnx ，請將其放置在與執行檔相同的資料夾中。\nmain.cpp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 #include \u0026lt;windows.h\u0026gt; #include \u0026lt;winrt/Windows.AI.MachineLearning.h\u0026gt; #include \u0026lt;winrt/Windows.Storage.h\u0026gt; #pragma comment(lib, \u0026#34;windowsapp\u0026#34;) // 用於 WinRT 連結 using namespace winrt; using namespace Windows::AI::MachineLearning; using namespace Windows::Storage; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) { // WinRT 初始化（MTA 或 STA 皆可） winrt::init_apartment(); try { // 讀取模型檔案 auto modelFile = StorageFile::GetFileFromPathAsync(L\u0026#34;model.onnx\u0026#34;).get(); LearningModel model = LearningModel::LoadFromStorageFileAsync(modelFile).get(); // 建立工作階段 LearningModelSession session(model); LearningModelBinding binding(session); // 模型的輸入與輸出（此處暫時為空輸入） // 實際上需要繫結 TensorFloat 等 // 執行推論 auto result = session.EvaluateAsync(binding, L\u0026#34;\u0026#34;).get(); MessageBox(nullptr, L\u0026#34;推論已完成\u0026#34;, L\u0026#34;Windows ML (C++)\u0026#34;, MB_OK); } catch (winrt::hresult_error const\u0026amp; ex) { MessageBox(nullptr, ex.message().c_str(), L\u0026#34;錯誤\u0026#34;, MB_ICONERROR); } return 0; } ✅ 補充：如何指定輸入與輸出 Tensor 根據模型的不同，在推論前可能需要 建立並繫結 Tensor 。\n範例：\n1 2 3 4 5 6 7 8 // 將一維 float 陣列轉換為 Tensor std::vector\u0026lt;float\u0026gt; inputData = {0.5f, 0.3f, 0.2f}; std::vector\u0026lt;int64_t\u0026gt; shape = {1, 3}; // 形狀：[1, 3] auto tensor = TensorFloat::CreateFromArray(shape, inputData); // 輸入繫結（需符合模型的輸入名稱） binding.Bind(L\u0026#34;input_0\u0026#34;, tensor); 輸出也同樣可以透過 result.Outputs().Lookup(L\u0026quot;output_0\u0026quot;) 取得。\n✅ 偵錯時的注意事項 若模型檔案不存在於執行資料夾中，將會拋出 FileNotFoundException 。 若輸入或輸出名稱不符，將會產生 invalid_argument 錯誤。 模型正確的 IO 規格可以使用 Netron 等工具確認。 ✅ 總結 項目 內容 使用 API Windows.AI.MachineLearning (WinRT) 語言 C++（基於 Win32） 建議方法 透過 C++/WinRT 標頭檔 優點 原生執行 ONNX 模型，也支援 GPU 注意 注意模型的輸入名稱與 Tensor 形狀 ✅ 替代方案：給不想使用 WinRT 的人 若使用微軟的 ONNX Runtime ，就能 完全不需要 WinRT 即可從 C++ 處理 ONNX 模型 。 支援跨平台，在 Windows 或 Linux 上也可以使用共通的程式碼。 📌 結語 Windows ML (Microsoft.Windows.AI) 是一個非常強大的人工智慧推論引擎，即使從 C++ 也能輕鬆使用。如果需要在 Windows 上進行原生推論，請務必嘗試看看。\n如果您需要建立 ONNX 模型或 Tensor 繫結的具體範例，我們將在後續文章中進行解說！\n","date":"2025-07-19T10:03:51+09:00","image":"http://kenji.blog/p/c-%E3%81%8B%E3%82%89microsoft.windows.ai%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E6%96%B9%E6%B3%95/img_hub9c7b00735e02a7f33c50dd8006e2228_376811_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%A6%82%E4%BD%95%E5%BE%9Ec-%E5%91%BC%E5%8F%ABmicrosoft.windows.ai/","title":"如何從 C++ 呼叫 Microsoft.Windows.AI"},{"content":"✅ TinyLLaMA × C++ 設定步驟（使用 llama.cpp） 🔧 Step 1: 準備 llama.cpp 1-1. 必備環境（最低需求） OS: Windows / Linux / macOS 開發環境: g++ / clang / MSVC Git / CMake 1-2. 取得並建置 llama.cpp 1 2 3 4 5 6 git clone https://github.com/ggerganov/llama.cpp cd llama.cpp mkdir build cd build cmake .. cmake --build . --config Release Windows 使用者可以在 Visual Studio Developer Command Prompt 中執行 cmake --build . --config Release 會比較方便。\n📦 Step 2: 下載 TinyLLaMA 模型並轉換 2-1. 從 HuggingFace 取得原始模型 範例: TinyLLaMA-1.1B\n1 2 3 4 5 6 7 # 如有需要，使用 transformers 進行下載 pip install transformers huggingface_hub python3 -m transformers.models.llama.convert_llama_weights_to_hf \\ --input_dir ./TinyLlama-1.1B-Chat \\ --model_size 1B \\ --output_dir ./hf_model 這是轉換為 Hugging Face 格式的步驟。\n2-2. 轉換為 GGUF 格式（供 llama.cpp 使用） 1 2 cd llama.cpp python3 convert.py ./hf_model --outfile tinyllama.gguf 2-3. 模型量化（縮減大小） 1 ./quantize ./tinyllama.gguf ./tinyllama-q4.gguf q4_0 q4_0 為 4bit 量化。模型大小大約會縮減至 ** 350MB前後 ** 。\n🧪 Step 3: 從 C++ 呼叫模型（程式碼範例） 3-1. 簡易 C++ 程式碼（推論） 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #include \u0026#34;llama.h\u0026#34; #include \u0026lt;iostream\u0026gt; int main() { llama_model_params model_params = llama_model_default_params(); llama_context_params ctx_params = llama_context_default_params(); llama_model *model = llama_load_model_from_file(\u0026#34;tinyllama-q4.gguf\u0026#34;, model_params); llama_context *ctx = llama_new_context_with_model(model, ctx_params); std::string prompt = \u0026#34;使用者說想要讀取 Excel 資料、進行篩選並儲存。節點架構為何？\u0026#34;; llama_batch batch = llama_batch_init(512, 0, 1); llama_token BOS = llama_token_bos(model); batch.token[0] = BOS; // 進行 Tokenize std::vector\u0026lt;llama_token\u0026gt; tokens(prompt.size() + 8); int n = llama_tokenize(model, prompt.c_str(), tokens.data(), tokens.size(), true); tokens.resize(n); for (size_t i = 0; i \u0026lt; tokens.size(); ++i) { batch.token[i + 1] = tokens[i]; } batch.n_tokens = tokens.size() + 1; llama_decode(ctx, batch); // 取得推論結果 for (int i = 0; i \u0026lt; 50; ++i) { llama_token next = llama_sample_token(ctx, nullptr); std::cout \u0026lt;\u0026lt; llama_token_to_str(model, next); llama_batch next_batch = llama_batch_init(1, 0, 1); next_batch.token[0] = next; next_batch.n_tokens = 1; llama_decode(ctx, next_batch); } llama_free(ctx); llama_free_model(model); return 0; } 🧱 Step 4: 編譯方法（範例） 1 g++ -I./llama.cpp main.cpp ./llama.cpp/build/libllama.a -o tiny_infer -pthread -std=c++11 libllama.a 會在建置後的 build/ 目錄中產生。\n✅ 成果物結構範例（整理） 1 2 3 4 5 6 my_app/ ├── tinyllama-q4.gguf # 已量化模型 (~350MB) ├── main.cpp # 上述 C++ 程式碼 ├── llama.cpp/ # llama.cpp 本體 └── build/ └── libllama.a # 已編譯函式庫 🧠 應用於使用案例的補充說明 在 C++ 內保有接受輸出並 比對/選擇節點範本 的程式碼 範例：若包含「Excel」「篩選」「儲存」→ 產生對應的節點群組 此部分採用 if 判斷式 + 讀取 JSON 範本 的簡單架構即可 📌 總結 項目 內容 推薦模型 TinyLLaMA-1.1B-Chat v1.0（GGUF + 量化） 大小 ~350〜450MB（4bit量化） C++整合 可透過 llama.cpp 達成，幾乎無外部依賴 處理能力 足以應付簡單的意圖理解與輸出句子生成（自然語言→架構） 擴充性 結合插槽填寫與範本呼叫，即可成為節點生成 AI ","date":"2025-07-19T09:40:53+09:00","image":"http://kenji.blog/p/tinyllama-%E3%82%92-c-%E3%81%8B%E3%82%89%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%9B%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86llama.cpp%E4%BD%BF%E7%94%A8/img_huf78e5769214ace33fee09d1baa98793b_1915663_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%BE%9E-c-%E5%91%BC%E5%8F%AB-tinyllama-%E7%9A%84%E6%AD%A5%E9%A9%9F%E4%BD%BF%E7%94%A8-llama.cpp/","title":"從 C++ 呼叫 TinyLLaMA 的步驟（使用 llama.cpp）"},{"content":"✅ 使用存取權杖的發文方法（Slack Web API） Slack 的「OAuth Token（例如 xoxb-\u0026hellip; 等）」是用來透過 Slack 的 Web API 發文的密鑰。 在這種情況下，與 Webhook 不同，你需要向 Slack API 端點 進行帶有 Authorization: Bearer 標頭的 POST 請求。\n🔑 必要前提 你必須在 Slack 應用程式的 OAuth 範圍內包含 chat:write ：\n設定步驟 前往 https://api.slack.com/apps 建立應用程式或選擇現有應用程式 在「OAuth \u0026amp; Permissions」 \u0026gt; Scopes 中 → 新增 chat:write 點擊「Install to Workspace」或「Reinstall」以獲取 Access Token（例如：xoxb-xxxxxxxxxx） 💻 C++ 程式碼（使用 WinHTTP 向 Slack API 發送請求） 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 #include \u0026lt;windows.h\u0026gt; #include \u0026lt;winhttp.h\u0026gt; #include \u0026lt;iostream\u0026gt; #pragma comment(lib, \u0026#34;winhttp.lib\u0026#34;) bool PostSlackMessage(const std::wstring\u0026amp; accessToken, const std::string\u0026amp; channel, const std::string\u0026amp; text) { const wchar_t* host = L\u0026#34;slack.com\u0026#34;; const wchar_t* path = L\u0026#34;/api/chat.postMessage\u0026#34;; HINTERNET hSession = WinHttpOpen(L\u0026#34;SlackPoster/1.0\u0026#34;, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); if (!hSession) return false; HINTERNET hConnect = WinHttpConnect(hSession, host, INTERNET_DEFAULT_HTTPS_PORT, 0); if (!hConnect) return false; HINTERNET hRequest = WinHttpOpenRequest(hConnect, L\u0026#34;POST\u0026#34;, path, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE); // Authorization 標頭與 Content-Type std::wstring headers = L\u0026#34;Content-Type: application/json\\r\\n\u0026#34;; headers += L\u0026#34;Authorization: Bearer \u0026#34; + accessToken + L\u0026#34;\\r\\n\u0026#34;; // JSON 內容 std::string body = R\u0026#34;({\u0026#34;channel\u0026#34;:\u0026#34;)\u0026#34; + channel + R\u0026#34;(\u0026#34;,\u0026#34;text\u0026#34;:\u0026#34;)\u0026#34; + text + R\u0026#34;(\u0026#34;})\u0026#34;; BOOL result = WinHttpSendRequest(hRequest, headers.c_str(), (DWORD)-1, (LPVOID)body.c_str(), body.length(), body.length(), 0); if (!result || !WinHttpReceiveResponse(hRequest, NULL)) { std::cerr \u0026lt;\u0026lt; \u0026#34;發送錯誤\\n\u0026#34;; return false; } // 確認狀態碼 DWORD statusCode = 0; DWORD size = sizeof(statusCode); WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, WINHTTP_HEADER_NAME_BY_INDEX, \u0026amp;statusCode, \u0026amp;size, WINHTTP_NO_HEADER_INDEX); WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return (statusCode == 200); } int main() { std::wstring token = L\u0026#34;xoxb-你的存取權杖\u0026#34;; // 存取權杖 std::string channel = \u0026#34;頻道ID或者#general\u0026#34;; // 範例: \u0026#34;#general\u0026#34; 或 \u0026#34;C0123456789\u0026#34; std::string message = \u0026#34;嘗試從 C++ 發送訊息到 Slack！\u0026#34;; if (PostSlackMessage(token, channel, message)) { std::cout \u0026lt;\u0026lt; \u0026#34;發文成功！\\n\u0026#34;; } else { std::cerr \u0026lt;\u0026lt; \u0026#34;發文失敗。\\n\u0026#34;; } return 0; } 📌 如何獲取頻道 ID 僅使用頻道名稱（例如：#general）可能會導致錯誤。 最可靠的方法是使用 Slack 頻道頁面 URL 中的 ID。\n1 2 https://app.slack.com/client/Txxxxx/C0123456789 ↑這部分就是頻道 ID ✅ 關於權杖類型（補充） 權杖格式 用途 範例 xoxb-... Bot Token（推薦） 發文、編輯、刪除 xoxp-... User Token（不推薦） 非 Bot 相關操作 Refresh Token 用於長期權杖更新 通常不使用 📝 總結 要從 C++ 發文到 Slack，使用 Slack Web API + Bearer Token 方式最為可靠 使用 HTTPS POST 發送至 chat.postMessage 端點 必須透過 Bearer 標頭發送權杖 確保 指定頻道 ID 以確保準確性 ","date":"2025-07-16T23:36:27+09:00","image":"http://kenji.blog/p/slack-app--oauth2-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-slack-%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_huc0fc953b24035d17918192b772178b43_75467_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/slack-app--oauth2-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-slack-%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"如何使用 Slack App + OAuth2 發送訊息到 Slack"},{"content":"使用 C++（Win32 API + WinHTTP）發送訊息至 Slack 的方法【支援 Webhook】 想要從 C++ 發送訊息到 Slack。 在 Node.js 或 Python 中這很常見，但使用「C++ × Win32 API × WinHTTP」來做的情況應該很少見吧。\n這篇文章將以循序漸進的方式，淺顯易懂地解說 如何使用 Webhook URL 從 C++ 發送訊息到 Slack 。\n✅ 整體流程 要發布到 Slack，需要遵循以下步驟。\n取得 Slack 的 Webhook URL（API 金鑰） 使用 WinHTTP 發送 POST 請求 以 JSON 格式建立訊息主體 檢查結果即可完成！ 🔑 Step1：取得 Slack Webhook URL 的方法 在 Slack 中，可以使用 Incoming Webhooks 的功能，輕鬆地從外部服務發送訊息。\n取得步驟 進入 https://api.slack.com/apps 點擊 Create New App 選擇 From scratch 並選擇應用程式名稱與發布目標工作區 從左側選單選擇 「Incoming Webhooks」 並啟用 點擊 「Add New Webhook to Workspace」 ，然後選擇頻道 複製發行的 URL（例如: https://hooks.slack.com/services/xxx/yyy/zzz） 這個 URL 將如同 API 金鑰般發揮作用。\n💻 Step2：使用 C++ 程式碼發送訊息至 Slack 使用技術 Win32 API WinHTTP（標準函式庫） JSON 格式訊息 範例程式碼（發佈至 Slack） 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 #include \u0026lt;windows.h\u0026gt; #include \u0026lt;winhttp.h\u0026gt; #include \u0026lt;iostream\u0026gt; #pragma comment(lib, \u0026#34;winhttp.lib\u0026#34;) bool PostToSlack(const std::wstring\u0026amp; webhookUrl, const std::string\u0026amp; messageJson) { // 解析 URL URL_COMPONENTS urlComp{}; wchar_t hostName[256]; wchar_t urlPath[1024]; urlComp.dwStructSize = sizeof(urlComp); urlComp.lpszHostName = hostName; urlComp.dwHostNameLength = _countof(hostName); urlComp.lpszUrlPath = urlPath; urlComp.dwUrlPathLength = _countof(urlPath); if (!WinHttpCrackUrl(webhookUrl.c_str(), 0, 0, \u0026amp;urlComp)) { std::wcerr \u0026lt;\u0026lt; L\u0026#34;URL 解析失敗\\n\u0026#34;; return false; } // HTTP 階段與連線 HINTERNET hSession = WinHttpOpen(L\u0026#34;SlackPoster/1.0\u0026#34;, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); HINTERNET hConnect = WinHttpConnect(hSession, hostName, urlComp.nPort, 0); HINTERNET hRequest = WinHttpOpenRequest(hConnect, L\u0026#34;POST\u0026#34;, urlPath, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE); std::wstring headers = L\u0026#34;Content-Type: application/json\\r\\n\u0026#34;; BOOL result = WinHttpSendRequest(hRequest, headers.c_str(), -1, (LPVOID)messageJson.c_str(), messageJson.length(), messageJson.length(), 0); if (!result) { std::cerr \u0026lt;\u0026lt; \u0026#34;發送請求失敗\\n\u0026#34;; return false; } WinHttpReceiveResponse(hRequest, NULL); DWORD statusCode = 0; DWORD size = sizeof(statusCode); WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, WINHTTP_HEADER_NAME_BY_INDEX, \u0026amp;statusCode, \u0026amp;size, WINHTTP_NO_HEADER_INDEX); // 釋放資源 WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return (statusCode == 200); } int main() { std::wstring webhookUrl = L\u0026#34;https://hooks.slack.com/services/xxx/yyy/zzz\u0026#34;; // 請替換成自己的 Webhook std::string message = R\u0026#34;({ \u0026#34;text\u0026#34;: \u0026#34;Hello from C++ :rocket:\u0026#34;, \u0026#34;username\u0026#34;: \u0026#34;C++ Bot\u0026#34;, \u0026#34;icon_emoji\u0026#34;: \u0026#34;:robot_face:\u0026#34; })\u0026#34;; if (PostToSlack(webhookUrl, message)) { std::cout \u0026lt;\u0026lt; \u0026#34;發布成功！\\n\u0026#34;; } else { std::cerr \u0026lt;\u0026lt; \u0026#34;發布失敗。\\n\u0026#34;; } return 0; } 🧪 自訂 JSON 訊息 在 Slack 的 Webhook 中，可以包含以下參數：\n1 2 3 4 5 6 { \u0026#34;text\u0026#34;: \u0026#34;通知內容\u0026#34;, \u0026#34;username\u0026#34;: \u0026#34;Bot 名稱\u0026#34;, \u0026#34;icon_emoji\u0026#34;: \u0026#34;:rocket:\u0026#34;, \u0026#34;channel\u0026#34;: \u0026#34;#任意頻道名稱\u0026#34; } 📌 補充事項 Content-Type 必須指定為 \u0026quot;application/json\u0026quot; Webhook URL 直接以 wstring 傳遞即可（無需 URL 編碼） 因為是 HTTPS 通訊，請別忘了加上 WINHTTP_FLAG_SECURE 🎉 附錄：Slack 中的發布確認範例 在 Slack 中會這樣顯示：\n1 2 [C++ Bot] Hello from C++ :rocket: ✍️ 總結 項目 內容 發布方式 Webhook (Incoming Webhooks) 通訊函式庫 WinHTTP 資料格式 JSON 可用參數 text, username, icon_emoji, channel 等 還在想著怎麼用 C++ 整合 Slack 嗎？你也可以從今天開始加入通知 Bot！\n🚀 下集預告？ 如果您有興趣，下次我們可以：\n檔案附件 帶按鈕的 UI 使用 Slack App + OAuth2 進行靈活的 API 操作 等，為您介紹更進一步的 Slack 整合！\n","date":"2025-07-16T19:42:56+09:00","image":"http://kenji.blog/p/c-win32-api--winhttp%E3%81%A7slack%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95webhook%E5%AF%BE%E5%BF%9C/img_huc0fc953b24035d17918192b772178b43_75467_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E4%BD%BF%E7%94%A8-c-win32-api--winhttp%E7%99%BC%E9%80%81%E8%A8%8A%E6%81%AF%E8%87%B3-slack-%E7%9A%84%E6%96%B9%E6%B3%95%E6%94%AF%E6%8F%B4-webhook/","title":"使用 C++（Win32 API + WinHTTP）發送訊息至 Slack 的方法【支援 Webhook】"},{"content":"Market-in 與 Product-out 大家好，我是 kenji。\n有時候在商業書或是企劃書上，\n「我們是 Market-in 策略」 「這個是 Product-out 型呢」\n會看到類似這樣的說法，但是……\n等等，Market-in？ Product-out？ 哪個比較厲害？？？\n大家不會這樣覺得嗎？\n所以這次，我想把這個「Market-in」和「Product-out」盡量講得白話一點，稍微帶點辛辣的觀點來看看。\n簡單來說… Market-in ：傾聽市場（Market）的聲音，並配合它來製造商品 Product-out ：把我們自己覺得好的東西（Product）做出來並推向世界 就這樣。很簡單。\n舉個拉麵店的例子… Market-in 的拉麵店會說， 「最近家系拉麵很流行呢。好，那就來點滿滿的油脂和大蒜吧！」\nProduct-out 的拉麵店則是， 「我做的這碗豆乳羅勒鹽味拉麵真的是最棒的，快吃吃看吧。」\n哪個才是正確答案呢…其實都對 Market-in 因為貼近顧客需求，所以「賣得好的機率很高」，但很難產生突破性的想法。\nProduct-out 則是「把我們相信的正義具象化」，所以很有個性且吸引人，但一旦搞錯了，就無法引起任何人的共鳴。\niPhone 感覺像是 Product-out 在大家說著「才不需要智慧型手機呢」的時代，Apple 推出了 iPhone。\n這已經是 完全 Product-out 的成功案例了。\n如果當初聽了用戶的聲音，只會得到「沒有鍵盤的手機？不可能啦」然後就結束了。\n但是 Product-out 很容易變成「自我滿足」 有時候會有些企業或人說，「因為我們是 Product-out 型」，但是，\n欸，這不就只是無視用戶嗎？\n有時也會讓人這麼想。\n「因為想做就做了。但是賣不出去」 這不是 Product-out，而是「自以為是-out」呢。\nMarket-in 也有陷阱 另一方面，Market-in 也不是萬能的。\n如果說著「只要是用戶要求的我們全做！」，產品的核心就會動搖，結果誰也吸引不了。\n不斷地增加功能，回過神來才發現變成了一個混亂的工具，大概就是這種感覺。\n真正厲害的，是「兩者兼具的人」 厲害的產品，能精準地提出「用戶真正需要，卻無法用言語表達的東西」。\n也就是說，「用 Product-out 的發想，取得 Market-in 式的共鳴」。\n這說起來簡單，但其實超級困難的。 不過，如果能做到這點，就會一口氣變成「神級產品」。\n結論：比起言語，用戶的反應才是一切 Market-in 還是 Product-out。 哪一個才是對的，這其實是沒什麼意義的問題。\n「是否有確實傳達到用戶心裡？」這才是一切 ，我是這麼認為的。\n「我們是偏向哪種策略」之類的， 等之後能寫進簡報裡就好了吧，我大概是這樣想的。\n以上，就是關於 Market-in 與 Product-out 的話題！\n不要被奇怪的外來語迷惑，「結果到底該怎麼做才能讓人開心？」去思考這一點，才是最健全的。\n那麼下次見囉～。\n","date":"2025-07-15T20:18:22+09:00","image":"http://kenji.blog/p/%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%83%E3%83%88%E3%82%A4%E3%83%B3%E3%81%A8%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%83%88%E3%82%A2%E3%82%A6%E3%83%88/img_hu9af708a897f548be4a7980daec441f8f_1946278_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/market-in-and-product-out/","title":"Market-in 與 Product-out"},{"content":"\u0026ldquo;任何數字最後都會變成 1\u0026rdquo; 這是真的嗎？── 試玩角谷猜想 你好！我是 kenji。\n突然問一下，如果你聽到 \u0026ldquo;無論什麼數字最後都會變成 1 的規則\u0026rdquo;， 是不是覺得有點不可思議？\n比如說 19，或者 87，甚至 1000000 也好。 只要按照適當的規則改變數字，不知為何最後都會收斂到 \u0026ldquo;1\u0026rdquo;。\n這種像夢一樣的故事，就是 ** 角谷猜想（Collatz Conjecture） **。\n到底什麼是角谷猜想？ 首先來介紹規則。\n起點：選擇任意 ** 正整數 **\n操作：\n如果是偶數 → 就減半（n → n / 2） 如果是奇數 → 就乘以 3 再加 1（n → 3n + 1） 如果一直重複這樣做，這就是一個 ** 任何數字最終都會到達 1 ** 的猜想。\n例如，從 6 開始：\n1 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 乖乖變成 \u0026ldquo;1\u0026rdquo; 了。歡迎回來！\n用程式碼試試看：用 Python 跑角谷猜想 說到這個，這時候用程式碼測試最快！ 讓我們用 Python 來輸出 \u0026ldquo;角谷數列\u0026rdquo; 吧。\n1 2 3 4 5 6 7 8 9 10 11 12 def collatz(n): steps = [n] while n != 1: if n % 2 == 0: n = n // 2 else: n = 3 * n + 1 steps.append(n) return steps # 範例：從 19 開始 print(collatz(19)) 執行結果：\n1 [19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1] 完美地到達了 1。 雖然繞了很大的遠路，但最後還是順利達陣！\n順帶一提，即使從 29 開始，也會以同樣的方式到達 1。\n1 print(collatz(29)) 執行結果\n1 2 3 4 5 6 7 8 [27, 82, 41, 124, 62, 31, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242, 121, 364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502, 251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732, 866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1] 居然花了 111 個步驟！\n而且，中途還有膨脹到 9000 以上的場面。 這是個瘋狂繞遠路之後才達陣的模式呢。\n所以，這到底哪裡厲害？ 這個猜想厲害的地方在於，\n** 雖然還沒被證明，但不管用什麼數字似乎都會變成 1 **\n就是這點。\n咦？那 1 兆，或者 1 京呢\u0026hellip;？\n想到這裡的人，很敏銳。 實際上，已經用電腦確認到大約 \u0026ldquo;2 的 68 次方\u0026rdquo;， ** 全部都到達了 1 **。難以置信\u0026hellip;。\n但是，** 還沒有在理論上被證明 \u0026ldquo;全部都會這樣\u0026rdquo; **。 這就是在數學界被稱為 \u0026ldquo;未解問題\u0026rdquo; 的東西。\nCollatz 先生是誰？ 那麼，讀到這裡你一定會想 \u0026ldquo;說到底 Collatz 是誰？\u0026rdquo; 吧。 我來好好介紹一下！\n姓名： ** 洛塔爾·科拉茨 (Lothar Collatz) ** 國籍：德國 生卒年：1910年〜1990年 頭銜：數學家（活躍於泛函分析和數論領域） 他在 1937 年提出了這個猜想， 之後的 80 多年來， ** 誰也沒能證明，也無法反證 **。\n順帶一提，這個問題雖然很簡單，但卻深奧到 就連保羅·艾狄胥（超級有名的數學家）都這麼說。\n\u0026ldquo;數學還沒有成熟到可以處理角谷猜想\u0026rdquo;\n也就是說，人類的數學還沒追上這個謎團的說法\u0026hellip;。\n不需要 \u0026ldquo;艱澀的數學公式\u0026rdquo; 角谷猜想的優點是， ** 任何人都可以玩 **。\n只要有紙和筆就能算。 用 Python 寫程式碼的話，可以自動測試。 即便如此， ** 最頂尖的數學家們卻在認真挑戰它 **。\n總覺得，是不是很令人興奮？\n附錄：一口氣測試的程式碼 我也把能一次測試各種數字的程式碼貼上來。\n1 2 3 for n in range(1, 21): steps = collatz(n) print(f\u0026#34;{n}: {steps}（步驟數: {len(steps)-1}）\u0026#34;) 這能一口氣印出 \u0026ldquo;1～20\u0026rdquo; 的角谷數列。\n結論：這個世界，果然不可思議 這就是角谷猜想。\n明明超級簡單 卻誰也無法證明 在數學界是個大問題 就是這樣一個像謎團綜合體般的存在。\n因為即使是程式設計初學者也能嘗試，請務必玩玩看喔～！\n推薦連結（給有興趣的人） Wikipedia: 角谷猜想 Terence Tao 論文（英文） 試著做個 Python 視覺化版本也很有趣喔！（如果有需求的話我會做） 如果你想知道更多這類 \u0026ldquo;不可思議系數學×程式設計\u0026rdquo; 的題材， 請隨時提出 \u0026ldquo;多教我一點\u0026rdquo; 的要求。 之後我也會介紹黎曼猜想、質數等等的各種話題！\n📮結束！\n","date":"2025-07-15T18:03:03+09:00","image":"http://kenji.blog/p/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E4%BA%88%E6%83%B3/img_hu1a59efae05835f74694145ebf674f295_4369684_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E4%BA%88%E6%83%B3/","title":"コラッツ予想"},{"content":"如何從 C++ 向 Microsoft Teams 發佈訊息（WinHTTP + Graph API） 想自動發佈訊息到 Microsoft Teams 聊天室中嗎？\n這時候可以使用的就是 Microsoft Graph API 。\n在本文中，我們將透過步驟介紹 使用 WinHTTP 的 C++ 程式碼範例 以及 必要的 API 認證步驟 。\n🔧 必要的準備（Microsoft Graph API 認證設定） 1. 在 Azure 入口網站註冊應用程式 首先，要使用 Microsoft Graph API，必須在 Azure 註冊應用程式。\n前往 Azure Portal 「Microsoft Entra ID」 \u0026gt; 「＋新增」 \u0026gt; 「應用程式註冊」 \u0026gt; 「新增註冊」 輸入任意應用程式名稱後點擊「註冊」 2. 新增 API 權限 前往左側選單的「API 權限」 在 「Microsoft Graph」 \u0026gt; 「新增權限」 中搜尋以下範圍，然後點擊 「更新權限」 Chat.ReadWrite User.Read ※ 若想要發佈到頻道，則還需要 ChannelMessage.Send\n3. 記下用戶端識別碼與租用戶識別碼 記下顯示在「概觀」索引標籤中的以下兩項：\n應用程式 (用戶端) 識別碼 目錄 (租用戶) 識別碼 4. 建立用戶端密碼 前往「憑證與密碼」索引標籤 點擊「新增用戶端密碼」 \u0026gt; 設定到期日後，點擊「新增」 顯示的值（密碼）請 務必當下立刻記下 🔐 取得存取權杖（OAuth2） 取得時我們使用 client_credentials 流程。\n使用 curl 執行以下命令，以取得存取權杖。\n1 2 3 4 5 6 7 curl -X POST ^ https://login.microsoftonline.com/{租用戶識別碼}/oauth2/v2.0/token ^ -H \u0026#34;Content-Type: application/x-www-form-urlencoded\u0026#34; ^ -d \u0026#34;client_id={用戶端識別碼}\u0026#34; ^ -d \u0026#34;scope=https%3A%2F%2Fgraph.microsoft.com%2F.default\u0026#34; ^ -d \u0026#34;client_secret={用戶端密碼}\u0026#34; ^ -d \u0026#34;grant_type=client_credentials\u0026#34; 回應範例 1 2 3 4 5 6 { \u0026#34;token_type\u0026#34;:\u0026#34;Bearer\u0026#34;, \u0026#34;expires_in\u0026#34;:3599, \u0026#34;ext_expires_in\u0026#34;:3599, \u0026#34;access_token\u0026#34;: \u0026#34;eyJ0eXAiOiJKV1QiLCJub...（省略）\u0026#34; } 使用此 access_token 來呼叫 Microsoft Graph API。\n💬 投稿到 Teams 聊天室的 C++ 範例 這裡示範使用 WinHTTP 向聊天室發佈訊息的 C++ 範例。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 #include \u0026lt;windows.h\u0026gt; #include \u0026lt;winhttp.h\u0026gt; #include \u0026lt;iostream\u0026gt; #include \u0026lt;string\u0026gt; #pragma comment(lib, \u0026#34;winhttp.lib\u0026#34;) void PostToTeamsChat(const std::wstring\u0026amp; accessToken, const std::wstring\u0026amp; chatId, const std::wstring\u0026amp; message) { HINTERNET hSession = WinHttpOpen(L\u0026#34;TeamsPoster/1.0\u0026#34;, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); HINTERNET hConnect = WinHttpConnect(hSession, L\u0026#34;graph.microsoft.com\u0026#34;, INTERNET_DEFAULT_HTTPS_PORT, 0); std::wstring endpoint = L\u0026#34;/v1.0/chats/\u0026#34; + chatId + L\u0026#34;/messages\u0026#34;; HINTERNET hRequest = WinHttpOpenRequest(hConnect, L\u0026#34;POST\u0026#34;, endpoint.c_str(), NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE); std::wstring jsonBody = L\u0026#34;{\\\u0026#34;body\\\u0026#34;: {\\\u0026#34;content\\\u0026#34;: \\\u0026#34;\u0026#34; + message + L\u0026#34;\\\u0026#34;}}\u0026#34;; std::wstring headers = L\u0026#34;Authorization: Bearer \u0026#34; + accessToken + L\u0026#34;\\r\\nContent-Type: application/json\\r\\n\u0026#34;; BOOL bResult = WinHttpSendRequest(hRequest, headers.c_str(), (DWORD)-1L, (LPVOID)jsonBody.c_str(), (DWORD)(jsonBody.length() * sizeof(wchar_t)), (DWORD)(jsonBody.length() * sizeof(wchar_t)), 0); if (bResult) WinHttpReceiveResponse(hRequest, NULL); DWORD dwSize = 0; WinHttpQueryDataAvailable(hRequest, \u0026amp;dwSize); if (dwSize \u0026gt; 0) { std::wstring response(dwSize / sizeof(wchar_t), 0); DWORD dwDownloaded = 0; WinHttpReadData(hRequest, \u0026amp;response[0], dwSize, \u0026amp;dwDownloaded); std::wcout \u0026lt;\u0026lt; L\u0026#34;Response: \u0026#34; \u0026lt;\u0026lt; response \u0026lt;\u0026lt; std::endl; } WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); } int main() { std::wstring access; std::wstring chatId = L\u0026#34;19:\u0026#34;; std::wstring message = L\u0026#34;Hello from C++!\u0026#34;; std::wcout \u0026lt;\u0026lt; L\u0026#34;Enter your access token: \u0026#34;; std::getline(std::wcin, access); std::wcout \u0026lt;\u0026lt; L\u0026#34;Enter chat ID: \u0026#34;; std::getline(std::wcin, chatId); PostToTeamsChat(access, chatId, message); return 0; } 🔍 取得聊天室識別碼的方法 聊天室識別碼可以透過 GET /v1.0/me/chats 來確認。\n1 2 3 4 curl -X GET ^ https://graph.microsoft.com/v1.0/me/chats ^ -H \u0026#34;Authorization: Bearer {access_token}\u0026#34; ^ -H \u0026#34;Content-Type: application/json\u0026#34; 回應範例 1 2 3 4 5 6 7 8 9 { \u0026#34;value\u0026#34;: [ { \u0026#34;id\u0026#34;: \u0026#34;19:abc123xyz@thread.v2\u0026#34;, \u0026#34;topic\u0026#34;: null, \u0026#34;chatType\u0026#34;: \u0026#34;oneOnOne\u0026#34; } ] } 📌 注意事項 此範例為最基本實作。在實際運用中： 權杖過期處理 HTTPS 憑證驗證 錯誤處理的強化 頻道發佈請使用 teams/{team-id}/channels/{channel-id}/messages 。 傳送附件檔案需要多部分處理 (multipart) 或 Graph Drive API。 總結 📎 總結 功能 概要 Graph API 與 Teams 互動的官方 API 應用程式註冊 Azure 上必要的認證手續 存取權杖 透過 OAuth2 取得，並用於請求中 C++ 實作 使用 WinHTTP 呼叫 Graph API 🚀 下一步 作為更進階的範例，以下也是可行的：\n團隊頻道發佈 (/teams/{team-id}/channels/...) 帶有附件檔案的發佈 機器人帳號或使用者帳號的切換 包含取得權杖在內的完整 C++ 實作 如有任何需求，歡迎隨時留言！\n","date":"2025-07-14T23:40:15+09:00","image":"http://kenji.blog/p/c-%E3%81%8B%E3%82%89-microsoft-teams-%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95winhttp--graph-api/img_hu9dbe154e21530b21fd6a41dcbc040106_90767_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%A6%82%E4%BD%95%E5%BE%9E-c-%E5%90%91-microsoft-teams-%E7%99%BC%E4%BD%88%E8%A8%8A%E6%81%AFwinhttp--graph-api/","title":"如何從 C++ 向 Microsoft Teams 發佈訊息（WinHTTP + Graph API）"},{"content":"我們整理了關於國外介面（表單）中「必填」標記的相關資訊，並附上 UI 設計指南。\n📌 主要的必填標記與最佳實踐 使用星號 (*)\n最常見且普及的方式，在必填欄位加上「*」。 然而， 在表單開頭必須加上「 為必填項目」等說明* (Nielsen Norman Group, California State University, Northridge)。 也有使用顏色來強調的例子（如紅字）。 在標籤中明確標示 \u0026ldquo;Required\u0026rdquo; 或 \u0026ldquo;(required)\u0026rdquo;\n在標籤內加入文字「Required」，可以讓螢幕閱讀器明確識別，提升無障礙體驗 (Deque)。 結合使用 ARIA 屬性與 HTML5 的 required 屬性\n除了視覺顯示外，使用 aria-required=\u0026quot;true\u0026quot; 或 \u0026lt;input required\u0026gt;，也能在程式層面傳達必填的資訊 (Deque)。 使用 \u0026ldquo;(optional)\u0026rdquo; 來明示選填欄位\n也有不標示必填，而是將選填欄位標示為「(optional)」的方法，這在兩者混合的情況下很有效。 不過，Nielsen‑Norman 指出「同時明示必填欄位會更容易判斷」 (TPGi)。 ✅ UI 設計指南資料總結 來源 內容 NN/g: Marking Required Fields in Forms 建議結合星號與說明文，僅標示選填欄位被認為是不夠友善的做法 (Nielsen Norman Group)。 Deque (Anatomy of Accessible Forms) ・在標籤內結合使用「Required」字串或圖片。\n・明確表示僅用顏色提示是不夠的。 W3C Techniques (H90) 有在標籤中包含星號或「(required)」，並在表單開頭定義其含義的範例。 TPGi (Doing what\u0026rsquo;s required) 考量到無障礙體驗，結合星號＋ARIA 屬性＋標籤文字插入被評為最佳做法。 Contensis 表單 UX 指南 簡潔地整理出：一致的標記（* 或 (optional)）非常重要。 ✅ 實作上的建議方法 在 表單開頭 加入說明文：\nFields marked with * are required. （或統一使用 \u0026ldquo;All fields are required\u0026rdquo;，若有選填則加上 \u0026ldquo;unless marked optional\u0026rdquo;）\n附加標籤 ：\n寫作 First Name * 或 Email (required)。 ARIA 屬性・HTML5 屬性 ：\n1 2 \u0026lt;label for=\u0026#34;email\u0026#34;\u0026gt;Email \u0026lt;abbr title=\u0026#34;required\u0026#34;\u0026gt;*\u0026lt;/abbr\u0026gt;\u0026lt;/label\u0026gt; \u0026lt;input id=\u0026#34;email\u0026#34; required aria-required=\u0026#34;true\u0026#34;\u0026gt; 不要僅依賴顏色 ：視覺與程式層面都需對應。\n🔗 參考連結（UI 設計指南資料） NN/g: Marking Required Fields in Forms (California State University, Northridge, Nielsen Norman Group, Deque) Deque: Anatomy of Accessible Forms (Deque) W3C Techniques: H90 Indicating required form controls (W3C) TPGi: Indicating mandatory fields accessibly (TPGi) Contensis: UX Forms Guidelines (Contensis) 如果需要，我也可以提供具體的 HTML／CSS 程式碼範例，或是 Sketch・Figma 用的 UI 元件設計模板。歡迎隨時提出討論！\n","date":"2025-07-14T13:47:51+09:00","image":"http://kenji.blog/p/%E5%85%A5%E5%8A%9B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E5%BF%85%E9%A0%88%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/img_hu551d2409ec5a7ae3c7367fc3f969286e_18058_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%85%A5%E5%8A%9B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E5%BF%85%E9%A0%88%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/","title":"關於輸入表單的必填標記"},{"content":"【初學者指南】如何在 Windows 上安裝 Gemini CLI 「Gemini CLI」讓您可以從命令列使用 Google 的生成式 AI「Gemini」。 本文將盡可能以淺顯易懂的方式，為您解說在 Windows 環境中安裝 Gemini CLI 的步驟。\n1. 事前準備：安裝 Node.js 和 npm 首先，由於 Gemini CLI 運行在名為「Node.js」的環境上，因此您必須先安裝以下項目：\nNode.js npm (Node.js 附帶的套件管理工具) npx (npm 包含的指令執行工具) 請從以下官方網站下載 Windows 版本的 Node.js (推薦使用 LTS 版本)：\n👉 Node.js 官方網站\n安裝完成後，請使用以下命令確認是否安裝正確。\n1 2 node -v npm -v 2. 啟動 PowerShell 在 Windows 上使用 Gemini CLI 時，通常會使用 PowerShell 進行操作。 請從開始選單輸入「PowerShell」並啟動。\n3. 安裝 Gemini CLI 將以下命令複製並貼上到 PowerShell 中執行：\n1 npx @google/gemini-cli 這個命令用於暫時執行 Google 發布的 Gemini CLI 套件。 如有需要，可能會要求您進行初始設定或登入。\n※ 第一次可能會花費幾分鐘。如果出現錯誤，請重新檢查您的 Node.js 或網路環境。\n4. 安裝完成！接下來要做的事 至此，Gemini CLI 已經安裝在您的 Windows 上了。 今後，您可以從命令列使用 Gemini 進行文本生成、程式碼補全等各種操作。\n如果您想查看官方文件或說明，也可以使用以下指令：\n1 npx @google/gemini-cli --help 總結 讓我們回顧一下在 Windows 上安裝 Gemini CLI 的步驟：\n安裝 Node.js 和 npm 啟動 PowerShell 執行 npx @google/gemini-cli 這樣就準備完成了！ 如果您想在本地使用生成式 AI，請務必參考這些步驟來挑戰看看。\n","date":"2025-07-13T23:49:56+09:00","image":"http://kenji.blog/p/gemini-cli-%E3%82%92-windows-%E7%92%B0%E5%A2%83%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu68d4fe037447f15938887bf6c4d85b87_249642_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%A6%82%E4%BD%95%E5%9C%A8-windows-%E7%92%B0%E5%A2%83%E4%B8%AD%E5%AE%89%E8%A3%9D-gemini-cli/","title":"如何在 Windows 環境中安裝 Gemini CLI"},{"content":"再次榮獲 Microsoft MVP (2025-2026)！ 大家好，我是 kenji。\n向大家報告一個好消息。今年我再次榮獲了 Microsoft MVP (Most Valuable Professional) 獎項。這是我 第 9 次 獲獎。\n非常感謝大家一直以來的支持。\n什麼是 Microsoft MVP？ 一聽到「MVP」，許多人可能會想到體育界的最有價值球員，但這裡的 MVP 是指 授予那些對 Microsoft 技術社群做出貢獻的人的稱號 。\n具體來說，包括：\n在技術部落格和社群媒體上發布資訊 在 GitHub 上公開範例程式碼 在讀書會和研討會上發表演講 在問答網站上回答問題 與海外開發者進行技術交流和合作 參與工程師互相交流的社群並發表文章 等「為了他人分享自己的知識和經驗」的活動會受到評估的制度。\n獲獎者遍布全球，但每年選出的人數有限，再次獲獎也絕非易事。正因為如此，能夠獲得這份認定，我感到無比榮幸。\n過去一年我致力於的事情 今年，我致力於以 技術的「易懂性」與「易達性」 為核心來傳播資訊。\n在 GitHub 上公開實用的範例程式碼 在讀書會與研討會上發表演講（不分國內外） 透過技術部落格和社群媒體定期發布資訊 在問答網站上持續回答問題 在工程師社群網站上分享知識 與海外工程師交流及共同測試 其中，在 GitHub 上公開程式碼讓我印象特別深刻，因為有時會收到「我也在煩惱同樣的問題，這幫了我大忙！」這樣的回饋，讓我切實感受到自己的努力正在幫助其他人的開發工作。\n此外，在活動演講時，我也會收到「即使是初學者也很容易理解」的回饋，這成為我思考「什麼是能傳達給別人的技術解說？」的好契機。\n展望明年 技術的發展真的非常快，光是追趕就很辛苦。儘管如此，我認為傳遞 作為「第一手資訊」的真實見解 （例如自己嘗試後獲得的親身體驗和遇到的挫折點）具有巨大的價值。\n明年，我想挑戰發布 結合影片和圖解的「視覺上易懂的技術內容」 。我希望增加我的產出，哪怕只能稍微解決別人的「卡關！」感也好。\n結語 MVP 這個頭銜終究只是個里程碑。\n今後，我也不會勉強，會以自己的步調前進。 但同時也會確實地幫助到他人。\n「查資料時幫了大忙」 「這個範例能動！」 「這段內容很容易懂」\n我希望繼續成為能讓人說出這些話的工程師。\n今後也請大家多多指教。\nGitHub: https://github.com/kenjinote 技術部落格: https://hack.jp X: https://twitter.com/kenjinote ","date":"2025-07-13T22:01:15+09:00","image":"http://kenji.blog/p/microsoft-mvp2025-2026%E3%82%92%E5%86%8D%E5%8F%97%E8%B3%9E%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/img_hu79b11b7d0311d1cf72d88f77ae4d2c9a_139280_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%86%8D%E6%AC%A1%E6%A6%AE%E7%8D%B2-microsoft-mvp-2025-2026/","title":"再次榮獲 Microsoft MVP (2025-2026)"},{"content":"Win32API + C++ 開發的魅力與挑戰 對於想要精通 Windows 應用程式開發的人來說， Win32API + C++ 仍然是一個強大的選擇。 這種允許與作業系統進行最密切互動的組合，兼具了速度與靈活性。\n另一方面，要掌握它需要決心，因為它與現代開發風格有很大的不同。\n在本頁中，我們將從 現役 Windows 應用程式開發人員的視角 清晰地解釋其優點和缺點。\n優點 超高速的原生執行 由於 C++ 和 Win32API 在最接近作業系統的層級上運作，因此幾乎沒有不必要的開銷。 CPU 和記憶體的使用效率極高，擁有 壓倒性的執行速度 。\n高靈活性和自由度 您可以 自行精細地控制 應用程式的所有行為，例如視窗控制、非同步處理、COM 整合和行程管理。 也可以建立專門的工具和自己的原創框架。\n易於分發，無需執行環境 由於不需要像 .NET 或 Java 這樣的外部執行環境，因此它 可以作為單一的執行檔進行分發 。 在重新分發期間較少發生問題，且無需安裝程式即可輕鬆執行。\n可以建立輕量級應用程式 由於它只需要最少必要的配置，其特點是 記憶體佔用非常小 。 即使在低規格 PC 或虛擬機器環境中也能舒適地運作。\n能夠實現作業系統級別的進階控制 您還可以實現 使用一般語言和函式庫難以達成的控制 ，例如全域滑鼠和鍵盤鉤子（Hook）、視窗樣式的微調以及系統選單操作。\n缺點 開發效率低 即使是 GUI 的建構也必須完全在程式碼中完成，有時 僅僅為了建立一個按鈕就需要幾十行程式碼 。 修改設計也很繁瑣，且與使用 UI 框架的開發相比，生產力較低。\n易於降低可維護性 有許多 具有特殊結構的程式碼 ，例如訊息迴圈和視窗程序，這阻礙了可讀性和可重複使用性。 它還有不適合團隊開發和長期維護的方面。\n難以支援現代 UI 很 難支援近年來要求的 UX ，例如高 DPI 支援、觸控介面、無障礙功能和深色模式。 您必須手動處理每一項，這需要花費大量的精力。\n不支援跨平台 由於它是一個完全 Windows 專用的 API，因此 無法移植到 macOS 或 Linux 。 如果您計劃跨平台部署，則需要選擇其他技術。\n學習成本極高 您必須了解 如今已很少使用的概念和機制 ，例如 Handles (控制代碼)、GDI、COM 和 OLE。 許多文件都很舊，需要時間和耐心來學習。\n適合的用途 輕量級工具 ，如檔案啟動器和快捷鍵輔助工具 系統實用程式 ，如剪貼簿操作和 IME 控制 基於原生控制的應用程式 ，如全域鉤子和視窗擷取 與硬體緊密連結的 驅動程式支援工具 不適合的用途 現代 UI / UX 重要的 一般消費者應用程式 考慮到速度而建立的 原型設計和 MVP 開發 基於長期運作和團隊開發的 大型專案 需要支援多個作業系統的 跨平台產品 評估總結 觀點 評估 執行速度 ◎ 非常快 記憶體效率 ◎ 優秀 開發速度 × 慢 可維護性 × 低 跨平台支援 × 不支援 現代 UI 支援 × 弱 作業系統控制自由度 ◎ 壓倒性地高 結論 Win32API + C++ 是為那些「想要親自處理作業系統中所有事情」的開發人員準備的工具。 雖然其力量巨大，但學習和操作需要相應的決心。\n是否值得「大膽選擇」取決於您目標應用程式的性質。\n潛入 #include \u0026lt;windows.h\u0026gt; 的世界而不依賴 GUI 框架或現代語言 ―― 這個選擇在今天仍然有意義。\n","date":"2025-07-12T12:30:35+09:00","image":"http://kenji.blog/p/win32api-c-%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E4%BD%9C%E3%82%8B%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%81%A8%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88/img_1_huda4a374969e448ba98e0798d75e2e435_4729_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/win32api-c-%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E4%BD%9C%E3%82%8B%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%81%A8%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88/","title":"使用 Win32API + C++ 開發程式的優缺點"},{"content":"如果您要在 Visual Studio 中使用 libcurl（支援 OpenSSL），強烈推薦引入 vcpkg，非常簡單 在 C++ 中處理 HTTP 通訊時，經常會使用 libcurl。但是，編譯和調整相依性卻意外地麻煩，對吧？\n這時候能派上用場的就是微軟開發的 C++ 函式庫管理工具 ** 「vcpkg」 ** 。 這次我們將介紹如何使用 cpkg 來引入 libcurl（支援 OpenSSL），並讓它在 Visual Studio 中能順暢使用的步驟。\nvcpkg 的安裝（僅限尚未安裝者） 首先，我們來安裝 cpkg. 請在 PowerShell 中執行以下步驟。\npowershell git clone https://github.com/microsoft/vcpkg cd vcpkg .\bootstrap-vcpkg.bat ※如果您還沒安裝 Git，請到 Git 官方網站 進行安裝。\nlibcurl（支援 OpenSSL）的安裝 接著，使用 vcpkg 來安裝 libcurl. 為了指定支援 OpenSSL 的 64 位元版本，請執行以下命令。\npowershell vcpkg install curl[ssl] --triplet x64-windows 執行此命令後，必要的相依性（如 OpenSSL）也會被自動設定好。\n與 Visual Studio 的整合設定 為了讓在 vcpkg 引入的函式庫能從 Visual Studio 專案中輕鬆使用，請使用下列命令進行整合設定。\npowershell vcpkg integrate install 設定好之後，在 Visual Studio 的專案中就能自動使用 #include \u0026lt;curl/curl.h\u0026gt;，不再需要手動設定函式庫的路徑或連結器。\n結語 至此，在 Visual Studio 中引入 libcurl（支援 OpenSSL）的準備工作就完成了。\n只要使用 vcpkg，就能一次管理所有麻煩的相依性 使用 cpkg install curl[ssl] \u0026ndash;triplet x64-windows 輕鬆引入 libcurl 使用 cpkg integrate install 即可與 Visual Studio 進行自動整合 接下來，只要在專案中包含標頭檔，並使用 libcurl 的 API 就能開始開發了。 請善用方便的 vcpkg，一口氣提升您的開發效率吧。\n","date":"2025-07-07T21:46:08+09:00","image":"http://kenji.blog/p/vcpkg-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-visual-studio-%E3%81%AB-curl-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/img_hub03488d3cca2b78b7b08dd6d749f5d1e_294355_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/vcpkg-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-visual-studio-%E3%81%AB-curl-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/","title":"【初學者指南】使用 vcpkg 在 Visual Studio 中安裝 libcurl（支援 OpenSSL）的步驟"},{"content":"不被陰謀論吸引所需的「心理安全」 在瀏覽網路時，我們有時會看到類似「陰謀論」的說法。\n「這件事，是不是背後有人在操縱？」 「真正的真相是不是被隱瞞了？」 許多人應該都見過這類言論以看似有理的形式擴散開來。\n為了不被這些資訊過度吸引，不僅需要「知識」或「思考能力」，更重要的是調整 心態 ，也就是建立「心理安全」。\n以下將介紹 6 個對此有效的思考方式。\n不要將不安與「答案」立刻連結起來 陰謀論的一大特徵是，它會針對不安或疑問，提出明確且容易理解的「答案」。\n例如，對於：\n「為什麼會發生這種事件？」 「誰是既得利益者？」 這類問題，如果有人提出「其實背後是○○在操縱」的劇情，人們往往很容易就接受了。\n然而，正因為感到不安， 不要立刻下結論，而是暫時保留 才顯得重要。\n「保持未知的狀態」也是心智成熟的表現。\n刻意拓寬接收資訊的管道 許多沉迷於陰謀論的人，都有集中觀看「想法相近的資訊」的傾向。\n這被稱為「確認偏誤」，是一種心理偏見，讓人只去接觸那些能強化自身已有觀點的資訊。\n尤其是社群媒體或影片網站的演算法，會不斷推薦符合你喜好的貼文，自然而然地使視野變得狹窄。\n有意識地做到：\n接觸不同觀點的媒體 觀看海外新聞或學術來源 傾聽與自己想法不同的意見 等，努力做到 資訊來源多樣化 ，有助於規避風險。\n不要認為「自己不會被騙」 知識豐富或邏輯清晰的人，有時反而更容易被陰謀論吸引。\n這是因為，如果自認為「我能發現別人沒注意到的真相」，這就會成為蒙蔽判斷的因素。\n無論多麼小心，人類都會犯錯。正因如此，建立在 自己也可能被騙的前提下 ，反而才是一種理性的態度。\n「抱持懷疑，但不妄下定論」將成為你的防禦力。\n看清結構，不要被故事牽著走 陰謀論總是伴隨著「充滿戲劇性的故事」。\n例如：\n正義與邪惡的對立結構 統治者與被統治者 覺醒的自己 vs 被洗腦的他人 這類簡單的二元對立，作為故事雖然吸引人，但未必能正確反映現實。\n現實中的事件或社會動態，交織著複雜的因果關係、歷史背景與制度結構等多種因素。\n重要的是，不要過度被故事牽動情緒，而是具備 結構性理解 「為什麼會變成這樣？」的視角。\n不要對孤獨置之不理 強烈被陰謀論吸引的背後，有時潛藏著「孤立」或「無處容身」的感覺。\n當人感到孤獨時，容易對能理解自己的人或群體產生深深的依賴。陰謀論社群有時便發揮了這種「歸屬地」的功能。\n正因如此，設法避免孤獨，也與心理安全息息相關。\n例如，採取以下行動：\n定期與人交談 參加分享興趣或關心事物的社群 不僅在線上，也保持線下的聯繫 這將有助於精神上的穩定。\n重視對話，而非全盤否定 即使身邊的人傾心於陰謀論， 劈頭蓋臉地否定有時會適得其反 。\n人在信念被否定時，心理上試圖保護它的傾向會增強（這被稱為「防禦性認知」）。\n取而代之的是：\n仔細詢問：「為什麼你會這麼想呢？」 溫和地表達自己的觀點：「或許也有這樣的思考方式喔。」 採取這類 對話式的接觸方式 ，有可能讓對方的視野自然地拓寬。\n總結：為了與陰謀論保持距離可以做的事 不將不安與答案立刻連結，具備暫時保留的能力 讓資訊來源多樣化，察覺自身的偏見 認知到自己的判斷並非絕對 透過結構與因果關係看事情，而不是透過故事 避免孤獨，保持與人的聯繫 面對他人的陰謀論時，以對話取代否定 人們是否會被陰謀論吸引，據說受心理狀態與環境的影響，大於知識量的影響。\n正因如此，不要以為「自己沒問題」，在日常生活中一點一滴地去努力 提升心理安全 ，這將成為在未來的資訊社會中靈活生存的強大支柱。\n","date":"2025-05-26T22:23:34+09:00","image":"http://kenji.blog/p/%E9%99%B0%E8%AC%80%E8%AB%96%E3%81%AB%E3%81%AF%E3%81%BE%E3%82%89%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%81%AB%E4%BD%95%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%8B/img_hu51c98705e3e626ac0eb85c430c7c7e5c_195663_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E9%99%B0%E8%AC%80%E8%AB%96%E3%81%AB%E3%81%AF%E3%81%BE%E3%82%89%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%81%AB%E4%BD%95%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%8B/","title":"不陷入陰謀論需要什麼"},{"content":"低代碼／無代碼開發的歷史（1980年代～至今） 低代碼／無代碼開發是一種無需專業編程知識即可創建應用程式、網站和數據庫的開發方法。這個理念始於1980年代，隨著個人電腦的普及、互聯網的發展和雲技術的擴展，已演變成多種平台。在本文中，我們將按年代介紹代表性的工具和服務，並強調其特點和價格。\n1980年代：草創期 HyperCard（Apple, 1987） 面向Macintosh的應用程式創建工具。以卡片形式構建畫面，並通過拖放創建GUI。也可以通過其專屬腳本語言「HyperTalk」實現簡單的動作控制。深受原型設計用途的青睞。發售時價格為49.95美元，後來免費提供給新的Mac購買者。最終版本在1998年，不支持Mac OS X及以上版本。\nFileMaker（Claris/Apple, 1985） 圖形化數據庫軟件。除了以表格形式顯示數據外，它還是一個具備自由佈局編輯和腳本功能的關聯數據庫工具。目前作為「Claris FileMaker Pro」提供，完整授權版價格為594美元（截至2024年）。\n1990年代：GUI應用程式與業務系統開發的崛起 Visual Basic（Microsoft, 1991） 專注於Windows應用程式開發的IDE。通過拖放按鈕和標籤等GUI組件，可以輕鬆構建事件驅動的應用程式。以1998年的VB6.0為最後版本，轉向了.NET時代。\nMicrosoft Access（1992） 面向Windows的數據庫開發工具。能夠進行關聯數據庫設計和通過GUI創建表單，廣泛應用於一般業務應用程式開發。目前作為Microsoft 365的一部分提供。\nPowerBuilder（PowerSoft/Sybase, 1991） 面向業務應用程式的4GL開發工具。支持客戶端/服務器架構，在數據庫聯動方面具有優勢。目前仍在SAP旗下繼續提供。\nDreamweaver（Macromedia, 1997） 可以可視化創建網頁的WYSIWYG工具。能夠在HTML編輯和設計視圖之間切換，並支持ASP和PHP。目前由Adobe提供，並可以通過訂閱（每月約34.49美元）使用。\nFlash（Macromedia, 1996） 最初作為FutureSplash Animator開發的矢量動畫製作工具。後來用於網頁互動內容製作，但由於安全隱患於2020年終止支持。\nGameMaker（1999） 面向初學者的2D遊戲製作工具。可以通過拖放進行對象放置和事件控制。後來也支持了腳本（GML），目前為商業用途提供多種方案。\n2000年代：基於Web與開源的擴展 WordPress（2003） 使用PHP和MySQL的開源CMS。即使沒有編程知識，也可以使用主題和插件構建博客和企業網站。免費分發，是世界上使用最廣泛的CMS之一。\nWix（2006） 可以在瀏覽器上構建網站的無代碼服務。可以選擇模板並通過拖放進行編輯。除了免費方案外，付費方案還允許使用自定義域名和電子商務功能。\nOutSystems（2001） 面向企業的低代碼平台。由於可以快速開發業務系統，正在大型企業和政府機構中推進採用。支持雲和本地部署。\nScratch（MIT, 2007） 為兒童開發的編程學習工具。通過組合彩色積木可以創建遊戲和動畫，在教育領域被廣泛使用。免費提供。\nAirtable（2013） 結合了電子表格和數據庫的雲服務。外觀類似Excel，但允許關聯、看板顯示和API聯動等。從個人到企業都被廣泛使用。\n2010年代〜2020年代：雲與自動化的時代 近年來，基於雲的低代碼／無代碼工具發展迅速。\nPower Platform（Microsoft） 包含「Power Apps」、「Power Automate」等的綜合業務應用程式開發與自動化平台。可以通過拖放可視化地構建企業的業務流程。\nSalesforce Lightning Platform CRM的Salesforce提供的應用程式開發基礎。可以通過GUI創建業務應用程式，並且很容易與其他Salesforce服務整合。\nZapier / IFTTT 可以在多個雲服務之間構建聯動而無需編碼的自動化工具。例如，可以輕鬆實現「如果輸入到Google表單則通知Slack」的工作流。\nNotion（2010年代） 整合了文檔管理、任務管理、Wiki等的全能工作區。還具備自定義數據庫功能，有助於通過無代碼改善業務。\nConstruct 3 / GameSalad 可以通過拖放製作遊戲的工具。Construct 3支持HTML5並且也可以在瀏覽器中運行，在教育領域和獨立開發者中很受歡迎。\n資訊來源與補充 本文基於各產品的官方網站、Wikipedia和可靠的資料與文章（Apple、Microsoft、Adobe等）構建。價格資訊盡可能參考當時或最新的官方資訊（主要以美元列出）。2000年代之後的許多工具都是基於訂閱的，費用因方案而異。\n","date":"2025-04-26T16:46:11+09:00","image":"http://kenji.blog/p/%E3%83%AD%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8A%E3%82%88%E3%81%B3%E3%83%8E%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%AD%B4%E5%8F%B2/img_hu615c889fe1afb242f7436bdb2a6d534f_388471_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/low-code-and-no-code-history/","title":"本地環境中無代碼的歷史"},{"content":"FizzBuzz 到底是什麼？ 大家好！\n今天我想寫寫關於「FizzBuzz」的事。\n無論你是覺得「啊，那個我知道！」的人，還是「好像聽過，但不太清楚」的人，請稍微陪我一下。幾分鐘就能讀完，或許你會覺得「原來如此」。\n「不會寫 FizzBuzz 就不夠格當程式設計師」是真的嗎？ 簡單來說，FizzBuzz 大概是這樣的東西。\n1 2 3 4 5 6 7 8 9 for i in range(1, 101): if i % 15 == 0: print(\u0026#34;FizzBuzz\u0026#34;) elif i % 3 == 0: print(\u0026#34;Fizz\u0026#34;) elif i % 5 == 0: print(\u0026#34;Buzz\u0026#34;) else: print(i) 沒錯，這就是著名的「FizzBuzz 問題」。\n依序查看 1 到 100 的數字，\n如果是 3 的倍數就顯示「Fizz」，如果是 5 的倍數就顯示「Buzz」，\n如果是兩者的倍數就顯示「FizzBuzz」，非常簡單。\n儘管如此，不知為何它常常被當作「程式設計師的最低測試」來對待。面試時會出現，社群網路上也時常看到「連 FizzBuzz 都不會寫的人\u0026hellip;」這種高高在上的發言。\n不過，請等一下。\n真的能斷言「不會寫 FizzBuzz = 不會寫程式」嗎？\n不是會不會，而是有沒有會的「狀態」 的確，FizzBuzz 要求對語法的理解和基本的邏輯思考能力。所以用來「確認基礎」是可以理解的。\n但是。\n環境不同，結果也會不同。\n例如，\n在初次見面的面試官面前感到緊張時 突然被交給一塊白板，手邊沒有編輯器時 突然想不起「咦，modulo 是什麼來著？」時 ……這些情況，難道沒有嗎？畢竟是人類，我想是有的。\n所以，與其說「能不能寫出 FizzBuzz」，不如說「能不能讓自己處於能寫出 FizzBuzz 的狀態」，其實才是更重要的。\n常見的「多練習就好」建議的陷阱 一談到這個話題，很容易就會出現「所以要每天練習！」這樣的建議。\n的確，透過反覆練習就能寫得很流暢，這是事實，本身也是好事。但是，如果站在「不會寫 FizzBuzz 就不及格」的前提下，它有時就會變成單純的恐懼。\n也就是說，很容易形成「犯錯了 = 自己很沒用」的感覺。\n例如，早上睡過頭的那天，是不是很容易覺得「自己是個懶惰的人\u0026hellip;」？但那可能只是身體剛好累了而已。\nFizzBuzz 也是一樣的。\n雖然這麼說，FizzBuzz 仍是個好問題 儘管如此，並不是說 FizzBuzz 不好。\n相反地，我覺得這是一個非常好的問題。規則簡單，也很容易擴充。例如，試著像這樣改變一下，思考就會變得更深。\n1 2 3 4 5 6 7 for i in range(1, 101): output = \u0026#34;\u0026#34; if i % 3 == 0: output += \u0026#34;Fizz\u0026#34; if i % 5 == 0: output += \u0026#34;Buzz\u0026#34; print(output or i) 這是一個「不用 if-elif-else 也能寫出來」的例子。感覺有點聰明吧。\n也就是說，FizzBuzz 不僅僅是「做不做得到」，它也能成為觀察「如何寫」以及「理解到什麼程度」的入口。\n總而言之 我覺得不必對能不能寫出 FizzBuzz 賦予太多過度的意義。\n就算寫不出來，那也可能只是「現在狀態不太好」，而且事後仔細想想能寫出來的情況也很多。\n不用著急，慢慢前進吧。\n程式碼是人類寫的。既然是人類，就有忘記的時候，也有緊張的時候。一邊接受這些，一邊慢慢前進，我想這樣就足夠了。\n那麼，今天也輕鬆地寫程式碼吧。\n","date":"2025-04-18T00:58:11+09:00","image":"http://kenji.blog/p/fizzbuzz/img_hu0b23239076c3049a7d4382dec6ccfba6_85967_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/fizzbuzz/","title":"FizzBuzz"},{"content":"漢諾塔 你好！\n今天，我想透過一個 Python 範例程式來解釋「漢諾塔」。\n什麼是漢諾塔？ 漢諾塔是一個使用 3 根柱子和多個圓盤的謎題。圓盤的大小各不相同，最初它們按從大到小的順序堆疊在一根柱子上。規則如下：\n每次只能移動一個圓盤。 較大的圓盤不能放在較小的圓盤上。 這個謎題被認為是學習遞迴思考的最佳教材。遞迴是一種透過將問題分解成相同類型的更小問題來解決問題的方法。在漢諾塔中，為了移動 n 個圓盤，我們重複移動 n-1 個圓盤的操作。\n用 Python 解決漢諾塔 以下是用 Python 解決漢諾塔的範例程式碼。\n1 2 3 4 5 6 7 8 9 10 def hanoi(n, source, target, auxiliary): if n == 1: print(f\u0026#34;Move disk 1 from {source} to {target}\u0026#34;) return hanoi(n - 1, source, auxiliary, target) print(f\u0026#34;Move disk {n} from {source} to {target}\u0026#34;) hanoi(n - 1, auxiliary, target, source) # 範例：將 3 個圓盤從 A 移動到 C hanoi(3, \u0026#39;A\u0026#39;, \u0026#39;C\u0026#39;, \u0026#39;B\u0026#39;) 在這個程式碼中，hanoi 函數被遞迴呼叫，並顯示移動圓盤的步驟。例如，在 3 個圓盤的情況下，可以獲得以下輸出：\n1 2 3 4 5 6 7 Move disk 1 from A to C Move disk 2 from A to B Move disk 1 from C to B Move disk 3 from A to C Move disk 1 from B to A Move disk 2 from B to C Move disk 1 from A to C 透過這種方式，使用遞迴方法，可以簡單地解決複雜的問題。\n移動 64 個圓盤需要多長時間？ 漢諾塔的移動次數最少需要 2^n - 1 次。也就是說，要移動 64 個圓盤，需要 2^64 - 1 次，約 1.84×10^19 次移動。即使 1 秒移動 1 次，也需要大約 5849 億年。這大約是宇宙年齡（約 137 億年）的 42 倍。\n因此，隨著圓盤數量的增加，所需的移動次數呈指數級增長。所以，在現實中移動 64 個圓盤是不切實際的。\n總結 漢諾塔是學習遞迴思考的最佳謎題。使用 Python，您可以輕鬆實現其解決方案。然而，請注意，隨著圓盤數量的增加，所需的移動次數會急劇增加。\n了解遞迴方法並嘗試實際編寫程式碼，可以幫助您提高程式設計技能。請務必挑戰一下漢諾塔。\n","date":"2025-04-17T22:23:14+09:00","image":"http://kenji.blog/p/%E3%83%8F%E3%83%8E%E3%82%A4%E3%81%AE%E5%A1%94/img_hub916bf71b02b2ffc8b3c247adaa061ec_2314383_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/hanoi-tower/","title":"漢諾塔"},{"content":"原始碼行數 你好！\n今天我想談一個有點特別的主題。\n話題是：「與過去相比，原始碼的行數增加了多少？」\n例如，太空梭的軟體由大約 42 萬行程式碼組成。為了符合 NASA 的高質量標準，這些程式碼是在非常嚴格的流程下開發的。另一方面，在現代大型軟體專案中，程式碼行數超過幾千萬行並不罕見。例如，據說 Google 的程式碼庫達到了約 20 億行。\n由此可見，軟體的規模隨著時代不斷擴大。\n但是，請等一下。\n程式碼行數的增加不一定是壞事。為了增加新功能並滿足用戶需求，程式碼的增加是很自然的。然而，隨著程式碼的增加，出現錯誤的風險也會提高。事實上，一項研究表明，當開源專案超過 100 萬行時，錯誤發生率往往會上升。\n儘管如此，並非所有的專案都以相同的方式增加程式碼。\n例如，Linux 核心在 1994 年的 1.0 版約有 20 萬行，但在 2015 年的 4.2 版中，已增加到約 2,000 萬行。這樣的增加是為了應對硬體的進化及新功能的添加。\n因此，原始碼的行數根據專案的規模、目的和時代背景會有很大差異。\n程式碼行數增加本身並不是問題，但為了保持品質和可維護性，必須有適當的管理。了解伴隨程式碼增加而來的風險並採取適當的對策是很重要的。\n最後，我認為不要過度執著於程式碼的行數，而是要重視專案的目的和品質。\n那麼，我們下次見！\n","date":"2025-04-17T10:33:02+09:00","image":"http://kenji.blog/p/%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E8%A1%8C%E6%95%B0/img_1_hu5eec8f3e01b611d6fcced12ecef63fb0_956545_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/source-code-lines/","title":"原始碼行數"},{"content":"\u0026ldquo;柯克霍夫原則\u0026rdquo; 你好！\n今天我想談談一個有點有趣、實際上非常重要的東西，叫做「柯克霍夫原則」。\n啊，等等。\n有些人可能會想：「我從來沒有聽過『柯克霍夫原則』，聽起來好像很難懂……」。請放心，這篇文章正是寫給有這種想法的你讀的。\n什麼是「安全的密碼」？ 例如，假設有人說：「這個保險箱，只有知道秘密開啟方法的人才能打開。」\n乍看之下，這似乎非常安全，對吧？\n但是，仔細想想，這不是有點令人不安嗎？\n像是「如果那個秘密被發現了，不就完蛋了？」\n事實上，這正是柯克霍夫原則出現的契機。\n到底什麼是「柯克霍夫原則」？ 簡單來說，這是一種概念：\n「密碼應該在機制被公開的情況下依然安全。」\n更進一步說，「安全性應該只依賴『秘密的鑰匙』，密碼的方法本身公開也沒關係！」\n反過來說，「只把密碼的演算法（機制）保密的狀態，會被認為是可靠性很低的。」\n「機制保密就很安全」可能有點危險 這是常見的想法：\n「這個應用程式的內部沒有給任何人看過，所以安全性沒問題」\n我了解這種感覺。\n但這就等於在說：「因為沒有人看，所以不會發現缺點，沒問題的。」\n實際上，這種「沒有人看」的狀態本身可能就會成為一種風險。\n但是，為什麼這個原則這麼重要？ 因為，如果有人取得了這個機制，並且可以輕易解碼，那這個密碼就沒用了。\n打個比方，就像是一扇門的鎖機制非常複雜，但實際上卻可以用百元商店打的備用鑰匙打開。\n重要的不是「鑰匙是秘密的所以沒問題」，而是「即使公開所有的機制，沒有正確的鑰匙也打不開」。\n「但是，這樣不會有點可怕嗎？」的心情 很多人在這裡會感到不安：\n「把所有的機制都公開，不會有點可怕嗎？」\n我懂。\n因為你會想：「如果我把內部全部公開，不會被模仿或惡意利用嗎？」\n但這正是柯克霍夫原則的核心。\n「即使讓人看到內部也不會崩潰的強度」才是真正的安全。\n話雖如此，一開始確實需要一點勇氣 站在開發者的角度來看，似乎「公開機制 = 暴露弱點」，這當然會讓人感到緊張。\n但是請想想看。\n能夠大方展示機制並說出「任何人都可以來驗證」的東西，結果反而更令人信賴。\n這跟人際關係很像。\n「在展現真實自我後還能好好相處的人」，終究是最讓人安心的。\n總而言之 柯克霍夫原則聽起來可能有點理論化，但本質上非常簡單。\n其實就是 「讓我們建立一個不管給誰看都不會崩壞的機制」 而已。\n與其保持表面的秘密，不如有良好的設計。\n與其寫出不想讓任何人看的程式碼，不如寫出展示給別人看也不會覺得丟臉的程式碼。\n或許，未來的時代會越來越需要這種「強度」。\n非常感謝您的閱讀！\n雖然安全性的話題有點困難，但也有些部分與「人際關係」或「日常的安心感」相連呢。\n不用感到有壓力，只要一點一點地去了解，相信一定會有好事的。\n","date":"2025-04-16T23:53:08+09:00","image":"http://kenji.blog/p/%E3%82%B1%E3%83%AB%E3%82%AF%E3%83%9B%E3%83%95%E3%82%B9%E3%81%AE%E5%8E%9F%E7%90%86/img_2_hu71b6c82ab9eb0ac0abd797e00918df90_2573611_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E6%9F%AF%E5%85%8B%E9%9C%8D%E5%A4%AB%E5%8E%9F%E5%89%87/","title":"柯克霍夫原則"},{"content":"🎯 從 C++ 透過 C++/CLI DLL 執行 PowerShell 的步驟（Visual Studio 2022 / C++） ✅ 整體架構 🔹 ① CLI 封裝 DLL（C++/CLI） 提供執行 PowerShell 腳本的功能。\n🔹 ② 原生 C++ 呼叫端 呼叫 CLI DLL 以執行 PowerShell 腳本。\n🔧 步驟 1：建立 CLI 封裝 DLL 專案 1. 建立專案 [建立新專案] → [C++] → CLR 類別庫 (.NET Framework) 名稱：PowerShellWrapper 💡 如果未顯示此範本，請安裝「.NET 桌面開發」工作負載。\n2. 新增 NuGet 套件 在專案上按一下右鍵 → [管理 NuGet 套件] 搜尋並安裝 System.Management.Automation\n（版本 5.x 或 7.x） 3. CLI 端程式碼實作 PowerShellWrapper.h 1 2 3 4 5 6 7 8 9 10 #pragma once using namespace System; namespace PowerShellWrapper { public ref class PowerShellExecutor { public: String^ Execute(String^ script); }; } PowerShellWrapper.cpp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include \u0026#34;PowerShellWrapper.h\u0026#34; using namespace System; using namespace System::Management::Automation; using namespace System::Collections::ObjectModel; String^ PowerShellWrapper::PowerShellExecutor::Execute(String^ script) { PowerShell^ ps = PowerShell::Create(); ps-\u0026gt;AddScript(script); Collection\u0026lt;PSObject^\u0026gt;^ results = ps-\u0026gt;Invoke(); System::Text::StringBuilder^ sb = gcnew System::Text::StringBuilder(); for each (PSObject^ result in results) { sb-\u0026gt;AppendLine(result-\u0026gt;ToString()); } return sb-\u0026gt;ToString(); } 🔧 步驟 2：從原生 C++ 端呼叫 1. 建立 C++ 主控台應用程式專案 名稱：NativeApp 2. 參考設定 在專案上按一下右鍵 → [加入] → [參考] → [專案] → 新增 PowerShellWrapper [組態屬性] → [C/C++] → [Common Language Runtime 支援] → 變更為 /clr 3. 執行程式碼（main.cpp） 1 2 3 4 5 6 7 8 9 10 11 12 13 #using \u0026lt;System.dll\u0026gt; #using \u0026#34;..\\\\PowerShellWrapper\\\\Debug\\\\PowerShellWrapper.dll\u0026#34; using namespace System; using namespace PowerShellWrapper; int main() { PowerShellExecutor^ executor = gcnew PowerShellExecutor(); String^ result = executor-\u0026gt;Execute(\u0026#34;Get-Process | Select-Object -First 1\u0026#34;); Console::WriteLine(result); return 0; } 💡 補充說明（IDL / TLB / COM 註冊） 此架構是直接參考 .NET DLL 而不是 COM，因此 不需要 IDL、TLB 或是 COM 註冊 。 ✅ 最終架構 1 2 3 4 5 Solution ├── PowerShellWrapper (C++/CLI DLL) │ └── PowerShellExecutor ├── NativeApp (C++ EXE) └── main.cpp → 呼叫 DLL ","date":"2025-04-16T01:58:03+09:00","image":"http://kenji.blog/p/c-%E3%81%8B%E3%82%89-powershell-%E3%82%92-c-cli-dll-%E7%B5%8C%E7%94%B1%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86/img_hu7575b218a6ea53bc902a4f89abde2058_17844_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/c-%E3%81%8B%E3%82%89-powershell-%E3%82%92-c-cli-dll-%E7%B5%8C%E7%94%B1%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86/","title":"從 C++ 透過 C++/CLI DLL 執行 PowerShell 的步驟"},{"content":"【Windows】如何檢查授權狀態（1個命令即可） 您是否曾想過您的 Windows 授權是否已正確認證？\n在這種時候，非常方便的是 一鍵檢查授權資訊的方法 。只需執行以下步驟，您就可以輕鬆檢查目前的授權狀態。\n檢查授權狀態的命令 您可以使用 Windows 內建的指令碼工具來顯示授權資訊。使用的命令如下：\n1 slmgr /dli 執行此命令後，部分授權資訊將顯示在一個視窗中。\n執行方法 從「開始功能表」輸入「cmd」，右鍵點擊命令提示字元 →「以系統管理員身分執行」 。\n在命令提示字元中輸入以下內容並按 Enter 鍵：\n1 slmgr /dli 等待幾秒鐘後，將顯示如下的授權資訊。\n顯示的主要資訊 產品金鑰的一部分 授權類型（零售、OEM 等） 授權狀態（有效、過期、未認證等） 如果您想了解更詳細的資訊？ 還有以下命令：\nslmgr /dlv ：顯示更詳細的授權資訊 slmgr /xpr ：顯示授權的到期日期（如是否永久） 總結 只需一個命令，即可輕鬆檢查 Windows 的授權狀態。\n簡易檢查 ：slmgr /dli 詳細檢查 ：slmgr /dlv 檢查到期日期 ：slmgr /xpr 如果授權出現問題，更新和某些功能可能會受到限制，因此定期檢查會讓人更安心。\n","date":"2025-04-14T00:41:45+09:00","image":"http://kenji.blog/p/windows-%E3%81%AE%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9%E3%81%AE%E7%8A%B6%E6%85%8B%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/img_1_hudcf97514836ad006a409bb9b34fbe340_111425_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/windows-%E3%81%AE%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9%E3%81%AE%E7%8A%B6%E6%85%8B%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/","title":"檢查 Windows 授權狀態的命令"},{"content":"針對 iOS 最佳化的 ffmpeg 轉換參數 我們將介紹 ffmpeg 命令來轉換影片，以便在 iOS 裝置（iPhone 和 iPad）上流暢播放。\n1 2 3 4 5 6 ffmpeg -i input.mp4 \\ -c:v libx264 -profile:v high -level 4.1 \\ -vf \u0026#34;scale=1920:-2\u0026#34; -r 30 \\ -crf 20 -preset slow \\ -c:a aac -b:a 128k -ar 48000 \\ -movflags +faststart output.mp4 各選項的含義（簡要說明） 選項 說明 -i input.mp4 輸入檔案（要轉換的影片） -c:v libx264 使用 H.264 編碼影片（支援 iOS） -profile:v high -level 4.1 在 iOS 上廣泛相容的設定檔和等級 -vf \u0026quot;scale=1920:-2\u0026quot; 調整大小為 1920px 寬，高度會自動調整以保持寬高比 -r 30 轉換為 30fps 的幀率 -crf 20 影片品質（數值越低畫質越高，建議 18-23） -preset slow 編碼速度與壓縮率的平衡（slow 表示高壓縮、高畫質） -c:a aac 音訊以 AAC 格式編碼 -b:a 128k 將音訊位元率設定為 128kbps -ar 48000 將音訊取樣率設定為 48kHz（iOS 建議） -movflags +faststart 在影片開頭放置索引， 加速在 Web 和 iOS 上的串流播放 使用這些設定轉換的影片，預期在 iPhone 和 iPad 等 Apple 裝置上具有高相容性且能流暢播放。\n如有需要，您可以透過變更解析度或位元率來調整檔案大小和畫質。如果需要高畫質，請嘗試將 -crf 設定為 18 左右；如果想要縮小檔案大小，請設定為 22-25。\n","date":"2025-03-02T04:16:07+09:00","image":"http://kenji.blog/p/ios-%E5%90%91%E3%81%91%E3%81%AE-ffmpeg-%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF/img_hu6ca6c354dba8425c4a9e54b9842ad89b_30790_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/ios-%E5%90%91%E3%81%91%E3%81%AE-ffmpeg-%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF/","title":"iOS 的 ffmpeg 參數"},{"content":"Android (Google Pixel) 裝置的還原步驟 當您的 Google Pixel 裝置遭遇「無限重啟（Bootloop）」、「卡在標誌畫面無法進入系統」或「運作極度不穩定」等嚴重的系統故障時，您可以透過 Google 官方提供的 「Pixel Update and Software Repair」 工具，經由瀏覽器安全地修復（還原）裝置的軟體。\n本文將詳細介紹具體步驟與注意事項。\n1. 存取還原工具 首先，請透過 PC（Windows 或 Mac）的瀏覽器（建議使用 Google Chrome 或 Microsoft Edge），存取以下官方修復工具頁面：\n🔗 Pixel Update and Software Repair 官方網站\n※注意事項※ 執行還原處理後，裝置內的資料（照片、應用程式、聯絡人等）可能會 全部清除（初始化） 。如果裝置仍可操作，請務必事先備份至 Google 雲端硬碟等地方。\n2. 還原前的準備工作 為了讓過程順利進行，請先做好以下準備：\n電池充電 如果在過程中斷電，可能會導致裝置變磚（完全損壞）。請確保至少有 50% 以上的電量，最好能充飽電。 準備原廠 USB 傳輸線 為了確保資料傳輸穩定，強烈建議使用裝置隨附的原廠 USB-C 傳輸線。 （如有需要）安裝驅動程式 如果您使用的是 Windows PC，裝置可能無法被正確辨識。這種情況下請安裝 Google USB 驅動程式。 3. 具體還原步驟 準備就緒後，請按照畫面上的指示進行還原。\nStep 1: 選擇電信商並連接裝置 開啟網站後，首先會顯示選擇通訊電信商的畫面。如果是無鎖版或沒有電信商限制，請選擇「其他（Other）」等選項。 接著，使用 USB 傳輸線將 PC 與 Pixel 裝置連接。\nStep 2: 讓裝置進入「救援模式（Fastboot 模式）」 按照畫面指示，在裝置關機狀態下 同時長按「電源鍵」與「音量減鍵」 ，啟動 Fastboot 模式（黑色背景且有一個倒下的 Android 機器人的畫面）。\nStep 3: 讓 PC 端辨識裝置 在瀏覽器上點擊「連接裝置」按鈕，瀏覽器會彈出視窗並顯示已連接的 Pixel 裝置清單。請選擇目標裝置並允許連接。\nStep 4: 下載並安裝軟體 當裝置被辨識後，系統會自動選出最適用的 Android OS（韌體）版本。點擊「安裝」後，軟體將下載至 PC，並隨即開始寫入（刷機）至裝置中。\n⚠️ 警告： 在此處理過程中， 絕對不要拔除 USB 傳輸線，也不要關閉 PC 電源。\nStep 5: 完成與初始設定 當進度條達到 100% 並顯示「完成」訊息時，代表還原成功。裝置會自動重新啟動，並顯示與剛購買時相同的初始設定畫面（「你好」畫面）。\n總結 Google Pixel 的官方修復工具非常優秀，不需要直接輸入特殊指令（adb 或 fastboot），只需在瀏覽器上點擊操作，就能安全地重刷韌體。\n在裝置出現問題準備送修前，不妨先嘗試這個步驟，或許能輕鬆解決問題。希望這篇文章對您有幫助。\n","date":"2025-02-28T01:20:41+09:00","image":"http://kenji.blog/p/androidgoogle-pixel%E7%AB%AF%E6%9C%AB%E3%81%AE%E5%BE%A9%E5%85%83%E6%89%8B%E9%A0%86/pixel_restore_eyecatch_1788588727945_hu9d405d830ed3e56e9e703ab601cf6c0a_776052_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/zh-tw/p/androidgoogle-pixel%E7%AB%AF%E6%9C%AB%E3%81%AE%E5%BE%A9%E5%85%83%E6%89%8B%E9%A0%86/","title":"Android (Google Pixel) 裝置的軟體還原（初始化・修復）步驟"},{"content":"透過 curl 發送 Gmail 1. 取得應用程式密碼 https://myaccount.google.com/apppasswords 點擊上方連結，並輸入應用程式名稱。 儲存產生的密碼。\n2. 使用 curl 指令發送電子郵件 執行以下指令。\n在下面的範例中，郵件內容寫在 mail.txt 中。\n1 2 3 4 5 6 From: from@gmail.com To: to@gmail.com Subject: 測試郵件 Content-Type: text/plain; charset=\u0026#34;UTF-8\u0026#34; 這是一封測試郵件。 建立上述檔案後，執行以下指令。\n1 curl --url \u0026#34;smtps://smtp.gmail.com:465\u0026#34; --ssl-reqd --mail-from \u0026#34;from@gmail.com\u0026#34; --mail-rcpt \u0026#34;to@gmail.com\u0026#34; --user \u0026#34;from@gmail.com:xxxxxxxxxxxxxxxx\u0026#34; --upload-file mail.txt ※ 請將 xxxxxxxxxxxxxxxx 替換為您的應用程式密碼。\n","date":"2025-02-27T02:13:31+09:00","image":"http://kenji.blog/p/gmail%E3%82%92curl%E3%81%8B%E3%82%89%E9%80%81%E3%82%8B/img_hua1028a8ea194106f3853f4bdf4e1e991_75790_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E9%80%8F%E9%81%8E-curl-%E7%99%BC%E9%80%81-gmail/","title":"透過 curl 發送 Gmail"},{"content":"介紹使用標準函式庫的範例程式碼。\n下載並顯示圖片 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import urllib.request import tempfile import os import webbrowser import time url = \u0026#34;https://www.aomori-ringo.or.jp/kids/wp-content/uploads/2021/11/apple.png\u0026#34; try: with urllib.request.urlopen(url) as response: img_data = response.read() # 儲存至暫存檔案並顯示 with tempfile.NamedTemporaryFile(delete=False, suffix=\u0026#34;.png\u0026#34;) as tmp: tmp.write(img_data) print(f\u0026#34;file://{tmp.name}\u0026#34;) webbrowser.open(f\u0026#34;file://{tmp.name}\u0026#34;) time.sleep(3) except Exception as e: print(f\u0026#34;發生錯誤： {e}\u0026#34;) finally: if \u0026#39;tmp\u0026#39; in locals(): os.unlink(tmp.name) # 刪除暫存檔案 ","date":"2025-02-24T18:21:14+09:00","image":"http://kenji.blog/p/python%E3%82%B3%E3%83%BC%E3%83%89%E7%89%87/img_hu6807d8c9816a78d77990562cff91e319_70806_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/python%E3%82%B3%E3%83%BC%E3%83%89%E7%89%87/","title":"Python 程式碼片段"},{"content":"透過 curl 呼叫 ChatGPT API 本文假設從 Windows 的命令提示字元呼叫。\n1 2 curl https://api.openai.com/v1/chat/completions -H \u0026#34;Content-Type: application/json\u0026#34; -H \u0026#34;Authorization: Bearer sk-proj-XXXXXXXXXXXXXXXXXXXX\u0026#34; -d \u0026#34;{\u0026#34;\u0026#34;model\u0026#34;\u0026#34;: \u0026#34;\u0026#34;gpt-3.5-turbo\u0026#34;\u0026#34;,\u0026#34;\u0026#34;messages\u0026#34;\u0026#34;: [{\u0026#34;\u0026#34;role\u0026#34;\u0026#34;: \u0026#34;\u0026#34;system\u0026#34;\u0026#34;, \u0026#34;\u0026#34;content\u0026#34;\u0026#34;: \u0026#34;\u0026#34;請用關西腔回答。\u0026#34;\u0026#34;}, {\u0026#34;\u0026#34;role\u0026#34;\u0026#34;: \u0026#34;\u0026#34;user\u0026#34;\u0026#34;, \u0026#34;\u0026#34;content\u0026#34;\u0026#34;: \u0026#34;\u0026#34;在此插入您要發送的訊息\u0026#34;\u0026#34;}]}\u0026#34; ","date":"2025-02-01T17:15:34+09:00","image":"http://kenji.blog/p/chatgpt-api%E3%82%92curl%E3%81%8B%E3%82%89%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99/img_huc9cfad0a382aa812189dd7635d7709f2_1078030_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/chatgpt-api%E3%82%92curl%E3%81%8B%E3%82%89%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99/","title":"透過 curl 呼叫 ChatGPT API"},{"content":"高股息股票總結 三菱日聯金融集團 (8306) 三井住友金融集團 (8316) 三菱商事 (8058) 伊藤忠商事 (8001) NTT (9432) KDDI (9433) 沖繩蜂窩電話 (9436) 東京海上控股 (8766) 豐田汽車 (7203) 雅馬哈發動機 (7272) 朝日集團控股 (2502) 麒麟控股 (2503) JT (2914) 普利司通 (5108) 大和房屋工業 (1925) 積水房屋 (1928) 京瓷 (6971) 信越化學工業 (4063) 日東電工 (6988) 歐力士 (8591) 三菱HC資本 (8593) Hulic (3003) ","date":"2024-12-22T00:56:14+09:00","image":"http://kenji.blog/p/%E9%AB%98%E9%85%8D%E5%BD%93%E6%A0%AA%E3%81%BE%E3%81%A8%E3%82%81/img_huf2943e4fc5463d0d6e36ddd1be1ac839_1663544_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E9%AB%98%E9%85%8D%E5%BD%93%E6%A0%AA%E3%81%BE%E3%81%A8%E3%82%81/","title":"高股息股票總結"},{"content":"長期目標 1年後 創立事業 建立網站並發布軟體（免費） 2年後 年營業額 1000 萬日圓 出版書籍 發布軟體（付費） 3年後 年營業額 1 億日圓 5年後 年營業額 10 億日圓 10年後 年營業額 100 億日圓 短期目標 1個月後 撰寫創業計畫書 3個月後 籌集創業資金約 500 萬日圓 6個月後 創立事業 1年後 使事業步入正軌 近期任務 明確目標與願景\n目的: 為什麼要開發軟體？ 例如: 解決問題、提供新價值、針對特定小眾市場等。 願景: 希望透過軟體實現什麼樣的未來？ 例如: 業務效率化、日常生活更便利、教育品質提升等。 市場調查與需求分析\n目標用戶: 軟體的使用者是誰？具體設定年齡層、職業、興趣等。 競品調查: 同領域是否有競爭對手？分析其優缺點。 確認需求: 掌握目標用戶尚未解決的問題或需求。 軟體設計與特色\n基本功能: 列出必要的功能。例如: 用戶認證、資料儲存、分析功能等。 差異化重點: 與其他公司產品相比，明確指出獨特之處。例如: 簡單的 UI、AI 應用、高度自定義能力。 技術規格: 使用的程式語言、框架、資料庫等。 開發計畫與資源分配\n開發時程: 制定專案各階段的時間表。例如: 原型開發、測試、正式發布。 團隊組成: 需具備的人才與技能（程式設計師、設計師、行銷人員等）。 預算: 估算開發費用、行銷費用與營運費用。 行銷與盈利模式\n推廣方法: 活用社群媒體、網站、廣告等提升知名度。 盈利策略: 評估免費版＋付費版、月費訂閱、廣告收入等選項。 獲客策略: 提供免費試用、促進口碑傳播、建立用戶社群等。 營運與規模擴展\n發布後的營運: 收集用戶回饋、修復 bug、新增功能。 成長策略: 規劃增加用戶數的方法、拓展海外市場與開發新功能。 風險管理: 準備針對法律問題與技術故障的應對措施。 ","date":"2024-12-08T03:32:34+09:00","image":"http://kenji.blog/p/%E7%9B%AE%E6%A8%99/img_huc6a3627da74a1082cbdd433fea41830c_4007614_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E7%9B%AE%E6%A8%99/","title":"目標"},{"content":"最近我對皮革製品產生了興趣，並購買了各種物品。在這樣的過程中，我也對皮革製品的保養產生了興趣，因此準備了一些相關用品來向大家介紹。\n最近購買的皮革保養用品 M.MOWBRAY DELICATE CREAM 價格：約 1,320 日圓\n這款乳霜具有營養補給、保濕和柔軟的效果。 雖然不會產生光澤，但非常適合需要大量水分和滋潤的皮革。 味道不會令人討厭，但稍微有一點氣味。 因為是無色的，我認為用途非常廣泛。因為是比較清爽的乳霜， 與其他乳霜相比，稍微多用一點可能會比較好。\nCollonil 1909 Supreme Creme de Luxe 價格：約 1,777 日圓\n知名、標準且萬用的乳霜，不容易產生斑點。這是一款能修補皮革顏色並使其保持濕潤的乳霜。 會產生少許光澤。因為是白色的，似乎也能期待撥水的效果。\nM.MOWBRAY SHOE CREAM (黑色) 價格：約 1,000 日圓\n鞋用乳霜。含有蠟、油脂和有機溶劑。 修補皮革的顏色並產生光澤。因為是黑色的，適用於黑色皮革。 我把它用在西裝皮鞋上。\nM.MOWBRAY STAIN REMOVER 價格：約 700 日圓\n這是我買刷子時附贈的。 鞋用水性清潔劑。去除皮革上的污垢。 讓布充分吸收後，輕輕擦拭皮革即可去除污垢。\n","date":"2024-10-30T00:31:46+09:00","image":"http://kenji.blog/p/%E9%9D%A9%E8%A3%BD%E5%93%81%E3%81%AE%E3%83%A1%E3%83%B3%E3%83%86%E3%83%8A%E3%83%B3%E3%82%B9/img_hu3ddba03af9cef883a82321d0a762e708_211817_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E7%9A%AE%E9%9D%A9%E8%A3%BD%E5%93%81%E7%9A%84%E4%BF%9D%E9%A4%8A/","title":"皮革製品的保養"},{"content":"大家好！今天我們來聊聊「漢隆的剃刀」 今天我想寫一個名字有點奇怪的思維方式，叫做「漢隆的剃刀」。光聽名字你可能會想「這好像有點可怕……？」，但其實這是一個能給我們帶來非常親切、溫柔視角的想法。\n你有過「那個人可能討厭我……」的想法嗎？ 例如，你有過這樣的經驗嗎？\nLINE回覆得很慢 明明對上眼了，卻沒有打招呼 拜託的事情被無視了 在這種時候，就會不安地想「難道我被討厭了？」。 我也經常這樣。然後就自己在一旁感到沮喪。\n什麼是漢隆的剃刀？ 這時「漢隆的剃刀」就派上用場了。\n這個詞原本的英文是 \u0026ldquo;Hanlon\u0026rsquo;s Razor\u0026rdquo;。 大意是這樣的：\n「能用愚蠢來解釋的，就不要歸咎於惡意。」\n……這說法有點尖銳，對吧。 說得更柔和一點就是：\n「即使對方看起來像在刁難你，可能也只是單純的疏忽或不小心而已。」\n就是這樣的思維方式。\n這是誰提出來的？羅伯特·J·漢隆是誰？ 據說這個詞最早出現在1980年出版的《墨菲定律第二集》（Murphy’s Law Book Two）一書中。\n書中直接使用了其中一位作者 羅伯特·J·漢隆 （Robert J. Hanlon）投稿的想法，因此被命名為「漢隆的剃刀」。\n順帶一提，這裡的「剃刀（Razor）」指的是「削去多餘的部分，簡單地思考」這樣像哲學工具一樣的意思，它與奧卡姆剃刀等齊名，是經常用來整理思緒的一種表達方式。\n總覺得「對方有惡意」，會讓自己很累 例如，在職場上寄出的電子郵件被無視時。\n如果心想「為什麼不回我？是討厭我嗎？」，想法就會變得越來越負面。\n但是仔細想想，\n剛好漏看了 寫了回覆卻忘記按發送 手機的通知被淹沒了 像這樣的理由，意外地非常多。 而且，我們自己其實也常常犯這種錯。\n對自己的失誤很寬容，對別人卻很嚴格的奇妙現象 例如，自己忘記回覆朋友的LINE時。\n我們經常會用毫無惡意的語氣回覆：「啊，抱歉！沒看到通知～」。\n但是，當別人對自己做同樣的事情時，就會覺得「我被無視了」。\n這是很常見的事。 人對於自己的情況非常能理解，但往往很難看清別人的難處。\n認定「對方有惡意」，其實是自己吃虧 當對方做了什麼事，如果你認定「他就是有惡意」，在心裡就會把那個人當作敵人。\n但其實，他可能只是笨拙，或者被其他事情忙得不可開交而已。\n當然，這世上確實有真正沒禮貌的人，被惡劣對待時感到受傷也是理所當然的。\n但是，不要輕易斷定「一定是惡意」，能讓自己的心輕鬆一點。\n雖說如此，這並不是要你什麼都忍耐 這裡不希望大家誤解，我並不是想說「這全都是你想太多了」。\n遇到討厭的事情時，覺得「那真的很過分」是完全沒問題的。\n只是，與其斷定「那個人性格很差」或「他是故意想傷害我」，\n不如試著給自己一點彈性，想著「或許他有什麼苦衷吧」，這是我的一個提議。\n所以：稍微用溫柔的眼光看待事物，世界或許會有所改變 我認為漢隆的剃刀與其說是「對別人溫柔」，不如說是一種「保護自己心靈的方法」。\n感受到別人行為中的惡意時，自己的心情也會變得緊繃。\n但是，如果能想著「大概只是失誤，或者他只是分身乏術吧」，自己的心情就會輕鬆一些。\n這就是一種為了自己而使用的思維方式。\n最後：請務必與我分享你的經歷 非常感謝您的閱讀。\n如果您有過「在這種時候感到很悶悶不樂～」的經歷，請務必告訴我。\n有時候，光是把自己的經歷說出來，心裡就會舒坦許多呢。\n那麼，下次見！\n","date":"2024-09-24T18:14:34+09:00","image":"http://kenji.blog/p/%E3%83%8F%E3%83%B3%E3%83%AD%E3%83%B3%E3%81%AE%E5%89%83%E5%88%80/img_hu0c32762ee7cb281fb24d789425dae55e_82924_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/hanlon-s-razor/","title":"漢隆的剃刀"},{"content":"電腦的基礎知識 本頁將說明什麼是電腦。\n電腦的定義 電腦是一台擁有以下五種單元的機器：\n輸入單元 輸出單元 記憶單元 控制單元 算術邏輯單元 簡而言之，對某個 輸入 進行特定的 處理，並將結果 輸出 的機器就是電腦。 它可以 記憶 所 輸入 的資料，進行 運算，並進行 輸出。 控制 負責控制上述四種單元。\n運行電腦所需的事物 要運行電腦，除了設備（硬體）之外，還需要程式（軟體）。\n在程式中，我們指示電腦要執行什麼樣的處理。程式是以電腦能夠理解的格式撰寫的。\n程式的範例如下： 一個計算從 1 到輸入整數之總和的程式\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include \u0026lt;iostream\u0026gt; using namespace std; int main() { // 配置所需的記憶體空間 int n, sum = 0; // 輸出 cout \u0026lt;\u0026lt; \u0026#34;請輸入一個整數： \u0026#34;; // 輸入 cin \u0026gt;\u0026gt; n; // 運算 for (int i = 1; i \u0026lt;= n; i++) { // 運算 sum += i; } // 輸出 cout \u0026lt;\u0026lt; \u0026#34;從 1 到 \u0026#34; \u0026lt;\u0026lt; n \u0026lt;\u0026lt; \u0026#34; 的總和是 \u0026#34; \u0026lt;\u0026lt; sum \u0026lt;\u0026lt; \u0026#34;。\u0026#34; \u0026lt;\u0026lt; endl; // 結束 return 0; } 程式會透過編譯器轉換成機器碼，並轉換為電腦可以執行的格式。\n","date":"2024-09-19T01:10:20+09:00","image":"http://kenji.blog/p/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E5%9F%BA%E6%9C%AC%E7%9F%A5%E8%AD%98/img_hubc9c51905d797e9d57f0ff169cf73b36_367819_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E5%9F%BA%E6%9C%AC%E7%9F%A5%E8%AD%98/","title":"電腦的基礎知識"},{"content":"推薦的 iOS 應用程式 X Instagram facebook youtube TikTok Microsoft Edge Firefox Google Chrome ChatGPT LINE Microsoft Teams Notion Goodnotes 6 TeamViewer DropBox GitHub Amazon PayPay WolframAlpha Mercari ","date":"2024-09-18T23:31:20+09:00","image":"http://kenji.blog/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81ios%E3%82%A2%E3%83%97%E3%83%AA/img_huad2df38b51218b64bee99f031553dd91_79847_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E6%8E%A8%E8%96%A6%E7%9A%84-ios-%E6%87%89%E7%94%A8%E7%A8%8B%E5%BC%8F/","title":"推薦的 iOS 應用程式"},{"content":"老夫婦與驢，以及我們“該聽誰的話”的問題 你好！\n今天我想談談“老夫婦與驢的故事”中引發我思考的一件事。\n相信很多人都聽過這個著名的寓言故事。\n什麼是“老夫婦與驢的故事”？ 很久很久以前，有一對老夫婦和一頭驢。\n一開始，老爺爺騎著驢，老奶奶跟在後面走。路過的人看到了便說：\n“這男的怎麼這樣，讓年邁的妻子走路，自己卻騎著驢！”\n老夫婦聽了，便換成老奶奶騎驢。這時，又有另一個人說：\n“女人騎驢讓男人走路，成何體統！”\n好吧，於是兩個人一起騎上了驢。結果又有人說了：\n“這頭驢真可憐，載兩個人太重了！”\n既然如此，兩個人都從驢背上下來，開始走路。這時又有人說：\n“有驢子為什麼沒有人騎呢？”\n最後，這對老夫婦完全不知所措了。\n“聽取大家的意見”確實有理，但是…… 這個故事通常被當作一個教訓，告訴我們：“如果太在意別人的眼光，永遠也無法滿足所有人。”\n但現實並非如此簡單。\n經常有人說：“別在意別人的眼光！”\n可是要完全忽視，實在有點困難。例如在社群媒體發文時，或者思考在公司聚餐該說些什麼時，我們總是會不自覺地在意別人的反應。\n因為“別人的意見”有時關乎我們的安全和評價。\n話雖如此，太過受他人影響會讓人很痛苦 這個故事裡的老夫婦，可能一開始只是在想：“到底該怎麼辦才好呢？”\n但不論怎麼做，總會有人抱怨。\n然後他們開始陷入迴圈：“那下次這樣吧”、“還是那樣好？”，回過神來才發現，自己已經迷失了真正想做的事。\n這種情況在我們的日常生活中也經常發生。\n上司的期望、父母的話語、社群媒體上的“讚”數。在迎合這些的過程中，你有沒有覺得自己已經不知道自己真正想做什麼了呢？\n選擇“聽誰的話”很重要 那麼，我們該怎麼辦呢？其實並沒有標準答案。\n不過，“聽從所有人的意見”在現實中是不可能的。\n正因如此，我認為自己去選擇“聽誰的話”非常重要。\n例如，“只聽自己尊敬的人的建議”，或者“以過去的自己是否能接受為標準”。\n只要有一個“我願意相信”的標準，世界上的雜音就會減少一些。\n所以，當你覺得有點累的時候 不妨回想一下“老夫婦與驢”的故事。\n別人的眼光，總是會讓人忍不住在意。\n但如果要去回應所有人，你最終也會從驢背上下來的。\n有時告訴自己：“優先考慮自己的感受或許也不錯。”這樣一想，心裡或許會輕鬆一些。\n","date":"2024-09-18T00:56:59+09:00","image":"http://kenji.blog/p/%E8%80%81%E5%A4%AB%E5%A9%A6%E3%81%A8%E3%83%AD%E3%83%90%E3%81%AE%E8%A9%B1/img_hu4e12b653e0413f37819b2904ce683e39_500631_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E8%80%81%E5%A4%AB%E5%A9%A6%E8%88%87%E9%A9%A2%E5%AD%90%E7%9A%84%E6%95%85%E4%BA%8B/","title":"老夫婦與驢子的故事"},{"content":"為什麼製造藍光LED幾乎是不可能的 介紹一部英語紀錄片。非常有趣。給人留下的強烈印象是，解決這個極其困難問題的日本人，最初在日本國內並沒有得到太多認可。\n","date":"2024-09-15T00:43:52+09:00","image":"http://kenji.blog/p/%E3%81%AA%E3%81%9C%E9%9D%92%E8%89%B2led%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%BB%E3%81%BC%E4%B8%8D%E5%8F%AF%E8%83%BD%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B/img_hu003acf083dbe465265af012766f30af7_1201686_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E3%81%AA%E3%81%9C%E9%9D%92%E8%89%B2led%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%BB%E3%81%BC%E4%B8%8D%E5%8F%AF%E8%83%BD%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B/","title":"為什麼製造藍光LED幾乎是不可能的"},{"content":"在 VSCode 中開始 Qt 開發：如何安裝 Qt Extension Pack 大家好，我是 Kenji。 這次我們將介紹「如何在 Visual Studio Code（以下簡稱 VSCode）中設定 Qt 的開發環境」。\n最近，除了官方的 Qt Creator 之外，越來越多的人希望使用輕量且高擴充性的 VSCode 來開發 Qt 應用程式。 推薦給這些人的就是 \u0026ldquo;Qt Extension Pack\u0026rdquo; 。 只需安裝此擴充套件包，即可一次擁有與 Qt 相關的主要擴充功能。\n目標讀者 想要開始使用 Qt 開發 GUI 應用程式的人 想要在 VSCode 而不是 Qt Creator 中進行開發的人 覺得逐一尋找擴充功能很麻煩的人 必備條件 已安裝 VSCode （可從官方網站免費下載） 已安裝 Qt 函式庫本體（Qt 官方網站） 什麼是 Qt Extension Pack？ Qt Extension Pack 是適用於 VSCode 的擴充套件包。 安裝後，將自動新增以下功能：\n支援 .ui 檔案（Qt Designer） .pro 檔案與 .qrc 檔案的語法突顯 適用於 Qt 的 C++ 程式碼自動完成、建置與除錯支援 Qt Resource Browser（資源參考） 安裝步驟 1. 開啟 VSCode 首先，請啟動 VSCode。\n2. 開啟擴充功能檢視 點擊左側的活動列（方形區塊圖示）以顯示「擴充功能」。\n或者您也可以使用快捷鍵 按下 Ctrl + Shift + X 。\n3. 搜尋 \u0026ldquo;Qt Extension Pack\u0026rdquo; 在搜尋列中輸入以下關鍵字：\n1 Qt Extension Pack 4. 點擊安裝按鈕 當顯示目標套件時，點擊「安裝」按鈕。 這樣就會一次安裝以下多個擴充功能：\nQt Language Support QML Support Qt Designer Integration CMake Tools（使用 CMake 進行 Qt 開發時必備） 專案設定補充（CMake + Qt 範例） 如果您在使用基於 CMake 的 Qt，建議搭配以下擴充功能：\nCMake Tools CMake Language Support 此外，如果您在 CMakeLists.txt 中加入以下描述，與 Qt 的整合將會很順利：\n1 2 find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(MyApp PRIVATE Qt6::Widgets) 補充：如何開啟 .ui 檔案？ .ui 檔案可以在 Qt Designer 中編輯。 在 VSCode 中，您可以對 .ui 檔案點擊右鍵 → 選擇 Open with Qt Designer （環境變數 PATH 中必須包含 Qt Designer）。\n總結 步驟 內容 1 啟動 VSCode 2 開啟擴充功能面板 3 搜尋 \u0026ldquo;Qt Extension Pack\u0026rdquo; 4 點擊安裝按鈕 在 VSCode 中建構 Qt 環境變得比以前容易許多。 它擁有足夠的功能作為 Qt Creator 的替代品，推薦給想要輕快地工作的人。\n推薦連結集 Qt 官方 Qt Extension Pack - Visual Studio Marketplace VSCode 官方 CMake Tools 擴充功能 最後 未來，我計畫在此環境中利用 Qt 的 UI 工具和 QML 推進開發。 下次，我將解說 如何從 VSCode 建置與執行 Qt Hello World 應用程式 。\n下次見！\n","date":"2024-09-13T00:53:53+09:00","image":"http://kenji.blog/p/visual-studio-code-%E3%81%AB-qt-extension-pack-%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%BF%E3%81%9F/img_1_hu3662f535d644da02b1919ea56b7b16c2_319254_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/visual-studio-code-%E3%81%AB-qt-extension-pack-%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%BF%E3%81%9F/","title":"嘗試在 Visual Studio Code 中安裝 Qt Extension Pack"},{"content":"如何確認 iPhone 是否有 SIM 卡鎖定 主畫面 \u0026gt; 設定 \u0026gt; 一般 \u0026gt; 關於本機 \u0026gt; 電信業者鎖定\n確認是否顯示「無 SIM 卡限制」或有 SIM 卡鎖定。\n","date":"2024-09-12T00:32:11+09:00","image":"http://kenji.blog/p/iphone%E3%81%ABsim%E3%83%AD%E3%83%83%E3%82%AF%E3%81%8C%E3%81%8B%E3%81%8B%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_huadfe7e53f677430d2790fc209a2a5361_107562_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/iphone%E3%81%ABsim%E3%83%AD%E3%83%83%E3%82%AF%E3%81%8C%E3%81%8B%E3%81%8B%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"如何確認 iPhone 是否有 SIM 卡鎖定"},{"content":"概要 1 P類別是在確定性圖靈機上可以在多項式時間內判定的一類問題，而NP類別是當給定一個結果為Yes的證據（稱為Witness）時，可以在多項式時間內判定Witness正確性（稱為驗證）的一類問題。由於在多項式時間內可判定的問題可以在多項式時間內驗證，因此P⊆NP是顯而易見的，但P是否為NP的真子集仍不清楚。目前尚無證明，但許多研究人員相信P≠NP。而這種認為P類別和NP類別不相等的猜想被稱為「P≠NP猜想」。 參考網站 : https://daigakudenki.com/np-hard/\n","date":"2024-09-11T02:22:39+09:00","permalink":"http://kenji.blog/zh-tw/p/pnp%E4%BA%88%E6%83%B3/","title":"P≠NP猜想"},{"content":"再次榮獲 Microsoft MVP (2024-2025) 大家好，我是 kenji。 很高興向大家報告，我今年再次榮獲 Microsoft MVP (Most Valuable Professional) 獎項。這是我第 8 次獲得此殊榮。\n藉此機會，我想稍微聊聊「什麼是 MVP」。\n什麼是 Microsoft MVP？ 雖然叫 MVP，但這與體育界的「最有價值球員」無關（雖然偶爾會被問到\u0026hellip;）。 Microsoft MVP (Most Valuable Professional) 是頒發給積極向社群分享、傳遞微軟技術知識與經驗的人的一項榮譽。\n撰寫技術部落格、在問答網站上回答問題、公開範例程式碼，或是參與活動演講。 「以幫助他人的方式分享自己所知」——這些腳踏實地的活動都會受到評估。\n獲獎者遍布全球，但每年人數有限，要再次獲獎也絕非易事。 在這樣的情況下能再次獲得認可，我真的非常感激。\n獲獎理由 這次的獎項是在「Developer Technologies」類別下再次獲獎。 過去這一年，我參與了以下活動：\n撰寫關於微軟相關技術的部落格文章 在技術問答網站上回答問題 在 GitHub 上公開範例程式碼 在讀書會和技術活動中發表演講 等等 這些都不是什麼特別了不起的事，但我一直努力將「我自己嘗試過且成功的方法」和「遇到困難但解決的經驗」轉化為對他人有用的形式分享出來。\n看到這些努力有了成果，我感到由衷的高興。\n展望未來 技術領域的發展速度非常快，光是要跟上腳步就很辛苦了。 但正因如此，分享「實際使用的感受」以及「哪裡難以理解」這類「真實資訊」，才顯得更有意義。\n未來我也會繼續以自己的步調前進，不會給自己太大壓力。 如果我提供的資訊能讓某個人覺得「啊，這幫了大忙」，那我就心滿意足了。\n今後也請多多指教。\n","date":"2024-09-03T21:25:20+09:00","image":"http://kenji.blog/p/microsoft-mvp2024-2025%E3%82%92%E5%86%8D%E5%8F%97%E8%B3%9E%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/img_hu90bf51ced9d60993f005bc037644a192_1013423_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%86%8D%E6%AC%A1%E6%A6%AE%E7%8D%B2-microsoft-mvp-2024-2025/","title":"再次榮獲 Microsoft MVP (2024-2025)"},{"content":"什麼是 yt-dlp yt-dlp 是一個用於下載 YouTube 影片的命令列工具。 不僅可以下載影片，還可以將其作為音樂檔案以 mp3 格式下載。\n下載與安裝 從 yt-dlp 的發布頁面 下載最新的 yt-dlp.exe。 將 yt-dlp.exe 放置在任意資料夾中。 將 yt-dlp.exe 的資料夾路徑加入到環境變數 Path 中。 使用方法 在命令提示字元中執行 yt-dlp.exe，並指定 YouTube 影片的 URL。\n1 yt-dlp.exe \u0026#34;https://www.youtube.com/watch?v=VIDEO_ID\u0026#34; ※ 參數部分也可以只輸入 VIDEO_ID。\n如果要將其下載為 mp3 音樂檔案，請執行以下命令：\n1 yt-dlp.exe --extract-audio --audio-format mp3 --embed-thumbnail --add-metadata \u0026#34;https://www.youtube.com/watch?v=VIDEO_ID\u0026#34; 這樣，影片就會下載到執行命令的當前目錄中。\n以上。\n","date":"2024-09-03T14:09:26+09:00","image":"http://kenji.blog/p/yt-dlp.exe-%E3%81%AB%E3%82%88%E3%82%8B-youtube-%E5%8B%95%E7%94%BB%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E6%96%B9%E6%B3%95/img_1_hu05024a06b03b28eb7dbfa3d8c8b493fd_22080_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/yt-dlp.exe-%E3%81%AB%E3%82%88%E3%82%8B-youtube-%E5%8B%95%E7%94%BB%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E6%96%B9%E6%B3%95/","title":"如何使用 yt-dlp.exe 下載 YouTube 影片"},{"content":" 足球 球僮 @gg211204 『球僮成為英雄的日子』 拯救了球隊的球僮後來被邀請到俱樂部與球員們共進晚餐。 #トッテナム #スパーズ #モウリーニョ #ボールボーイ ♬ original sound - じょり 星巴克 ","date":"2024-08-25T16:24:35+09:00","image":"http://kenji.blog/p/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E5%8B%95%E7%94%BB%E3%83%AA%E3%83%B3%E3%82%AF/img_hu6a40cd72b9cd9a636c4c642d7bc2c778_3354885_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E7%9F%AD%E5%BD%B1%E7%89%87%E9%80%A3%E7%B5%90/","title":"短影片連結"},{"content":"你好！\n今天，我想談談愛因斯坦的名言。\n世界不看重你的善行？ 1 2 3 4 5 6 世界永遠不會評估你做的一百萬件好事。 但他們會批評你做錯的一件事... 但不要灰心 「永遠超越所有的嘲笑和批評。保持堅強。」 - 阿爾伯特·愛因斯坦 這是據說由愛因斯坦所說的話。它敏銳地指出了我們每天感受到的社會的嚴酷，以及人們評價的偏見。\n儘管如此，繼續站起來 「永遠超越所有的嘲笑和批評。保持堅強。」\n這些接下來的話可以說是愛因斯坦對上述殘酷現實的回答。它們教會我們不屈服於批評或嘲笑，並繼續對自己充滿信心地前進的重要性。\n將愛因斯坦的教誨應用於日常生活 這句名言與我們的日常生活息息相關。例如，有時候你在工作上的努力沒有得到認可，只有微小的錯誤引人注目。此外，你在社群媒體上的發言可能會被斷章取義並受到批評。\n在這種時候，試著記住愛因斯坦的話。重要的是保持自己的信念，而不是為別人的評價而喜怒哀樂。\n結論 愛因斯坦的這句名言教會了我們「不被他人評價所左右，相信自己而活」的重要性。讓我們有勇氣走我們相信的道路，不屈服於批評或嘲笑。\n最後，再次回顧愛因斯坦的話。\n「永遠超越所有的嘲笑和批評。保持堅強。」\n希望這些話能在你心中產生共鳴，並激勵你向前邁出積極的一步。\n","date":"2024-08-24T18:38:47+09:00","image":"http://kenji.blog/p/%E3%82%A2%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E3%81%AE%E5%90%8D%E8%A8%80/Solvay_conference_1927_hu5334df7b0e2e62905cb44adbbbde85ad_2671814_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/zh-tw/p/%E6%84%9B%E5%9B%A0%E6%96%AF%E5%9D%A6%E7%9A%84%E5%90%8D%E8%A8%80/","title":"愛因斯坦的名言"},{"content":"以下是一個簡單的C語言程式碼，用於生成指定範圍內的質數。在這個例子中，我們列舉從1到n的質數。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #include \u0026lt;stdio.h\u0026gt; #include \u0026lt;stdbool.h\u0026gt; bool isPrime(int num) { if (num \u0026lt;= 1) return false; if (num \u0026lt;= 3) return true; if (num % 2 == 0 || num % 3 == 0) return false; for (int i = 5; i * i \u0026lt;= num; i += 6) { if (num % i == 0 || num % (i + 2) == 0) return false; } return true; } void printPrimes(int n) { printf(\u0026#34;2 \u0026#34;); for (int i = 3; i \u0026lt;= n; i += 2) { if (isPrime(i)) { printf(\u0026#34;%d \u0026#34;, i); } } printf(\u0026#34;\\n\u0026#34;); } int main() { int n; printf(\u0026#34;請輸入生成質數範圍的最大值: \u0026#34;); scanf(\u0026#34;%d\u0026#34;, \u0026amp;n); printf(\u0026#34;1到%d之間的質數如下:\\n\u0026#34;, n); printPrimes(n); return 0; } 這段程式碼的運作方式如下：\nisPrime函數：判斷給定的數字是否為質數。為了提高效率，首先檢查是否能被2和3整除，然後再以6的倍數進行檢查。 printPrimes函數：輸出指定範圍內的質數。首先輸出2，然後只檢查奇數。 main函數：讓使用者輸入範圍的最大值，並輸出該範圍內的質數。 編譯並執行此程式碼後，將會顯示指定範圍內的質數。\n","date":"2024-08-24T09:38:10+09:00","image":"http://kenji.blog/p/%E7%B4%A0%E6%95%B0%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8Bc%E8%A8%80%E8%AA%9E%E3%82%B3%E3%83%BC%E3%83%89/img_hu31b8bd853d4750e84615619ef286e5d3_22034_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E7%94%9F%E6%88%90%E8%B3%AA%E6%95%B8%E7%9A%84c%E8%AA%9E%E8%A8%80%E7%A8%8B%E5%BC%8F%E7%A2%BC/","title":"生成質數的C語言程式碼"},{"content":"\n與謝野晶子 ** 「你不要死」 **\n―― 為在旅順口包圍軍中的弟弟悲嘆\n啊，弟弟啊，我為你哭泣，\n你不要死，\n身為么子的你\n父母的疼愛更是深厚，\n父母難道有讓你握著刀刃\n教你去殺人嗎？\n難道是為了讓你殺了人去死\n才把你養到二十四歲的嗎？\n身為堺市商人的\n古老家族引以為傲的主人，\n既然你繼承了父母的名字，\n你不要死，\n無論旅順的城堡是否陷落，\n陷落與否，又有何干？\n你或許不知道，這在商人的\n家規中是不曾有的。\n你不要死，\n天皇陛下在戰爭中\n不會親自出征，\n讓彼此流著人的血，\n死於野獸之道，\n並將赴死視為人的榮耀，\n天皇陛下的心意如此深遠，\n又怎會這般認為呢？\n啊，弟弟啊，在戰爭中\n你不要死，\n在去年秋天失去了\n父親大人的母親大人，\n在悲痛之中，令人心碎地\n自己的孩子又被徵召，守著家，\n即便是在聽說安泰的太平盛世，\n母親的白髮也只是與日俱增。\n躲在暖簾後伏地哭泣的\n嬌弱年輕的新婚妻子，\n你忘記了嗎？你想起過嗎？\n想想那連十個月都沒相伴就分離的\n少女的心吧，\n在這世上除了你這個唯一，\n啊，她還能依靠誰呢，\n你不要死。\n","date":"2024-07-25T13:16:47+09:00","permalink":"http://kenji.blog/zh-tw/p/%E4%BD%A0%E4%B8%8D%E8%A6%81%E6%AD%BB/","title":"你不要死"},{"content":"\n🔹 人物簡介 與謝野晶子（1878年～1942年）是活躍於明治至昭和初期的日本歌人、作家及思想家。她以熱情且充滿個性的短歌作品聞名，是在近代日本文學中為女性獨立及戀愛表達開創了新視野的代表性人物。\n本名 ：與謝野（舊姓：鳳）志（しょう）\n出生地 ：堺（大阪府堺市）\n丈夫 ：與謝野鐵幹（歌人、詩人）\n主要活躍時期 ：明治後期至昭和初期\n特色 ：\n以坦率表達女性戀愛感情的短歌而備受矚目 具備女性主義思想，推動女性教育與獨立 展現出批判日俄戰爭的和平主義姿態 為文學雜誌《明星》的核心成員 🔹 代表作及其大綱與特色 1. 《亂髮》（1901年） 概要 ：處女歌集。於20歲出頭發表，對日本文壇帶來了巨大的衝擊。 特色 ：從女性立場坦率地表達戀愛感情與肉體慾望。 著名短歌 ： 柔嫩肌膚的 炙熱鮮血你未曾觸碰 難道不覺寂寞嗎 不斷說教的你\n→ 透過女性自身的語言表達了在當時道德觀下被視為大膽的戀愛觀，因而引起了廣泛討論。\n2. 《君勿死去》（1904年） 形式 ：詩（為新體詩，非短歌） 內容 ：寫給出征日俄戰爭的弟弟的反戰詩。 部分節錄 ： 弟弟啊 願你不要死去 身為么子的你 讓母親淚流滿面 哭濕了你的衣袖……\n意義 ：在當時強烈美化戰爭的風氣中，從擔憂弟弟死去的女性立場訴諸反戰，此舉具有劃時代的意義。 🔹 影響與評價 進行了推動女性解放、和平主義、普及教育等在社會上具備先進性的活動。 晚年致力於女子教育，並參與了女子大學的設立（如文化學院等）。 為戰前日本最重要的女性知識分子及文學家之一。 🔹 總結 項目 內容 姓名 與謝野晶子 活躍領域 短歌、詩、評論、教育 主要作品 《亂髮》、《君勿死去》 特色 戀愛自由、女性獨立、和平主義的表達 對現代的影響 女性主義文學、近代短歌的革新、反戰詩的先驅 ","date":"2024-07-25T13:08:36+09:00","permalink":"http://kenji.blog/zh-tw/p/about-yosano-akiko/","title":"關於與謝野晶子"},{"content":"Mathematica 入門 解方程式 1 Solve[x^2 - 3 x + 2 == 0, x] 輸出\n1 {{x -\u0026gt; 1}, {x -\u0026gt; 2}} 在整數範圍內求方程式的解 1 Solve[x^2 - 3 x + 2 == 0 \u0026amp;\u0026amp; 0 \u0026lt;= x \u0026lt;= 2, x, Integers] 輸出\n1 {{x -\u0026gt; 1}, {x -\u0026gt; 2}} 解聯立方程式 1 Solve[{x + y == 3, x - y == 1}, {x, y}] 輸出\n1 {{x -\u0026gt; 2, y -\u0026gt; 1}} 解不等式 1 Reduce[x^2 - 3 x + 2 \u0026gt; 0, x] 輸出\n1 x \u0026lt; 1 || x \u0026gt; 2 微分 1 D[x^2, x] 輸出\n1 2 x 積分 1 Integrate[x^2, x] 輸出\n1 x^3/3 求極限 1 Limit[1/x, x -\u0026gt; 0] 輸出\n1 Infinity 求級數 1 Sum[1/n^2, {n, 1, Infinity}] 輸出\n1 π^2/6 建立矩陣 1 m = {{1, 2}, {3, 4}} 求矩陣乘積 1 m . m 輸出\n1 {{7, 10}, {15, 22}} 求反矩陣 1 Inverse[m] 輸出\n1 {{-2, 1}, {1.5, -0.5}} 求特徵值與特徵向量 1 Eigensystem[m] 輸出\n1 {{5, 0}, {{1, 1}, {1, -1}}} 求向量內積 1 {1, 2} . {3, 4} 輸出\n1 11 求向量外積 1 Cross[{1, 2, 3}, {4, 5, 6}] 輸出\n1 {-3, 6, -3} 求向量的大小 1 Norm[{1, 2, 3}] 輸出\n1 √14 求向量的角度 1 ArcCos[{1, 2} . {3, 4}/(Norm[{1, 2}] Norm[{3, 4}])] 輸出\n1 ArcCos[11/(√5 √25)] 求向量的投影 1 {1, 2} . {3, 4}/Norm[{3, 4}] {3, 4}/Norm[{3, 4}] 輸出\n1 {11/5, 22/5} 求向量的旋轉 1 RotationMatrix[π/2].{1, 0} 輸出\n1 {0, 1} 求向量的平移 1 TranslationTransform[{1, 2}][{3, 4}] 輸出\n1 {4, 6} 求向量的縮放 1 ScalingTransform[{2, 3}][{1, 1}] 輸出\n1 {2, 3} 求向量的反射 1 ReflectionTransform[{1, 1}][{1, 1}] 輸出\n1 {0, 0} 產生亂數 1 RandomReal[] 輸出\n1 0.123456 產生亂數（整數） 1 RandomInteger[] 輸出\n1 123456 產生亂數（指定範圍） 1 RandomReal[{1, 10}] 輸出\n1 5.6789 產生亂數（整數、指定範圍） 1 RandomInteger[{1, 10}] 輸出\n1 5 產生亂數（指定分佈） 1 RandomVariate[NormalDistribution[0, 1]] 輸出\n1 0.123456 產生亂數（指定分佈、指定數量） 1 RandomVariate[NormalDistribution[0, 1], 10] 輸出\n1 {0.123456, 0.234567, ..., 0.987654} 產生亂數（指定分佈、指定數量、指定種子） 1 2 SeedRandom[12345] RandomVariate[NormalDistribution[0, 1], 10] 輸出\n1 {0.123456, 0.234567, ..., 0.987654} 將函數套用至陣列元素 1 2 3 Map[Sqrt, {1, 4, 9}] Sqrt /@ {1, 4, 9} Map[#^(1/2)\u0026amp;, {1, 4, 9}] 輸出\n1 {1, 2, 3} 使用 Lambda 運算式定義函數 1 2 f = Function[x, x^2] f[3] 輸出\n1 9 合成函數 1 2 3 4 f = Function[x, x^2] g = Function[x, x + 1] h = Function[x, f[g[x]]] h[3] 輸出\n1 16 參考前一次的計算結果 1 % + 1 輸出\n1 17 純函數 1 (#+3)\u0026amp;[5] 輸出\n1 8 擷取陣列 1 2 Select[{1, 2, 3, 4, 5}, EvenQ] Select[{1, 2, 3, 4, 5}, Mod[#,2]==0\u0026amp;] 輸出\n1 {2, 4} ","date":"2024-07-25T01:36:19+09:00","image":"http://kenji.blog/p/mathematica%E5%85%A5%E9%96%80/img_hucba782cf2f6047b30fd8084b4d887659_22760_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/mathematica%E5%85%A5%E9%96%80/","title":"Mathematica 入門"},{"content":"什麼是 Hugo Hugo 是一個靜態網站生成器。您可以透過將 Markdown 檔案轉換為 HTML 來建立網站。Hugo 使用 Go 語言編寫，運行速度非常快。\n這個部落格也是使用 Hugo 建立的。\n安裝 Hugo CLI 要安裝 Hugo CLI，請執行以下指令。\n※ 這是 macOS 的範例。對於其他作業系統，請參考官方文件。\n1 brew install hugo 您可以使用 Homebrew 進行安裝。\nHugo 指令列表 Hugo 提供了各種指令。以下總結了常用的指令。\n建立新網站 1 hugo new site \u0026lt;網站名稱\u0026gt; 建立新網站的指令。在 \u0026lt;網站名稱\u0026gt; 中指定網站的名稱。\n建立新文章 1 hugo new \u0026lt;文章名稱\u0026gt;.md 建立新文章的指令。在 \u0026lt;文章名稱\u0026gt; 中指定文章的名稱。\n啟動伺服器 1 hugo server 啟動本地伺服器的指令。可以透過 http://localhost:1313 進行存取。\n建置網站 1 hugo 建置網站的指令。HTML 檔案將產生在 public 目錄中。\n部署網站 1 hugo deploy 部署網站的指令。部署目標的設定在 config.toml 檔案中進行。\n顯示文章列表 1 hugo list all 顯示文章列表的指令。\n確認設定 1 hugo config 確認設定的指令。\n顯示幫助 1 hugo help 顯示幫助的指令。\n顯示版本 1 hugo version 顯示版本的指令。\n以上是 Hugo 的指令列表。還有其他各種指令可供使用，請參考官方文件。\n參考資料 Hugo 官方文件 ","date":"2024-05-31T01:36:00+09:00","image":"http://kenji.blog/p/hugo%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E4%B8%80%E8%A6%A7/img_hu415dc7e70376ac350673d0366f70ca4b_19909_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/hugo%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E4%B8%80%E8%A6%A7/","title":"Hugo 指令列表"},{"content":"Visual Studio Code 推薦擴充功能列表 分類 名稱 提供者 說明 虛擬與容器管理 Remote Devlopment Microsoft 支援透過 SSH 連接至虛擬容器/WSL 進行遠端開發 虛擬與容器管理 Docker Microsoft 支援 Docker 容器的管理 程式碼管理 GitHub Pull Requests GitHub 在 VSCode 上管理 GitHub 的 Pull Requests 程式碼管理 GitHub Copilot GitHub 支援 AI 程式碼自動完成 程式碼管理 Git Graph mhutchie 以圖形化方式顯示 Git 分支與提交記錄 程式碼管理 Git History Don Jayamanne 顯示 Git 歷史記錄 瀏覽器與 Web 開發 Debugger for Firefox Firefox DevTools 在 VSCode 上使用 Firefox 偵錯工具 瀏覽器與 Web 開發 Microsoft Edge Tool For VScode Microsoft 在 VSCode 上使用 Edge 開發人員工具 瀏覽器與 Web 開發 Vue Language Features(Volar) Vue 支援 Vue 的語言功能 瀏覽器與 Web 開發 JavaScript (ES6) code snippets charalampos karypidis 提供 JavaScript 程式碼片段 瀏覽器與 Web 開發 Tailwind CSS IntelliSense Tailwind Labs 提供 Tailwind CSS 程式碼片段 雲端開發 AWS Toolkit Amazon Web Services 支援 AWS 開發 雲端開發 Azure Tools Microsoft 支援 Azure 開發 雲端開發 Google Cloud Tools Google Cloud 支援 Google Cloud 開發 資料庫 MySQL Jun Han 支援 MySQL 開發 資料庫 SQL Server(mssql) Microsoft 支援 SQL Server 開發 資料庫 PostgreSQL Chris Kolkman 支援 PostgreSQL 開發 嵌入式系統 PlatformIO PlatformIO 支援 PlatformIO 開發 嵌入式系統 Arduino Microsoft 支援 Arduino 開發 嵌入式系統 WorkBench Particle 支援 IoT 開發，包含 Particle 提供的開發環境、韌體、函式庫以及雲端整合 C/C++ C/C++ Extension Pack Microsoft 支援 C/C++ 開發 C/C++ C/C++ Runner franneck94 執行 C/C++ 程式碼 (支援 gcc、msvc、cuda nvcc 編譯器) C/C++ Cortex-Debug marus25 支援 Cortex-A/R/M 微控制器的偵錯 Python Python Extension Pack Microsoft 支援 Python 開發 Python jupyter Microsoft 支援 Jupyter Notebook 開發 實用工具與 UI 擴充 Makrdown All in One Yu Zhang 支援 Markdown 撰寫 實用工具與 UI 擴充 Hex Editor Microsoft 編輯二進位檔案 實用工具與 UI 擴充 vscode-pdf tomoki1207 顯示 PDF 檔案 實用工具與 UI 擴充 Rainbow CSV mechatroner 彩色顯示 CSV 檔案 實用工具與 UI 擴充 Draw.io Integration Henning Dieterichs 在 VSCode 上使用 Draw.io 實用工具與 UI 擴充 Japanese Language Pack for Visual Studio Code Microsoft 日文語言套件 實用工具與 UI 擴充 Live Share Microsoft 支援即時共同作業 ","date":"2024-05-29T17:20:19+09:00","image":"http://kenji.blog/p/visual-studio-code%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD/img_hu9f3ce3d75e92e9f1ca11d3e7a3c7b710_108332_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/visual-studio-code%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD/","title":"Visual Studio Code 推薦擴充功能"},{"content":"什麼是 mermaid.js mermaid.js 是一個 JavaScript 函式庫，它允許你透過編寫基於文字的獨特語法 (Mermaid 語法) 來圖形化顯示複雜的圖表，例如流程圖、圖表和甘特圖。 它也被應用在 GitHub、Qiita 和 Notion 等各種服務中。這次我們將嘗試在 hugo 中使用 mermaid.js。\n讓 mermaid.js 可以在 hugo 中使用 步驟如下：\n在 layouts/partials/extend_footer.html 中加入以下內容。 1 2 3 4 5 6 7 8 9 10 11 12 13 {{ if or .Params.mermaid .Site.Params.mermaid }} \u0026lt;script src=\u0026#34;https://cdn.jsdelivr.net/npm/mermaid@10.3.0/dist/mermaid.min.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; {{- $loadmermaid := resources.Get \u0026#34;js/load-mermaid.js\u0026#34; }} \u0026lt;script src=\u0026#34;{{ $loadmermaid.RelPermalink }}\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script\u0026gt; window.initMermaid(); if (isDarkTheme()) { setPrefTheme(\u0026#39;dark\u0026#39;); } else { setPrefTheme(\u0026#39;light\u0026#39;); } \u0026lt;/script\u0026gt; {{ end }} ※ 只有當 if 判斷式中設定為 mermaid: true 時，才會載入 mermaid.min.js。這個函式庫大約有 3MB，出乎意料地大。\n建立 assets/js/load-mermaid.js。這個程序用於初始化，以及在動態切換主題時重新繪製。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 (function(window){ \u0026#39;use strict\u0026#39; const elementCode = \u0026#39;.mermaid\u0026#39; const loadMermaid = function(theme) { window.mermaid.initialize({theme}) window.mermaid.init({theme}, document.querySelectorAll(elementCode)) } const saveOriginalData = function(){ return new Promise((resolve, reject) =\u0026gt; { try { var els = document.querySelectorAll(elementCode), count = els.length; els.forEach(element =\u0026gt; { element.setAttribute(\u0026#39;data-original-code\u0026#39;, element.innerHTML) count-- if(count == 0){ resolve() } }); } catch (error) { reject(error) } }) } const resetProcessed = function(){ return new Promise((resolve, reject) =\u0026gt; { try { var els = document.querySelectorAll(elementCode), count = els.length; els.forEach(element =\u0026gt; { if(element.getAttribute(\u0026#39;data-original-code\u0026#39;) != null){ element.removeAttribute(\u0026#39;data-processed\u0026#39;) element.innerHTML = element.getAttribute(\u0026#39;data-original-code\u0026#39;) } count-- if(count == 0){ resolve() } }); } catch (error) { reject(error) } }) } const init = ()=\u0026gt;{ saveOriginalData() .catch( console.error ) document.body.addEventListener(\u0026#39;dark-theme-set\u0026#39;, ()=\u0026gt;{ resetProcessed() .then(loadMermaid(\u0026#39;dark\u0026#39;)) .catch(console.error) }) document.body.addEventListener(\u0026#39;light-theme-set\u0026#39;, ()=\u0026gt;{ resetProcessed() .then(loadMermaid(\u0026#39;default\u0026#39;)) .catch(console.error) }) } window.initMermaid = init })(window); 此處的基本程式碼參考了以下內容：\nReinitialize with new theme #1945 修改 header.html 中切換主題時的處理程序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 function switchTheme(theme) { switch (theme) { case \u0026#39;light\u0026#39;: {{ if or .Params.mermaid .Site.Params.mermaid }} document.body.dispatchEvent(new CustomEvent(\u0026#39;light-theme-set\u0026#39;)); {{ end }} document.body.classList.remove(\u0026#39;dark\u0026#39;); break; case \u0026#39;dark\u0026#39;: {{ if or .Params.mermaid .Site.Params.mermaid }} document.body.dispatchEvent(new CustomEvent(\u0026#39;dark-theme-set\u0026#39;)); {{ end }} document.body.classList.add(\u0026#39;dark\u0026#39;); break; // auto default: if (window.matchMedia(\u0026#39;(prefers-color-scheme: dark)\u0026#39;).matches) { {{ if or .Params.mermaid .Site.Params.mermaid }} document.body.dispatchEvent(new CustomEvent(\u0026#39;dark-theme-set\u0026#39;)); {{ end }} document.body.classList.add(\u0026#39;dark\u0026#39;); } } } 建立 layouts/shortcodes/mermaid.html 1 2 3 \u0026lt;div class=\u0026#34;mermaid\u0026#34; align=\u0026#34;{{ if .Get \u0026#34;align\u0026#34; }}{{ .Get \u0026#34;align\u0026#34; }}{{ else }}center{{ end }}\u0026#34;\u0026gt; {{ safeHTML .Inner }} \u0026lt;/div\u0026gt; 以上就完成了使用 mermaid.js 的準備工作。\n嘗試使用 mermaid.js 在文章定義中加入以下內容 1 marmaid: true 在文章內文中加入以下內容 流程圖\n1 2 3 4 5 6 {{\u0026lt;mermaid align=\u0026#34;center\u0026#34;\u0026gt;}} graph TD A[開始] --\u0026gt;|條件1| B(條件2) B --\u0026gt; C{條件3} C --\u0026gt;|條件4| D[結束] {{\u0026lt;/mermaid\u0026gt;}} 輸出結果\ngraph TD A[開始] --\u003e|條件1| B(條件2) B --\u003e C{條件3} C --\u003e|條件4| D[結束] 甘特圖\n1 2 3 4 5 6 7 8 9 10 11 12 {{\u0026lt;mermaid align=\u0026#34;center\u0026#34;\u0026gt;}} gantt section Project 需求定義 :done, a, 2024-05-25, 5d 基本設計 :done, b, after a, 5d 詳細設計 :done, c, after b, 5d 製造 :active, d, after c, 10d 單元測試 :crit, e, after d, 5d 整合測試 : f, after e, 5d 系統測試 : g, after f, 5d 發布 :milestone, h, after g, 1d {{\u0026lt;/mermaid\u0026gt;}} 輸出結果\ngantt section Project 需求定義 :done, a, 2024-05-25, 5d 基本設計 :done, b, after a, 5d 詳細設計 :done, c, after b, 5d 製造 :active, d, after c, 10d 單元測試 :crit, e, after d, 5d 整合測試 : f, after e, 5d 系統測試 : g, after f, 5d 發布 :milestone, h, after g, 1d 循序圖\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 {{\u0026lt;mermaid align=\u0026#34;center\u0026#34;\u0026gt;}} sequenceDiagram participant user participant view participant controller participant model participant database user-\u0026gt;\u0026gt;view: 輸入 ID/PW view-\u0026gt;\u0026gt;controller: 認證請求 controller-\u0026gt;\u0026gt;model: 認證請求 model-\u0026gt;\u0026gt;database: 認證請求 database--\u0026gt;\u0026gt;model: 傳回認證結果 model--\u0026gt;\u0026gt;controller: 傳回認證結果 controller--\u0026gt;\u0026gt;view: 傳回認證結果 view--\u0026gt;\u0026gt;user: 顯示認證結果 {{\u0026lt;/mermaid\u0026gt;}} 輸出結果\nsequenceDiagram participant user participant view participant controller participant model participant database user-\u003e\u003eview: 輸入 ID/PW view-\u003e\u003econtroller: ajax 查詢 controller-\u003e\u003emodel: 認證請求 model-\u003e\u003edatabase: 發出 SQL database--\u003e\u003emodel: 傳回 SQL 結果 model--\u003e\u003econtroller: 傳回請求結果 controller--\u003e\u003eview: 傳回 ajax 查詢結果 view--\u003e\u003euser: 顯示認證結果 就是這樣。\n參考 mermaid.js 官網 可以預覽 mermaid 語法的展示網站 ","date":"2024-05-25T02:18:09+09:00","image":"http://kenji.blog/p/mermaid.js%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/img_2_huc7c099ec3ef9a6ce3efa5818e1489313_12585_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/mermaid.js%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/","title":"嘗試使用 mermaid.js"},{"content":"如何取消 git reset 如果在進行 git commit 之後，不小心執行了 git reset，這裡介紹如何取消 git reset（如何復原到 git commit 時的狀態）。\n使用 git reflog 確認 reset 前的 commit ID 使用 git reset --hard HEAD@{數字} 恢復到 reset 前的狀態 以上就是如何取消 git reset 的方法。\n","date":"2024-05-15T23:32:43+09:00","image":"http://kenji.blog/p/git-reset%E3%82%92%E5%8F%96%E3%82%8A%E6%B6%88%E3%81%99%E6%96%B9%E6%B3%95/img_hu1637c23702d7aac8be6c2641e62ebc1a_73066_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%A6%82%E4%BD%95%E5%8F%96%E6%B6%88-git-reset/","title":"如何取消 git reset"},{"content":"MS-DOS 4.0 的開源 微軟公開了近 40 年前發布的 MS-DOS 4.0 的原始碼。 它幾乎完全是用 8086 組合語言編寫的。\nGitHub 儲存庫 https://github.com/microsoft/MS-DOS\n參考網站 Open Sourcing MS-DOS 4.0 ","date":"2024-05-05T16:44:28+09:00","image":"http://kenji.blog/p/ms-dos-4.0-%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E5%8C%96/img_hu44e977c98e405f06fee0746ba6885217_23034_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/ms-dos-4.0-%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E5%8C%96/","title":"MS-DOS 4.0 的開源"},{"content":" 可讀的程式碼 (Readable Code) 程式設計原理 (Principles of Programming) 程式設計師修煉之道 (The Pragmatic Programmer) 支撐 Web 的技術 安全 Web 應用程式建立指南 網路為何能連接 向達人學習 SQL 徹底指南 Docker 實踐指南 Kubernetes 完全指南 CODE COMPLETE 第2版 Clean Code 無瑕的程式碼 Clean Architecture 無瑕的程式碼：整潔的軟體設計與架構篇 成為遊戲程式設計師前必須知道的技術 成為極客 (Being Geek) 為什麼要用物件導向？ ","date":"2024-05-05T16:03:33+09:00","image":"http://kenji.blog/p/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E5%88%9D%E5%AD%A6%E8%80%85%E3%81%AB%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE%E6%9B%B8%E7%B1%8D/img_huefc28c3d74f521b3206dda9fd272911e_636136_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E6%8E%A8%E8%96%A6%E7%B5%A6%E5%88%9D%E5%AD%B8%E5%B7%A5%E7%A8%8B%E5%B8%AB%E7%9A%84%E6%9B%B8%E7%B1%8D/","title":"推薦給初學工程師的書籍"},{"content":"我製作了Excel的日曆範本（支援假日版）！ 我製作了一個Excel範本，只要輸入年份和月份，就會顯示該月份日曆上的假日。\n歡迎下載使用。 日曆.xlsx\n","date":"2024-05-01T00:15:57+09:00","image":"http://kenji.blog/p/excel%E3%81%AE%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E4%BC%91%E6%97%A5%E5%AF%BE%E5%BF%9C%E7%89%88/img_hu8d7d9eeba53cb2329139f98aded52558_13893_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/excel%E3%81%AE%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E4%BC%91%E6%97%A5%E5%AF%BE%E5%BF%9C%E7%89%88/","title":"Excel日曆範本（支援假日版）"},{"content":"※ 此為 Windows 11 的設定步驟。\n打開控制台 選擇電源選項 點擊「選擇電源按鈕的行為」 點擊「變更目前無法使用的設定」 取消勾選「開啟快速啟動 (建議選項)」 點擊「儲存變更」 參考 \\[Windows 10\\] 請告訴我如何停用快速啟動。\n","date":"2024-04-29T19:42:20+09:00","image":"http://kenji.blog/p/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%A2%E3%83%8B%E3%82%BF%E3%81%A7%E6%AF%8E%E5%9B%9E%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%ABdpi%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%8C%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%95%E3%82%8C%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E3%81%A8%E3%81%8D%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/img_huc496c8f1febcd28bf66466cd5e2648a0_37147_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%A6%82%E4%BD%95%E4%BF%AE%E5%BE%A9%E5%A4%9A%E8%9E%A2%E5%B9%95%E6%AF%8F%E6%AC%A1%E9%96%8B%E6%A9%9F%E6%99%82dpi%E8%A8%AD%E5%AE%9A%E8%A2%AB%E9%87%8D%E8%A8%AD%E7%9A%84%E5%95%8F%E9%A1%8C/","title":"如何修復多螢幕每次開機時DPI設定被重設的問題"},{"content":"只取得 git 儲存庫的最新版本 您可以使用以下指令只取得儲存庫的最新版本。 這在您想要快速取得儲存庫以節省磁碟空間時非常有用。\n1 git clone --depth 1 \u0026lt;儲存庫URL\u0026gt; ","date":"2024-04-27T02:54:12+09:00","image":"http://kenji.blog/p/git%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E6%9C%80%E6%96%B0%E3%81%A0%E3%81%91%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/img_hu2ecde82e40aa31a994850b70302683b4_5304_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%8F%AA%E5%8F%96%E5%BE%97-git-%E5%84%B2%E5%AD%98%E5%BA%AB%E7%9A%84%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC/","title":"只取得 git 儲存庫的最新版本"},{"content":"當 GitHub Copilot 顯示以下錯誤時的解決方法 大約從 2024 年 4 月 19 日起，GitHub Copilot 無法使用。錯誤訊息如下：\n1 2 [ERROR] [ghostText] [2024-04-21T04:06:46.900Z] Error on ghost text request: (FetchError) unable to verify the first certificate [ERROR] [certificates] [2024-04-21T04:06:46.901Z] Your current Copilot license doesn\u0026#39;t support proxy connections with custom certificates. Please visit https://gh.io/copilot-network-errors to learn more. Original cause: {\u0026#34;type\u0026#34;:\u0026#34;system\u0026#34;,\u0026#34;_name\u0026#34;:\u0026#34;FetchError\u0026#34;,\u0026#34;code\u0026#34;:\u0026#34;UNABLE_TO_VERIFY_LEAF_SIGNATURE\u0026#34;} 解決方法 這似乎是 ESET 的錯誤。在 ESET 的進階設定中，將「啟用 SSL/TLS」關閉。 參考 似乎 AWS CDK 也發生了相同的錯誤。\nAWS CDK bootstrap certificate warning-error ","date":"2024-04-21T18:47:26+09:00","image":"http://kenji.blog/p/%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%A7github-copilot%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/img_hue52485515660c172702881501d13c34d_319675_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%A6%82%E4%BD%95%E8%A7%A3%E6%B1%BA%E5%9B%A0%E6%86%91%E8%AD%89%E9%8C%AF%E8%AA%A4%E5%B0%8E%E8%87%B4-github-copilot-%E7%84%A1%E6%B3%95%E4%BD%BF%E7%94%A8%E7%9A%84%E5%95%8F%E9%A1%8C/","title":"如何解決因憑證錯誤導致 GitHub Copilot 無法使用的問題"},{"content":"\nvim入門 下載與安裝 https://www.vim.org/download.php\n從上述網站，根據您要安裝的作業系統下載並安裝模組。\n對於 Windows，選擇 gvim_X.X.X_x64_signed.exe 是一個好選擇。\n啟動方法 在 Windows 中，必須將包含 vim.exe 的資料夾註冊到環境變數 Path 中。\n啟動方法：\n1 vim 指定檔案名稱來啟動：\n1 vim filename.txt 結束方法 要結束時，輸入 : (冒號)，接著輸入 q，然後按 Enter。\n1 :q 如果檔案已更新，將會顯示 已修改但尚未儲存 (可用 ! 強制執行)。 您可以放棄變更並強制退出。\n1 :q! 若要儲存檔案並退出：\n1 :wq 以下指令也具有相同的意義：\n1 :x 此外，按住 Shift 並按兩次 z 也可以退出。（等同於 :wq）\n模式 vim 具有 指令模式 和 輸入模式。啟動 vim 時，預設為 指令模式，按下 i 鍵將會切換到 輸入模式。\n在 輸入模式 中，顧名思義可以進行文字輸入。要從 輸入模式 切換回 指令模式，請按 ESC 鍵。\n這種輸入模式的切換是 vim 的一大特色。\n游標移動與捲動 整理在 指令模式 時的游標移動和捲動方式。\n按鍵 說明 h（或 Ctrl+H、BackSpace、←） 向左移動 j（或 Ctrl+J / N、↓） 向下移動 k（或 Ctrl+P、↑） 向上移動 l（或 Space、→） 向右移動 +（或 Enter） 移動到下一行的開頭 - 移動到上一行的開頭 Ctrl+B（或 PageUp） 向上捲動一頁 Ctrl+F（或 PageDown） 向下捲動一頁 Ctrl+U 向上捲動半頁 Ctrl+D 向下捲動半頁 Ctrl+Y 向上捲動一行 Ctrl+E 向下捲動一行 z Enter 將游標所在行捲動到畫面頂部 z . 將游標所在行捲動到畫面中央 z - 將游標所在行捲動到畫面底部 0（或 |） 將游標移動到行首 $ 將游標移動到行尾 ^（或 _） 將游標移動到行首（排除空白和 Tab） G（或 :$） 將游標移動到最後一行 :行號 Enter 移動到指定行 在輸入上述移動按鍵之前輸入 數字，就可以移動該數字指定的次數。 （例如，輸入 3j 將會從目前游標位置向下移動 3 行。）\n其他指令 按鍵 說明 Ctrl+L 重新繪製畫面 Ctrl+G 顯示檔案總行數、游標位置等 ","date":"2024-04-19T22:06:34+09:00","image":"http://kenji.blog/p/vim%E5%85%A5%E9%96%80/img_hu70487bce4333a61ad5b3ba8ed7939499_17904_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/vim%E5%85%A5%E9%96%80/","title":"vim入門"},{"content":"關於呼叫DestroyIcon的必要性 在以下情況需要呼叫 DestroyIcon：\nCreateIconFromResourceEx (如果在沒有 LR_SHARED 旗標的情況下呼叫) CreateIconIndirect CopyIcon 當由上述函式建立時。\nLoadIcon LoadImage (如果使用 LR_SHARED 旗標) CopyImage (如果使用 LR_COPYRETURNORG 旗標，且 hImage 參數是共用圖示) CreateIconFromResource CreateIconFromResourceEx (如果使用 LR_SHARED 旗標) 在上述情況下建立和載入的圖示不應呼叫 DestroyIcon。\n參考 DestroyIcon 函式 (winuser.h) ","date":"2024-04-19T01:55:17+09:00","permalink":"http://kenji.blog/zh-tw/p/loadicon%E4%B8%8D%E9%9C%80%E8%A6%81%E5%91%BC%E5%8F%ABdestroyicon/","title":"LoadIcon不需要呼叫DestroyIcon"},{"content":"關於生成式AI的講座影片 「生成式AI」(1) 中尾政之・東京大學教授 2023.9.8 「生成式AI」(2) 酒井邦嘉・東京大學大學院教授 2023.10.11 「生成式AI」(3) 松尾豐・東京大學大學院教授 2024.3.15 ","date":"2024-04-16T02:13:56+09:00","image":"http://kenji.blog/p/%E7%94%9F%E6%88%90ai%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/img_hu1a8581c4b72be646476cf90db2209d32_686551_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E9%97%9C%E6%96%BC%E7%94%9F%E6%88%90%E5%BC%8Fai/","title":"關於生成式AI"},{"content":"使用 curl 產生 QR Code 注意：所介紹的方法是透過伺服器端產生 QR Code 並回傳，因此可能會被記錄日誌。將個人資訊等機密資訊轉換為 QR Code 時請多加留意。\n方法 1 這是在命令提示字元中產生 QR Code 的方法。 qrenco.de 會以文字形式回傳結果。\n1 curl qrenco.de/kenji.blog 輸出結果 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 █████████████████████████████ █████████████████████████████ ████ ▄▄▄▄▄ █ ▄ ▄ █ ▄▄▄▄▄ ████ ████ █ █ █ ▀▀▀██ █ █ ████ ████ █▄▄▄█ █▀▀█▀▄█ █▄▄▄█ ████ ████▄▄▄▄▄▄▄█▄▀ ▀ █▄▄▄▄▄▄▄████ ████▄ █▀▄ ▄▀█▄▀ ▀██▄▀ ▄████ ████▀▀▀█ ▄▄ ▄█▄█▀█▀▄██ ▀████ ████▄▄▄██▄▄█ █▀█ ▄██▀▀█ █████ ████ ▄▄▄▄▄ █▀█ ▀ ▄▀▄▄▄ ▀████ ████ █ █ █▄▄ ▄▀▄▀▄ ██ ▀████ ████ █▄▄▄█ █▀▀█ ▀▄▄▄ ▄▄██████ ████▄▄▄▄▄▄▄█▄▄███▄▄█▄███▄████ █████████████████████████████ █████████████████████████████ 參考 qrenco.de 方法 2 api.qrserver.com 會回傳一張圖片。\n1 curl -o qr.png \u0026#34;https://api.qrserver.com/v1/create-qr-code/?size=150x150\u0026amp;data=HelloWorld\u0026#34; 輸出結果 參考 QR Code Generator ","date":"2024-04-16T00:42:27+09:00","image":"http://kenji.blog/p/curl%E3%81%A7qr%E3%82%B3%E3%83%BC%E3%83%89%E7%94%9F%E6%88%90/img_hub03976e78daddb607d3d46f69887db4b_11127_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/curl%E3%81%A7qr%E3%82%B3%E3%83%BC%E3%83%89%E7%94%9F%E6%88%90/","title":"使用 curl 產生 QR Code"},{"content":"快捷鍵列表 快捷鍵 說明 Ctrl + B 粗體 Ctrl + I 斜體 Ctrl + U 底線 Ctrl + E 置中對齊 Ctrl + L 靠左對齊 Ctrl + R 靠右對齊 Ctrl + ] 放大字體 Ctrl + [ 縮小字體 Ctrl + C 複製 Ctrl + V 貼上 Ctrl + X 剪下 Ctrl + Z 復原 Ctrl + Y 重複上一步操作 Ctrl + A 全選 Shift + 方向鍵 選擇範圍 Ctrl + F 搜尋文字 Ctrl + H 取代文字 Ctrl + P 預覽列印 Ctrl + S 儲存文件 F12 另存新檔 Ctrl + Home 移至文件開頭 Ctrl + End 移至文件結尾 參考 Word 的鍵盤快速鍵 ","date":"2024-04-07T14:18:51+09:00","image":"http://kenji.blog/p/microsoft-word%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/img_hu52c1b9e3b4195e8df02b1851180b33b3_10388_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/microsoft-word%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/","title":"Microsoft Word 快捷鍵列表"},{"content":"在此介紹會自動重整網頁的 Edge 瀏覽器擴充功能「索引標籤自動重整」。\n索引標籤自動重整的安裝 索引標籤自動重整\n進入上述網站，然後點擊 安裝。\n點擊 新增擴充功能。\n使用方法 安裝完成後，Edge 右上角會新增一個圖示。\n開啟您想要自動重整的網頁，點擊該圖示，自動重整就會開始。\n綠框部分是自動重整的間隔。請選擇自動重整的時機。\n若要停止自動重整，請點擊圖示，然後點擊 Stop reloading this tab。\n","date":"2024-04-06T15:36:54+09:00","image":"http://kenji.blog/p/web%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E6%8B%A1%E5%BC%B5edge%E3%82%A2%E3%83%89%E3%82%AA%E3%83%B3/img_hu57eb7510f8ab42d5a8107b2d3db76a45_3448_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/web%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E6%8B%A1%E5%BC%B5edge%E3%82%A2%E3%83%89%E3%82%AA%E3%83%B3/","title":"網頁自動重整瀏覽器擴充功能 (Edge 附加元件)"},{"content":"Visual Studio 快捷鍵列表 這是我個人常用的 Visual Studio 快捷鍵列表。 只要記住 Visual Studio 的鍵盤快捷鍵，就可以有效率地進行開發作業。請務必活用。\n※在 Visual Studio 2022 進行了確認。\n快捷鍵 說明 F1 顯示所選單字的說明 F2 跳到書籤 Ctrl + F2 新增書籤 Ctrl + Shift + F2 移除所有書籤 F5 建置並執行（偵錯執行） Ctrl + F5 建置並執行（不偵錯） F7 建置 F9 在游標行加入中斷點 Ctrl + F9 停用游標行的中斷點 Shift + Ctrl + F9 刪除所有中斷點 F10 逐步執行 F11 進入逐步執行 F12 跳到定義 Ctrl + D 複製游標行 Ctrl + X 未選取範圍時，剪下游標行 Ctrl + Shift + ] 選取游標處括號對應的括號 Alt + 上下方向鍵 上下移動游標行 Alt + Shift + 方向鍵 多重游標/區塊選取 Ctrl + Tab 切換原始碼/視窗顯示 Ctrl + Shift + V 顯示剪貼簿歷史紀錄 Ctrl + K 後 Ctrl + C 註解游標行 Ctrl + K 後 Ctrl + U 取消註解游標行 Ctrl + G 指定行號並跳至該行 Ctrl + F 搜尋 Ctrl + Shift + F 全域搜尋 Ctrl + H 取代 Ctrl + Shift + F 全域取代 Ctrl + Tab 切換原始碼/視窗顯示 Ctrl + Space 單字自動補齊 Ctrl + Alt + L 開啟方案總管視窗 Ctrl + Shift + E 開啟資源檢視視窗 Ctrl + 0 後 Ctrl + G 開啟 Git 認可視窗 參考 Visual Studio 中的預設鍵盤快捷鍵 ","date":"2024-04-06T11:27:37+09:00","image":"http://kenji.blog/p/visual-studio-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/img_hue1a55f22c15dca7427db7cd2dfd89735_223690_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/visual-studio-%E5%BF%AB%E6%8D%B7%E9%8D%B5%E5%88%97%E8%A1%A8/","title":"Visual Studio 快捷鍵列表"},{"content":"以下將介紹如何在 Windows 10/11 的檔案總管右鍵選單中新增 Hidemaru Editor 的 grep 功能。\n※以下步驟會修改登錄檔，請自行承擔風險。\n步驟 開啟下方連結，並儲存至任意資料夾。 秀丸レジストリ登録.reg\n點擊兩下 秀丸レジストリ登録.reg 檔案以將其新增至登錄檔。 參考 秀丸grepをフォルダの右クリックメニューから行う ","date":"2024-04-03T00:00:46+09:00","image":"http://kenji.blog/p/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%AB%E7%A7%80%E4%B8%B8%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFgrep%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B/img_hu1bfa3588f39c8e6af312f48159d52b67_932_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%B0%87-hidemaru-editor-grep-%E6%96%B0%E5%A2%9E%E8%87%B3%E6%AA%94%E6%A1%88%E7%B8%BD%E7%AE%A1%E7%9A%84%E5%8F%B3%E9%8D%B5%E9%81%B8%E5%96%AE/","title":"將 Hidemaru Editor grep 新增至檔案總管的右鍵選單"},{"content":"你知道生日悖論嗎？ 我要講一個有點神奇的故事。 你覺得需要聚集多少人，「有人同一天生日的機率」才會變高呢？\n舉例來說，一年有365天，所以當有人說「如果聚集23個人，有人生日相同的機率會超過50%」時……感覺有點違背直覺對吧。\n但這 真的是50%以上。\n為什麼會發生這種事呢？ 這個現象被稱為「生日悖論」。 雖然名字裡有「悖論」，但其實有著嚴謹的數學理由。\n當人數為「n」時， 沒有人生日相同的機率 可以用以下公式計算：\n1 P(沒有人相同) = 365/365 × 364/365 × 363/365 × ... × (365 - n + 1)/365 將這個結果用1去減，就可以得出「有人生日相同的機率」。\n來看看結果…… 人數 有人同一天生日的機率 10人 約11.7% 20人 約41.1% 23人 約50.7%（這裡是重點！） 30人 約70.6% 70人 竟然高達約99.9%！ 也就是說，只要有 23人 ，就有超過一半的機率有人生日相同。 這在學校班級或職場會議上似乎也滿常發生的。\n總結：直覺與數學的落差很有趣 「生日悖論」是個有趣的例子，展示了我們的直覺與實際數學機率之間的落差。 知道這樣的故事，或許能在閒聊或猜謎時讓氣氛熱絡起來！\n參考連結 生日悖論（Wikipedia） ","date":"2024-04-02T01:20:50+09:00","image":"http://kenji.blog/p/%E3%83%90%E3%83%BC%E3%82%B9%E3%83%87%E3%82%A4%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A8%E3%81%AF/img_huf1a218b90023063d558c5c810438e753_117620_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E3%83%90%E3%83%BC%E3%82%B9%E3%83%87%E3%82%A4%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A8%E3%81%AF/","title":"什麼是生日悖論？"},{"content":"什麼是剪取工具 剪取工具（Snipping Tool）是 Windows 內建的螢幕截圖工具。您可以擷取並儲存螢幕的一部分、擷取整個螢幕或進行錄影。\n如何啟動剪取工具 主要有以下 3 種啟動方法：\n按下 Win 鍵，輸入 Snipping Tool，然後按下 Enter 鍵。 按下 Win + Shift + S 鍵。 按下 Win + R 鍵，輸入 snippingtool，然後按下 Enter 鍵。 剪取工具的使用方法 儲存擷取圖片的方法如下： 選擇 相機 圖示。 點擊 新增 按鈕。 選擇您想要擷取的範圍。 點擊 另存新檔 按鈕。 輸入儲存位置和檔案名稱進行儲存。 儲存擷取影片的方法如下： 選擇 影片 圖示。 點擊 新增 按鈕。 選擇您想要擷取的範圍。 點擊 開始 按鈕。 進行螢幕錄影。 點擊 停止 按鈕。 點擊 另存新檔 按鈕。 輸入儲存位置和檔案名稱進行儲存。 參考 使用剪取工具擷取螢幕截圖 ","date":"2024-04-01T23:19:45+09:00","image":"http://kenji.blog/p/snipping-tool%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/img_hu405fe4bbcac8bf4b2046262eb8f35d4a_18613_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%89%AA%E5%8F%96%E5%B7%A5%E5%85%B7%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95/","title":"剪取工具的使用方法"},{"content":"以下介紹如何建立一個用來鎖定電腦的捷徑。\n這很方便，因為您只需在桌面上連按兩下建立好的捷徑即可鎖定電腦。\n建立方法 1. 在桌面上按一下右鍵，選擇 新增 ＞ 捷徑 2. 將顯示建立捷徑的畫面，輸入 rundll32.exe user32.dll,LockWorkStation 然後點擊 下一步 3. 輸入捷徑名稱 鎖定電腦 然後點擊 完成 4. 變更建立好的捷徑圖示 在建立好的捷徑上按一下右鍵，選擇 內容\n點擊 變更圖示\n選擇黃色的鎖頭圖示並點擊 確定，再次點擊 確定 以關閉內容視窗\n就是這樣。\n連按兩下建立好的捷徑就會鎖定電腦。\n您也可以按下 Win鍵 + L鍵 來鎖定電腦。\n※注意：鎖定電腦時不會顯示確認對話方塊。\n","date":"2024-04-01T01:37:49+09:00","image":"http://kenji.blog/p/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%92%E3%83%AD%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hud14aa91db8f19c318807d0f2f72ee0fc_128434_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%A6%82%E4%BD%95%E5%BB%BA%E7%AB%8B%E9%8E%96%E5%AE%9A%E9%9B%BB%E8%85%A6%E7%9A%84%E6%8D%B7%E5%BE%91/","title":"如何建立鎖定電腦的捷徑"},{"content":"什麼是蒙提霍爾問題 蒙提霍爾問題是美國電視節目「Let\u0026rsquo;s Make a Deal」中進行的一個遊戲問題，內容如下：\n前提條件：3 扇門中有一扇後面有獎品，其餘 2 扇門後面是空的（銘謝惠顧）。\n參賽者從 3 扇門中選擇一扇。 主持人在參賽者未選擇的 2 扇門中，打開一扇沒有獎品的門。 詢問參賽者是否要改變選擇的門。 此問題在於探討參賽者換門比較好，還是不換門比較好。\n解法 蒙提霍爾問題的解法如下：\n參賽者不改變最初選擇的門\n中獎機率：1/3 沒中獎機率：2/3 主持人打開沒有獎品的門後\n若不換門，中獎機率：1/3（與 1. 的中獎機率相同） 若換門，中獎機率：2/3（1. 中未中獎的機率總和） 因此，參賽者改變選擇的門，中獎的機率會比較高。\n參考 維基百科 Monty Hall problem ","date":"2024-03-31T23:41:51+09:00","image":"http://kenji.blog/p/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C/img_1_hu20d98afb87b485a440eb6d6beaf3ac5e_189614_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C/","title":"蒙提霍爾問題"},{"content":"下載 micro https://github.com/zyedidia/micro/releases\n開啟上述連結，點擊 Show all XX assets（X 為數字），然後下載 micro-X.X.XX-win64.zip（X 為數字）。 解壓縮 zip 檔案，並將所有檔案放置在您選擇的資料夾中。\n設定環境變數 為了從命令提示字元使用 micro.exe，您需要設定環境變數。\n按下 Win 鍵 + R 鍵，輸入 sysdm.cpl 並按下 Enter 鍵。 點擊 系統內容 中的 進階系統設定。 點擊 環境變數。 在 系統變數 中選擇 Path，然後點擊 編輯。 點擊 新增，並加入包含 micro.exe 的資料夾路徑。 點擊 確定 以關閉所有對話方塊。 重新啟動命令提示字元，輸入 nano 以確認是否可以執行。 micro 的使用方法 在命令提示字元中輸入 micro 並執行後，將顯示以下畫面。 主要的操作方法與快捷鍵如下：\n快捷鍵 操作 Ctrl+Q 關閉檔案 Ctrl+S 儲存檔案 Ctrl+O 開啟檔案 Ctrl+A 全選 Ctrl+X 剪下選取範圍 Ctrl+C 複製選取範圍 Ctrl+V 貼上 Ctrl+Z 復原 Ctrl+Y 重做 Ctrl+E 執行編輯器指令 參考 micro ","date":"2024-03-31T21:50:39+09:00","image":"http://kenji.blog/p/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFmicro%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu5c724e25c36dcf3781d5276f98286fd4_13721_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%A6%82%E4%BD%95%E5%9C%A8-windows-%E4%B8%8A%E5%AE%89%E8%A3%9D-micro-%E6%96%87%E5%AD%97%E7%B7%A8%E8%BC%AF%E5%99%A8/","title":"如何在 Windows 上安裝 micro 文字編輯器"},{"content":"下載 nano.exe https://sourceforge.net/projects/nano-for-windows/\n打開上述連結，點擊 Download 下載 GNU-Nano_Win32(static).zip。 解壓縮 zip 檔案，並將 nano.exe 放置在任意資料夾中。 ※ 尚未支援日文輸入（截至 2024/03/31）。\n設定環境變數 為了在命令提示字元中使用 nano.exe，您需要設定環境變數。\n按下 Win 鍵 + R 鍵，輸入 sysdm.cpl，然後按下 Enter 鍵。 在「系統內容」中點擊 系統內容。 點擊 環境變數。 選擇「系統變數」中的 Path，然後點擊 編輯。 點擊 新增，然後加入 nano.exe 的路徑。 點擊 確定 以關閉所有對話方塊。 重新啟動命令提示字元，輸入 nano 看看是否能成功執行。 nano 的使用方法 輸入 nano 並執行後，會顯示以下畫面。\n畫面下方會顯示快捷鍵的說明。\n符號的意義如下：\n^ 代表 Ctrl 鍵。 M- 代表 Alt 鍵。 若要儲存並關閉，請先按下 Ctrl + S，接著按下 Ctrl + X。\n參考 GNU nano ","date":"2024-03-31T18:09:32+09:00","image":"http://kenji.blog/p/cli%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFnano%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_1_hud0bad6678c124835195c96dbf5908709_45668_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/cli%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFnano%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"如何在 Windows 上安裝 CLI 文字編輯器 nano"},{"content":"解決在 wsl 中顯示「Temporary failure resolving～」錯誤的方法 1 2 3 4 kenji@MyComputer:~$ sudo apt update [sudo] password for kenji: Err:1 http://archive.ubuntu.com/ubuntu focal InRelease Temporary failure resolving \u0026#39;archive.ubuntu.com\u0026#39; 當在 wsl 中顯示上述錯誤時，DNS 伺服器的設定可能不正確。 在我的環境中，透過以下步驟解決了這個問題。\n啟動 wsl。 執行 sudo nano /etc/resolv.conf。 將 nameserver 的行更改如下： 1 nameserver 8.8.8.8 按 Ctrl + S 儲存，按 Ctrl + X 退出。 執行 sudo apt update。 如果沒有顯示錯誤，則表示已解決。 如果上述步驟無法解決 似乎有些情況下，上述步驟無法解決。請參考以下文章。\n解決在 WSL 中進行 apt update 時出現『Temporary failure resolving ～』的方法 ","date":"2024-03-31T16:57:33+09:00","image":"http://kenji.blog/p/wsl-%E3%81%A7temporary-failure-resolving%E3%81%A8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/img_hu6b9065bcca76a2739d7c532080d71efa_118604_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/wsl-%E3%81%A7temporary-failure-resolving%E3%81%A8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/","title":"解決在 wsl 中顯示「Temporary failure resolving～」錯誤的方法"},{"content":"從工作列右鍵選單關閉的方法 這是在 Windows 10 上的方法。在 Windows 11 中似乎不會顯示該選單。 在工作列上按住 Shift 鍵與 Ctrl 鍵的同時點擊滑鼠右鍵，選單中就會顯示 結束檔案總管。\n從工作管理員關閉的方法 按下 Ctrl + Shift + Esc 鍵以啟動工作管理員。 選擇 詳細資料。 選擇 explorer.exe 並按下 Delete 鍵，當系統詢問 確定要結束 explorer.exe 嗎？ 時，選擇 結束處理程序。 從命令提示字元關閉的方法 按下 Win + R 鍵，輸入 cmd，然後按下 Enter 鍵。 輸入 taskkill /f /im explorer.exe，然後按下 Enter 鍵。 從工作管理員啟動檔案總管的方法 按下 Ctrl + Shift + Esc 鍵以啟動工作管理員。 從檔案選單中，選擇 執行新工作。 輸入 explorer.exe，然後按下 Enter 鍵。 ","date":"2024-03-30T15:40:24+09:00","image":"http://kenji.blog/p/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AE%E7%B5%82%E4%BA%86%E5%86%8D%E8%B5%B7%E5%8B%95%E6%96%B9%E6%B3%95/img_2_hue735828bd961ff4973e3abea5e21f198_20142_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AE%E7%B5%82%E4%BA%86%E5%86%8D%E8%B5%B7%E5%8B%95%E6%96%B9%E6%B3%95/","title":"如何關閉與重新啟動檔案總管"},{"content":"如何在 Windows 11 中恢復傳統的右鍵選單 我們將介紹如何在 Windows 11 中恢復傳統的右鍵選單。\n打開登錄編輯程式。 按下 Win鍵 + R鍵，輸入 regedit，然後按 Enter鍵。 前往 HKEY_CURRENT_USER\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}。如果這個機碼不存在，請建立它。\n前往 HKEY_CURRENT_USER\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\\InprocServer32。如果這個機碼不存在，請建立它。\n確認 InprocServer32 中的 (預設值) 為空值。\n重新啟動電腦。 確認右鍵選單已恢復為傳統版本。 ","date":"2024-03-30T13:13:36+09:00","image":"http://kenji.blog/p/windows-11%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%92%E5%BE%93%E6%9D%A5%E7%89%88%E3%81%AB%E6%88%BB%E3%81%99%E6%96%B9%E6%B3%95/img_hub131b7dada89fffcdae45f20639b1ab3_50623_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/how-to-restore-classic-context-menu-windows-11/","title":"如何在 Windows 11 中恢復傳統的右鍵選單"},{"content":"JetBrains Mono 這是由 JetBrains 提供的開源程式設計字體。\n下載： https://www.jetbrains.com/ja-jp/lp/mono/\nHackGen 白源 (HackGen) 是一款程式設計字體，將適合程式設計的英文字體 Hack 與思源黑體的衍生字體源柔黑體合成而來。\n下載： https://github.com/yuru7/HackGen/releases\nRicty Diminished Ricty Diminished 是 Ricty 的姊妹字體，它不是使用 Inconsolata 和 Migu 1M，而是使用 Inconsolata 和 Circle M+ 1m 透過 Ricty 生成腳本合成的字體。由於不包含 IPA 黑體的字形，可用的漢字字形數量較少，但相對地可以在 SIL Open Font License 下進行分發。\n下載： https://rictyfonts.github.io/diminished\nCica 英數字和符號使用 Hack + DejaVu Sans Mono。 其他字元則使用 Rounded Mgen+ 的程式設計字體。\n下載： https://github.com/miiton/Cica/releases\n參考：\nHack DejaVu Sans Mono Rounded Mgen+ Migu 這是 M+ 和 IPA 的合成字體。\n下載： https://itouhiro.github.io/mixfont-mplus-ipa/migu/\nOsaka 這是一款讓 Mac OS 標準字體 Osaka 可以在 Windows 上使用的字體。\n下載： http://ifs.nog.cc/osakattf.hp.infoseek.co.jp/\nPlemolJP 這是一套結合了 IBM 釋出的開源日文字體 IBM Plex Sans JP 與同樣來自 IBM Plex 系列的 IBM Plex Mono 的程式設計字體。\n下載： https://github.com/yuru7/PlemolJP/releases\n","date":"2024-03-30T02:21:31+09:00","image":"http://kenji.blog/p/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E9%9B%86/img_hu5455a1c7ae52190ddcafb3051b00c15b_52757_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E9%81%A9%E5%90%88%E5%AF%AB%E7%A8%8B%E5%BC%8F%E7%9A%84%E5%AD%97%E9%AB%94%E9%9B%86%E5%90%88/","title":"適合寫程式的字體集合"},{"content":"以下介紹如何使用「hide」指令啟動 Hidemaru 編輯器。 注意：此方法已在 Windows 10/11 上測試過。\n打開「登錄編輯程式」。 導覽至 HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths。 在 App Paths 下建立一個名為 hide.exe 的機碼。 在此機碼名稱中， .exe 前面的部分即為指令名稱。 將 hide.exe 機碼的 (預設值) 設為 Hidemaru 編輯器執行檔的路徑。在我的環境中是 \u0026quot;C:\\Program Files (x86)\\Hidemaru\\Hidemaru.exe\u0026quot;。 在 hide.exe 機碼中建立一個名為 Path 的字串值。 將 Path 的資料設為包含 Hidemaru 編輯器執行檔的資料夾路徑。在我的環境中是 \u0026quot;C:\\Program Files (x86)\\Hidemaru\u0026quot;。 現在，在按下 Win 鍵 + R 鍵開啟的 執行 對話方塊中，您可以使用 hide 指令啟動 Hidemaru 編輯器。此外，在命令提示字元中，您可以使用 start hide 指令啟動它。 1 2 3 4 5 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\hide.exe] @=\u0026#34;\\\u0026#34;C:\\\\Program Files (x86)\\\\Hidemaru\\\\Hidemaru.exe\\\u0026#34;\u0026#34; \u0026#34;Path\u0026#34;=\u0026#34;\\\u0026#34;C:\\\\Program Files (x86)\\\\Hidemaru\\\\\\\u0026#34;\u0026#34; 如果您將上述內容儲存為 .reg 檔案並執行它，這些設定將被新增至登錄檔中。\n","date":"2024-03-29T23:45:37+09:00","image":"http://kenji.blog/p/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89hide%E3%81%A7%E7%A7%80%E4%B8%B8%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%82%92%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%82%8B%E6%96%B9%E6%B3%95/img_2_hu43898a3aaad9ace099d9a060bc7203e5_68153_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-hide-%E6%8C%87%E4%BB%A4%E5%95%9F%E5%8B%95-hidemaru-%E7%B7%A8%E8%BC%AF%E5%99%A8/","title":"如何使用「hide」指令啟動 Hidemaru 編輯器"},{"content":"數學的未解決問題 我將解釋數學的未解決問題。即使問題本身很簡單，但仍然有許多問題尚未被證明。\n完全數有無數個嗎？ 完全數是指除自身以外的正因數之和等於自身的自然數。 例如，\n6的因數是1, 2, 3，因為1+2+3=6，所以它是完全數。 28的因數是1, 2, 4, 7, 14，因為1+2+4+7+14=28，所以它是完全數。 目前只發現了51個，雖然預計有無數個， 但這尚未被證明。\n哥德巴赫猜想 哥德巴赫猜想是，所有大於2的偶數都可以表示為兩個質數之和。 （這裡的質數是指除了1和自身之外沒有其他因數的自然數。）\n例如，\n4=2+2 6=3+3 8=3+5 10=3+7=5+5 問題本身非常簡單，但至今尚未被證明。\n黎曼猜想 黎曼猜想是，黎曼ζ函數的零點僅限於負偶數和實部為 1 / 2 的複數。\n黎曼ζ函數是，當 $s$ 為複數，$n$ 為自然數時，\n$$\\zeta(s):=\\sum _{n=1}^{\\infty }{\\frac {1}{n^{s}}}=1+{\\frac {1}{2^{s}}}+{\\frac {1}{3^{s}}}+{\\frac {1}{4^{s}}}+\\cdots$$ 由上述公式所定義的函數 $\\zeta$。\n","date":"2024-03-02T22:57:36+09:00","image":"http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%9C%AA%E8%A7%A3%E6%B1%BA%E5%95%8F%E9%A1%8C/img_hub174c33a50b5d9de07ec5dc9c7de1bd4_731181_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E6%95%B8%E5%AD%B8%E7%9A%84%E6%9C%AA%E8%A7%A3%E6%B1%BA%E5%95%8F%E9%A1%8C/","title":"數學的未解決問題"},{"content":"我試著收集了各種版本資訊對話框 Windows 11 首先是我現在正在使用的 Windows 11 的版本資訊。 IntelliJ IDEA (Community Edition) 這是我寫這篇部落格的環境。 Visual Studio Code 這也是我經常使用的編輯器。出乎意料地簡單。 Visual Studio 這是我在 C++ 中使用的開發環境。 LINE(Windows) 這是 Windows 版的 LINE。 Paint.NET 這是一款影像編輯軟體。 sakura編輯器 這是一款文字編輯器。 Google Chrome 這是 Google Chrome。自從 Edge 出現後，我就不怎麼用了。 Firefox 這是 Firefox。最近我不怎麼用了。 Microsoft Edge 這是 Microsoft Edge。最近我經常使用這個。 OBS Studio 這是 OBS Studio。最近我不怎麼用了。 TradingView 這是 TradingView。最近我用它來看美元兌日圓的圖表。 Spy++ 這是 Spy++。它是 Windows SDK 中包含的工具。 dependency walker 這是 dependency walker。它是 Windows SDK 中包含的工具。 resource hacker 這是 resource hacker。它是用於編輯和獲取可執行檔案資源的工具。 Microsoft Excel 這是 Microsoft Excel。 bandicam 這是 bandicam。它是一款影片擷取工具。 winmerge 這是 winmerge。它是一款查看檔案差異的工具。 iTunes 這是 iTunes。最近我不怎麼用了。 秀丸編輯器 這是秀丸編輯器。它是一款文字編輯器。 Adobe Photoshop CS6 這是 Adobe Photoshop CS6。 Adobe Illustrator CS6 這是 Adobe Illustrator CS6。 ESET NOD32 這是 ESET NOD32。 NotePad++ 這是 NotePad++。它是一款文字編輯器。 MIFES 這是 MIFES。最近我不怎麼用了。 ","date":"2024-03-02T21:32:11+09:00","image":"http://kenji.blog/p/%E3%81%84%E3%82%8D%E3%82%93%E3%81%AA%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E6%83%85%E5%A0%B1%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%E9%9B%86%E3%82%81%E3%81%A6%E3%81%BF%E3%81%9F/img_hub829fc9858068bdd622cbafca10cd245_20954_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E3%81%84%E3%82%8D%E3%82%93%E3%81%AA%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E6%83%85%E5%A0%B1%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%E9%9B%86%E3%82%81%E3%81%A6%E3%81%BF%E3%81%9F/","title":"我試著收集了各種版本資訊對話框"},{"content":"GIF動畫螢幕錄影工具 我製作了一個錄製螢幕並轉換為GIF動畫的工具。 使用此工具，您可以錄製螢幕上的操作，並在Microsoft Teams等通訊工具中分享。\n使用方法 啟動工具 指定要錄製的範圍。如果未指定，將錄製整個螢幕。 按下錄影按鈕 按下停止錄影按鈕 GIF動畫將輸出在與執行檔相同的位置 下載 下載\n開啟上述連結，點擊 GIFScreenRecorder.exe 連結以下載執行檔。\n原始碼 GitHub\n","date":"2024-02-08T01:23:01+09:00","image":"http://kenji.blog/p/gif%E3%82%A2%E3%83%8B%E3%83%A1%E7%94%BB%E9%9D%A2%E9%8C%B2%E7%94%BB%E3%83%84%E3%83%BC%E3%83%AB/img_hua1d1e581d2290ce1c516887dff1e6eb0_11957_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/gif%E5%8B%95%E7%95%AB%E8%9E%A2%E5%B9%95%E9%8C%84%E5%BD%B1%E5%B7%A5%E5%85%B7/","title":"GIF動畫螢幕錄影工具"},{"content":"PMP 考試學習總結 這是 PMP 考試學習的總結。\n概要 PMP 是一項專案管理資格認證。它是基於一本名為 PMBOK（最新第 7 版）的指南所設立的資格。 PMP 考試時間為 230 分鐘，共 180 題，其中 5 題為不計分題，因此在 175 題中答對 106 題以上即可及格。 回答方式為選擇題，大部分是 4 選 1，但其中也包含 5 選 1 或多選題。\n服務型領導 (Servant Leadership) 不是從上而下發布命令，而是從下而上提供支援的領導風格。\n服務型領導的 10 個原則（特徵） 傾聽 同理心 療癒 覺察 說服 概念化 先見之明 管家精神 致力於人們的成長 建立社群 敏捷宣言的 4 個價值觀 我們正在透過實踐軟體開發， 或協助他人實踐的過程中， 尋找更好的開發方法。 透過這項活動，我們得出以下價值觀：\n個人與互動 重於 流程與工具， 可用的軟體 重於 詳盡的文件， 與客戶合作 重於 合約談判， 回應變化 重於 遵循計畫， 也就是說，儘管左側的項目有其價值， 但我們更重視右側的項目。\n敏捷宣言\n敏捷 敏捷宣言背後的 12 項原則 我們最優先的任務是透過儘早並持續地交付有價值的軟體來滿足客戶。 歡迎需求變更，即使是在開發後期。敏捷流程利用變化來提升客戶的競爭優勢。 經常交付可用的軟體，頻率從兩三週到兩三個月不等，以較短的時間間隔為佳。 業務人員和開發者必須在整個專案期間每天一起工作。 以積極參與的個人為核心來建立專案。提供他們所需的環境與支援，並信任他們能把工作完成。 在開發團隊中以及向團隊傳遞資訊最有效率且有成效的方法，就是面對面交談。 可用的軟體是衡量進度的首要指標。 敏捷流程提倡永續開發。贊助者、開發者和使用者應該能夠無限期地維持穩定的步伐。 持續關注技術卓越和優良的設計，可提升敏捷性。 簡潔（最大化未完成工作量的藝術）是不可或缺的。 最好的架構、需求和設計皆來自於自我組織的團隊。 團隊定期反省如何能更有效率，並據此調整及修正自身的行為。 敏捷宣言背後的原則\n術語 Epic (史詩，概要) 用戶故事 (登錄在產品待辦清單的單位，進行優先級排序的單位) 任務 (技術性的工作項目，評估所需時間的對象) 產品待辦清單 / 產品待辦清單項目 產品負責人 (Product Owner) 利害關係人 (Stakeholder) 敏捷實務指南 (書籍) 精實開發 (Lean Development) 看板 (Kanban) 價值鏈 (Value Chain) AC (Actual Cost，實際成本) EV (Earned Value，實獲值) PV (Planned Value，計畫價值) EVA (Earned Value Analysis，實獲值分析) SPI (SPI: Schedule Performance Index = EV / PV，進度績效指標) CPI (CPI: Cost Performance Index = EV / AC，成本績效指標) EVM (Earned Value Method，實獲值管理) BAC (完工預算，Budget at Completion) ETC (完工尚需估算，Estimate To Complete) EAC (完工估算，Estimate At Completion) 職能型 矩陣型 專案型 服務型領導 (Servant Leadership) 塔克曼模型 (Tuckman\u0026rsquo;s Model：形成期、風暴期、規範期、績效期、解散期) 團隊章程 (Team Charter) 規劃撲克 (Planning Poker，費氏數列) 回顧會議 (Retrospective) 虛擬團隊 (Virtual Team) 專案章程 (Project Charter) 衝突 (6 種應對方式：面對／解決問題、合作、妥協、平息／適應、強制、撤退／迴避) 價值流圖 (Value Stream Mapping) 導師制 (Mentoring) 教練制 (Coaching) 培訓 (Training) 道格拉斯·麥格雷戈的 XY 理論 (Douglas McGregor\u0026rsquo;s XY Theory) SWOT 分析 Strength（優勢）、Weakness（劣勢）、Opportunity（機會）、Threat（威脅） SECI 模型 (Socialization 社會化、Externalization 外化、Combination 結合、Internalization 內化) PDCA, PDSA PESTLE (Political 政治, Economic 經濟, Social 社會, Technological 技術, Legal 法律, Environmental 環境) VUCA (波動性、不確定性、複雜性、模糊性) 蒙地卡羅法 (Monte Carlo Method) 決策樹分析 (Decision Tree Analysis) 期望貨幣價值 (EMV) 淨推薦值 (NPS, Net Promoter Score) 成本效益分析 (Cost-Benefit Analysis) 衝刺審查 (Sprint Review) 發布管理 (Release Management) SOW (Statement of Work) 工作範圍說明書、工作明細書「包含專案範圍、目的、交付物、期間、資源等詳細說明的文檔」 P-SOW (採購工作範圍說明書) RFI (Request For Information) 資訊需求書 RFP (Request For Proposal) 提案需求書 總價合約 (FP: Fixed Price) 工料合約 (T\u0026amp;M: Time and Material) 成本補償合約 (CR: Cost Reimbursable) 總價加獎勵金合約 (FPIF) 範圍潛變 (Scope Creep) 狩野分析 (Kano Model) 資金分配法 100 點法 MSCW (Must, Should, Could, Would) 方法 需求追溯矩陣 (Traceability Matrix) WBS 詞典 速率 (Velocity，每次迭代中完成的故事點數) 速率圖 (Velocity Chart) 參與度矩陣 (不知曉、抵制、中立、支持、領導) 階段關卡 (Phase Gate) 資訊看板 (Information Radiator) 燃盡圖 (Burndown Chart) 燃起圖 (Burnup Chart) 累積流量圖 (Cumulative Flow Diagram) QCD (Quality, Cost, Delivery) 螺旋型 (Spiral) 關鍵鏈 (Critical Chain) 特性 (Feature) 迭代／衝刺 (Iteration / Sprint) 迭代式 (Iterative) 增量式 (Incremental) 增量 (Increment，遞增的交付物) 韌性／恢復力 (Resilience / Resiliency) 管家精神 (Stewardship) 誠實可靠的舉止與負責任的行為（決策） 升級 (Escalation) KPT (Keep, Problem, Try) RACI (Responsible 負責, Accountable 當責, Consulted 諮詢, Informed 告知) PMO (Project Management Office) 支援型、控制型、指揮型 節奏 (Cadence) 裁適 (Tailoring) 神經邏輯層次 (環境、行為、能力、信念與價值觀、自我認知) 商業論證 (Business Case，記錄專案的目的、利益、風險、投資回報等的文件) 趨勢分析 (使用趨勢圖執行，並根據結果使用數學技術預測未來的成果) 品質管理計畫 (定義專案交付物品質相關的策略與方法) 治理流程 (Governance Process) 產品負責人 (產品願景、產品待辦清單優先順序排定、產品發布) 專案負責人 (專案發起人) 專案經理 (管理整個專案) 專案領導者 (現場指揮) 專案成員 (推動專案) 混合式方法 (Hybrid Approach) 最小可行產品 (MVP, Minimum Viable Product) 迭代審查 (Iteration Review) 工作坊 (Workshop) 專案利益管理計畫 (專案目標的利益、實現利益的戰略手段，以及實現利益的時間表) 關鍵績效指標 (KPI) 現場 (On-site) 類比估算 (Analogous Estimating) 三點估算 (Three-Point Estimating) 參數估算 (Parametric Estimating) 專案審查 (Project Review) 大爆炸方法 (Big Bang Approach) DSDM (Dynamic Systems Development Method，動態系統開發方法) 布魯克斯法則 (Brooks\u0026rsquo;s Law) 大爆炸方法 (全部同時一次性導入) 風險登記簿 (Risk Register，作為風險管理工具使用的文件，用於識別專案中潛在的倒退風險) 風險登記錄 (Risk Register) SL 理論 (情境領導理論，根據對方的狀況採取 4 種行動) 勝任力 (Competence) 承諾 (Commitment) 參考 Scrum 指南 (Ken Schwaber \u0026amp; Jeff Sutherland) PMI ECO（日文版）頁面 敏捷實務指南 PMI 道德與專業行為準則 教材 目標一次考取「PMP® 認證考試」！ 高效備考策略課程 (2021) 敏捷應對 ","date":"2024-02-04T18:41:31+09:00","image":"http://kenji.blog/p/pmp%E5%8B%89%E5%BC%B7/img_hu67a0961bf8e284d45690ac9cdb09e5b3_16702_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/pmp%E5%8B%89%E5%BC%B7/","title":"PMP 學習"},{"content":"總覽 關於在日本發生的自然災害的筆記\n2024年1月1日 能登半島地震 ","date":"2024-01-07T00:50:09+09:00","image":"http://kenji.blog/p/%E6%97%A5%E6%9C%AC%E3%81%AE%E7%81%BD%E5%AE%B3/img_hue649e8d0b3bd837ea85e155e108b15fd_273208_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E6%97%A5%E6%9C%AC%E3%81%AE%E7%81%BD%E5%AE%B3/","title":"日本的災害"},{"content":"七草 水芹（せり） 薺菜（なずな） 鼠麴草（ごぎょう） 繁縷（はこべら） 寶蓋草（ほとけのざ） 蔓菁（すずな） 蘿蔔（すずしろ） ","date":"2024-01-06T22:22:00+09:00","image":"http://kenji.blog/p/%E4%B8%83%E8%8D%89%E7%B2%A5%E3%81%AE%E3%83%AC%E3%82%B7%E3%83%94/img_hu3e148c57f6499065259203ce3bd1c8c5_295252_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E4%B8%83%E8%8D%89%E7%B2%A5%E9%A3%9F%E8%AD%9C/","title":"七草粥食譜"},{"content":"推薦邦樂 チューリップ - 青春の影 イルカ - なごり雪 河島英五 - 酒と泪と男と女 Orangestar - Surges 竹内まりや - Plastic Love RADWIMPS - 前前前世 BEGIN - 島人ぬ宝 ザ・ブルーハーツ - 情熱の薔薇 荒井由実 - ルージュの伝言 Begin - 海の声 荒井由実 - ひこうき雲 Love is Over - 欧陽菲菲 クラムボン - 波よせて RADWIMPS - スパークル かりゆし58 - アンマー かりゆし58 - オワリはじまり テレサ・テン - 時の流れに身をまかせ 宇多田ヒカル『One Last Kiss』 不可思議/wonderboy - Pellicule (Official Music Video) Kamen Rider Black RX - Opening Song たしかなこと / 小田和正 - Covered by パクユナ 【Japanese healing song】Hana／Kosuke Atari（covered by Leah） 「真夜中のドア〜stay with me」/ 松原みき Official Lyric Video Midnight Pretenders Anri - Last Summer Whisper 1985 - The Blue Hearts BUMP OF CHICKEN - supernova チューリップ　心の旅　1972 小さな恋のうた ASKA - はじまりはいつも雨 (Official Music Video) キリンジ - エイリアンズ あの日の空よ - 南こうせつ ","date":"2024-01-06T04:11:01+09:00","image":"http://kenji.blog/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E9%82%A6%E6%A5%BD/img_hub840e0bd8da1fd2845b1fe157b13d9d8_1067024_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%96%9C%E6%AD%A1%E7%9A%84%E9%82%A6%E6%A8%82/","title":"喜歡的邦樂"},{"content":"推薦西洋音樂 Keane - Somewhere Only We Know Ben E. King - Stand By Me The Beatles - Hey Jude The Mamas \u0026amp; The Papas - California Dreamin' Ed Sheeran - Shape of You Mark Ronson ft. Bruno Mars – Uptown Funk Sugar - Maroon 5 Bette Midler - The Rose Green Day - Basket Case Coldplay - Viva La VidaViva La Vida Maroon 5 - Memories (Lyrics) Dido - Thank You (Official Video) 巴布·狄倫 - Blowin\u0026rsquo;The Wind(在風中飄蕩) Coldplay - Yellow Eric Clapton - Tears In Heaven B. J. Thomas - Raindrops Keep Fallin\u0026rsquo; on My Head (Stereo / Lyrics) Take Me Home, Country Roads Simon \u0026amp; Garfunkel - Mrs. Robinson (Audio) Taylor Swift - Love Story (Live on Letterman) Wiz Khalifa - See You Again ft. Charlie Puth [Official Video] Furious 7 Soundtrack The Top (Extended Mix) Something Just Like This Feelings Yesterday Once More Carpenters - Top Of The World 青春的輝煌 / I Need To Be In Love [附日語翻譯] 木匠兄妹 Bob Marley \u0026amp; The Wailers \u0026ldquo;Three Little Birds\u0026rdquo; Alan Walker - All Falls Down (feat. Noah Cyrus with Digital Farm Animals) Alan Walker - Darkside (feat. Au/Ra and Tomine Harket) Alan Walker - Alone Alan Walker - Sing Me To Sleep Alan Walker - Faded killing me softly with his song a-ha - Take On Me (Official Video) ","date":"2024-01-05T00:14:22+09:00","image":"http://kenji.blog/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E6%B4%8B%E6%A5%BD/img_hued679cc884753e5576b95c5f8e6f029a_283063_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E6%B4%8B%E6%A5%BD/","title":"喜歡的西洋音樂"},{"content":"在命令提示字元中安裝 PowerToys 這是在命令提示字元中安裝 PowerToys 的方法。\n1 winget install Microsoft.PowerToys --source winget 在命令提示字元中解除安裝 PowerToys 1 winget uninstall --name PowerToys ","date":"2023-09-30T21:23:00+09:00","image":"http://kenji.blog/p/powertoys%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/img_hud87e455d0958ca41a83ffdf977dac7c2_37972_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/powertoys%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/","title":"在命令提示字元中安裝 PowerToys"},{"content":"讓我們致敬吧 讓我們對能做到我們做不到的事的人致敬。\n在社會中，令人驚訝的是，有許多人會對工作和地位分出優劣，而無法給予尊重。\n對於能完成我們做不到的工作的人，無論是什麼工作，都讓我們向他們致敬。\n我想銘記在心。\n","date":"2023-08-01T23:42:31+09:00","image":"http://kenji.blog/p/%E8%87%AA%E5%88%86%E3%81%AB%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E4%BA%BA%E3%81%AB%E6%95%AC%E6%84%8F%E3%82%92%E6%89%95%E3%81%8A%E3%81%86/img_hu0ec845f1b3d93c1f1262f8f9c2fb19a8_357395_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%B0%8D%E8%83%BD%E5%81%9A%E5%88%B0%E6%88%91%E5%80%91%E5%81%9A%E4%B8%8D%E5%88%B0%E7%9A%84%E4%BA%8B%E7%9A%84%E4%BA%BA%E8%87%B4%E6%95%AC/","title":"對能做到我們做不到的事的人致敬"},{"content":"斯普拉遁 2 這可能是我人生中玩過最長時間的遊戲了。 我幾乎沒玩過故事模式，但4對4的線上對戰配對做得非常出色，因為能和等級相近的玩家對戰，所以有著百玩不膩的樂趣。此外，觀察對手和隊友的動作特徵並思考致勝策略也非常有趣。\n武器 我常用的武器依序是：「香檳瓶（貼牌）」、「新葉射擊槍」、「斯普拉滾筒」和「可變式滾筒（貼牌）」。 「新葉射擊槍」是適合初學者的武器，我在遊戲初期很常使用。\n各武器的塗地面積點數如下：\n武器 塗地面積點數 可變式滾筒（貼牌） 6,636,594p 斯普拉滾筒 6,200,629p 新葉射擊槍 4,211,759p 香檳瓶（貼牌） 744,678p 斯普拉射擊槍 301,238p 關於等級 我感覺自己一直在 A+ 到 S+ 之間徘徊，已經有段時間無法晉升到 S+ 的頂尖行列了，但比起提升排名，我更享受比賽的樂趣。 （如果排名太高，對手也會變強，緊張感隨之而來，就無法好好享受了）\n遊玩時間 我的遊玩時間已經超過了 2500 小時。\n未來目標 除了維持目前的遊戲水平並享受遊玩之外，我也希望在金錢和裝備上達到滿級（上限）。 自從《斯普拉遁 3》推出後，對戰配對的時間變長了，有時甚至會配對不到人，所以我希望能在玩家人數不再減少的祈禱中繼續玩下去。\n","date":"2023-08-01T00:26:30+09:00","image":"http://kenji.blog/p/%E3%82%B9%E3%83%97%E3%83%A9%E3%83%88%E3%82%A5%E3%83%BC%E3%83%B32/img_hu177387d05aedc7553df9576fd3706d02_192717_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/splatoon-2/","title":"斯普拉遁 2"},{"content":"關於獲得 Microsoft MVP 獎項 (2023-2024) 很高興與大家分享，我榮獲了 Microsoft MVP (2023-2024) 獎項。 這是自 2017 年以來連續第 7 年獲得此殊榮。\n獲獎的類別是 Developer Technologies 。\n回顧過去的活動，我主要參與了以下事項：\n在 GitHub 上公開程式碼 在部落格及 社群媒體 (如 Twitter 等) 上分享技術資訊 在 MSDN 論壇 上發文解答 提供對微軟產品的反饋 未來，我希望能繼續撰寫更好的文章，並持續分享有用的資訊。\n感謝大家一直以來的支持。\n","date":"2023-07-31T19:15:14+09:00","image":"http://kenji.blog/p/microsoft-mvp%E5%8F%97%E8%B3%9E%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A62023-2024/img_hua5cba2ce9936d80b2181232333db0622_19957_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E9%97%9C%E6%96%BC%E7%8D%B2%E5%BE%97-microsoft-mvp-%E7%8D%8E%E9%A0%85-2023-2024/","title":"關於獲得 Microsoft MVP 獎項 (2023-2024)"},{"content":"古希臘三大作圖問題 給定一個圓，作出一個與該圓面積相同的正方形（化圓為方問題） 給定任意角，將其三等分（三等分角問題） 給定一個立方體，作出一個體積為其兩倍的立方體（倍立方問題） 阿基米德螺線 在平面上，將半直線 OB 繞定點 O 以均勻速度旋轉。設初始位置為 OA，點 P 從 O 出發，並沿著 OB 以等速移動，此時點 P 所描繪出的曲線即為阿基米德螺線。\n帕普斯定理 擺線 (Cycloid) 尼科梅迪斯蚌線 (Conchoid of Nicomedes) 狄奧克勒斯蔓葉線 (Cissoid of Diocles) 費馬切線法 笛卡兒法線法 年表 年份 事件 約公元前 3400 年 蘇美爾人使用黏土代幣進行計數 約公元前 3000 年 埃及出現聖書體數學 約公元前 2800 年 印度河流域文明使用十進制度量衡 約公元前 2700 年 埃及人使用繩索和畢氏三元數確認角度 約公元前 2500 年 發現用於計算的工具——算盤 約公元前 2500 年 參考資料 數學的歷史 ","date":"2023-07-22T15:25:10+09:00","image":"http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%AD%B4%E5%8F%B2/img_hu67324d5a4a949c1841dc5158adcb7086_428375_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E6%95%B8%E5%AD%B8%E7%9A%84%E6%AD%B7%E5%8F%B2/","title":"數學的歷史"},{"content":"關於 Elecom 軌跡球 Deft Pro M-DPT1MRBK 購買 Elecom 的軌跡球「Deft Pro M-DPT1MRBK」已經過了一個禮拜，所以我想分享一下使用心得。\n主要特徵\n按鈕數量多達8個 可透過三種方式連接：有線、無線接收器及藍牙 較大的球體（中型直徑 44mm） Amazon 購買價格：￥7,012（截至 2021 年 5 月 2 日） 優點 與滑鼠相比，不需移動手腕，減輕了手腕的負擔 按鈕數量多，可為按鈕分配各種功能 目前分配如上。您也可以針對每個應用程式更改按鈕分配。 ※按鈕分配需要安裝專用軟體。 因為球體較大，在軌跡球中相對容易進行細微的操作 缺點 軌跡球周圍容易積聚灰塵，需要定期（大約每隔幾天）將球取出並清理 使用食指、中指等移動游標，用拇指操作滾輪，這與滑鼠的操作感不同，需要一段時間才能適應 雖然上面提到容易進行細微移動，但使用軌跡球仍然很難以1像素為單位移動游標 無法在按住左鍵的同時操作滾輪（例如，在小畫家中選擇區域時想要縮放） 總結來說，雖然這在軌跡球中算較為昂貴的，但整體操作相當順手，我覺得工作效率變高了。 希望這能為正在考慮購買的人提供參考。\n","date":"2023-05-02T23:28:33+09:00","image":"http://kenji.blog/p/%E3%83%88%E3%83%A9%E3%83%83%E3%82%AF%E3%83%9C%E3%83%BC%E3%83%ABdeft-prom-dpt1mrbk%E3%81%AE%E3%81%99%E3%81%99%E3%82%81/img_hue224b6b6b3d7da0ebda5f0b37d429b68_231359_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/trackball-deft-pro-m-dpt1mrbk-recommendation/","title":"推薦軌跡球 Deft Pro (M-DPT1MRBK)"},{"content":"什麼是 wxWidgets wxWidgets 是一個 C++ 的 GUI 函式庫，支援 Windows、Mac、Linux、Android、iOS 等多個平台。\n安裝 wxWidgets 開啟 https://www.wxwidgets.org/downloads/ 並下載 Windows Installer。 執行 wxMSW-3.2.2.1-Setup.exe 進行安裝。 從安裝的資料夾中開啟 \u0026ldquo;C:\\wxWidgets-3.2.2.1\\build\\msw\\wx_vc17.sln\u0026rdquo;。 開啟 wx_vc17.sln 後，選擇 建置 ＞ 批次建置。 按下 全選 按鈕，然後按下 重建 按鈕。 建置完成後，暫時關閉 Visual Studio。 建立範例專案 開啟 Visual Studio。 選擇 檔案 ＞ 新增 ＞ 專案。 選擇 Windows 桌面應用程式（分頁為 C++、Windows、桌面）。 在 專案名稱 輸入 wxWidgetsSample。 點擊 建立。 右鍵點擊 wxWidgetsSample，選擇 屬性。 在 組態屬性 ＞ C/C++ ＞ 其他包含目錄 中新增 C:\\wxWidgets-3.2.2.1\\include 和 C:\\wxWidgets-3.2.2.1\\include\\msvc。 在 組態屬性 ＞ 連結器 ＞ 其他程式庫目錄 中新增 C:\\wxWidgets-3.2.2.1\\lib\\vc_x64_lib。 開啟 wxWidgetsSample.cpp 並替換為以下程式碼。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 #pragma comment(linker,\u0026#34;\\\u0026#34;/manifestdependency:type=\u0026#39;win32\u0026#39; name=\u0026#39;Microsoft.Windows.Common-Controls\u0026#39; version=\u0026#39;6.0.0.0\u0026#39; processorArchitecture=\u0026#39;*\u0026#39; publicKeyToken=\u0026#39;6595b64144ccf1df\u0026#39; language=\u0026#39;*\u0026#39;\\\u0026#34;\u0026#34;) #include \u0026lt;wx/wxprec.h\u0026gt; #ifndef WX_PRECOMP #include \u0026lt;wx/wx.h\u0026gt; #endif class MyApp : public wxApp { public: virtual bool OnInit(); }; class MyFrame : public wxFrame { public: MyFrame(); private: void OnHello(wxCommandEvent\u0026amp; event); void OnExit(wxCommandEvent\u0026amp; event); void OnAbout(wxCommandEvent\u0026amp; event); }; enum { ID_Hello = 1 }; wxIMPLEMENT_APP(MyApp); bool MyApp::OnInit() { MyFrame* frame = new MyFrame(); frame-\u0026gt;Show(true); return true; } MyFrame::MyFrame() : wxFrame(NULL, wxID_ANY, \u0026#34;Hello World\u0026#34;) { wxMenu* menuFile = new wxMenu; menuFile-\u0026gt;Append(ID_Hello, \u0026#34;\u0026amp;Hello...\\tCtrl-H\u0026#34;, \u0026#34;Help string shown in status bar for this menu item\u0026#34;); menuFile-\u0026gt;AppendSeparator(); menuFile-\u0026gt;Append(wxID_EXIT); wxMenu* menuHelp = new wxMenu; menuHelp-\u0026gt;Append(wxID_ABOUT); wxMenuBar* menuBar = new wxMenuBar; menuBar-\u0026gt;Append(menuFile, \u0026#34;\u0026amp;File\u0026#34;); menuBar-\u0026gt;Append(menuHelp, \u0026#34;\u0026amp;Help\u0026#34;); SetMenuBar(menuBar); wxButton* button1 = new wxButton(this, ID_Hello, _(\u0026#34;Hello\u0026#34;), wxPoint(20, 20), wxSize(100, 32)); Connect(ID_Hello, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MyFrame::OnHello)); wxButton* button2 = new wxButton(this, wxID_ABOUT, _(\u0026#34;About\u0026#34;), wxPoint(20, 60), wxSize(100, 32)); Connect(wxID_ABOUT, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MyFrame::OnAbout)); wxButton* button3 = new wxButton(this, wxID_EXIT, _(\u0026#34;Exit\u0026#34;), wxPoint(20, 100), wxSize(100, 32)); Connect(wxID_EXIT, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MyFrame::OnExit)); CreateStatusBar(); SetStatusText(\u0026#34;Welcome to wxWidgets!\u0026#34;); Bind(wxEVT_MENU, \u0026amp;MyFrame::OnHello, this, ID_Hello); Bind(wxEVT_MENU, \u0026amp;MyFrame::OnAbout, this, wxID_ABOUT); Bind(wxEVT_MENU, \u0026amp;MyFrame::OnExit, this, wxID_EXIT); } void MyFrame::OnExit(wxCommandEvent\u0026amp; event) { Close(true); } void MyFrame::OnAbout(wxCommandEvent\u0026amp; event) { wxMessageBox(\u0026#34;This is a wxWidgets\u0026#39; Hello world sample\u0026#34;, \u0026#34;About Hello World\u0026#34;, wxOK | wxICON_INFORMATION); } void MyFrame::OnHello(wxCommandEvent\u0026amp; event) { wxLogMessage(\u0026#34;Hello world from wxWidgets!\u0026#34;); } 建置並執行後，會開啟如下的視窗。 參考資料 範例專案已上傳至以下連結。 wxWidgetsSample\n官方網站 使用 C++ 與 wxWidgets 的遊戲 以上。\n","date":"2023-04-18T00:18:22+09:00","image":"http://kenji.blog/p/wxwidgets-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB/img_hud707912b3d08e9053ad61da0782a9b23_168133_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/wxwidgets-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB/","title":"使用 wxWidgets 的範例"},{"content":"想看的電影（看過就打勾） 於離別之朝束起約定之花 博士熱愛的算式 夏日大作戰 關鍵少數 心靈捕手 美麗境界 愛的萬物論 天才無限家 霍金傳 (班奈狄克·康柏拜區) 天地明察 圓周率 (π) 決戰21點 迷情追殺 證明我愛你 三個傻瓜 水牛城66 發條橘子 浴火赤子情 淺草小子 捍衛戰士 駭客任務：復活 我是傳奇 達文西密碼 社群網戰 命運石之門 星空清理者 地心引力 紫羅蘭永恆花園 心靈判官 Psycho-Pass 鬼滅之刃 魔法公主 Winny 零的焦點 動物方城市 你的名字 天氣之子 回到未來 (1, 2, 3) 正宗哥吉拉 新·超人力霸王 新·假面騎士 鈴芽之旅 THE FIRST SLAM DUNK ","date":"2023-04-17T00:34:13+09:00","image":"http://kenji.blog/p/%E6%98%A0%E7%94%BBtodo%E3%83%AA%E3%82%B9%E3%83%88/image_hu831a556e644f698f06f7bab476f01bf6_248271_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/zh-tw/p/%E6%98%A0%E7%94%BBtodo%E3%83%AA%E3%82%B9%E3%83%88/","title":"電影TODO清單"},{"content":"很酷的網頁模板\nhtml5up https://html5up.net/ 因為想試用看看，所以做個筆記。\n","date":"2023-04-17T00:26:55+09:00","image":"http://kenji.blog/p/%E3%81%8B%E3%81%A3%E3%81%93%E3%81%84%E3%81%84-web-%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88html5up/img_huc021190a6647c74fdf17f0c26cf7f09d_324732_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E3%81%8B%E3%81%A3%E3%81%93%E3%81%84%E3%81%84-web-%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88html5up/","title":"很酷的網頁模板 (html5up)"},{"content":"先決條件 ISO C++ 20 標準 (/std:c++20) 程式碼 1 2 3 4 #include \u0026lt;chrono\u0026gt; #include \u0026lt;format\u0026gt; std::string datetime = std::format(\u0026#34;{:%FT%TZ}\u0026#34;, system_clock::now()); 以上就是在 C++ 中以 ISO 8601 格式輸出當前時間的方法。\n參考資料 std::format ","date":"2023-04-15T19:35:27+09:00","image":"http://kenji.blog/p/c-%E3%81%A7%E7%8F%BE%E5%9C%A8%E6%99%82%E5%88%BB%E3%82%92iso8601%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%81%A7%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu7d543f2117b8a102814b6a542ff27896_11509_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/c-%E3%81%A7%E7%8F%BE%E5%9C%A8%E6%99%82%E5%88%BB%E3%82%92iso8601%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%81%A7%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"如何在 C++ 中以 ISO 8601 格式輸出當前時間"},{"content":"在此介紹如何建立用來關閉 Windows 的捷徑。\n您可以將建立好的捷徑放在桌面等地方，只需連按兩下即可關機，非常方便。\n建立方法 1. 在桌面上按一下滑鼠右鍵，選擇 新增 ＞ 捷徑 2. 隨即會顯示建立捷徑的畫面，請輸入 shutdown.exe -s -f -t 0 並按一下 下一步 3. 輸入捷徑的名稱 關機，然後按一下 完成 4. 變更建立好的捷徑圖示 在建立好的捷徑上按一下滑鼠右鍵，選擇 內容\n按一下 變更圖示\n選擇紅色的方形圖示，按一下 確定，然後再次按一下 確定 以關閉內容視窗。\n以上。\n連按兩下建立好的捷徑，即可關閉 Windows。\n※注意：不會顯示關機的確認對話方塊。\n","date":"2023-04-11T17:03:32+09:00","image":"http://kenji.blog/p/windows-%E3%82%92%E3%82%B7%E3%83%A3%E3%83%83%E3%83%88%E3%83%80%E3%82%A6%E3%83%B3%E3%81%99%E3%82%8B%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu9b7c59b017f6e7ad15ccc41a6e668b14_6147_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%A6%82%E4%BD%95%E5%BB%BA%E7%AB%8B%E7%94%A8%E4%BE%86%E9%97%9C%E9%96%89-windows-%E7%9A%84%E6%8D%B7%E5%BE%91/","title":"如何建立用來關閉 Windows 的捷徑"},{"content":"我將介紹如何使用 paint.net 在圖片的特定區域加上馬賽克。\n在將圖片上傳到網路上時，有時候會想要在圖片的特定區域加上馬賽克。使用 paint.net，您可以快速地處理圖片。\n步驟 1. 使用 paint.net 開啟您想要進行馬賽克處理的圖片 2. 使用選取工具，選擇您想要加上馬賽克的部分（可複選） 3. 選擇選單＞效果＞扭曲＞馬賽克 透過儲存格大小來設定馬賽克處理的粗糙度。數值越大，隱蔽性越高。 [縮小] 選擇 多重取樣雙線性 [放大] 選擇 最鄰近點 點擊 OK 關閉對話框。\n4. 圖片將會被加上馬賽克，接著請儲存圖片。 以上。\n","date":"2023-04-11T16:33:10+09:00","image":"http://kenji.blog/p/paint.net%E3%81%A7%E7%94%BB%E5%83%8F%E3%81%AE%E7%89%B9%E5%AE%9A%E5%80%8B%E6%89%80%E3%81%AB%E3%83%A2%E3%82%B6%E3%82%A4%E3%82%AF%E3%82%92%E3%81%8B%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/img_huffa96a6cc9046fae85e7535d0c0f77f3_7385_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/paint.net%E3%81%A7%E7%94%BB%E5%83%8F%E3%81%AE%E7%89%B9%E5%AE%9A%E5%80%8B%E6%89%80%E3%81%AB%E3%83%A2%E3%82%B6%E3%82%A4%E3%82%AF%E3%82%92%E3%81%8B%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/","title":"如何使用 paint.net 在圖片的特定區域加上馬賽克"},{"content":"在此介紹如何使用 paint.net 為圖片加上邊框。\n步驟 1. 在 paint.net 中打開想要加上邊框的圖片 2. 設定次要顏色（這將會是邊框的顏色） 如果沒有顯示調色盤，請按下鍵盤上的 F8 鍵。\n若要設定為黑色，請點擊 。\n3. 選擇選單＞圖片＞變更畫布大小 將寬度和高度各增加 2 像素。增加 2 像素的話，邊框就會是 1 像素。 如果想要 5 像素的邊框，就將寬度和高度各增加 10 像素。\n錨點選擇「置中」，然後點擊確定。\n4. 圖片會加上邊框，接著儲存圖片。 以上。\n","date":"2023-04-11T14:31:59+09:00","image":"http://kenji.blog/p/paint.net%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E7%94%BB%E5%83%8F%E3%81%AB%E6%9E%A0%E7%B7%9A%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/img_3_hu0a2e55b3f220b3e7559f248d1c86ab19_112900_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/how-to-add-border-using-paint-net/","title":"如何使用 paint.net 為圖片加上邊框"},{"content":"前言 使用名為 Ranklet 的服務，可以從 Google Analytics 取得熱門頁面排行榜並輕鬆進行配置。\n本文將介紹如何將其配置到 HUGO 部落格中。\n效果預覽 事前準備 網站已設定 Google Analytics 步驟 前往 Ranklet 點擊 Sign in with Google 並使用 Google 帳號登入（需與已綁定 Google Analytics 的帳號一致） 點擊 允許\n設定基本資訊 如上圖所示進行設定。\n在 Google Analytics ビュー（Google Analytics 檢視）中，選擇想要取得排行榜的檢視。 設定文字取代 如上圖所示進行設定。 此設定是為了刪除頁面標題中的 | kenji.blog。\n設定範本 HTML（隱藏了排名的數字） 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 \u0026lt;div class=\u0026#34;ranklet ranklet-reset\u0026#34;\u0026gt; \u0026lt;table class=\u0026#34;ranklet-table\u0026#34;\u0026gt; \u0026lt;tbody class=\u0026#34;ranklet-pages\u0026#34;\u0026gt; {{#context.pages}} \u0026lt;tr class=\u0026#34;ranklet-page\u0026#34;\u0026gt; \u0026lt;td class=\u0026#34;ranklet-image\u0026#34;\u0026gt; {{#image}} \u0026lt;a href=\u0026#34;{{url}}\u0026#34; class=\u0026#34;ranklet-link\u0026#34;\u0026gt; \u0026lt;img class=\u0026#34;ranklet-img\u0026#34; src=\u0026#34;{{image}}\u0026#34; /\u0026gt; \u0026lt;/a\u0026gt; {{/image}} \u0026lt;/td\u0026gt; \u0026lt;td class=\u0026#34;ranklet-meta\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;ranklet-title\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;{{url}}\u0026#34; class=\u0026#34;ranklet-link\u0026#34;\u0026gt; {{title}} \u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; {{#description}} \u0026lt;div class=\u0026#34;ranklet-description\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;{{url}}\u0026#34; class=\u0026#34;ranklet-link\u0026#34;\u0026gt; {{description}} \u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; {{/description}} \u0026lt;/td\u0026gt; \u0026lt;/tr\u0026gt; {{/context.pages}} \u0026lt;/tbody\u0026gt; \u0026lt;/table\u0026gt; \u0026lt;/div\u0026gt; CSS（修改了字型大小，並讓說明文字以 3 行顯示） 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 #ranklet-{{context.id}} { .ranklet-reset { // 重設 table, tr, td, div, span { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; line-height: 1; box-sizing: border-box; } } .ranklet-table { border-collapse: separate; border-spacing: 8px 24px; width: 100%; word-break: break-all; td { vertical-align: middle; } .ranklet-rank { text-align: center; font-size: 120%; } .ranklet-image { text-align: center; img { max-width: 128px; max-height: 128px; } } .ranklet-meta { .ranklet-title { font-size: 20px; line-height: 125%; } .ranklet-description { font-size: 16px; margin-top: 8px; line-height: 125%; display: -webkit-box; overflow: hidden; -webkit-box-orient: vertical; -webkit-line-clamp: 3; /* 行數 */ } } } } JavaScript 保持不變 從「サイトへの掲載（發佈至網站）」複製 HTML 複製畫面上顯示的 HTML\n貼上至 HUGO 範本中 建立 layouts/partials/ranklet.html，並將複製的 HTML 貼上 1 \u0026lt;div id=\u0026#34;ranklet-11958\u0026#34;\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;script src=\u0026#34;//widget.ranklet.com/v1/ranklet/s3/widgets/11958/widget.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; 在 layouts/_default/single.html 中的 \u0026lt;/footer\u0026gt; 前一行貼上以下程式碼 1 {{- partial \u0026#34;ranklet.html\u0026#34; . }} 以上步驟完成。這樣一來，頁面下方就會像本頁底部一樣顯示出排行榜。\n","date":"2023-04-10T20:26:57+09:00","image":"http://kenji.blog/p/google%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E3%81%8B%E3%82%89%E4%BA%BA%E6%B0%97%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%81%A6%E9%85%8D%E7%BD%AE%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hue19aa55fc0e6d690cd31b7a50b796054_6753_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/google%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E3%81%8B%E3%82%89%E4%BA%BA%E6%B0%97%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%81%A6%E9%85%8D%E7%BD%AE%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"如何從 Google Analytics 取得並配置熱門頁面排行榜"},{"content":"Python Google Colaboratory Google Colaboratory 是一個可線上執行的 Python 執行環境。\n也支援使用 GPU。 使用 Colab 筆記本，可以在單一文件中撰寫可執行的程式碼與富文本（包括圖片、HTML、LaTeX 等）。 以 Jupyter Notebook 為基礎。\nRust Rust Playground JavaScript Javascript Playground Java paiza.IO Online Java compiler Haskell Haskell Playground Swift Online Swift Playground C++ C++ 14 其他 AWS Cloud9 由 Amazon AWS 提供的線上整合開發環境。預先封裝了超過 40 種程式語言的工具，如 Node.js、JavaScript、Python、PHP、Ruby、Go、C++ 等。\nVisual Studio Code for the Web 由微軟提供的線上開發環境。但是，需要編譯的語言無法進行執行和偵錯。\npaiza.IO 支援 C、C++、Java、Ruby、Python、PHP、Perl 等 24 種主要語言的線上執行環境。\nCodePen HTML、CSS、JavaScript 的線上執行環境。\ncodeanywhere 線上 IDE。可以分享程式碼和聊天。\n","date":"2023-04-09T14:01:00+09:00","image":"http://kenji.blog/p/%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83%E3%81%BE%E3%81%A8%E3%82%81/img_hu1a682c657d060df2f584d6c279d355c7_129199_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83%E3%81%BE%E3%81%A8%E3%82%81/","title":"[按語言] 線上程式碼執行環境總結"},{"content":"什麼是埃拉托斯特尼篩法 埃拉托斯特尼篩法是一種用來找出一定範圍內所有質數的演算法。 演算法很簡單，可以透過以下步驟實現：\n建立一個包含 N 個元素的布林值陣列，並將所有元素初始化為 true。 將陣列的第 0 個和第 1 個元素設為 false（因為 0 和 1 不是質數）。 如果陣列的第 2 個元素為 true，則輸出 2 為質數。 將陣列中 $2^2$ 以上的 2 的倍數對應的元素全部設為 false ※ 如果陣列的第 3 個元素為 true，則輸出 3 為質數。 將陣列中 $3^2$ 以上的 3 的倍數對應的元素全部設為 false。 對於第 4 個、第 5 個，……直到第 N 個元素，重複相同的處理。 ※ 將平方以上的元素設為 false 的原因在於，小於平方的數字已經被處理過（列舉已完成）。\nRust 實作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 fn main() { let n = 1000; let mut is_prime = vec![true; n+1]; is_prime[0] = false; is_prime[1] = false; for i in 2..=n { if is_prime[i] { println!(\u0026#34;{}\u0026#34;, i); let mut j = i * i; while j \u0026lt;= n { is_prime[j] = false; j += i; } } } } 稍微最佳化版本 考慮到以下幾點，我們進行稍微最佳化的實作：\n將陣列初始化為 false 而不是 true（這樣速度更快）。 因為 2 的倍數不是質數，所以省略將 2 的倍數設為 false 的處理。 不需要迴圈到 n，只需列舉到 n 的平方根為止的質數，就能找出所有小於等於 n 的質數。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 fn main() { let n = 1000; let mut is_prime = vec![false; n+1]; is_prime[2] = true; for i in (3..=n).step_by(2) { is_prime[i] = true; } for i in 3..=((n as f64).sqrt() as usize) { if is_prime[i] { let mut j = i * i; while j \u0026lt;= n { is_prime[j] = false; j += i * 2; } } } for i in (2..=n).filter(|\u0026amp;x| is_prime[x]) { println!(\u0026#34;{}\u0026#34;, i); } } 參考資料 埃拉托斯特尼篩法 ","date":"2023-04-09T12:54:24+09:00","image":"http://kenji.blog/p/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A61000%E4%BB%A5%E4%B8%8B%E3%81%AE%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hud779f88eb17786b23927bc052940ab95_400805_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E5%9F%83%E6%8B%89%E6%89%98%E6%96%AF%E7%89%B9%E5%B0%BC%E7%AF%A9%E6%B3%95%E5%88%97%E5%87%BA1000%E4%BB%A5%E4%B8%8B%E7%9A%84%E8%B3%AA%E6%95%B8/","title":"如何使用埃拉托斯特尼篩法列出1000以下的質數"},{"content":"透過終端機安裝 打開終端機 執行 sudo gem install cocoapods → 不知為何，出現了以下錯誤訊息，安裝失敗。 輸出 1 2 3 ERROR: Error installing cocoapods: The last version of activesupport (\u0026gt;= 5.0, \u0026lt; 8) to support your Ruby \u0026amp; RubyGems was 6.1.7.3. Try installing it with `gem install activesupport -v 6.1.7.3` and then running the current command again activesupport requires Ruby version \u0026gt;= 2.7.0. The current ruby version is 2.6.10.210. 因此，我在網路上搜尋了錯誤訊息（請參閱下方的「參考資料」），並執行了以下指令： 1 /bin/bash -c \u0026#34;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\u0026#34; 輸出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 ==\u0026gt; Checking for `sudo` access (which may request your password)... ==\u0026gt; This script will install: /usr/local/bin/brew /usr/local/share/doc/homebrew /usr/local/share/man/man1/brew.1 /usr/local/share/zsh/site-functions/_brew /usr/local/etc/bash_completion.d/brew /usr/local/Homebrew ==\u0026gt; The following new directories will be created: /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Frameworks ==\u0026gt; The Xcode Command Line Tools will be installed. Press RETURN/ENTER to continue or any other key to abort: ==\u0026gt; /usr/bin/sudo /bin/mkdir -p /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Frameworks ==\u0026gt; /usr/bin/sudo /bin/chmod ug=rwx /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Frameworks ==\u0026gt; /usr/bin/sudo /bin/chmod go-w /usr/local/share/zsh /usr/local/share/zsh/site-functions ==\u0026gt; /usr/bin/sudo /usr/sbin/chown kenji /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Frameworks ==\u0026gt; /usr/bin/sudo /usr/bin/chgrp admin /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Frameworks ==\u0026gt; /usr/bin/sudo /bin/mkdir -p /usr/local/Homebrew ==\u0026gt; /usr/bin/sudo /usr/sbin/chown -R kenji:admin /usr/local/Homebrew ==\u0026gt; /usr/bin/sudo /bin/mkdir -p /Users/kenji/Library/Caches/Homebrew ==\u0026gt; /usr/bin/sudo /bin/chmod g+rwx /Users/kenji/Library/Caches/Homebrew ==\u0026gt; /usr/bin/sudo /usr/sbin/chown -R kenji /Users/kenji/Library/Caches/Homebrew ==\u0026gt; Searching online for the Command Line Tools ==\u0026gt; /usr/bin/sudo /usr/bin/touch /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress ==\u0026gt; Installing Command Line Tools for Xcode-14.3 ==\u0026gt; /usr/bin/sudo /usr/sbin/softwareupdate -i Command\\ Line\\ Tools\\ for\\ Xcode-14.3 Software Update Tool Finding available software Downloading Command Line Tools for Xcode Downloaded Command Line Tools for Xcode Installing Command Line Tools for Xcode Done with Command Line Tools for Xcode Done. ==\u0026gt; /usr/bin/sudo /usr/bin/xcode-select --switch /Library/Developer/CommandLineTools ==\u0026gt; /usr/bin/sudo /bin/rm -f /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress ==\u0026gt; Downloading and installing Homebrew... remote: Enumerating objects: 236191, done. remote: Counting objects: 100% (504/504), done. remote: Compressing objects: 100% (327/327), done. remote: Total 236191 (delta 176), reused 468 (delta 158), pack-reused 235687 Receiving objects: 100% (236191/236191), 68.37 MiB | 15.51 MiB/s, done. Resolving deltas: 100% (173058/173058), done. From https://github.com/Homebrew/brew * [new branch] master -\u0026gt; origin/master * [new branch] test-runners -\u0026gt; origin/test-runners * [new tag] 0.1 -\u0026gt; 0.1 * [new tag] 0.2 -\u0026gt; 0.2 * [new tag] 0.3 -\u0026gt; 0.3 * [new tag] 0.4 -\u0026gt; 0.4 * [new tag] 0.5 -\u0026gt; 0.5 * [new tag] 0.6 -\u0026gt; 0.6 * [new tag] 0.7 -\u0026gt; 0.7 * [new tag] 0.7.1 -\u0026gt; 0.7.1 * [new tag] 0.8 -\u0026gt; 0.8 * [new tag] 0.8.1 -\u0026gt; 0.8.1 * [new tag] 0.9 -\u0026gt; 0.9 * [new tag] 0.9.1 -\u0026gt; 0.9.1 * [new tag] 0.9.2 -\u0026gt; 0.9.2 * [new tag] 0.9.3 -\u0026gt; 0.9.3 * [new tag] 0.9.4 -\u0026gt; 0.9.4 * [new tag] 0.9.5 -\u0026gt; 0.9.5 * [new tag] 0.9.8 -\u0026gt; 0.9.8 * [new tag] 0.9.9 -\u0026gt; 0.9.9 * [new tag] 1.0.0 -\u0026gt; 1.0.0 * [new tag] 1.0.1 -\u0026gt; 1.0.1 * [new tag] 1.0.2 -\u0026gt; 1.0.2 * [new tag] 1.0.3 -\u0026gt; 1.0.3 * [new tag] 1.0.4 -\u0026gt; 1.0.4 * [new tag] 1.0.5 -\u0026gt; 1.0.5 * [new tag] 1.0.6 -\u0026gt; 1.0.6 * [new tag] 1.0.7 -\u0026gt; 1.0.7 * [new tag] 1.0.8 -\u0026gt; 1.0.8 * [new tag] 1.0.9 -\u0026gt; 1.0.9 * [new tag] 1.1.0 -\u0026gt; 1.1.0 * [new tag] 1.1.1 -\u0026gt; 1.1.1 * [new tag] 1.1.10 -\u0026gt; 1.1.10 * [new tag] 1.1.11 -\u0026gt; 1.1.11 * [new tag] 1.1.12 -\u0026gt; 1.1.12 * [new tag] 1.1.13 -\u0026gt; 1.1.13 * [new tag] 1.1.2 -\u0026gt; 1.1.2 * [new tag] 1.1.3 -\u0026gt; 1.1.3 * [new tag] 1.1.4 -\u0026gt; 1.1.4 * [new tag] 1.1.5 -\u0026gt; 1.1.5 * [new tag] 1.1.6 -\u0026gt; 1.1.6 * [new tag] 1.1.7 -\u0026gt; 1.1.7 * [new tag] 1.1.8 -\u0026gt; 1.1.8 * [new tag] 1.1.9 -\u0026gt; 1.1.9 * [new tag] 1.2.0 -\u0026gt; 1.2.0 * [new tag] 1.2.1 -\u0026gt; 1.2.1 * [new tag] 1.2.2 -\u0026gt; 1.2.2 * [new tag] 1.2.3 -\u0026gt; 1.2.3 * [new tag] 1.2.4 -\u0026gt; 1.2.4 * [new tag] 1.2.5 -\u0026gt; 1.2.5 * [new tag] 1.2.6 -\u0026gt; 1.2.6 * [new tag] 1.3.0 -\u0026gt; 1.3.0 * [new tag] 1.3.1 -\u0026gt; 1.3.1 * [new tag] 1.3.2 -\u0026gt; 1.3.2 * [new tag] 1.3.3 -\u0026gt; 1.3.3 * [new tag] 1.3.4 -\u0026gt; 1.3.4 * [new tag] 1.3.5 -\u0026gt; 1.3.5 * [new tag] 1.3.6 -\u0026gt; 1.3.6 * [new tag] 1.3.7 -\u0026gt; 1.3.7 * [new tag] 1.3.8 -\u0026gt; 1.3.8 * [new tag] 1.3.9 -\u0026gt; 1.3.9 * [new tag] 1.4.0 -\u0026gt; 1.4.0 * [new tag] 1.4.1 -\u0026gt; 1.4.1 * [new tag] 1.4.2 -\u0026gt; 1.4.2 * [new tag] 1.4.3 -\u0026gt; 1.4.3 * [new tag] 1.5.0 -\u0026gt; 1.5.0 * [new tag] 1.5.1 -\u0026gt; 1.5.1 * [new tag] 1.5.10 -\u0026gt; 1.5.10 * [new tag] 1.5.11 -\u0026gt; 1.5.11 * [new tag] 1.5.12 -\u0026gt; 1.5.12 * [new tag] 1.5.13 -\u0026gt; 1.5.13 * [new tag] 1.5.14 -\u0026gt; 1.5.14 * [new tag] 1.5.2 -\u0026gt; 1.5.2 * [new tag] 1.5.3 -\u0026gt; 1.5.3 * [new tag] 1.5.4 -\u0026gt; 1.5.4 * [new tag] 1.5.5 -\u0026gt; 1.5.5 * [new tag] 1.5.6 -\u0026gt; 1.5.6 * [new tag] 1.5.7 -\u0026gt; 1.5.7 * [new tag] 1.5.8 -\u0026gt; 1.5.8 * [new tag] 1.5.9 -\u0026gt; 1.5.9 * [new tag] 1.6.0 -\u0026gt; 1.6.0 * [new tag] 1.6.1 -\u0026gt; 1.6.1 * [new tag] 1.6.10 -\u0026gt; 1.6.10 * [new tag] 1.6.11 -\u0026gt; 1.6.11 * [new tag] 1.6.12 -\u0026gt; 1.6.12 * [new tag] 1.6.13 -\u0026gt; 1.6.13 * [new tag] 1.6.14 -\u0026gt; 1.6.14 * [new tag] 1.6.15 -\u0026gt; 1.6.15 * [new tag] 1.6.16 -\u0026gt; 1.6.16 * [new tag] 1.6.17 -\u0026gt; 1.6.17 * [new tag] 1.6.2 -\u0026gt; 1.6.2 * [new tag] 1.6.3 -\u0026gt; 1.6.3 * [new tag] 1.6.4 -\u0026gt; 1.6.4 * [new tag] 1.6.5 -\u0026gt; 1.6.5 * [new tag] 1.6.6 -\u0026gt; 1.6.6 * [new tag] 1.6.7 -\u0026gt; 1.6.7 * [new tag] 1.6.8 -\u0026gt; 1.6.8 * [new tag] 1.6.9 -\u0026gt; 1.6.9 * [new tag] 1.7.0 -\u0026gt; 1.7.0 * [new tag] 1.7.1 -\u0026gt; 1.7.1 * [new tag] 1.7.2 -\u0026gt; 1.7.2 * [new tag] 1.7.3 -\u0026gt; 1.7.3 * [new tag] 1.7.4 -\u0026gt; 1.7.4 * [new tag] 1.7.5 -\u0026gt; 1.7.5 * [new tag] 1.7.6 -\u0026gt; 1.7.6 * [new tag] 1.7.7 -\u0026gt; 1.7.7 * [new tag] 1.8.0 -\u0026gt; 1.8.0 * [new tag] 1.8.1 -\u0026gt; 1.8.1 * [new tag] 1.8.2 -\u0026gt; 1.8.2 * [new tag] 1.8.3 -\u0026gt; 1.8.3 * [new tag] 1.8.4 -\u0026gt; 1.8.4 * [new tag] 1.8.5 -\u0026gt; 1.8.5 * [new tag] 1.8.6 -\u0026gt; 1.8.6 * [new tag] 1.9.0 -\u0026gt; 1.9.0 * [new tag] 1.9.1 -\u0026gt; 1.9.1 * [new tag] 1.9.2 -\u0026gt; 1.9.2 * [new tag] 1.9.3 -\u0026gt; 1.9.3 * [new tag] 2.0.0 -\u0026gt; 2.0.0 * [new tag] 2.0.1 -\u0026gt; 2.0.1 * [new tag] 2.0.2 -\u0026gt; 2.0.2 * [new tag] 2.0.3 -\u0026gt; 2.0.3 * [new tag] 2.0.4 -\u0026gt; 2.0.4 * [new tag] 2.0.5 -\u0026gt; 2.0.5 * [new tag] 2.0.6 -\u0026gt; 2.0.6 * [new tag] 2.1.0 -\u0026gt; 2.1.0 * [new tag] 2.1.1 -\u0026gt; 2.1.1 * [new tag] 2.1.10 -\u0026gt; 2.1.10 * [new tag] 2.1.11 -\u0026gt; 2.1.11 * [new tag] 2.1.12 -\u0026gt; 2.1.12 * [new tag] 2.1.13 -\u0026gt; 2.1.13 * [new tag] 2.1.14 -\u0026gt; 2.1.14 * [new tag] 2.1.15 -\u0026gt; 2.1.15 * [new tag] 2.1.16 -\u0026gt; 2.1.16 * [new tag] 2.1.2 -\u0026gt; 2.1.2 * [new tag] 2.1.3 -\u0026gt; 2.1.3 * [new tag] 2.1.4 -\u0026gt; 2.1.4 * [new tag] 2.1.5 -\u0026gt; 2.1.5 * [new tag] 2.1.6 -\u0026gt; 2.1.6 * [new tag] 2.1.7 -\u0026gt; 2.1.7 * [new tag] 2.1.8 -\u0026gt; 2.1.8 * [new tag] 2.1.9 -\u0026gt; 2.1.9 * [new tag] 2.2.0 -\u0026gt; 2.2.0 * [new tag] 2.2.1 -\u0026gt; 2.2.1 * [new tag] 2.2.10 -\u0026gt; 2.2.10 * [new tag] 2.2.11 -\u0026gt; 2.2.11 * [new tag] 2.2.12 -\u0026gt; 2.2.12 * [new tag] 2.2.13 -\u0026gt; 2.2.13 * [new tag] 2.2.14 -\u0026gt; 2.2.14 * [new tag] 2.2.15 -\u0026gt; 2.2.15 * [new tag] 2.2.16 -\u0026gt; 2.2.16 * [new tag] 2.2.17 -\u0026gt; 2.2.17 * [new tag] 2.2.2 -\u0026gt; 2.2.2 * [new tag] 2.2.3 -\u0026gt; 2.2.3 * [new tag] 2.2.4 -\u0026gt; 2.2.4 * [new tag] 2.2.5 -\u0026gt; 2.2.5 * [new tag] 2.2.6 -\u0026gt; 2.2.6 * [new tag] 2.2.7 -\u0026gt; 2.2.7 * [new tag] 2.2.8 -\u0026gt; 2.2.8 * [new tag] 2.2.9 -\u0026gt; 2.2.9 * [new tag] 2.3.0 -\u0026gt; 2.3.0 * [new tag] 2.4.0 -\u0026gt; 2.4.0 * [new tag] 2.4.1 -\u0026gt; 2.4.1 * [new tag] 2.4.10 -\u0026gt; 2.4.10 * [new tag] 2.4.11 -\u0026gt; 2.4.11 * [new tag] 2.4.12 -\u0026gt; 2.4.12 * [new tag] 2.4.13 -\u0026gt; 2.4.13 * [new tag] 2.4.14 -\u0026gt; 2.4.14 * [new tag] 2.4.15 -\u0026gt; 2.4.15 * [new tag] 2.4.16 -\u0026gt; 2.4.16 * [new tag] 2.4.2 -\u0026gt; 2.4.2 * [new tag] 2.4.3 -\u0026gt; 2.4.3 * [new tag] 2.4.4 -\u0026gt; 2.4.4 * [new tag] 2.4.5 -\u0026gt; 2.4.5 * [new tag] 2.4.6 -\u0026gt; 2.4.6 * [new tag] 2.4.7 -\u0026gt; 2.4.7 * [new tag] 2.4.8 -\u0026gt; 2.4.8 * [new tag] 2.4.9 -\u0026gt; 2.4.9 * [new tag] 2.5.0 -\u0026gt; 2.5.0 * [new tag] 2.5.1 -\u0026gt; 2.5.1 * [new tag] 2.5.10 -\u0026gt; 2.5.10 * [new tag] 2.5.11 -\u0026gt; 2.5.11 * [new tag] 2.5.12 -\u0026gt; 2.5.12 * [new tag] 2.5.2 -\u0026gt; 2.5.2 * [new tag] 2.5.3 -\u0026gt; 2.5.3 * [new tag] 2.5.4 -\u0026gt; 2.5.4 * [new tag] 2.5.5 -\u0026gt; 2.5.5 * [new tag] 2.5.6 -\u0026gt; 2.5.6 * [new tag] 2.5.7 -\u0026gt; 2.5.7 * [new tag] 2.5.8 -\u0026gt; 2.5.8 * [new tag] 2.5.9 -\u0026gt; 2.5.9 * [new tag] 2.6.0 -\u0026gt; 2.6.0 * [new tag] 2.6.1 -\u0026gt; 2.6.1 * [new tag] 2.6.2 -\u0026gt; 2.6.2 * [new tag] 2.7.0 -\u0026gt; 2.7.0 * [new tag] 2.7.1 -\u0026gt; 2.7.1 * [new tag] 2.7.2 -\u0026gt; 2.7.2 * [new tag] 2.7.3 -\u0026gt; 2.7.3 * [new tag] 2.7.4 -\u0026gt; 2.7.4 * [new tag] 2.7.5 -\u0026gt; 2.7.5 * [new tag] 2.7.6 -\u0026gt; 2.7.6 * [new tag] 2.7.7 -\u0026gt; 2.7.7 * [new tag] 3.0.0 -\u0026gt; 3.0.0 * [new tag] 3.0.1 -\u0026gt; 3.0.1 * [new tag] 3.0.10 -\u0026gt; 3.0.10 * [new tag] 3.0.11 -\u0026gt; 3.0.11 * [new tag] 3.0.2 -\u0026gt; 3.0.2 * [new tag] 3.0.3 -\u0026gt; 3.0.3 * [new tag] 3.0.4 -\u0026gt; 3.0.4 * [new tag] 3.0.5 -\u0026gt; 3.0.5 * [new tag] 3.0.6 -\u0026gt; 3.0.6 * [new tag] 3.0.7 -\u0026gt; 3.0.7 * [new tag] 3.0.8 -\u0026gt; 3.0.8 * [new tag] 3.0.9 -\u0026gt; 3.0.9 * [new tag] 3.1.0 -\u0026gt; 3.1.0 * [new tag] 3.1.1 -\u0026gt; 3.1.1 * [new tag] 3.1.10 -\u0026gt; 3.1.10 * [new tag] 3.1.11 -\u0026gt; 3.1.11 * [new tag] 3.1.12 -\u0026gt; 3.1.12 * [new tag] 3.1.2 -\u0026gt; 3.1.2 * [new tag] 3.1.3 -\u0026gt; 3.1.3 * [new tag] 3.1.4 -\u0026gt; 3.1.4 * [new tag] 3.1.5 -\u0026gt; 3.1.5 * [new tag] 3.1.6 -\u0026gt; 3.1.6 * [new tag] 3.1.7 -\u0026gt; 3.1.7 * [new tag] 3.1.8 -\u0026gt; 3.1.8 * [new tag] 3.1.9 -\u0026gt; 3.1.9 * [new tag] 3.2.0 -\u0026gt; 3.2.0 * [new tag] 3.2.1 -\u0026gt; 3.2.1 * [new tag] 3.2.10 -\u0026gt; 3.2.10 * [new tag] 3.2.11 -\u0026gt; 3.2.11 * [new tag] 3.2.12 -\u0026gt; 3.2.12 * [new tag] 3.2.13 -\u0026gt; 3.2.13 * [new tag] 3.2.14 -\u0026gt; 3.2.14 * [new tag] 3.2.15 -\u0026gt; 3.2.15 * [new tag] 3.2.16 -\u0026gt; 3.2.16 * [new tag] 3.2.17 -\u0026gt; 3.2.17 * [new tag] 3.2.2 -\u0026gt; 3.2.2 * [new tag] 3.2.3 -\u0026gt; 3.2.3 * [new tag] 3.2.4 -\u0026gt; 3.2.4 * [new tag] 3.2.5 -\u0026gt; 3.2.5 * [new tag] 3.2.6 -\u0026gt; 3.2.6 * [new tag] 3.2.7 -\u0026gt; 3.2.7 * [new tag] 3.2.8 -\u0026gt; 3.2.8 * [new tag] 3.2.9 -\u0026gt; 3.2.9 * [new tag] 3.3.0 -\u0026gt; 3.3.0 * [new tag] 3.3.1 -\u0026gt; 3.3.1 * [new tag] 3.3.10 -\u0026gt; 3.3.10 * [new tag] 3.3.11 -\u0026gt; 3.3.11 * [new tag] 3.3.12 -\u0026gt; 3.3.12 * [new tag] 3.3.13 -\u0026gt; 3.3.13 * [new tag] 3.3.14 -\u0026gt; 3.3.14 * [new tag] 3.3.15 -\u0026gt; 3.3.15 * [new tag] 3.3.16 -\u0026gt; 3.3.16 * [new tag] 3.3.2 -\u0026gt; 3.3.2 * [new tag] 3.3.3 -\u0026gt; 3.3.3 * [new tag] 3.3.4 -\u0026gt; 3.3.4 * [new tag] 3.3.5 -\u0026gt; 3.3.5 * [new tag] 3.3.6 -\u0026gt; 3.3.6 * [new tag] 3.3.7 -\u0026gt; 3.3.7 * [new tag] 3.3.8 -\u0026gt; 3.3.8 * [new tag] 3.3.9 -\u0026gt; 3.3.9 * [new tag] 3.4.0 -\u0026gt; 3.4.0 * [new tag] 3.4.1 -\u0026gt; 3.4.1 * [new tag] 3.4.10 -\u0026gt; 3.4.10 * [new tag] 3.4.11 -\u0026gt; 3.4.11 * [new tag] 3.4.2 -\u0026gt; 3.4.2 * [new tag] 3.4.3 -\u0026gt; 3.4.3 * [new tag] 3.4.4 -\u0026gt; 3.4.4 * [new tag] 3.4.5 -\u0026gt; 3.4.5 * [new tag] 3.4.6 -\u0026gt; 3.4.6 * [new tag] 3.4.7 -\u0026gt; 3.4.7 * [new tag] 3.4.8 -\u0026gt; 3.4.8 * [new tag] 3.4.9 -\u0026gt; 3.4.9 * [new tag] 3.5.0 -\u0026gt; 3.5.0 * [new tag] 3.5.1 -\u0026gt; 3.5.1 * [new tag] 3.5.10 -\u0026gt; 3.5.10 * [new tag] 3.5.2 -\u0026gt; 3.5.2 * [new tag] 3.5.3 -\u0026gt; 3.5.3 * [new tag] 3.5.4 -\u0026gt; 3.5.4 * [new tag] 3.5.5 -\u0026gt; 3.5.5 * [new tag] 3.5.6 -\u0026gt; 3.5.6 * [new tag] 3.5.7 -\u0026gt; 3.5.7 * [new tag] 3.5.8 -\u0026gt; 3.5.8 * [new tag] 3.5.9 -\u0026gt; 3.5.9 * [new tag] 3.6.0 -\u0026gt; 3.6.0 * [new tag] 3.6.1 -\u0026gt; 3.6.1 * [new tag] 3.6.10 -\u0026gt; 3.6.10 * [new tag] 3.6.11 -\u0026gt; 3.6.11 * [new tag] 3.6.12 -\u0026gt; 3.6.12 * [new tag] 3.6.13 -\u0026gt; 3.6.13 * [new tag] 3.6.14 -\u0026gt; 3.6.14 * [new tag] 3.6.15 -\u0026gt; 3.6.15 * [new tag] 3.6.16 -\u0026gt; 3.6.16 * [new tag] 3.6.17 -\u0026gt; 3.6.17 * [new tag] 3.6.18 -\u0026gt; 3.6.18 * [new tag] 3.6.19 -\u0026gt; 3.6.19 * [new tag] 3.6.2 -\u0026gt; 3.6.2 * [new tag] 3.6.20 -\u0026gt; 3.6.20 * [new tag] 3.6.21 -\u0026gt; 3.6.21 * [new tag] 3.6.3 -\u0026gt; 3.6.3 * [new tag] 3.6.4 -\u0026gt; 3.6.4 * [new tag] 3.6.5 -\u0026gt; 3.6.5 * [new tag] 3.6.6 -\u0026gt; 3.6.6 * [new tag] 3.6.7 -\u0026gt; 3.6.7 * [new tag] 3.6.8 -\u0026gt; 3.6.8 * [new tag] 3.6.9 -\u0026gt; 3.6.9 * [new tag] 4.0.0 -\u0026gt; 4.0.0 * [new tag] 4.0.1 -\u0026gt; 4.0.1 * [new tag] 4.0.10 -\u0026gt; 4.0.10 * [new tag] 4.0.11 -\u0026gt; 4.0.11 * [new tag] 4.0.2 -\u0026gt; 4.0.2 * [new tag] 4.0.3 -\u0026gt; 4.0.3 * [new tag] 4.0.4 -\u0026gt; 4.0.4 * [new tag] 4.0.5 -\u0026gt; 4.0.5 * [new tag] 4.0.6 -\u0026gt; 4.0.6 * [new tag] 4.0.7 -\u0026gt; 4.0.7 * [new tag] 4.0.8 -\u0026gt; 4.0.8 * [new tag] 4.0.9 -\u0026gt; 4.0.9 HEAD is now at c51687009 Merge pull request #15168 from reitermarkus/api-ruby-source-path ==\u0026gt; Installation successful! ==\u0026gt; Homebrew has enabled anonymous aggregate formulae and cask analytics. Read the analytics documentation (and how to opt-out) here: https://docs.brew.sh/Analytics No analytics data has been sent yet (nor will any be during this install run). ==\u0026gt; Homebrew is run entirely by unpaid volunteers. Please consider donating: https://github.com/Homebrew/brew#donations ==\u0026gt; Next steps: - Run these two commands in your terminal to add Homebrew to your PATH: (echo; echo \u0026#39;eval \u0026#34;$(/usr/local/bin/brew shellenv)\u0026#34;\u0026#39;) \u0026gt;\u0026gt; /Users/kenji/.zprofile eval \u0026#34;$(/usr/local/bin/brew shellenv)\u0026#34; - Run brew help to get started - Further documentation: https://docs.brew.sh 執行 brew install cocoapods 輸出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 Warning: Treating cocoapods as a formula. For the cask, use homebrew/cask/cocoapods ==\u0026gt; Fetching dependencies for cocoapods: libyaml, ca-certificates, openssl@1.1, readline and ruby ==\u0026gt; Fetching libyaml ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/libyaml/manifests/0.2.5 ######################################################################## 100.0% ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/libyaml/blobs/sha256:b49e62f014 ==\u0026gt; Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh ######################################################################## 100.0% ==\u0026gt; Fetching ca-certificates ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/ca-certificates/manifests/2023- ######################################################################## 100.0% ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/ca-certificates/blobs/sha256:11 ==\u0026gt; Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh ######################################################################## 100.0% ==\u0026gt; Fetching openssl@1.1 ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/openssl/1.1/manifests/1.1.1t ######################################################################## 100.0% ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/openssl/1.1/blobs/sha256:97676d ==\u0026gt; Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh ######################################################################## 100.0% ==\u0026gt; Fetching readline ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/readline/manifests/8.2.1 ######################################################################## 100.0% ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:abe9d3f3e ==\u0026gt; Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh ######################################################################## 100.0% ==\u0026gt; Fetching ruby ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/ruby/manifests/3.2.2 ######################################################################## 100.0% ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/ruby/blobs/sha256:a4ac080688e87 ==\u0026gt; Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh ######################################################################## 100.0% ==\u0026gt; Fetching cocoapods ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/cocoapods/manifests/1.12.0 ######################################################################## 100.0% ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/cocoapods/blobs/sha256:11226288 ==\u0026gt; Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh ######################################################################## 100.0% ==\u0026gt; Installing dependencies for cocoapods: libyaml, ca-certificates, openssl@1.1, readline and ruby ==\u0026gt; Installing cocoapods dependency: libyaml ==\u0026gt; Pouring libyaml--0.2.5.ventura.bottle.tar.gz 🍺 /usr/local/Cellar/libyaml/0.2.5: 10 files, 330KB ==\u0026gt; Installing cocoapods dependency: ca-certificates ==\u0026gt; Pouring ca-certificates--2023-01-10.all.bottle.tar.gz ==\u0026gt; Regenerating CA certificate bundle from keychain, this may take a while... 🍺 /usr/local/Cellar/ca-certificates/2023-01-10: 3 files, 216.9KB ==\u0026gt; Installing cocoapods dependency: openssl@1.1 ==\u0026gt; Pouring openssl@1.1--1.1.1t.ventura.bottle.tar.gz 🍺 /usr/local/Cellar/openssl@1.1/1.1.1t: 8,101 files, 18.5MB ==\u0026gt; Installing cocoapods dependency: readline ==\u0026gt; Pouring readline--8.2.1.ventura.bottle.tar.gz 🍺 /usr/local/Cellar/readline/8.2.1: 50 files, 1.7MB ==\u0026gt; Installing cocoapods dependency: ruby ==\u0026gt; Pouring ruby--3.2.2.ventura.bottle.tar.gz 🍺 /usr/local/Cellar/ruby/3.2.2: 16,605 files, 46.3MB ==\u0026gt; Installing cocoapods ==\u0026gt; Pouring cocoapods--1.12.0.ventura.bottle.tar.gz 🍺 /usr/local/Cellar/cocoapods/1.12.0: 13,436 files, 27.8MB ==\u0026gt; Running `brew cleanup cocoapods`... Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP. Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`). 執行 pod --version 輸出 1 1.12.0 似乎已經成功安裝了。\n參考資料 Installing \u0026ldquo;CocoaPods\u0026rdquo; ","date":"2023-04-09T03:25:54+09:00","image":"http://kenji.blog/p/mac%E3%81%ABcocoapods%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_1_hu5a3007afd3f7cdc4b526573a36fbeca4_11833_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/mac%E3%81%ABcocoapods%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"如何在 mac 上安裝 CocoaPods"},{"content":"如何使用 Salesforce SOQL 獲取每天建立的記錄數 開啟開發者控制台。 開啟 Query Editor 索引標籤。 貼上並執行以下 SOQL。 1 select day_only(createdDate), count(createdDate) from account group by day_only(createdDate) order by count(createdDate) desc limit 10 請將 account 更改為您想要獲取的任何物件名稱並執行。\n參考 Is there a way to group by the date portion of a datetime field in SOQL? ","date":"2023-04-09T02:50:30+09:00","image":"http://kenji.blog/p/salesforce%E3%81%AEsoql%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%A6%E6%97%A5%E5%88%A5%E3%81%AE%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E4%BD%9C%E6%88%90%E6%95%B0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hub769e11b0a209a1986a31ec50fb9e2d1_10470_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-salesforce-soql-%E7%8D%B2%E5%8F%96%E6%AF%8F%E5%A4%A9%E5%BB%BA%E7%AB%8B%E7%9A%84%E8%A8%98%E9%8C%84%E6%95%B8/","title":"如何使用 Salesforce SOQL 獲取每天建立的記錄數"},{"content":"\n需要的東西 Google 帳號 步驟 進入 https://colab.research.google.com/ 選擇「檔案」→「新增筆記本」 貼上並執行以下程式碼 1 2 3 4 5 6 7 import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 2*np.pi, 500) plt.plot(x, np.sin(x), label=\u0026#34;sin curve\u0026#34;) plt.plot(x, np.cos(x), label=\u0026#34;cos curve\u0026#34;) plt.legend() # 顯示圖例 plt.show() 執行結果 參考資料 matplotlib.pyplot — Matplotlib 3.5.3 documentation ","date":"2023-04-09T01:02:19+09:00","image":"http://kenji.blog/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hucdb24ab588d845f9f7a56ef99be2c709_27745_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-python-matplotlib.pyplot-%E7%B9%AA%E8%A3%BD%E5%9C%96%E8%A1%A8/","title":"如何使用 Python (matplotlib.pyplot) 繪製圖表"},{"content":"所需項目 Twitter API Twitter API SECRET Twitter ACCESS TOKEN Twitter ACCESS TOKEN SECRET Google 帳號 有關如何取得 Twitter API，請參閱參考網站。\n使用 API 發布推文的步驟 進入 https://colab.research.google.com/ 選擇「檔案」→「新增筆記本」 貼上並執行以下程式碼（請使用您自己取得的實際值） 1 2 3 4 API_KEY = \u0026#39;9Smu2f2RoLqbVQHQq6n79Z2JW\u0026#39; API_SECRET = \u0026#39;uGVRIkLL2l8sRyPv2Lr4mXxXppnQF1isMoRnvktcXCtFgAK2R8\u0026#39; ACCESS_TOKEN = \u0026#39;0367292979164670705-7hSErDoQbO6fkFtnn5UY0vqpvecy0O\u0026#39; ACCESS_TOKEN_SECRET = \u0026#39;pUv81U9GVzZirz5g4AxZPHAJ4GpSXnBo8GUcZ1egtjw9q\u0026#39; 貼上並執行以下程式碼 1 import tweepy 貼上並執行以下程式碼（API v1.1） 1 2 3 4 auth = tweepy.OAuthHandler(API_KEY, API_SECRET) auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET) api = tweepy.API(auth) api.update_status(\u0026#34;hello\u0026#34;) → 將發布一則內容為 hello 的推文\n貼上並執行以下程式碼（API v2.0） 1 2 client = tweepy.Client(consumer_key=API_KEY, consumer_secret=API_SECRET, access_token=ACCESS_TOKEN, access_token_secret=ACCESS_TOKEN_SECRET) client.create_tweet(text=\u0026#39;hello v2\u0026#39;) → 將發布一則內容為 hello v2 的推文\n以上\n參考 【截至2021年4月】附帶使用範例與截圖的 Twitter API 使用申請徹底解說 【無需繁瑣設定！】Google Colaboratory 是 Twitter API 測試環境的推薦選擇【附帶原始碼分享】 【Tweepy】Twitter API v2：推文、回覆、附帶投票的推文、附帶媒體的推文（v1.1）[Python] ","date":"2023-04-08T18:48:32+09:00","image":"http://kenji.blog/p/twitter-api%E3%81%A8google-colaboratory%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6tweet%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu92a10d7ea1c17ea4dcc0d2e0b77b6296_75327_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/how-to-tweet-using-twitter-api-and-google-colaboratory-zh-tw/","title":"如何使用 Twitter API 和 Google Colaboratory 發布推文"},{"content":"什麼是 OpenSSL？ 它是一個開源函式庫，提供了執行加密通訊所需的處理功能。\n為了在程式中使用它，由於其 C 語言原始碼是公開的，您需要對其進行編譯以建立函式庫。\n下面，我們將介紹編譯步驟。\n準備編譯環境 Perl\n從 https://strawberryperl.com/ 下載 strawberry-perl-5.32.1.1-64bit.msi。最新版本應該就可以。\nNASM\n從 https://www.nasm.us/ 的 Download 中下載 2.16.01/nasm-2.16.01-win64.zip。非 RC 的最新版本應該就可以。 安裝後，您需要將安裝 NASM 的資料夾登錄到環境變數 PATH 中。\nVisual Studio 2022 或 Build Tools for Visual Studio 2022\n從 https://visualstudio.microsoft.com/ja/downloads/ 安裝 Visual Studio 2022 Community 或 Build Tools for Visual Studio 2022。\nWindows 上的 OpenSSL 編譯步驟 從 https://www.openssl.org/source/ 下載 openssl-3.1.0.tar.gz 並解壓縮。如果無法解壓縮，請在命令提示字元中執行 tar -xzf openssl-3.1.0.tar.gz。 以系統管理員權限 啟動命令提示字元。 開啟解壓縮後的資料夾。 執行以下命令。 ※ 請根據您安裝的 Visual Studio 版本更改 Community 部分。 1 \u0026#34;C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\u0026#34; x64 執行以下命令： 1 perl Configure VC-WIN64A 執行以下命令（會花費相當長的時間）： 1 nmake 執行以下命令（會花費相當長的時間）： 1 nmake test 執行以下命令： 1 nmake install 如果成功，OpenSSL 將會安裝在 C:\\Program Files\\OpenSSL。\n以上。\n參考資料 https://ja.wikipedia.org/wiki/OpenSSL\n","date":"2023-04-07T21:06:32+09:00","image":"http://kenji.blog/p/windows-%E3%81%A7-openssl-%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu856dff3329e4daff79f775d47e5cc35b_35659_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/windows-%E3%81%A7-openssl-%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"如何在 Windows 上編譯 OpenSSL"},{"content":"什麼是 i18n？ i18n 是 Internationalization 的縮寫，意思是國際化。因為 Internationalization 太長了， 所以在第一個 i 和最後一個 n 之間有 18 個字母，因此縮寫為 i18n。\n它經常被用在軟體國際化的語境中。\n國際化的主要考慮項目包括以下內容：1\n字元集（標準字元編碼等） 文字方向（從左到右、從右到左、從上到下向左等） 語言 / 文字 字型 格式 數字（小數點字元、千位分隔符號、分組位數等） 日期和時間（日期格式、使用的日曆差異，如伊斯蘭曆/公曆/猶太曆/日本曆等） 日期和時間資訊的時區差異 貨幣資訊 國際化與在地化 - 維基百科\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"2023-04-07T00:42:02+09:00","image":"http://kenji.blog/p/i18n%E3%81%A8%E3%81%AF/img_hu5547e5059a9dab53fb09979c54309752_11855_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/i18n%E3%81%A8%E3%81%AF/","title":"什麼是 i18n？"},{"content":"如何使用 HTML 製作簡報資料 reveal.js 是一個使用 HTML 和 Markdown 的簡報製作工具，具有以下功能：\n豐富的簡報功能，如數學公式、動畫和滑動操作 主題和版面可以自訂 支援多種裝置的導航功能，如滑鼠、鍵盤和觸控板 提供進階功能，如自動播放投影片和嵌入影片 支援匯出為 PDF 格式 透過這些功能，使用者可以輕鬆建立互動且具吸引力的簡報。\nreveal.js 的安裝與使用方法 最簡單的使用方法是從以下頁面下載整個 ZIP 檔案並解壓縮。\n打開 https://revealjs.com/installation 並從連結下載 master.zip 在瀏覽器中打開解壓縮資料夾內的 index.html 修改 index.html 以建立自己的簡報資料 ※ demo.html 中寫有展示用的 HTML 程式碼，可以作為參考。\n應用方式 製作好的簡報資料可以直接作為網頁發布，或匯出為 PDF。 此外，由於簡報的原始碼是文字，因此很容易使用版本控制系統進行管理。\n似乎也可以使用 Markdown 格式建立簡報資料。\n參考資料 未來的簡報資料就用 reveal.js 吧 Markdown 語法範例列表 ","date":"2023-04-06T23:23:46+09:00","image":"http://kenji.blog/p/html%E3%81%A7%E3%83%97%E3%83%AC%E3%82%BC%E3%83%B3%E8%B3%87%E6%96%99%E3%82%92%E4%BD%9C%E3%82%8B%E6%96%B9%E6%B3%95reveal.js/img_hu4de64f3f6be8c50037c2a4c6c2d48287_30871_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/html%E3%81%A7%E3%83%97%E3%83%AC%E3%82%BC%E3%83%B3%E8%B3%87%E6%96%99%E3%82%92%E4%BD%9C%E3%82%8B%E6%96%B9%E6%B3%95reveal.js/","title":"如何使用 HTML 製作簡報資料 (reveal.js)"},{"content":"什麼是 Stable diffusion Stable diffusion 是由德國慕尼黑大學研究團隊開發的，一種根據輸入文字資訊生成圖像的 AI。 透過讓它學習各種圖像，它可以生成從寫實照片到插圖等各式各樣的圖片。\n這次，我將介紹如何使用 Stable diffusion 的預訓練資料來生成插圖。\n需要準備的東西 Google 帳號 僅此而已\n生成步驟 打開 https://colab.research.google.com 從左上角的 檔案 中選擇 新增筆記本 從 編輯 中選擇 筆記本設定 將 硬體加速器 更改為 GPU 貼上並執行以下程式碼 1 !pip install diffusers==0.8.0 transformers 貼上並執行以下程式碼 1 from diffusers import StableDiffusionPipeline 貼上並執行以下程式碼 1 2 pipe = StableDiffusionPipeline.from_pretrained(\u0026#34;gsdf/Counterfeit-V2.5\u0026#34;) pipe.to(\u0026#34;cuda\u0026#34;) 貼上並執行以下程式碼 1 2 3 4 5 prompt = \u0026#34;((masterpiece,best quality)),1girl, solo, animal ears, rabbit, barefoot, knees up, dress, sitting, rabbit ears, short sleeves, looking at viewer, grass, short hair, smile, white hair, puffy sleeves, outdoors, puffy short sleeves, bangs, on ground, full body, animal, white dress, sunlight, brown eyes, dappled sunlight, day, depth of field\u0026#34; n_prompt = \u0026#34;EasyNegative, extra fingers,fewer fingers\u0026#34; image = pipe(prompt, negative_prompt = n_prompt).images[0] image 這裡使用的 Prompt 參考了 https://huggingface.co/gsdf/Counterfeit-V2.5 的 Prompt。\n生成結果（部分） 參考 https://huggingface.co/gsdf/Counterfeit-V2.5 花了15分鐘使用人工智慧（AI）製作了圖像生成程式【實況編程】 ","date":"2023-04-06T00:43:19+09:00","image":"http://kenji.blog/p/aistablediffusion%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E7%94%BB%E5%83%8F%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu25483e02f36587a64f3cf042db15c245_550570_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/aistablediffusion%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E7%94%BB%E5%83%8F%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"如何使用 AI (Stable Diffusion) 生成插圖"},{"content":"執行檔（exe）是什麼 在 Windows 上可執行的檔案。基本上是以被稱為 PE 格式的形式撰寫。 包含為了執行的機器語言程式碼、圖示與圖片等資源。\n有幾款工具可以用來解析執行檔，因此這次將介紹它們。\n7-Zip EXE 檔案有時會因為體積容易變大，而透過壓縮檔案來建立。在這種情況下，使用檔案壓縮與解壓縮軟體 7-Zip，可以將執行檔解壓縮並檢查其內容。同樣能進行解壓縮的工具還有一款叫作 WinRAR。\nResource Hacker 可以從 EXE 檔案中提取出資源（圖示、點陣圖、對話方塊、字串等）。此外，因為也具備二進位編輯器的功能，所以也能夠編輯並改寫 EXE 檔案的內容。\nPE Explorer 可以解析 Windows 用的 PE 檔案（EXE、DLL、OCX、SYS、驅動程式）。PE Explorer 提供各種解析功能，例如顯示檔案結構、顯示檔案標頭、顯示目錄項目、顯示匯出的函式與符號等。\nDependency Walker 可以檢查 EXE 檔案所依賴的 DLL 檔案，並確認它們是否有被正確載入。此外，也能追蹤 DLL 檔案的函式呼叫。\nGhidra 由 NSA（美國國家安全局）開發並作為開源軟體免費公開的強大逆向工程工具。不僅能對 EXE 檔案進行反組譯（轉換為組合語言），還具備能反編譯成接近 C 語言形式的功能，非常受歡迎。\nIDA Free / IDA Pro 在惡意軟體解析與逆向工程領域，成為全球業界標準的高階反組譯器與反編譯器。Pro 版非常昂貴，但如果是個人或非商業用途，可以免費使用功能限制版的「IDA Free」。\nx64dbg (x32dbg) Windows 專用的開源除錯器。專門用於一邊執行執行檔，一邊以逐步執行來解析內容與記憶體狀態的「動態解析」，常被用於解讀 Crackme（用於解析練習的程式）或調查惡意軟體的行為。\nILSpy / dotPeek 如果目標的 EXE 檔案是使用 C# 等 .NET 相關語言所建立，透過使用這些工具，可以將其反編譯到幾乎與原始程式碼相同的狀態，將內容完全曝光。\n雖然這些工具有助於檢查 EXE 檔案的內容，但必須注意。編輯檔案或將其用於不正當的用途，可能會引起著作權法或安全上的問題，因此請在充分理解的情況下使用。\n","date":"2023-04-05T23:31:06+09:00","image":"http://kenji.blog/p/%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%ABexe%E3%81%AE%E4%B8%AD%E8%BA%AB%E3%82%92%E8%A7%A3%E6%9E%90%E3%81%99%E3%82%8B%E3%83%84%E3%83%BC%E3%83%AB/img_1_hu9e069acaa7fdaa872d319a8c6d6e1444_1819799_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E8%A7%A3%E6%9E%90%E5%9F%B7%E8%A1%8C%E6%AA%94exe%E5%85%A7%E5%AE%B9%E7%9A%84%E5%B7%A5%E5%85%B7/","title":"解析執行檔（exe）內容的工具"},{"content":"簡介 這裡將介紹如何在 Mac 上像 Windows 一樣（Alt+Tab）切換應用程式。\n因為透過更改預設設定很難實現，所以這個方法需要安裝應用程式。\n操作演示 設定方法 (macOS Ventura) 打開 https://alt-tab-macos.netlify.app 點擊 Download the latest release 打開下載的應用程式 按照步驟進行安裝 這樣，你就可以像在 Windows 上一樣使用 Alt+Tab 切換應用程式了。\n以上\n","date":"2023-04-05T02:20:12+09:00","image":"http://kenji.blog/p/mac%E3%81%A7windows%E3%83%A9%E3%82%A4%E3%82%AFalt-tab%E3%81%AB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu9e86c898d72728906fc707b47dff25e0_55585_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/mac%E3%81%A7windows%E3%83%A9%E3%82%A4%E3%82%AFalt-tab%E3%81%AB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"如何在 Mac 上像 Windows 一樣（Alt+Tab）切換應用程式"},{"content":"簡介 當在 Windows 和 mac 之間切換使用時，常用的複製、貼上和復原等快捷鍵有所不同，因此我將介紹如何將它們保持一致。\n設定方法（macOS Ventura） 開啟「系統設定」 選擇「鍵盤」 選擇「鍵盤快速鍵」 選擇「變更鍵」 將 Control(^) 鍵指派為「⌘ Command」 將 Command(⌘) 鍵指派為「^ Control」 點擊「完成」 以上\n","date":"2023-04-05T00:49:02+09:00","image":"http://kenji.blog/p/mac%E3%81%A7%E3%82%B3%E3%83%94%E3%83%BC%E3%83%9A%E3%83%BC%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E3%82%92windows%E3%81%A8%E5%90%88%E3%82%8F%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95/img_hu81c2d0d61c05f6ce24b15f479442c3bc_211588_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/mac%E3%81%A7%E3%82%B3%E3%83%94%E3%83%BC%E3%83%9A%E3%83%BC%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E3%82%92windows%E3%81%A8%E5%90%88%E3%82%8F%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95/","title":"如何在 mac 上將複製和貼上快捷鍵與 Windows 保持一致"},{"content":"前言 我使用的是美式鍵盤，在 Windows 上我使用 Alt + ` 來切換日文輸入。 我想在 Mac 上也使用相同的按鍵進行切換，經過一番查詢，我發現可以在設定中進行更改。\n設定方法 (macOS Ventura) 打開系統設定 選擇「鍵盤」 選擇「鍵盤快速鍵」 選擇「輸入方式」 雙擊「選擇輸入選單中的下一個來源」右側的快速鍵顯示 輸入 Alt + ` 點擊完成 現在，您可以使用 Alt + ` 在英文與日文之間進行切換。 不過，預設情況下，片假名會包含在切換選項中，因此我按照以下步驟從輸入來源中移除了片假名。\n打開系統設定 選擇「鍵盤」 點擊輸入方式中 日文 - 羅馬字輸入 右側的編輯 點擊 日文 - 羅馬字輸入 取消勾選輸入模式中的片假名 點擊完成 以上\n","date":"2023-04-04T23:02:12+09:00","image":"http://kenji.blog/p/mac%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E8%8B%B1%E8%AA%9E%E5%85%A5%E5%8A%9B%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu79c9b62a36c4ad9394525ea6ed769587_198703_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/mac%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E8%8B%B1%E8%AA%9E%E5%85%A5%E5%8A%9B%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"如何在 Mac 上更改日文與英文輸入切換的快捷鍵"},{"content":"如何在 Windows 中尋找路徑中的執行檔位置 當您指定一個執行檔來執行命令時，有時您會想知道該執行檔的確切位置。在這種情況下，您可以使用以下命令來找出執行檔的位置。\n1 where \u0026lt;執行檔名稱\u0026gt; 例如，如果您想知道小畫家 (mspaint.exe) 的位置，請執行以下操作：\n1 where mspaint.exe 參考 How do I find the location of an executable in Windows? ","date":"2023-04-03T00:02:55+09:00","image":"http://kenji.blog/p/windows-%E3%81%A7%E3%83%91%E3%82%B9%E3%81%AE%E9%80%9A%E3%81%A3%E3%81%9F%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%A0%B4%E6%89%80%E3%82%92%E8%A6%8B%E3%81%A4%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/img_hub74cf0d67f87eb185fadea6cd8747be8_5455_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/windows-%E3%81%A7%E3%83%91%E3%82%B9%E3%81%AE%E9%80%9A%E3%81%A3%E3%81%9F%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%A0%B4%E6%89%80%E3%82%92%E8%A6%8B%E3%81%A4%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/","title":"如何在 Windows 中尋找路徑中的執行檔位置"},{"content":"購買了 mac mini (2018) 在 Mercari 上購買了一台二手的 mac mini (2018)。規格如下。\nCPU: 3.2GHz 6核心 Intel Core i7 記憶體: 32GB 儲存空間: 1TB SSD 價格是 ￥ 77,000\n購買原因 我在公司使用規格幾乎相同的 mac mini 來開發手機應用程式，但我希望在家裡也能建立一個開發環境（特別是 xcode 的執行環境）。 我有一台 macbook pro，但是 9 年前買的，速度非常慢，所以幾乎沒在用。 個人一直想開發 iOS 應用程式。 立刻安裝 xcode 和 inteliJ IDEA xcode 的版本是 Version 14.3 (14E222b) inteliJ IDEA 的版本是 2023.1 來吧！開始開發囉！\n","date":"2023-04-02T18:05:30+09:00","image":"http://kenji.blog/p/mac-mini2018%E3%82%92%E8%B3%BC%E5%85%A5/img_huc5df0470d74ce7a0046f11abaa7c5815_30469_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/mac-mini2018%E3%82%92%E8%B3%BC%E5%85%A5/","title":"購買了 mac mini (2018)"},{"content":"關於「Unsplash」 https://unsplash.com/ja/\n圖片素材網站「Unsplash」總結如下：\n所有圖片皆可免費使用 允許商業用途 允許圖片加工 無需取得使用許可 無需標示原作者 這對於撰寫部落格文章非常方便，請務必嘗試使用看看。\n※ 關於授權條款，請參考下方的「註腳」。1\n本網站也會繼續利用它。\nUnsplash 授權條款\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"2023-04-02T14:44:17+09:00","image":"http://kenji.blog/p/%E3%83%96%E3%83%AD%E3%82%B0%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E5%86%99%E7%9C%9F%E7%B4%A0%E6%9D%90%E3%82%B5%E3%82%A4%E3%83%88unsplash%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/img_1_hu43cbd10eab78d2e7468dbb36abe8d794_828454_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E9%97%9C%E6%96%BC%E9%81%A9%E7%94%A8%E6%96%BC%E9%83%A8%E8%90%BD%E6%A0%BC%E7%9A%84%E5%85%8D%E8%B2%BB%E5%9C%96%E5%BA%AB%E7%B6%B2%E7%AB%99unsplash/","title":"關於適用於部落格的免費圖庫網站「Unsplash」"},{"content":"取得 egui 範例 您可以使用以下指令執行 egui 範例。\n1 2 3 git clone https://github.com/emilk/eframe_template/ egui_test cd egui_test cargo run 載入支援日文的字型 要顯示日文，您必須載入支援日文的字型。\n在 src/app.rs 中，將以下行新增至 pub fn new 方法內。\n1 2 3 4 5 6 7 8 9 10 11 12 // 載入支援日文的字型 let mut fonts = egui::FontDefinitions::default(); fonts.font_data.insert( \u0026#34;Meiryo\u0026#34;.to_owned(), egui::FontData::from_static(include_bytes!(\u0026#34;C:/Windows/Fonts/Meiryo.ttc\u0026#34;)), ); fonts .families .entry(egui::FontFamily::Proportional) .or_default() .insert(0, \u0026#34;Meiryo\u0026#34;.to_owned()); cc.egui_ctx.set_fonts(fonts); 現在您可以顯示日文了。 ","date":"2023-04-01T03:17:52+09:00","image":"http://kenji.blog/p/egui%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu6798dc327f7454fc6cd8b8de1315ab03_5786_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/how-to-display-japanese-in-egui/","title":"如何在 egui 中顯示日文"},{"content":"什麼是 KaTeX KaTeX 是一個用於在 HTML 中顯示 LaTeX 風格數學公式的 javascript 函式庫。\n具體來說，您可以顯示如下的數學公式。\n$$f(x) = x^2 + x + 41$$ 似乎還有其他 LaTeX 風格的數學公式顯示函式庫，但 KaTeX 以簡單且快速而聞名。\n如何導入到 hugo 在 hugo 的資料夾層次結構中建立一個新的 layouts/partials/math.html。 內容應如下所示。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 \u0026lt;link rel=\u0026#34;stylesheet\u0026#34; href=\u0026#34;https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/katex.min.css\u0026#34; integrity=\u0026#34;sha384-vKruj+a13U8yHIkAyGgK1J3ArTLzrFGBbBc0tDp4ad/EyewESeXE/Iv67Aj8gKZ0\u0026#34; crossorigin=\u0026#34;anonymous\u0026#34;\u0026gt; \u0026lt;script defer src=\u0026#34;https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/katex.min.js\u0026#34; integrity=\u0026#34;sha384-PwRUT/YqbnEjkZO0zZxNqcxACrXe+j766U2amXcgMg5457rve2Y7I6ZJSm2A0mS4\u0026#34; crossorigin=\u0026#34;anonymous\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script defer src=\u0026#34;https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/contrib/auto-render.min.js\u0026#34; integrity=\u0026#34;sha384-+VBxd3r6XgURycqtZ117nYw44OOcIax56Z4dCRWbxyPt0Koah1uHoK0o4+/RRE05\u0026#34; crossorigin=\u0026#34;anonymous\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script\u0026gt; document.addEventListener(\u0026#34;DOMContentLoaded\u0026#34;, function() { renderMathInElement( document.body, { delimiters: [ {left: \u0026#34;$$\u0026#34;, right: \u0026#34;$$\u0026#34;, display: true}, {left: \u0026#34;\\\\[\u0026#34;, right: \u0026#34;\\\\]\u0026#34;, display: true}, {left: \u0026#34;$\u0026#34;, right: \u0026#34;$\u0026#34;, display: false}, {left: \u0026#34;\\\\(\u0026#34;, right: \u0026#34;\\\\)\u0026#34;, display: false} ] }); }); \u0026lt;/script\u0026gt; 接下來，將以下程式碼新增至現有檔案 layouts/partials/extend_head.html 中。 1 2 3 {{ if or .Params.math .Site.Params.math }} {{ partial \u0026#34;math.html\u0026#34; . }} {{ end }} 現在您已經準備好使用 KaTeX 了。 您可以透過在頁面的 front matter 中加入 math: true 來啟用 KaTeX。\n剩下的就是在頁面文章的正文中以 LaTeX 風格編寫公式即可。 1 $$ e^{i \\pi} = -1 $$ 如上所述編寫，將會如下顯示。\n$$ e^{i \\pi} = -1 $$ 參考資料 Math Typesetting | PaperModX KaTex Auto-render Extension 導入 KaTeX | The Strange Storage ","date":"2023-03-31T23:11:26+09:00","image":"http://kenji.blog/p/hugo%E3%81%A7katexlatex%E9%A2%A8%E6%95%B0%E5%BC%8F%E8%A1%A8%E7%A4%BA%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu4b1d83d24aac47c2cd375cc93b995e98_26739_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/how-to-enable-katex-in-hugo/","title":"如何在 hugo 中啟用 KaTeX（LaTeX 風格的數學公式顯示）"},{"content":"人性的弱點 https://amzn.to/3YTv0Dr\n被討厭的勇氣 https://amzn.to/3n3SVCQ\nLIFE SHIFT 100年時代的人生戰略 https://amzn.to/3TtKUDf\n7個習慣 https://amzn.to/3TqfjSO\n","date":"2023-03-19T18:13:14+09:00","image":"http://kenji.blog/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E6%9B%B8/img_huc9a897f0643b20664d8e252d3dd67b22_2836610_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E6%8E%A8%E8%96%A6%E7%9A%84%E5%95%86%E6%A5%AD%E6%9B%B8%E7%B1%8D/","title":"推薦的商業書籍"},{"content":"推薦的 Chrome 擴充功能 介紹我目前正在使用的 Chrome 擴充功能。雖然說是 Chrome，但在 Microsoft Edge 上也可以使用。\n1. simpleGestures 這是一款讓你能夠使用滑鼠手勢的擴充功能。 不需要使用鍵盤或對準工具列上的按鈕，就可以操作瀏覽器。\n例如，按住滑鼠右鍵並向左滑動可以返回，按住滑鼠右鍵並向右滑動可以前進等。\n因為它也是開源的，所以可靠性很高。\nsimpleGestures github 2. uBlock Origin 這是一款阻擋廣告的擴充功能。因為是開源的，可靠性很高。此外，它的 CPU 和記憶體使用量也很少，運作起來非常流暢。\nuBlock Origin github 3. DeepL 翻譯 這款 Chrome 擴充功能允許您使用世界知名的翻譯服務 DeepL 來翻譯網頁內容。只要在瀏覽器中選擇想要翻譯的文字，就會顯示 DeepL 的圖示，點擊即可自動翻譯。\nDeepL Translator 4. ChatGPT Sidebar 這款擴充功能讓您可以在側邊欄使用 ChatGPT。按下 Ctrl+P 即可顯示側邊欄，立即向 AI 提問。 如果頁面中有選取的文字，它會直接複製到提問框中，按下 Ctrl+Enter 就可以立刻發問。\nChatGPT Sidebar 5. Salesforce DevTools 為 Salesforce 開發增加便利功能的擴充功能。 對於不使用 Salesforce 的人來說應該是不需要的。\nSalesforce DevTools ","date":"2023-03-19T02:54:30+09:00","image":"http://kenji.blog/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE-chorme-%E6%8B%A1%E5%BC%B5/img_4_hue5f33cff57d8628a1113ed27818b8d04_20776_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE-chorme-%E6%8B%A1%E5%BC%B5/","title":"推薦的 Chrome 擴充功能"},{"content":"如何更新 rustc 只需在命令列中執行以下一行。\n1 rustup update 輸出參考 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 rustup update info: syncing channel updates for \u0026#39;stable-x86_64-pc-windows-msvc\u0026#39; warning: Signature verification failed for \u0026#39;https://static.rust-lang.org/dist/channel-rust-stable.toml\u0026#39; info: latest update on 2023-03-09, rust version 1.68.0 (2c8cc3432 2023-03-06) info: downloading component \u0026#39;rust-src\u0026#39; info: downloading component \u0026#39;cargo\u0026#39; info: downloading component \u0026#39;clippy\u0026#39; info: downloading component \u0026#39;rust-docs\u0026#39; info: downloading component \u0026#39;rust-std\u0026#39; info: downloading component \u0026#39;rustc\u0026#39; 63.9 MiB / 63.9 MiB (100 %) 37.5 MiB/s in 1s ETA: 0s info: downloading component \u0026#39;rustfmt\u0026#39; info: removing previous version of component \u0026#39;rust-src\u0026#39; info: removing previous version of component \u0026#39;cargo\u0026#39; info: removing previous version of component \u0026#39;clippy\u0026#39; info: removing previous version of component \u0026#39;rust-docs\u0026#39; info: removing previous version of component \u0026#39;rust-std\u0026#39; info: removing previous version of component \u0026#39;rustc\u0026#39; info: removing previous version of component \u0026#39;rustfmt\u0026#39; info: installing component \u0026#39;rust-src\u0026#39; info: installing component \u0026#39;cargo\u0026#39; info: installing component \u0026#39;clippy\u0026#39; info: installing component \u0026#39;rust-docs\u0026#39; 19.4 MiB / 19.4 MiB (100 %) 2.4 MiB/s in 6s ETA: 0s info: installing component \u0026#39;rust-std\u0026#39; 27.6 MiB / 27.6 MiB (100 %) 12.7 MiB/s in 2s ETA: 0s info: installing component \u0026#39;rustc\u0026#39; 63.9 MiB / 63.9 MiB (100 %) 13.8 MiB/s in 4s ETA: 0s info: installing component \u0026#39;rustfmt\u0026#39; info: checking for self-updates info: downloading self-update stable-x86_64-pc-windows-msvc updated - rustc 1.68.0 (2c8cc3432 2023-03-06) (from rustc 1.64.0 (a55dd71d5 2022-09-19)) info: cleaning up downloads \u0026amp; tmp directories ","date":"2023-03-18T10:27:02+09:00","image":"http://kenji.blog/p/rustc%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu2f4438039b9bb5f2180f9e10d772e3b3_30692_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/rustc%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"如何更新 rustc"},{"content":"什麼是 egui 這是一個可以在 Rust 中使用的 GUI 函式庫。\n試用 egui 您可以使用以下指令執行 egui 的範例。\n1 2 3 git clone https://github.com/emilk/eframe_template/ egui_test cd egui_test cargo run 之後，您可以在把玩範例程式碼的同時進行各種嘗試。\n參考資料 官方 GitHub\n","date":"2023-03-18T10:27:02+09:00","image":"http://kenji.blog/p/egui%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/demo_hu16f50e8d6a05810ce904e73f9e33bab1_152754_120x120_fill_box_smart1_1.gif","permalink":"http://kenji.blog/zh-tw/p/egui%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/","title":"試用 egui"},{"content":"YAMAHA AG03 雜訊消除方法 使用AG03的監聽功能聽PC音訊時，會定期（大約每1到3分鐘一次）聽到沙沙的雜音。 經過查詢，發現以下方法可以解決AG03的雜訊問題。\nhttps://jp.yamaha.com/support/updates/yamaha_steinberg_usb_driver_for_win.html\n從上述網站下載並安裝 Yamaha Steinberg USB Driver 後，雜訊就消失了。\n今すぐ購入 參考資料 https://web.archive.org/web/20201003230738/http://yamaha.custhelp.com/app/answers/detail/a_id/7202\n","date":"2023-03-18T01:17:10+09:00","image":"http://kenji.blog/p/ag03%E3%83%8E%E3%82%A4%E3%82%BA%E8%A7%A3%E6%B6%88%E6%96%B9%E6%B3%95/img_hu7b60ee71c94898202eca721f7c6778b5_180745_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/ag03%E3%83%8E%E3%82%A4%E3%82%BA%E8%A7%A3%E6%B6%88%E6%96%B9%E6%B3%95/","title":"AG03雜訊消除方法"},{"content":"現役工程師推薦與想要的電腦周邊設備 鍵盤 說到底，鍵盤最推薦的是不容易壞的靜電容無接點方式。 我已經持有 RealForce 超過 10 年了，至今仍在服役中。 我使用的是英文排列的靜音版。\n不過，最近也對 Logitech MX Keys 這款鍵盤很感興趣。\n軌跡球 關於指標裝置，相較於滑鼠，更推薦軌跡球，因為它能減輕疲勞。\n我使用的是 Logitech MX Ergo。這雖然是價格超過1萬日圓的昂貴產品，但我認為它有超越其價格的價值。\n我也對使用食指和中指操作的大球款式 DEFT PRO(M-DPT1MRXBK) 很感興趣。 顯示器 雖然任何顯示器都可以，但推薦高解析度的 4K 顯示器。\n目前使用的是 DELL的 4K 顯示器。\n現在很想要寬螢幕的 EIZO 顯示器 或是 DELL 顯示器。\n","date":"2023-02-28T00:51:49+09:00","image":"http://kenji.blog/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AEpc%E5%91%A8%E8%BE%BA%E6%A9%9F%E5%99%A8/img_hu9c34821fcae33240cf8bba1055606dc6_434960_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AEpc%E5%91%A8%E8%BE%BA%E6%A9%9F%E5%99%A8/","title":"推薦的電腦周邊設備"},{"content":"使用付費 Web 字型的服務 fontplus.jp https://fontplus.jp/\n每月 1,100 日圓即可使用所有字型，並支援在多個網站上使用。\n","date":"2023-02-07T20:59:01+09:00","image":"http://kenji.blog/p/fontplus.jp/img_hu81cfc4bed02bb5cdb36d3ac7fae3e538_91722_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/fontplus.jp/","title":"關於 fontplus.jp"},{"content":"預設情況下，HUGO 不允許在文章中使用 HTML 標籤，但您可以透過在 config.toml 中加入以下描述來啟用它。\n1 2 [markup.goldmark.renderer] unsafe = true 參考: Configure Markup\n","date":"2023-01-17T19:20:32+09:00","image":"http://kenji.blog/p/hugo%E3%81%A7html%E3%82%BF%E3%82%B0%E3%82%92%E4%BD%BF%E3%81%86/img_hu415dc7e70376ac350673d0366f70ca4b_19909_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%9C%A8-hugo-%E4%B8%AD%E4%BD%BF%E7%94%A8-html-%E6%A8%99%E7%B1%A4/","title":"在 HUGO 中使用 HTML 標籤"},{"content":"招募 GitHub 贊助者 如果您能透過下方的按鈕成為 GitHub 贊助者，我會非常高興。\n這將用於工具開發等方面。\n我會努力直到能夠加上程式碼簽章憑證！\n","date":"2023-01-17T18:13:56+09:00","image":"http://kenji.blog/p/github%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B5%E3%83%BC%E5%8B%9F%E9%9B%86/img_hueb38a852fa4aae54f384564ce61ae26b_130999_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E6%8B%9B%E5%8B%9F-github-%E8%B4%8A%E5%8A%A9%E8%80%85/","title":"招募 GitHub 贊助者"},{"content":"什麼是按鈕 按鈕是 GUI 控制項之一，可以使用 Windows 標準 API 來實作。 當您點擊畫面上的區域（滑鼠左鍵按下，滑鼠左鍵放開）時， 就可以執行程式中指定的處理。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // 建立按鈕 CreateWindow( TEXT(\u0026#34;BUTTON\u0026#34;), TEXT(\u0026#34;Close\u0026#34;), WS_CHILD|WS_VISIBLE, 10,10,128,30, hWnd, (HMENU)ID_BUTTON1, ((LPCREATESTRUCT)lParam)-\u0026gt;hInstance, 0); ... // 當被點擊時，作業系統會向視窗發送 WM_COMMAND 訊息。 case WM_COMMAND: switch(LOWORD(wParam)) { case ID_BUTTON1: SendMessage(hWnd,WM_CLOSE,0,0); break; } break; 範例程式碼發佈在下方。 button\n","date":"2023-01-14T20:24:00+09:00","image":"http://kenji.blog/p/%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%A4%E3%81%84%E3%81%A6/img_hu07b471bb746fa184ff8eeb6f561670e7_8164_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%A4%E3%81%84%E3%81%A6/","title":"關於按鈕"},{"content":"買了一台筆記型電腦 ThinkPad（二手） 在筆記型電腦上的工作幾乎都是透過遠端桌面連線進入其他終端機來進行，所以我不需要高規格的電腦。原本 ChromeBook 也可以，但因為沒有好看的設計或高解析度，所以我買了 ThinkPad。\n規格如下，使用了各種點數後，價格大約是 5 萬 5 千日圓。\nThinkPad T470s CPU: Intel Core i7 7600U RAM: 24GB SSD: 512GB OS: Windows 10 Pro 64bit 螢幕: 14.0 吋寬螢幕（防眩光面板） 解析度: WQHD 液晶 2560×1440 重量: 約 1.32kg 備註: 英文鍵盤 因為是二手的，我原本還在想會不會有使用痕跡或刮傷，但完全沒有問題，真是太好了。 目前電池用起來也沒什麼問題。\n目前想到的不滿意之處 沒有 Pause 鍵和 App 鍵。我之前常用 Pause 鍵作為開啟系統設定的捷徑。另外，我也經常用 App 鍵來開啟彈出式選單，所以沒有這些鍵很不方便。 PageUp 鍵和 PageDown 鍵就在鍵盤方向鍵的旁邊，所以我經常按錯。這可能是需要習慣的問題。 其他考慮過但沒買的電腦 ASUS Chromebook Flip C436FA (C436FA-ENG) HP 筆記型電腦 HP15s-fq 參考資料: ThinkPad T470s\n","date":"2023-01-13T19:07:00+09:00","image":"http://kenji.blog/p/thinkpad%E4%B8%AD%E5%8F%A4%E3%82%92%E8%B2%B7%E3%81%A3%E3%81%9F/img_hu1990736b7e8b9be3011f0d8e6938401f_246116_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/thinkpad%E4%B8%AD%E5%8F%A4%E3%82%92%E8%B2%B7%E3%81%A3%E3%81%9F/","title":"買了一台 ThinkPad（二手）"},{"content":"使用 TeamViewer 輕鬆進行遠端連線 使用 TeamViewer，可以輕鬆進行遠端桌面連線。\n在遠端目標端和遠端來源端啟動 TeamViewer， 在遠端來源端輸入遠端目標端的 ID 和密碼即可進行遠端連線。\n如果是透過命令列進行遠端連線，請如下操作：\n1 %ProgramFiles%\\TeamViewer\\TeamViewer.exe -i \u0026lt;ID\u0026gt; -P \u0026lt;Password\u0026gt; 在 \u0026lt;ID\u0026gt; 輸入遠端目標端的 ID，在 \u0026lt;Password\u0026gt; 輸入遠端目標端的密碼。\n如果使用上述指令建立捷徑檔案，就可以省略輸入 ID/密碼，非常方便。\n參考網站：Command line parameters\n","date":"2023-01-13T01:45:00+09:00","image":"http://kenji.blog/p/teamviewer%E3%81%A7%E7%B0%A1%E5%8D%98%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E6%8E%A5%E7%B6%9A/img_hu6a85c6015d61f1656b290295e2fefc2b_15316_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E4%BD%BF%E7%94%A8-teamviewer-%E8%BC%95%E9%AC%86%E9%80%B2%E8%A1%8C%E9%81%A0%E7%AB%AF%E9%80%A3%E7%B7%9A/","title":"使用 TeamViewer 輕鬆進行遠端連線"},{"content":" 愚者從經驗中學習，智者從歷史中學習 (奧托·馮·俾斯麥)\n授人以魚不如授人以漁 (老子)\n求知若飢，虛心若愚 (史蒂夫·賈伯斯)\n完成比完美更重要 (馬克·祖克柏)\n保持簡單 (詹姆斯·高斯林)\n我沒有時間去擔心誰不喜歡我。我太忙著去愛那些愛我的人了。 (史努比)\n對人類而言，最大的幸福就是『能遇到讓自己發揮所長的工作』 (卡爾·馬克思)\n如果一知半解是危險的，那麼擁有足以脫離危險的知識的人又在哪裡呢？ (托馬斯·赫胥黎 1877)\n特偉都迪接著說：「反過來說，如果是這樣，它可能是這樣；如果是這樣，它就會是這樣；但既然不是這樣，它就不是這樣。這就是邏輯。」 (路易斯·卡羅《愛麗絲鏡中奇遇》1872)\n稱克勞德·夏農為資訊時代之父，且其學術成就是20世紀最偉大的成就之一，這並非誇大其辭。 (美國數學學會評語)\n了解符號代數理論現狀的人都知道，這種分析過程的有效性，並不取決於所用符號的解釋，而是僅取決於它們組合的法則。 (喬治·布爾，在《邏輯的數學分析》開篇 1847)\n","date":"2022-10-15T17:00:43+09:00","image":"http://kenji.blog/p/%E5%90%8D%E8%A8%80%E9%9B%86/img_hu460fc51ec02f7186f7ea8b0f77e830d9_47559_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%90%8D%E8%A8%80%E9%9B%86/","title":"名言集"},{"content":"圖形編輯器 介紹一個可以創建簡單圖形的網頁。\nhttps://csacademy.com/app/graph_editor/\n您可以透過輸入數值來創建圖形。 此外，似乎也可以用滑鼠移動元素。\n點擊 Directed 也可創建有向圖。\n您可以使用 Download as PNG 將創建的圖形保存為圖片。\n","date":"2022-10-13T23:31:11+09:00","image":"http://kenji.blog/p/%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/img_hu784f47a1f9126188b11445cd2c37bf68_13497_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/","title":"圖形編輯器"},{"content":"使用 Mathematica 解決旅行推銷員問題 問題 電車でこんな広告を見かけました😁📸 pic.twitter.com/iXEgvtXrpL\n\u0026mdash; 早稲田大学 早水桃子研究室 (@hayamizu_lab) October 11, 2022 解法 1 d=SparseArray[{{1,2}-\u0026gt;10,{2,1}-\u0026gt;10,{1,5}-\u0026gt;15,{5,1}-\u0026gt;15,{1,4}-\u0026gt;12,{4,1}-\u0026gt;12,{1,3}-\u0026gt;20,{3,1}-\u0026gt;20,{2,5}-\u0026gt;10,{5,2}-\u0026gt;10,{3,4}-\u0026gt;10,{4,3}-\u0026gt;10,{3,8}-\u0026gt;30,{8,3}-\u0026gt;30,{3,7}-\u0026gt;20,{7,3}-\u0026gt;20,{3,6}-\u0026gt;25,{6,3}-\u0026gt;25,{4,5}-\u0026gt;15,{5,4}-\u0026gt;15,{4,8}-\u0026gt;20,{8,4}-\u0026gt;20,{5,9}-\u0026gt;18,{9,5}-\u0026gt;18,{5,8}-\u0026gt;15,{8,5}-\u0026gt;15,{6,7}-\u0026gt;5,{7,6}-\u0026gt;5,{7,8}-\u0026gt;35,{8,7}-\u0026gt;35,{8,9}-\u0026gt;12,{9,8}-\u0026gt;12},{9,9},Infinity]; 使用 SparseArray 函數建立矩陣。每個元素代表該元素的行與列對應城市之間的距離。例如，第一個元素 {1,2}-\u0026gt;10 表示 1 和 2 之間的距離是 10。倒數第二個元素 {9,9} 表示矩陣的大小，最後一個元素 Infinity 表示未指定城市之間的道路長度無限大。也就是說，意味著沒有道路。\n1 {len,tour}=FindShortestTour[{1,2,3,4,5,6,7,8,9},DistanceFunction-\u0026gt;(d[[#1,#2]]\u0026amp;)] 透過 FindShortestTour 函數，可以輕鬆解決旅行推銷員問題。{1,2,3,4,5,6,7,8,9} 代表城市編號。DistanceFunction-\u0026gt;(d[[#1,#2]]\u0026amp;) 傳遞了代表城市之間距離的矩陣 d。\n輸出 1 {137, {1, 2, 5, 9, 8, 7, 6, 3, 4}} 輸出為最短距離及當時的巡迴路線。最短距離為 137，巡迴路線為 1→2→5→9→8→7→6→3→4→1。按照 ABC 順序轉換後，將變為 A, B, E, I, H, G, F, C, D。\n","date":"2022-10-12T19:05:58+09:00","image":"http://kenji.blog/p/mathematica%E3%81%A7%E5%B7%A1%E5%9B%9E%E3%82%BB%E3%83%BC%E3%83%AB%E3%82%B9%E3%83%9E%E3%83%B3%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E3%81%8F/img_hucba782cf2f6047b30fd8084b4d887659_22760_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E4%BD%BF%E7%94%A8-mathematica-%E8%A7%A3%E6%B1%BA%E6%97%85%E8%A1%8C%E6%8E%A8%E9%8A%B7%E5%93%A1%E5%95%8F%E9%A1%8C/","title":"使用 Mathematica 解決旅行推銷員問題"},{"content":"要勾選網頁中的所有核取方塊，請按 F12 開啟 DevTools，將以下代碼貼上到主控台並執行。\n1 2 3 4 5 6 let boxes = document.querySelectorAll(\u0026#39;input[type=\u0026#34;checkbox\u0026#34;]\u0026#39;); for (let i = 0; i \u0026lt; boxes.length; i++) { if (!boxes[i].disabled) { boxes[i].checked = true; } } 或者，\n建立一個新書籤，並將以下代碼貼上到註冊網址處（通常是輸入 https://\u0026hellip; 的地方）進行註冊。 顯示您想要勾選的網頁，然後點擊已建立的書籤，所有的核取方塊就會被勾選。\n1 javascript:(function(){let boxes=document.querySelectorAll(\u0026#39;input[type=\u0026#34;checkbox\u0026#34;]\u0026#39;);for(let i=0;i\u0026lt;boxes.length;i++){if(!boxes[i].disabled){boxes[i].checked=true;}}})(); 如果要全部取消勾選，請將上述腳本中的 boxes[i].checked = true; 部分更改為 boxes[i].checked = false;。\n","date":"2022-10-05T20:07:06+09:00","image":"http://kenji.blog/p/web%E3%83%9A%E3%83%BC%E3%82%B8%E5%86%85%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92%E5%85%A8%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B/img_hu556225b69f77e68d5b8659c3dfad5080_9228_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%8B%BE%E9%81%B8%E7%B6%B2%E9%A0%81%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E6%A0%B8%E5%8F%96%E6%96%B9%E5%A1%8A/","title":"勾選網頁中的所有核取方塊"},{"content":"威爾遜定理 當 $p$ 是質數時，$(p−1)!≡−1 \\pmod p$ 成立。\n歐拉公式 $e^{iπ}+1=0$\n費馬最後定理 對於任何整數 $n≥3$，不存在滿足 $x^n+y^n=z^n$ 的正整數組 $x,y,z$。\n巴塞爾問題 $1/1^2+1/2^2+1/3^2+1/4^2+...=π^2/6$\n歐拉素數生成式 當 $n$ 是 $0$ 以上 $39$ 以下的整數時，$n^2+n+41$ 全部為質數。\n","date":"2022-10-05T13:24:50+09:00","image":"http://kenji.blog/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E6%95%B0%E5%BC%8F/img_huc293f175856c5702bca3e96906ea6e7d_155123_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E6%95%B0%E5%BC%8F/","title":"喜歡的數學公式"},{"content":"先決條件 必須為 Windows 11\n步驟 從 Microsoft Store 安裝 應用程式安裝程式 https://www.microsoft.com/store/productId/9NBLGGH4NNS1 在命令提示字元中安裝應用程式 1 winget install Google.Chrome 可安裝的主要應用程式 Google Chrome (命令 winget install Google.Chrome) Microsoft Edge (命令 winget install Microsoft.Edge) Microsoft Teams (命令 winget install Microsoft.Teams) Microsoft Office (命令 winget install Microsoft.Office) Visual Studio Code (命令 winget install vscode) Slack (命令 winget install SlackTechnologies.Slack) Discord (命令 winget install Discord.Discord) Docker Desktop (命令 winget install Docker.DockerDesktop) Git (命令 winget install Git) 7zip (命令 winget install 7zip) VLC (命令 winget install VideoLAN.VLC) 參考資料 使用 winget 工具安裝和管理應用程式\n題外話 我以為也可以安裝 Paint.Net，但無法安裝。\nhttps://forums.getpaint.net/topic/118574-please-add-paintnet-to-the-available-packages-for-windows-package-manager-winget/\n","date":"2022-10-05T12:15:20+09:00","image":"http://kenji.blog/p/winget-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/img_hu0f8970b897eb9ee188b975a06c549111_1216_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/winget-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/","title":"使用 WinGet 透過命令列安裝應用程式"},{"content":"Rust 的特徵 由 Mozilla 開發的相對較新的開源程式語言 沒有垃圾回收機制（garbage collection），是一種專為系統編程設計的高速語言 將所有權（ownership）和借用（borrowing）的獨特機制做為語言規範，保證記憶體安全 支援跨平台運行 標配了優秀的套件管理器 Cargo ","date":"2022-10-03T22:47:20+09:00","image":"http://kenji.blog/p/rust%E3%81%AE%E7%89%B9%E5%BE%B4/img_hu184f8481eb552ab7d9cefed2227c58f9_39839_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/rust%E3%81%AE%E7%89%B9%E5%BE%B4/","title":"Rust 的特徵"},{"content":"若要在 Github Actions 中動態設定變數，可以透過附加寫入到 $env:GITHUB_ENV 來實現，如下所示。\n【Windows 情況】\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 name: Rust on: push: branches: [ \u0026#34;master\u0026#34; ] pull_request: branches: [ \u0026#34;master\u0026#34; ] env: CARGO_TERM_COLOR: always jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Get Environment run: | echo \u0026#39;VERSION=1.0.0\u0026#39; \u0026gt;\u0026gt; $GITHUB_ENV echo \u0026#39;NAME=1.0.0\u0026#39; \u0026gt;\u0026gt; $GITHUB_ENV - name: Display Environment run: | echo $env:VERSION echo $env:NAME - name: Create Release id: create_release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: ${{ env.VERSION }} release_name: ${{ env.VERSION }} draft: false prerelease: false - name: Upload Release Asset id: upload-release-asset uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it\u0026#39;s ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps asset_path: ./target/release/${{ env.NAME }}.exe asset_name: ${{ env.NAME }}.exe asset_content_type: application/octet-stream 【Linux 情況】\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 name: Rust on: push: branches: [ \u0026#34;main\u0026#34; ] pull_request: branches: [ \u0026#34;main\u0026#34; ] env: CARGO_TERM_COLOR: always jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Get Environment run: | echo \u0026#39;VERSION=1.0.0\u0026#39; \u0026gt;\u0026gt; $GITHUB_ENV echo \u0026#39;NAME=hello\u0026#39; \u0026gt;\u0026gt; $GITHUB_ENV - name: Display Environment run: | echo ${{ env.VERSION }} echo ${{ env.NAME }} ","date":"2022-10-02T02:33:35+09:00","image":"http://kenji.blog/p/github-actions%E3%81%A7%E5%8B%95%E7%9A%84%E3%81%AB%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B/img_1_hua65fb3c79313ad0762e062df80261603_10981_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/github-actions%E3%81%A7%E5%8B%95%E7%9A%84%E3%81%AB%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B/","title":"在 Github Actions 中動態設定變數"},{"content":"刪除本地標籤 使用 git tag 確認本地存在的標籤。 使用 git tag -d v0.1.0 刪除標籤。（在 v0.1.0 的部分指定您要刪除的標籤） 刪除遠端標籤 使用 git ls-remote --tags 確認遠端存在的標籤。 使用 git push origin --delete v0.1.0 刪除遠端存在的標籤。（在 v0.1.0 的部分指定您要刪除的標籤） 參考 gitでtagをリモートとローカルで削除する方法！\n","date":"2022-10-02T02:18:04+09:00","image":"http://kenji.blog/p/git%E3%81%A7%E3%82%BF%E3%82%B0%E3%82%92%E6%B6%88%E3%81%99/img_hu2ecde82e40aa31a994850b70302683b4_5304_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/git%E3%81%A7%E3%82%BF%E3%82%B0%E3%82%92%E6%B6%88%E3%81%99/","title":"在 git 中刪除標籤"},{"content":"在 Rust 中顯示簡單的視窗\n1 2 3 4 5 6 7 8 9 10 [package] name = \u0026#34;win\u0026#34; version = \u0026#34;0.1.0\u0026#34; edition = \u0026#34;2021\u0026#34; # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies.winapi] version = \u0026#34;0.3\u0026#34; features = [\u0026#34;winuser\u0026#34;] 原始碼如下\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 #![windows_subsystem = \u0026#34;windows\u0026#34;] use winapi::{ um::{ winuser::{RegisterClassW, WNDCLASSW, CS_HREDRAW, CS_VREDRAW, LoadIconW, IDI_APPLICATION, LoadCursorW, IDC_ARROW, CreateWindowExW, ShowWindow, SW_NORMAL, UpdateWindow, GetMessageW, TranslateMessage, DispatchMessageW, MSG, WM_DESTROY, PostQuitMessage, DefWindowProcW, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT}, wingdi::{GetStockObject, WHITE_BRUSH}, }, shared::{ windef::{HWND, HBRUSH}, minwindef::{UINT, WPARAM, LPARAM, LRESULT}, }, }; use std::ptr; use std::mem; fn main() { unsafe { let class_name = encode(\u0026#34;my_window_class_name\u0026#34;); if !register_wndclass(\u0026amp;class_name) { return; } let hwnd = create_window(\u0026amp;class_name); if hwnd.is_null() { return; } ShowWindow(hwnd, SW_NORMAL); UpdateWindow(hwnd); let mut msg = mem::uninitialized::\u0026lt;MSG\u0026gt;(); loop { if GetMessageW(\u0026amp;mut msg, ptr::null_mut(), 0, 0) == 0 { return; } TranslateMessage(\u0026amp;mut msg); DispatchMessageW(\u0026amp;mut msg); } } } fn encode(source: \u0026amp;str) -\u0026gt; Vec\u0026lt;u16\u0026gt; { source.encode_utf16().chain(Some(0)).collect() } unsafe fn register_wndclass(class_name: \u0026amp;[u16]) -\u0026gt; bool { let mut winc = mem::zeroed::\u0026lt;WNDCLASSW\u0026gt;(); winc.style = CS_HREDRAW | CS_VREDRAW; winc.lpfnWndProc = Some(win_proc); winc.hIcon = LoadIconW(ptr::null_mut(), IDI_APPLICATION); winc.hCursor = LoadCursorW(ptr::null_mut(), IDC_ARROW); winc.hbrBackground = GetStockObject(WHITE_BRUSH as i32) as HBRUSH; winc.lpszClassName = class_name.as_ptr(); RegisterClassW(\u0026amp;winc) \u0026gt; 0 } unsafe fn create_window(class_name: \u0026amp;[u16]) -\u0026gt; HWND { CreateWindowExW( 0, class_name.as_ptr(), encode(\u0026#34;Hello, World!\u0026#34;).as_ptr(), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, ptr::null_mut(), ptr::null_mut(), ptr::null_mut(), ptr::null_mut(), ) } unsafe extern \u0026#34;system\u0026#34; fn win_proc(hwnd: HWND, msg: UINT, w_param: WPARAM, l_param: LPARAM) -\u0026gt; LRESULT { match msg { WM_DESTROY =\u0026gt; PostQuitMessage(0), _ =\u0026gt; return DefWindowProcW(hwnd, msg, w_param, l_param), }; 0 } 參考 Rust 中的 Windows 程式設計 - CreateWindow 篇\n","date":"2022-10-01T19:08:58+09:00","image":"http://kenji.blog/p/rust%E3%81%A7%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/images/rust_logo_huefc2d075e966b0edc0b7186c50038553_22411_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/rust%E3%81%A7%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/","title":"在 Rust 中顯示簡單的視窗"},{"content":"在 Rust 中編寫測試時，需要在測試函數定義的上一行加上 #[test] 屬性來建立函數。\n1 2 3 4 5 6 7 8 fn plus(a:i32,b:i32)-\u0026gt;i32 { a+b } #[test] fn plus_test() { assert_eq!(plus(1, 1), 2); } 可以使用 cargo test 執行測試程式碼。如果測試成功，會輸出 ok。 如果失敗，則會輸出 FAILED。\n成功的情況\n1 2 3 4 5 6 7 8 9 C:\\Users\\admin\\Desktop\\test1\u0026gt;cargo test Compiling test1 v0.1.0 (C:\\Users\\admin\\Desktop\\test1) Finished test [unoptimized + debuginfo] target(s) in 0.35s Running unittests src\\main.rs (target\\debug\\deps\\test1-be5d3118bc52cb3a.exe) running 1 test test plus_test ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 失敗的情況\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 C:\\Users\\admin\\Desktop\\test1\u0026gt;cargo test Compiling test1 v0.1.0 (C:\\Users\\admin\\Desktop\\test1) Finished test [unoptimized + debuginfo] target(s) in 0.33s Running unittests src\\main.rs (target\\debug\\deps\\test1-be5d3118bc52cb3a.exe) running 1 test test plus_test ... FAILED failures: ---- plus_test stdout ---- thread \u0026#39;plus_test\u0026#39; panicked at \u0026#39;assertion failed: `(left == right)` left: `2`, right: `3`\u0026#39;, src\\main.rs:7:5 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: plus_test test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass \u0026#39;--bin test1\u0026#39; ","date":"2022-10-01T02:00:59+09:00","image":"http://kenji.blog/p/rust%E3%81%A7%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E6%9B%B8%E3%81%8F/images/rust_logo_huefc2d075e966b0edc0b7186c50038553_22411_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/rust%E3%81%A7%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E6%9B%B8%E3%81%8F/","title":"在 Rust 中編寫測試"},{"content":"您可以按照以下步驟在 Rust 中顯示 MessageBox。\n安裝 Rust。 參考 Rust 入門 在命令提示字元中執行 cargo new --bin MessageBox。 進入 MessageBox 目錄。 打開 Cargo.toml 並修改如下。 1 2 3 4 5 6 7 8 9 10 [package] name = \u0026#34;hello_world\u0026#34; version = \u0026#34;0.1.0\u0026#34; edition = \u0026#34;2021\u0026#34; # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] winapi = \u0026#34;0.2.7\u0026#34; user32-sys = \u0026#34;0.2.0\u0026#34; 打開 src\\main.rs 並修改如下。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 extern crate user32; extern crate winapi; use std::ffi::CString; use user32::MessageBoxA; use winapi::winuser::{MB_OK, MB_ICONINFORMATION}; fn main() { let lp_text = CString::new(\u0026#34;Hello, world!\u0026#34;).unwrap(); let lp_caption = CString::new(\u0026#34;MessageBox Example\u0026#34;).unwrap(); unsafe { MessageBoxA( std::ptr::null_mut(), lp_text.as_ptr(), lp_caption.as_ptr(), MB_OK | MB_ICONINFORMATION ); } } 在命令提示字元中執行 cargo run。 如果您想建立發布版本，請執行 cargo build --release。\n參考 Hello World MesssageBox example in Rust\n","date":"2022-09-30T23:54:31+09:00","image":"http://kenji.blog/p/rust%E3%81%A7messagebox%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/images/rust_logo_huefc2d075e966b0edc0b7186c50038553_22411_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%9C%A8-rust-%E4%B8%AD%E9%A1%AF%E7%A4%BA-messagebox/","title":"在 Rust 中顯示 MessageBox"},{"content":"懂了是什麼意思？ 你好！\n今天，我想談談「懂了，到底是什麼意思？」這個主題。\n「懂了」其實很模糊？ 在日常生活中，我們總有覺得「懂了！」的瞬間。但仔細想想，那種「懂了」真的代表完全理解嗎？\n舉例來說，開車。踩油門就會前進，踩煞車就會停止。這或許可以稱作「懂了」。不過，能夠詳細解釋引擎內部發生了什麼事的人，應該不多吧。\n真的需要完全理解嗎？ 其實，即使我們沒有完全理解所有事物，通常也不會影響日常生活。就算不知道智慧型手機的內部構造，我們依然可以打電話、傳送訊息。\n儘管如此，我們也不能輕視「懂了」這件事。隨著理解的加深，有時會帶來新的發現與啟發。\n還有許多我們不懂的事物 世界上還有許多尚未被解開的謎團。例如，人類情感與意識的運作機制、宇宙的起源等等。即使科學不斷進步，這些領域至今仍未被完全「理解」。\n即使在數學的世界裡，也有像「哥德巴赫猜想」這樣看似簡單卻尚未解決的問題。\n「懂了」的價值 當我們「懂了」的事情變多，就能充滿自信地向他人解釋，並進行有效的溝通。此外，具備知識還有一項好處，那就是不容易被錯誤資訊誤導。\n謙卑的態度很重要 認知到自己「不懂」，會帶來謙卑。也正因為有這樣的認知，才會產生持續學習的動力。\n總而言之，雖然「懂了」很重要，但要完全理解所有事物是很困難的。我認為最重要的是，認識到自己理解的極限，並保持持續學習的態度。\n","date":"2022-09-24T02:38:18+09:00","image":"http://kenji.blog/p/%E3%82%8F%E3%81%8B%E3%82%8B%E3%81%A3%E3%81%A6%E3%81%AA%E3%82%93%E3%81%A0%E3%82%8D%E3%81%86/img_hu70cb8dd6d786a678b22436c932461bee_164867_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E6%87%82%E4%BA%86%E6%98%AF%E4%BB%80%E9%BA%BC%E6%84%8F%E6%80%9D/","title":"懂了是什麼意思？"},{"content":"為什麼我會喜歡數學和電腦呢 對所有人平等 無論是什麼人、什麼立場或地點，對於相同的輸入，總是返回相同的輸出。\n規則明確 規則有明確的定義，沒有不合理或不公正的地方。\n得出的答案和理論永遠正確 一旦計算出答案，就不必擔心以後會被改寫。\n有適度的難度 總是有未解決的問題，隨時都可以挑戰解決問題。\n","date":"2022-09-23T01:56:52+09:00","image":"http://kenji.blog/p/%E3%81%AA%E3%81%9C%E6%95%B0%E5%AD%A6%E3%82%84%E8%A8%88%E7%AE%97%E6%A9%9F%E3%81%8C%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%93%E3%81%A0%E3%82%8D%E3%81%86/img_hue4a786c476ad4bcc54a52cdbffbd292f_6616634_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E3%81%AA%E3%81%9C%E6%95%B0%E5%AD%A6%E3%82%84%E8%A8%88%E7%AE%97%E6%A9%9F%E3%81%8C%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%93%E3%81%A0%E3%82%8D%E3%81%86/","title":"為什麼我會喜歡數學和電腦呢"},{"content":"社群所需要的事物 我覺得 Scratch 的社群指南非常精煉且優秀。 上面寫了以下內容：\n尊重每個人。\n保持安全：請勿公開個人資訊或聯絡方式。\n發表有用的評論。\n了解混音（Remix）文化。\n誠實。\n讓網站成為一個舒適的地方。\n我認為這些觀點適用於任何社群。\nhttps://ja.scratch-wiki.info/wiki/%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%83%BC%E3%82%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3\n","date":"2022-09-23T01:37:43+09:00","image":"http://kenji.blog/p/%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%81%93%E3%81%A8/img_hueeaef9e10f0c1990dbbf990f6784494a_314802_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E7%A4%BE%E7%BE%A4%E6%89%80%E9%9C%80%E8%A6%81%E7%9A%84%E4%BA%8B%E7%89%A9/","title":"社群所需要的事物"},{"content":"費馬 (P, de Fermat, 1601-1665) 17世紀法國的代表性數學家。為解析幾何、機率論、微分法等奠定了基礎。他也是數論的創始人。\n丟番圖 (Diophantus, 約207-約291) 希臘數學家。以引入符號法及研究有理數解聞名。代表作有《算術》。求方程式有理數解的分支被稱為丟番圖分析。\n歐拉 (L. Euler, 1707-1783) 瑞士誕生的數學之王。在所有數學領域都取得了成就。留下了超過700篇論文和45部著作。\n勒讓德 (A. M. Legendre, 1752-1833) 法國數學家。在整數論、橢圓積分、引力問題等多個領域留下了成就。「數論」一詞源於他的主要著作《數論》。\n庫默爾 (E. E. Kummer, 1810-1893) 德國數學家。將分圓體的整數論應用於費馬最後定理，並取得了重大成果。\n笛卡兒 (R. Descartes, 1596-1650) 法國極具獨創性的哲學家。代表作包括《方法論》、《幾何學》和《宇宙論》等。\n巴斯卡 (B. Pascal, 1623-1662) 以機率論和流體研究聞名的法國哲學家。後來加入詹森派，從事宗教活動。《思想錄》是那時期的著作。\n巴歇 (C. G. Bachet, 1581-1638) 法國貴族，將研究數字謎題作為興趣。出版了丟番圖《算術》的拉丁文譯本，並將自己的研究作為註釋刊登其中。\n沃利斯 (J. Wallis, 1616-1703) 英國數學家。在其主要著作《無窮算術》中賦予極限概念數學形式，為微積分學的基礎做出了貢獻。\n布隆克爾 (W. Brouncker, 1620-1684) 愛爾蘭貴族。皇家學會（英國科學院）首任會長。數學愛好者，與沃利斯等人有交流。\n拉格朗日 (J. L. Lagrange, 1736-1813) 出生於義大利的法國數學家。作為歐拉的繼任者擔任柏林科學院數學部主任。在整數論、解析力學等方面取得了重大成就。\n西格爾 (C. L. Siegel, 1896-1981) 德國數論學家。在數的解析理論中做出了諸多貢獻。\n斐波那契 (L. Fibonacci, 約1175-約1250) 義大利數學家。在他的主要著作《算盤書》中使用了印度-阿拉伯數字，並致力於其普及。此外，在《平方書》中論述了同餘數。\n貝克 (A. Baker, 1939-) 英國數論學家。因在超越數論上的貢獻，與廣中平祐共同獲頒菲爾茲獎。\n龐加萊 (J. Poincare, 1854-1912) 被稱為最後一位全能數學家的法國數學家。除了自守函數論、非歐幾何、微分方程式、天體力學、電動力學等領域外，在科學評論方面也留下了卓越的著作。\n莫德爾 (L. J. Mordell, 1888-1972) 出生於美國的數學家。父母是來自立陶宛的移民。在不定方程式論方面有許多論文，其中橢圓曲線論中的莫德爾定理尤為著名。韋伊將其推廣到一般代數曲線的情況，算術代數幾何從此獲得了爆炸性的發展。\n韋伊 (A. Weil, 1906-) 猶太裔法國數學家。年輕時對費馬問題產生興趣，為了將其應用於數論，從根本上重新審視了代數幾何學，並進行了嚴格的基礎建設。也以數學史的著作而聞名。\n梅森 (M. Mersenne, 1588-1648) 法國最小兄弟會的神父。促成了各地數學家之間的書信往來。名為梅森數的數字，實際上也是由費馬構想出來的。\n羅貝瓦爾 (G. P. de Roberval, 1602-1675) 法國數學家。是當時幾乎唯一獲得數學教授職位的人，以對擺線的研究而聞名。\n阿貝爾 (N. H. Abel, 1802-1829) 挪威數學家。在一般五次方程式的不可解性、橢圓函數論、阿貝爾積分論等方面取得了傑出成就，但英年早逝。\n雅可比 (K. G. Jacob, 1804-1851) 猶太裔德國數學家。在橢圓函數論、θ函數論、微分方程式、變分學等領域留下了重大成就。向世人介紹了阿貝爾的成就。也以將科學的目的定為「人類精神的榮譽」並排斥實用主義而聞名。\n高斯 (C. F. Gauss, 1777-1855) 德國誕生的數學之王。以整數論、非歐幾何、測地學、超幾何級數、曲面論、地磁研究等聞名。是個完美主義者，據說如果沒有達到連鷹架都看不見的完美程度，他就不會公開成果。主要著作有《算術研究》等。\n拉梅 (G. Lame, 1795-1870) 法國數學家。在彈性力學、熱傳導論等方面有貢獻。\n劉維爾 (J. Liouville, 1809-1882) 法國數學家。對微分方程式、超越整數論、函數論做出了貢獻。\n柯西 (A. L. Cauchy, 1789-1857) 法國數學家。多產，在理論物理和數學方面有許多成就。據說在法國受到的尊敬可與高斯媲美。\n伽羅瓦 (E. Galois, 1811-1832) 法國數學家。引入群的概念，闡明了阿貝爾關於五次以上方程式一般無法用代數解的定理。年紀輕輕就在決鬥中倒下，現在已知起因是一場無聊的女性糾紛。\n亨澤爾 (K, Hensel, 1861-1941) 德國數學家。克羅內克的學生。應用函數論的手法，在數論中引入了p進制（p進解析）理論。\n哈塞 (H. Hesse, 1898-1979) 德國數學家。亨澤爾的學生，為p進解析的基礎及其應用做出了貢獻。完善了類體論、研究橢圓曲線的L函數等。\n克羅內克 (L. Kronecker, 1823-1891) 猶太裔德國數學家。對橢圓函數論、數論等做出了貢獻。也以提倡數學的算術基礎而聞名，但因其主觀性強的性格，對柏林大學的同事魏爾斯特拉斯進行無理的批評，以及阻撓康托爾的就業，為他的一生帶來了負面形象。\n希爾伯特 (D. Hilbert, 1862-1943) 德國數學家。在不變量理論、代數整數論、數學基礎論等數學的各個領域留下了巨大的足跡。他在巴黎國際數學家大會 (1900) 上提出的23個問題對數學的發展產生了重大影響。\n黎曼 (B. Riemann, 1826-1866) 德國數學家。在複變函數論中黎曼面的概念、黎曼幾何學等涉及數學根本的領域取得了重大成就。\n法爾廷斯 (G. Faltings, 1954-) 德國數學家。在1983年解決了莫德爾猜想。\n懷爾斯 (A, Wiles, 1953-) 出生於英國的數學家。在岩澤主猜想、貝赫和斯維納通-戴爾猜想等研究中做出了重大貢獻，是該領域的權威。\n參考文獻 費馬最後定理被解開了！從歐拉到懷爾斯的證明 講談社\n","date":"2022-09-22T23:06:37+09:00","image":"http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E5%81%89%E4%BA%BA%E3%81%9F%E3%81%A1/img_hu9ac53943fe4f64bfe30a56c18c498d11_667839_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E6%95%B8%E5%AD%B8%E7%9A%84%E5%81%89%E4%BA%BA%E5%80%91/","title":"數學的偉人們"},{"content":"列舉視窗標題 以下是如何使用 PowerShell 列舉目前開啟的視窗標題。\n1 Get-Process|where{$_.mainWindowTItle}|Select-Object MainWindowTitle 輸出範例\n1 2 3 4 5 6 7 8 9 MainWindowTitle --------------- Windows PowerShell Internet Explorer 未命名 - 小畫家 未命名 - 記事本 工作管理員 Windows 輸入體驗 文件 - WordPad ","date":"2022-09-20T17:03:15+09:00","image":"http://kenji.blog/p/%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB%E3%81%AE%E5%88%97%E6%8C%99/img_huc312ccf5dbdb1b6edae5dc06174466bf_18265_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%88%97%E8%88%89%E8%A6%96%E7%AA%97%E6%A8%99%E9%A1%8C/","title":"列舉視窗標題"},{"content":"快速批次刪除大型資料夾 在檔案總管中刪除大型資料夾時，會先完整掃描資料夾內容才執行刪除，因此速度很慢。 如下列方式透過指令刪除時，掃描與刪除會同時進行，所以可以快速刪除大型資料夾。\n在命令提示字元中，移動到目標資料夾的階層。 執行 DEL /F /Q /S 資料夾名稱 \u0026gt; NUL 。 執行 RMDIR /Q /S 資料夾名稱 。 ","date":"2022-09-20T16:04:02+09:00","image":"http://kenji.blog/p/%E5%A4%A7%E3%81%8D%E3%81%AA%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC%E3%82%92%E9%AB%98%E9%80%9F%E4%B8%80%E6%8B%AC%E5%89%8A%E9%99%A4/img_hu0a77dc7478cd7b69f58fbada7141acfe_6495_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%A4%A7%E3%81%8D%E3%81%AA%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC%E3%82%92%E9%AB%98%E9%80%9F%E4%B8%80%E6%8B%AC%E5%89%8A%E9%99%A4/","title":"快速批次刪除大型資料夾"},{"content":"Salesforce Chatter 全刪除指令 這是一個用來刪除 Salesforce Chatter 中所有貼文和附件的指令。 開啟 Developer Console，從 Debug 選單中選擇「Open Execute Anonymous Window」，貼上以下程式碼並執行。 當組織的儲存空間快滿時，我個人會使用這個指令。\n1 2 3 4 5 6 delete [select id from FeedItem]; delete [select id from FeedAttachment]; delete [select id from ContentDocument]; // 清空資源回收筒 database.emptyRecycleBin([select id from ContentDocument where IsDeleted = true ALL ROWS]); ","date":"2022-09-19T21:59:14+09:00","image":"http://kenji.blog/p/salesforce%E3%83%81%E3%83%A3%E3%83%83%E3%82%BF%E3%83%BC%E5%85%A8%E6%B6%88%E3%81%97%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/img_1_hu1e12ce6e6e64d4f046faca027a6e75ab_14487_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/salesforce%E3%83%81%E3%83%A3%E3%83%83%E3%82%BF%E3%83%BC%E5%85%A8%E6%B6%88%E3%81%97%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/","title":"Salesforce Chatter 全刪除指令"},{"content":"這是一些在 Windows 中常用的小技巧。希望剛開始使用 Windows 的使用者能閱讀這篇文章。 預設環境為 Windows 11，但許多技巧在 Windows 10 中也適用。\n關閉視窗 視窗處於活動狀態時按下 Alt + F4 視窗處於活動狀態時按下 Ctrl + W。關閉分頁或視窗（僅限支援的應用程式） 雙擊視窗標題列左側的圖示 點擊視窗標題列的 × 顯示桌面 Win + D。按 2 次可恢復原來的視窗狀態。當您只想短暫顯示桌面時非常方便。 Win + M。最小化所有應用程式。按 2 次無法恢復。 語音輸入 Win + H。開始語音輸入。要結束語音輸入，請按下 Esc 或再次按下 Win + H。 在檔案總管中顯示傳統的右鍵選單 按下 Shift + F10 或應用程式鍵。應用程式鍵位於鍵盤的右下角。 選擇範圍並擷取螢幕畫面 按下 Win + Shift + S 可選擇範圍並擷取螢幕畫面。 按下 Win + Print Screen 或單獨按下 Print Screen 可擷取全螢幕。 (如果加上 Win，擷取的圖片將儲存在 C:\\Users\\使用者名稱\\Pictures\\Screenshots 中。) 按下 Alt + Print Screen 可擷取目前的活動視窗。 啟動釘選在工作列上的應用程式 按下 Win + 數字鍵 可啟動釘選在工作列上的應用程式。\n例如，按下 Win + 1 將啟動工作列最左側的應用程式。 按下 Win + T 可將焦點移至工作列上的圖示，連續多次按下 Win + T， 或使用 ← 或 → 移動選擇，然後按下 Enter 鍵啟動選定的應用程式。 放大/縮小 按下 Win + + 可啟動 Windows 放大鏡。此外，按 Win + + 或 - 可放大/縮小螢幕。 在記事本或瀏覽器中，按下 Ctrl + + 或 - 可放大/縮小（僅限支援的應用程式）。 鎖定 Windows Win + L Ctrl + Alt + Del → Space 或 Enter 關閉 Windows 在按下 Win + M 或 Win + D 顯示桌面時，或者按下 Win + T 或 Win + B 啟動工作列時，按下 Alt + F4，將顯示如下對話方塊，確認已選擇「關機」，然後按下 Enter 也可以透過 Win + R → Alt + F4 → Alt + F4 執行。 依序按下 Win + X → U → U 即可關機。 在命令提示字元或 Win + R 開啟的「執行」中輸入 shutdown /s /t 0 即可關機。若加上 /f 則會強制關機。 重新啟動 Windows 在按下 Win + M 或 Win + D 顯示桌面時，或者按下 Win + T 或 Win + B 啟動工作列時，按下 Alt + F4，將顯示如下對話方塊，按 1 次 ↓ 選擇「重新啟動」，然後按下 Enter 也可以透過 Win + R → Alt + F4 → Alt + F4 執行。 依序按下 Win + X → U → R 即可重新啟動。 輸入 shutdown /r /t 0 即可重新啟動。若加上 /f 則會強制重新啟動。 睡眠 Windows 在按下 Win + M 或 Win + D 顯示桌面時，或者按下 Win + T 或 Win + B 啟動工作列時，按下 Alt + F4，將顯示如下對話方塊，按 1 次 ↑ 選擇「睡眠」，然後按下 Enter 也可以透過 Win + R → Alt + F4 → Alt + F4 執行。 透過 Win + R → 或在命令提示字元中輸入 rundll32.exe powrprof.dll,SetSuspendState 即可進入休眠狀態。 登出 Windows 在按下 Win + M 或 Win + D 顯示桌面時，或者按下 Win + T 或 Win + B 啟動工作列時，按下 Alt + F4，將顯示如下對話方塊，按 2 次 ↑ 選擇「登出」，然後按下 Enter 也可以透過 Win + R → Alt + F4 → Alt + F4 執行。 依序按下 Win + X → U → I Ctrl + Alt + Del → 按 2 次 Tab 或 2 次 ↓ → Enter 或 Space 輸入 logoff 即可登出。 使用鍵盤移動視窗 Win + ←：向左移動 Win + →：向右移動 Win + ↑：向上移動/最大化 Win + ↓：向下移動/最小化 Win + Shift + ← 或 →：在多顯示器之間移動 Win + Alt + ← 或 → 或 ↑ 或 ↓：在不最大化或最小化的情況下移動視窗 在未最小化的狀態下，按下 Alt + Space 後按 M，然後使用方向鍵移動。\n※因為視窗會跟隨游標，即使視窗顯示在螢幕外也可以將其移回。 在工作管理員中結束處理程序 按下 Ctrl + Shift + Esc 可啟動工作管理員。 按下 Ctrl + Tab 可切換分頁。 在 詳細資料 分頁中按下 Tab，接著使用鍵盤英數輸入搜尋處理程序的前綴。 當選取處理程序名稱後，按下 Delete 鍵，再按 Enter 鍵即可結束處理程序。 使用命令指定處理程序名稱並結束 輸入 taskkill /f /im 處理程序名稱 即可結束處理程序。 例如，輸入 taskkill /f /im explorer.exe 即可結束檔案總管。 從工作列圖示啟動多個相同的程式 在工作列上按住 Shift 鍵並點擊左鍵，即可啟動多個相同的程式。（僅限支援多開的應用程式） 以系統管理員權限啟動程式 按住 Ctrl + Shift 啟動程式即可獲得系統管理員權限。 啟動檔案總管 按下 Win + E 即可啟動檔案總管。 按下 Win + R 顯示「執行」，輸入 explorer 並按下 Enter。 按下 Ctrl + Shift + N 可建立新資料夾。 在檔案總管目前開啟的位置開啟命令提示字元 在 Windows 11 中，可從右鍵選單的「終端機」啟動命令提示字元。 此外，在網址列中輸入 cmd 並按下 Enter 鍵即可啟動命令提示字元。 顯示剪貼簿記錄 按下 Win + V 即可顯示剪貼簿記錄。 選取以前複製的文字或圖片即可再次複製。 執行 按下 Win + R 即可啟動「執行」。 以下介紹幾個可在「執行」或命令提示字元中執行的命令。\n開啟 Edge 輸入 msedge 並按下 Enter 開啟 Internet Explorer 11 (IE11) 輸入 powershell.exe -Command \u0026quot;(New-Object -ComObject InternetExplorer.Application).Visible = $true\u0026quot; 並按下 Enter 開啟終端機 輸入 wt 並按下 Enter 開啟控制台 輸入 control 並按下 Enter 也可以輸入 explorer.exe shell:::{26EE0668-A00A-44D7-9371-BEB064C98683} 開啟。 啟動記事本 輸入 notepad 並按下 Enter 啟動小算盤 輸入 calc 並按下 Enter 啟動小畫家 輸入 mspaint 並按下 Enter 啟動 PowerShell 輸入 powershell 並按下 Enter 啟動 Visual Studio Code 輸入 code 並按下 Enter 啟動 Excel 輸入 excel 並按下 Enter\n※僅限安裝了 Excel 的情況。 開啟 Word 輸入 winword 並按下 Enter\n※僅限安裝了 Word 的情況。 開啟 PowerPoint 輸入 powerpnt 並按下 Enter\n※僅限安裝了 PowerPoint 的情況。 開啟系統設定 輸入 msconfig 並按下 Enter 開啟系統內容 輸入 sysdm.cpl 並按下 Enter 開啟 Windows 關於 輸入 winver 並按下 Enter 開啟螢幕小鍵盤 輸入 osk 並按下 Enter 開啟寫字板 輸入 wordpad 或 write 並按下 Enter 開啟登錄編輯程式 輸入 regedit 並按下 Enter 開啟程式和功能 輸入 explorer.exe shell:::{7b81be6a-ce2b-4676-a29e-eb907a5126c5} 並按下 Enter 開啟鍵盤內容 輸入 explorer.exe shell:::{725BE8F7-668E-4C7B-8F90-46BDB0936430} 並按下 Enter 開啟滑鼠內容 輸入 explorer.exe shell:::{6C8EEC18-8D75-41B2-A177-8831D59D2D50} 並按下 Enter 開啟聲音 輸入 explorer.exe shell:::{F2DDFC82-8F12-4CDD-B7DC-D4FE1425AA4D} 並按下 Enter 開啟使用者帳戶 輸入 explorer.exe shell:::{60632754-c523-4b62-b45c-4172da012619} 並按下 Enter 複製標準訊息方塊中的字串 按下 Ctrl + C 即可複製標準訊息方塊中的字串。 複製上述的訊息方塊時，會將以下內容複製到剪貼簿： 1 2 3 4 5 6 7 [Window Title] 寫字板 [Main Instruction] 您要儲存變更到 文件 嗎? [儲存(S)] [不要儲存(N)] [取消] 將命令提示字元的輸出儲存到剪貼簿 在命令的後方加上 | clip (管線符號加 clip)，如 echo \u0026quot;hello\u0026quot; | clip，即可將標準輸出複製到剪貼簿。\n以文字輸出資料夾階層 在命令提示字元中使用 tree 命令，可以樹狀結構輸出資料夾階層。\n輸出範例\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 C:. ├─.idea │ └─libraries ├─binaryeditorbz ├─blog │ ├─archetypes │ ├─content │ ├─data │ ├─layouts │ ├─static │ └─themes │ └─PaperMod │ ├─.git │ │ ├─branches │ │ ├─hooks │ │ ├─info │ │ ├─logs │ │ │ └─refs │ │ │ ├─heads │ │ │ └─remotes │ │ │ └─origin │ │ ├─objects │ │ │ ├─info │ │ │ └─pack │ │ └─refs │ │ ├─heads │ │ ├─remotes │ │ │ └─origin │ │ └─tags │ ├─.github │ │ ├─ISSUE_TEMPLATE │ │ └─workflows │ ├─assets │ │ ├─css │ │ │ ├─common │ │ │ ├─core │ │ │ ├─extended │ │ │ ├─hljs │ │ │ └─includes │ │ └─js │ ├─i18n │ ├─images │ └─layouts │ ├─partials │ │ └─templates │ ├─shortcodes │ └─_default │ └─_markup (以下省略) 參考資料 Windows 的鍵盤快速鍵 ","date":"2022-09-18T23:49:29+09:00","image":"http://kenji.blog/p/windows-%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E5%B0%8F%E6%8A%80%E9%9B%86/img_hu13a9ab529476901cdea6aea124c07798_315814_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/windows-%E7%9A%84%E5%BF%AB%E9%80%9F%E9%8D%B5%E8%88%87%E5%B0%8F%E6%8A%80%E5%B7%A7%E9%9B%86/","title":"Windows 的快速鍵與小技巧集"},{"content":"我將介紹我在開發工作中經常使用的影像編輯軟體 paint.net。\nWindows內建小畫家做不到的實用優點 可以處理透明度和不透明度 可以自動選擇複雜的範圍形狀 可以處理圖層 可以調整色階、亮度、對比度等 可以套用各種效果（模糊、扭曲、雜訊等） 其他特點 免費使用 運作相對輕快 直覺易用，沒有太多怪癖 日語（多語言支援） 它是一個功能強大但易於使用的軟體。我自己也還沒有完全掌握所有功能。\n在這裡安裝 https://www.getpaint.net/download.html\n如果您選擇免費版本，請點擊連結中下方紅框的部分。\n如果您透過 Microsoft Store 安裝似乎需要付費，但作為替代，它可以自動更新。 即使是免費版本，也會通知您最新的更新資訊，因此您可以相當順利地進行更新。\n","date":"2022-09-14T19:33:31+09:00","image":"http://kenji.blog/p/paint.net%E3%81%AE%E9%AD%85%E5%8A%9B/img_hu407db422a0531b2d8a8b6fa0ee25fc6c_64699_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/paint.net%E3%81%AE%E9%AD%85%E5%8A%9B/","title":"paint.net的魅力"},{"content":"要為 Github 儲存庫設定自訂網域，您需要變更網域的 DNS 設定。 在此，我們將假設您使用 Onamae.com 管理您的網域。 您可以透過在其他註冊商處覆寫 A 記錄來進行類似的設定。\n在 Onamae.com 中變更 DNS 設定 要變更網域的 DNS 設定，請登入 Onamae.com 的管理畫面。 登入後，請前往網域管理畫面。 進入網域管理畫面後，請變更 DNS 設定。 要變更 DNS 設定，請按照以下步驟進行：\n存取 https://www.onamae.com/ 並點擊「Onamae.com Navi 登入」 輸入您的「Onamae ID (會員 ID)」與「密碼」，然後點擊登入按鈕 點擊「名稱伺服器設定」 點擊「網域 DNS 設定」 選擇您想設定的網域，然後點擊「下一步」 點擊「使用 DNS 記錄設定」右側的「設定」 在 TYPE 選擇 A，在 TTL 輸入 3600，在 VALUE 輸入「185.199.108.153」，然後點擊「新增」 與步驟 7 相同，也為「185.199.109.153」、「185.199.110.153」和「185.199.111.153」進行新增 確認已勾選「DNS 記錄設定用名稱伺服器變更確認」，然後點擊「前往設定畫面」 如果出現「為了防止意外的 DNS 設定變更」畫面，請點擊「不設定」（請視需要選擇） 確認設定內容，然後點擊「設定」 這樣 DNS 設定就完成了。最多可能需要約 72 小時才能完成生效。 如果 72 小時後仍未生效，請嘗試聯絡 Onamae.com 的支援團隊。 要確認設定是否已反映在您的本機環境中，請嘗試執行以下命令。 請將 example.com 替換為您想確認的網域。\n適用於 Linux、Mac 1 dig example.com +noall +answer -t A 如果結果如下，則表示設定已反映。\n1 2 3 4 example.com. 0 IN A 185.199.108.153 example.com. 0 IN A 185.199.109.153 example.com. 0 IN A 185.199.110.153 example.com. 0 IN A 185.199.111.153 適用於 Windows 1 nslookup -q=a example.com 8.8.8.8 如果結果如下，則表示設定已反映。\n1 2 3 4 5 6 7 8 9 伺服器: dns.google Address: 8.8.8.8 未授權的回答: 名稱: example.com Addresses: 185.199.108.153 185.199.109.153 185.199.110.153 185.199.111.153 在 Github 儲存庫中設定自訂網域 打開儲存庫頁面，然後點擊 Settings 點擊 Pages 如果您要直接發佈儲存庫的原始碼，請在 Source 中選擇「Deploy from a branch」。如果您要建置原始碼（如 HUGO），請選擇「GitHub Actions」。 在 Branch 中選擇要發佈的分支，然後點擊 Save 在 Custom domain 中輸入您取得的網域，然後點擊 Save。 如果需要，請勾選「Enforce HTTPS」以啟用 HTTPS 支援 [PR] ","date":"2022-09-13T01:16:40+09:00","image":"http://kenji.blog/p/github%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/images/octocat_hu8f3e107f91a1c645c9aa316280652835_20372_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%A6%82%E4%BD%95%E5%9C%A8-github-%E5%84%B2%E5%AD%98%E5%BA%AB%E4%B8%AD%E8%A8%AD%E5%AE%9A%E8%87%AA%E8%A8%82%E7%B6%B2%E5%9F%9F/","title":"如何在 Github 儲存庫中設定自訂網域"},{"content":"使用 dotnet.exe 指令可以方便地執行從簡單程式的建置等操作，因此準備好它是非常有用的。\n安裝 .NET SDK 由於 dotnet.exe 包含在 .NET SDK 中，因此首先要安裝 .NET SDK。 以系統管理員權限啟動 cmd.exe 並執行以下指令。\n1 winget install Microsoft.DotNet.SDK.6 產生 .gitignore 使用 dotnet.exe 產生 .gitignore 的指令如下。\n1 dotnet new gitignore 產生的 .gitignore 如下所示。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. ## ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore # User-specific files *.rsuser *.suo *.user *.userosscache *.sln.docstates # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs # Mono auto generated files mono_crash.* # Build results [Dd]ebug/ [Dd]ebugPublic/ [Rr]elease/ [Rr]eleases/ x64/ x86/ [Ww][Ii][Nn]32/ [Aa][Rr][Mm]/ [Aa][Rr][Mm]64/ bld/ [Bb]in/ [Oo]bj/ [Ll]og/ [Ll]ogs/ # Visual Studio 2015/2017 cache/options directory .vs/ # Uncomment if you have tasks that create the project\u0026#39;s static files in wwwroot #wwwroot/ # Visual Studio 2017 auto generated files Generated\\ Files/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* # NUnit *.VisualState.xml TestResult.xml nunit-*.xml # Build Results of an ATL Project [Dd]ebugPS/ [Rr]eleasePS/ dlldata.c # Benchmark Results BenchmarkDotNet.Artifacts/ # .NET project.lock.json project.fragment.lock.json artifacts/ # Tye .tye/ # ASP.NET Scaffolding ScaffoldingReadMe.txt # StyleCop StyleCopReport.xml # Files built by Visual Studio *_i.c *_p.c *_h.h *.ilk *.meta *.obj *.iobj *.pch *.pdb *.ipdb *.pgc *.pgd *.rsp *.sbr *.tlb *.tli *.tlh *.tmp *.tmp_proj *_wpftmp.csproj *.log *.vspscc *.vssscc .builds *.pidb *.svclog *.scc # Chutzpah Test files _Chutzpah* # Visual C++ cache files ipch/ *.aps *.ncb *.opendb *.opensdf *.sdf *.cachefile *.VC.db *.VC.VC.opendb # Visual Studio profiler *.psess *.vsp *.vspx *.sap # Visual Studio Trace Files *.e2e # TFS 2012 Local Workspace $tf/ # Guidance Automation Toolkit *.gpState # ReSharper is a .NET coding add-in _ReSharper*/ *.[Rr]e[Ss]harper *.DotSettings.user # TeamCity is a build add-in _TeamCity* # DotCover is a Code Coverage Tool *.dotCover # AxoCover is a Code Coverage Tool .axoCover/* !.axoCover/settings.json # Coverlet is a free, cross platform Code Coverage Tool coverage*.json coverage*.xml coverage*.info # Visual Studio code coverage results *.coverage *.coveragexml # NCrunch _NCrunch_* .*crunch*.local.xml nCrunchTemp_* # MightyMoose *.mm.* AutoTest.Net/ # Web workbench (sass) .sass-cache/ # Installshield output folder [Ee]xpress/ # DocProject is a documentation generator add-in DocProject/buildhelp/ DocProject/Help/*.HxT DocProject/Help/*.HxC DocProject/Help/*.hhc DocProject/Help/*.hhk DocProject/Help/*.hhp DocProject/Help/Html2 DocProject/Help/html # Click-Once directory publish/ # Publish Web Output *.[Pp]ublish.xml *.azurePubxml # Note: Comment the next line if you want to checkin your web deploy settings, # but database connection strings (with potential passwords) will be unencrypted *.pubxml *.publishproj # Microsoft Azure Web App publish settings. Comment the next line if you want to # checkin your Azure Web App publish settings, but sensitive information contained # in these scripts will be unencrypted PublishScripts/ # NuGet Packages *.nupkg # NuGet Symbol Packages *.snupkg # The packages folder can be ignored because of Package Restore **/[Pp]ackages/* # except build/, which is used as an MSBuild target. !**/[Pp]ackages/build/ # Uncomment if necessary however generally it will be regenerated when needed #!**/[Pp]ackages/repositories.config # NuGet v3\u0026#39;s project.json files produces more ignorable files *.nuget.props *.nuget.targets # Microsoft Azure Build Output csx/ *.build.csdef # Microsoft Azure Emulator ecf/ rcf/ # Windows Store app package directories and files AppPackages/ BundleArtifacts/ Package.StoreAssociation.xml _pkginfo.txt *.appx *.appxbundle *.appxupload # Visual Studio cache files # files ending in .cache can be ignored *.[Cc]ache # but keep track of directories ending in .cache !?*.[Cc]ache/ # Others ClientBin/ ~$* *~ *.dbmdl *.dbproj.schemaview *.jfm *.pfx *.publishsettings orleans.codegen.cs # Including strong name files can present a security risk # (https://github.com/github/gitignore/pull/2483#issue-259490424) #*.snk # Since there are multiple workflows, uncomment next line to ignore bower_components # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) #bower_components/ # RIA/Silverlight projects Generated_Code/ # Backup \u0026amp; report files from converting an old project file # to a newer Visual Studio version. Backup files are not needed, # because we have git ;-) _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML UpgradeLog*.htm ServiceFabricBackup/ *.rptproj.bak # SQL Server files *.mdf *.ldf *.ndf # Business Intelligence projects *.rdl.data *.bim.layout *.bim_*.settings *.rptproj.rsuser *- [Bb]ackup.rdl *- [Bb]ackup ([0-9]).rdl *- [Bb]ackup ([0-9][0-9]).rdl # Microsoft Fakes FakesAssemblies/ # GhostDoc plugin setting file *.GhostDoc.xml # Node.js Tools for Visual Studio .ntvs_analysis.dat node_modules/ # Visual Studio 6 build log *.plg # Visual Studio 6 workspace options file *.opt # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) *.vbw # Visual Studio LightSwitch build output **/*.HTMLClient/GeneratedArtifacts **/*.DesktopClient/GeneratedArtifacts **/*.DesktopClient/ModelManifest.xml **/*.Server/GeneratedArtifacts **/*.Server/ModelManifest.xml _Pvt_Extensions # Paket dependency manager .paket/paket.exe paket-files/ # FAKE - F# Make .fake/ # CodeRush personal settings .cr/personal # Python Tools for Visual Studio (PTVS) __pycache__/ *.pyc # Cake - Uncomment if you are using it # tools/** # !tools/packages.config # Tabs Studio *.tss # Telerik\u0026#39;s JustMock configuration file *.jmconfig # BizTalk build output *.btp.cs *.btm.cs *.odx.cs *.xsd.cs # OpenCover UI analysis results OpenCover/ # Azure Stream Analytics local run output ASALocalRun/ # MSBuild Binary and Structured Log *.binlog # NVidia Nsight GPU debugger configuration file *.nvuser # MFractors (Xamarin productivity tool) working folder .mfractor/ # Local History for Visual Studio .localhistory/ # BeatPulse healthcheck temp database healthchecksdb # Backup folder for Package Reference Convert tool in Visual Studio 2017 MigrationBackup/ # Ionide (cross platform F# VS Code tools) working folder .ionide/ # Fody - auto-generated XML schema FodyWeavers.xsd ## ## Visual studio for Mac ## # globs Makefile.in *.userprefs *.usertasks config.make config.status aclocal.m4 install-sh autom4te.cache/ *.tar.gz tarballs/ test-results/ # Mac bundle stuff *.dmg *.app # content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore # General .DS_Store .AppleDouble .LSOverride # Icon must end with two \\r Icon # Thumbnails ._* # Files that might appear in the root of a volume .DocumentRevisions-V100 .fseventsd .Spotlight-V100 .TemporaryItems .Trashes .VolumeIcon.icns .com.apple.timemachine.donotpresent # Directories potentially created on remote AFP share .AppleDB .AppleDesktop Network Trash Folder Temporary Items .apdisk # content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore # Windows thumbnail cache files Thumbs.db ehthumbs.db ehthumbs_vista.db # Dump file *.stackdump # Folder config file [Dd]esktop.ini # Recycle Bin used on file shares $RECYCLE.BIN/ # Windows Installer files *.cab *.msi *.msix *.msm *.msp # Windows shortcuts *.lnk # JetBrains Rider .idea/ *.sln.iml ## ## Visual Studio Code ## .vscode/* !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json 雖然其中有許多 Visual Studio 專用的檔案，但也包含一般不需要在 git 上管理的項目，例如 Mac 的 .DS_Store。\n參考網站 在 Windows 上安裝 .NET ","date":"2022-09-13T00:25:12+09:00","image":"http://kenji.blog/p/dotnet%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7.gitignore%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B/img_1_huc51d4f51d02497db3544f94dd1182dc1_19208_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/dotnet%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7.gitignore%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B/","title":"使用 dotnet 指令產生 .gitignore"},{"content":"回想起喜歡的遊戲，結果全都是殿堂級的作品。 因為老遊戲居多，還沒玩過的朋友請務必嘗試看看。\nGame Boy 初代 Game Boy 是由任天堂於1989年發售的掌上型遊戲機。 隨後也發售了 Game Boy Color 和 Game Boy Advance 等後繼機種。\n① Sa・Ga2 秘寶傳說 1990年由史克威爾（現為史克威爾艾尼克斯）發售的RPG遊戲。 這是一個在各個關卡中不斷收集被稱為秘寶的寶物的故事， 這是我第一次玩的RPG遊戲。\n② 星之卡比 1992年由任天堂發售的動作遊戲。開發商為 HAL 研究所。 這是一款透過吸入敵人或吸入空氣漂浮在空中來推進的遊戲。 音樂和音效也做得相當好，成為一款玩起來很有節奏感的作品。\n③ 精靈寶可夢 紅・綠 1996年由任天堂發售的RPG遊戲。開發商為任天堂情報開發本部、Game Freak、Creatures。 之後雖然改編成動畫並獲得了爆炸性的人氣，但我只玩過這個初代。\n超級任天堂 (Super Famicom) 1990年由任天堂發售的家用遊戲機。在海外也被稱為 SNES (Super Nintendo Entertainment System)。\n④ 超級瑪利歐賽車 1992年由任天堂發售的超級任天堂軟體。 這是一款一邊丟龜殼或香蕉皮等道具妨礙對手，一邊競爭名次的競速遊戲。 我還記得以前常和家人朋友一起玩。\n⑤ 勇者鬥惡龍V 天空的新娘 1992年由艾尼克斯發售的RPG遊戲。 這款遊戲包含了選擇結婚對象的元素，以及能將打倒的怪物變成同伴的元素。 我沉迷到直到收服了多隻迷路金屬史萊姆成為同伴才罷休。\n⑥ 最終幻想V (Final Fantasy V) 1992年由史克威爾發售的RPG遊戲。 具有選擇職業並將技能練到極致的耐玩元素。 跟勇者鬥惡龍一樣，我記得以前總是死命地在洞穴裡練等。\n⑦ 特魯內克大冒險 不可思議的迷宮 1993年由 Chunsoft 發售的 Roguelike 遊戲。 不可思議的迷宮系列的前身。 其特色是每次迷宮的形狀都會隨機改變。 宣傳語是「可以玩1000次的RPG」。\n⑧ 不可思議的迷宮2 風來的希煉 1995年由 Chunsoft 發售的 Roguelike 遊戲。 不可思議的迷宮系列《特魯內克大冒險》的續作。 迷宮內有商店，可以在裡面購買道具。 （如果不付錢就走出商店，店主會追上來。）\n⑨ MOTHER2 (地球冒險2) 1994年由任天堂發售的 MOTHER 系列第二作。開發商為 Ape 和 HAL 研究所。 之後在2006年發售了 MOTHER3。這是一部由糸井重里先生製作的作品， 裡面點綴著獨特的世界觀和充滿哲理的話語。\n⑩ 薩爾達傳說 眾神的三角神力 1991年由任天堂發售的動作冒險遊戲。 這是一款一邊收集各種道具、解開一些小謎題一邊推進的遊戲。 之後發售了各種續作。（參考）\n任天堂 Switch 2017年由任天堂發售的家用遊戲機。\n⑪ 斯普拉遁2 (Splatoon 2) 2017年由任天堂發售的動作射擊遊戲。 這是一款使用墨汁來佔領地盤、或是打倒對手以取得勝利的遊戲。 2022年發售了續作斯普拉遁3。\n","date":"2022-09-12T19:28:50+09:00","image":"http://kenji.blog/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%B2%E3%83%BC%E3%83%A011%E9%81%B8/img_12_hu03b5dadc912359ffea73dab76258d285_471079_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/11%E6%AC%BE%E6%9C%80%E5%96%9C%E6%AD%A1%E7%9A%84%E9%81%8A%E6%88%B2/","title":"11款最喜歡的遊戲"},{"content":"在 macOS 上避免自動產生 .DS_Store 的指令如下。 請在終端機中執行。\n1 defaults write com.apple.desktopservices DSDontWriteNetworkStores true 執行指令後，請重新啟動 Finder。\n1 killall Finder 如果要還原設定，請執行以下指令。\n1 defaults delete com.apple.desktopservices DSDontWriteNetworkStores false 與上述相同，如果更改了設定，請重新啟動 Finder。\n1 killall Finder ","date":"2022-09-12T16:03:42+09:00","image":"http://kenji.blog/p/macos%E3%81%A7.ds_store%E3%82%92%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90%E3%81%97%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/img_hu4b5bbd3b572a7a7eb2cc4ecf633430af_78743_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%9C%A8macos%E4%B8%8A%E9%81%BF%E5%85%8D%E8%87%AA%E5%8B%95%E7%94%A2%E7%94%9F.ds_store%E7%9A%84%E6%8C%87%E4%BB%A4/","title":"在macOS上避免自動產生.DS_Store的指令"},{"content":"將當前目錄移動到目標資料夾，並執行以下命令以批次刪除 .DS_Store，包括子資料夾中的檔案。\n1 Get-ChildItem . -include \u0026#39;.DS_Store\u0026#39; -Recurse -Force | Remove-Item -Force ","date":"2022-09-12T10:11:42+09:00","image":"http://kenji.blog/p/powershell%E3%81%A7.ds_store%E3%82%92%E4%B8%80%E6%8B%AC%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B/img_hu95c0724bd9a903eadf46c7f648acb682_8907_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E4%BD%BF%E7%94%A8-powershell-%E6%89%B9%E6%AC%A1%E5%88%AA%E9%99%A4-.ds_store/","title":"使用 PowerShell 批次刪除 .DS_Store"},{"content":"HUGO 可用的 Shortcodes YouTube {{\u0026lt;youtube 123456abc\u0026gt;}}\nTwitter {{\u0026lt;twitter 123456abc\u0026gt;}}\nInstagram {{\u0026lt;instagram 123456abc\u0026gt;}}\nFlickr {{\u0026lt;flickr 123456abc\u0026gt;}}\nVimeo {{\u0026lt;vimeo 123456abc\u0026gt;}}\n其他 Shortcodes\n題外話 若要在網站上顯示 {{\u0026lt; foo \u0026gt;}}，您必須撰寫 {{\u0026lt;/* foo */\u0026gt;}}。\n","date":"2022-09-11T22:59:52+09:00","image":"http://kenji.blog/p/hugo%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89/img_hu415dc7e70376ac350673d0366f70ca4b_19909_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/hugo%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89/","title":"HUGO 可用的 Shortcodes"},{"content":"預設的佈局是將圖片置中且寬度為 100%， 但因為有時覺得有點大，所以我嘗試讓圖片環繞在標題下方， 並將寬度更改為約 150px。\n檔案的變更如下。\nblank.css 為了更改邊距、圖片大小和文字顯示行數，在 blank.css 中加入以下描述。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 .entry-content { -webkit-line-clamp: 4; } .entry-footer { text-align: right; } .entry-cover { margin-bottom: initial; text-align: center; } .entry-cover img { border-radius: 4px; display: inline; max-width: 100%; } .post-meta { display: block; text-align: right; } post-entry.css 由於無法在 blank.css 端刪除定義，因此在 post-entry.css 中刪除以下位置的 1 行。\n1 2 3 4 5 6 .entry-cover img { border-radius: var(--radius); pointer-events: none; /* width: 100%; */ ← 刪除此行 height: auto; } list.html 為了更改圖片佈局，我修改了 list.html 中的以下位置。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 \u0026lt;article class=\u0026#34;{{ $class }}\u0026#34;\u0026gt; \u0026lt;!-- {{- $isHidden := (site.Params.cover.hidden | default site.Params.cover.hiddenInList) }} --\u0026gt;\u0026lt;!-- 移至下方 --\u0026gt; \u0026lt;!-- {{- partial \u0026#34;cover.html\u0026#34; (dict \u0026#34;cxt\u0026#34; . \u0026#34;IsHome\u0026#34; true \u0026#34;isHidden\u0026#34; $isHidden) }} --\u0026gt;\u0026lt;!-- 移至下方 --\u0026gt; \u0026lt;header class=\u0026#34;entry-header\u0026#34;\u0026gt; \u0026lt;h2\u0026gt; {{- .Title }} {{- if .Draft }}\u0026lt;sup\u0026gt;\u0026lt;span class=\u0026#34;entry-isdraft\u0026#34;\u0026gt;\u0026amp;nbsp;\u0026amp;nbsp;[draft]\u0026lt;/span\u0026gt;\u0026lt;/sup\u0026gt;{{- end }} \u0026lt;/h2\u0026gt; \u0026lt;/header\u0026gt; \u0026lt;div style=\u0026#34;display:flex;\u0026#34;\u0026gt;\u0026lt;!-- 新增 --\u0026gt; \u0026lt;div style=\u0026#34;max-width:150px;margin:11px 15px 0px 0px;\u0026#34;\u0026gt;\u0026lt;!-- 新增 --\u0026gt; {{- $isHidden := (site.Params.cover.hidden | default site.Params.cover.hiddenInList) }}\u0026lt;!-- 從上方移來 --\u0026gt; {{- partial \u0026#34;cover.html\u0026#34; (dict \u0026#34;cxt\u0026#34; . \u0026#34;IsHome\u0026#34; true \u0026#34;isHidden\u0026#34; $isHidden) }}\u0026lt;!-- 從上方移來 --\u0026gt; \u0026lt;/div\u0026gt;\u0026lt;!-- 新增 --\u0026gt; \u0026lt;div style=\u0026#34;width:100%;\u0026#34;\u0026gt;\u0026lt;!-- 新增 --\u0026gt; {{- if (ne (.Param \u0026#34;hideSummary\u0026#34;) true) }} \u0026lt;div class=\u0026#34;entry-content\u0026#34;\u0026gt; \u0026lt;p\u0026gt;{{ .Summary | plainify | htmlUnescape }}{{ if .Truncated }}...{{ end }}\u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; {{- end }} {{- if not (.Param \u0026#34;hideMeta\u0026#34;) }} \u0026lt;footer class=\u0026#34;entry-footer\u0026#34;\u0026gt; {{- partial \u0026#34;post_meta.html\u0026#34; . -}} \u0026lt;/footer\u0026gt; {{- end }} \u0026lt;a class=\u0026#34;entry-link\u0026#34; aria-label=\u0026#34;post link to {{ .Title | plainify }}\u0026#34; href=\u0026#34;{{ .Permalink }}\u0026#34;\u0026gt;\u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt;\u0026lt;!-- 新增 --\u0026gt; \u0026lt;/div\u0026gt;\u0026lt;!-- 新增 --\u0026gt; \u0026lt;/article\u0026gt; 似乎有不少類似的要求。\nhttps://github.com/adityatelange/hugo-PaperMod/discussions/159#discussioncomment-247844\n如果官方也能支援就太好了。\n","date":"2022-09-11T18:50:40+09:00","image":"http://kenji.blog/p/papermod%E3%81%AE%E7%94%BB%E5%83%8F%E3%81%AE%E9%85%8D%E7%BD%AE%E5%A4%89%E6%9B%B4/images/img_hu42e770ebe6b22298fe9d1751d1191316_24734_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E6%9B%B4%E6%94%B9-papermod-%E4%B8%AD%E7%9A%84%E5%9C%96%E7%89%87%E4%BD%88%E5%B1%80/","title":"更改 PaperMod 中的圖片佈局"},{"content":"簡介 PaperMod 主題支援 Twitter Card。 但是，Twitter Card 的設定必須寫在 config.toml 或每篇文章的 *.md 的標頭資訊中。 如果您在每篇文章和 config.toml 中都進行了設定，則每篇文章的標頭資訊將優先。\n設定方法 config.toml 在 config.toml 中，於 [params] 下方新增一個名為 images 的項目。 在 images 中，描述要在 Twitter Card 顯示的圖片路徑。 如果您將圖片放在 static 資料夾中，只需指定檔案名稱即可。\n1 2 [params] images = [\u0026#34;twitter_card.jpg\u0026#34;] 資料夾結構\n1 2 3 4 5 6 7 8 9 10 root │ config.toml (寫在這裡) ├─content │ └─posts │ └─文章資料夾 │ │ index.md (寫在這裡) │ └─images │ cover.png (放在這裡) └─static twitter_card.jpg (放在這裡) 每篇文章的標頭資訊 在每篇文章的標頭資訊中，於 cover 下方新增一個名為 image 的項目。 如果將 relative 設定為 true，您可以透過文章的 *.md 的相對路徑來指定。\n1 2 3 cover: image: \u0026#34;images/cover.jpg\u0026#34; relative: true 如果不想顯示在文章頂部 如果您不想在文章頂部顯示封面圖片，請在 cover 下方新增一個名為 hidden 的項目，並將其設定為 true。\n1 2 3 4 cover: image: \u0026#34;images/cover.jpg\u0026#34; relative: true hidden: true 關於圖片大小 在 PaperMod 目前的規格中，Twitter Card 的大小似乎只支援 summary_large_image。 對於 summary_large_image 的合適大小（解析度）有各種說法，但大約 800 x 418（圖片比例 1.91:1）似乎不錯。\n參考網站 1 參考網站 2\n如果可能的話，建議在發布前調整圖片大小。\n如何檢查設定 要檢查 Twitter Card 的設定，請使用 Twitter Card Validator。 但是，由於預覽在我的環境中無法正確顯示，如果無法顯示預覽，我建議您在發布前使用私人帳號等檢查一次。\n","date":"2022-09-10T18:41:22+09:00","image":"http://kenji.blog/p/papermod%E3%81%A7twitter-card%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/images/img_hu5e280b2f775d1811bb256626ef7709c6_973665_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/papermod%E3%81%A7twitter-card%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"如何在 PaperMod 中設定 Twitter Card"},{"content":"簡介 GitHub Copilot 是由 GitHub 開發的基於 AI 的程式碼完成工具。 您可以透過在開發環境 IntelliJ IDEA 中安裝 GitHub Copilot 外掛程式來在 IntelliJ IDEA 中使用 GitHub Copilot。 啟動需要 GitHub 帳戶。\n安裝方法 從 IntelliJ IDEA 的 File 選單中選擇 Settings 選擇 Plugins，在搜尋框中搜尋 \u0026ldquo;GitHub Copilot\u0026rdquo; 從安裝按鈕進行安裝 點擊 Restart IDE 按鈕重新啟動 IntelliJ IDEA 重新啟動 IntelliJ IDEA 後，安裝即完成。 啟動 點擊右下角的圖示 點擊 Login to Github 點擊 Copy and Open 按鈕 瀏覽器將開啟，如果您尚未登入 GitHub，請先登入，然後使用 Ctrl+V 貼上程式碼，並點擊 Continue 按鈕 點擊 Authorize GitHub Copilot Plugin 按鈕 如果顯示上述畫面，則啟動完成。 試用看看 當您在 IntelliJ IDEA 編輯器中輸入幾個字元時，GitHub Copilot 將開始建議程式碼的後續部分。 享受 AI 強大的自動完成功能吧！\n","date":"2022-09-10T09:44:55+09:00","image":"http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_hu78c7d99017ff4692861292fedffeefef_291492_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%9C%A8-intellij-idea-%E4%B8%AD%E4%BD%BF%E7%94%A8-github-copilot/","title":"在 IntelliJ IDEA 中使用 GitHub Copilot"},{"content":"簡介 Go 是 Google 在 2009 年發布的一種相對較新的程式語言。 Go 的編譯器、工具和函式庫都是開源的。 此外，Go 是一種像 C 和 Java 一樣的靜態型別語言，但它不像 C 語言那樣使用指標。\n安裝方法 安裝 Go\n上述網站提供了各個平台的安裝程式。\n按照螢幕上的指示進行安裝。 安裝完成。很簡單吧。\n第一個程式 將以下程式存為 hello.go。\n1 2 3 4 5 6 7 package main import \u0026#34;fmt\u0026#34; func main() { fmt.Printf(\u0026#34;Hello World\\n\u0026#34;) } 從命令提示字元或終端機執行 go run hello.go 時，將會輸出 Hello, world!。\n如果要編譯，執行 go build hello.go 會產生 hello.exe。 執行 hello.exe 時，將會輸出 Hello, world!。\n您也可以在網頁上執行程式碼 https://go.dev/play/\n日文文件 http://go.shibu.jp/\n學習 Go 所需的說明都集中在上面的連結中（日文翻譯版）。 與 Go 相關的技術是開放的，內容非常豐富，幾乎不需要購買紙本教材。\n那麼，祝您有美好的 Go 生活！\n","date":"2022-09-10T00:48:17+09:00","image":"http://kenji.blog/p/go%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/images/cover_hu90f0e026fa77d6f7268f9adc11e245d4_5801_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%9D-go/","title":"如何安裝 Go"},{"content":"什麼是黑格爾的辯證法 黑格爾捕捉到了理性陷入矛盾的積極意義，並主張一般而言，所有有限的事物都會以自身內在的矛盾為動力產生對立面，並以此為媒介，兩者被揚棄到更高的層次，他將此作為現實世界一切運動的原理。 (摘自 Kotobank)\n我的理解是，現實世界中的所有主義和主張，並不是單方面地絕對正確， 而是內部必然包含著矛盾，在理解和吸收這種對立結構的過程中， 我們的認知會發展到更高的層次。\n我認為這不僅適用於人的思維方式，也適用於自然界的所有現象。\n所有的物質，有作用力就會有反作用力；所有物體運動就會產生摩擦；引力不僅存在於太陽和地球之間，而是所有物質之間都在相互影響。 河水的流動和風的流動，也不僅僅是朝著一個方向，而是受到各種力的作用，在瞬間發生著變化。\n就技術層面而言，電腦程式內部也必然包含著 bug，通過消除這些 bug，它們將成為更高層次的程式。 我認為可以說，沒有 bug 的程式就是沒有在發展、無趣的程式。它遲早會被淘汰。\n周圍的環境隨著時代不斷變化。與其忽視自我矛盾、勉強地去合理化，或是固化思維方式， 不如經常審視自己的思考和看待事物的方式，靈活地改變我們的思維。\n","date":"2022-09-09T23:13:19+09:00","image":"http://kenji.blog/p/%E3%83%98%E3%83%BC%E3%82%B2%E3%83%AB%E3%81%AE%E5%BC%81%E8%A8%BC%E6%B3%95/images/img_huf44f6813611a65fb4bf58b8763a4133a_83624_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E9%BB%91%E6%A0%BC%E7%88%BE%E7%9A%84%E8%BE%AF%E8%AD%89%E6%B3%95/","title":"黑格爾的辯證法"},{"content":"我時隔多年再次去了神座（拉麵）。\n蔥泡菜拉麵\n非常好吃。這是一種偶爾會想念的味道。\n","date":"2022-09-09T21:45:19+09:00","image":"http://kenji.blog/p/%E4%BD%95%E5%B9%B4%E3%81%8B%E3%81%B6%E3%82%8A%E3%81%AE%E7%A5%9E%E5%BA%A7%E3%81%8B%E3%82%80%E3%81%8F%E3%82%89%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%B3/images/img2_hu5b1c55ddd3b998ef9e1e7da203dc1109_434676_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/zh-tw/p/%E4%BD%95%E5%B9%B4%E3%81%8B%E3%81%B6%E3%82%8A%E3%81%AE%E7%A5%9E%E5%BA%A7%E3%81%8B%E3%82%80%E3%81%8F%E3%82%89%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%B3/","title":"時隔多年的神座（拉麵）"},{"content":"我寫了一個在 Rust 中列舉質數的程式。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 fn main() { let max = 1000; let mut primes = vec![2]; let mut n = 3; loop { let mut is_prime = true; for p in \u0026amp;primes { if n % p == 0 { is_prime = false; break; } } if is_prime { primes.push(n); } n += 2; if n \u0026gt; max { break; } } for p in \u0026amp;primes { println!(\u0026#34;{}\u0026#34;, p); } } ","date":"2022-09-09T07:08:49+09:00","image":"http://kenji.blog/p/rust%E3%81%A7%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B/images/img_hu5b7e04bd1dc0eefb45fd25ac4219842a_9797_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%9C%A8-rust-%E4%B8%AD%E5%88%97%E8%88%89%E8%B3%AA%E6%95%B8/","title":"在 Rust 中列舉質數"},{"content":"平靜的爵士樂播放清單 ","date":"2022-09-08T17:40:26+09:00","image":"http://kenji.blog/p/%E8%90%BD%E3%81%A1%E7%9D%80%E3%81%84%E3%81%9F%E3%82%B8%E3%83%A3%E3%82%BA/images/img_huddf559c95c5d412c9cd6a131d9beecb1_1507891_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%B9%B3%E9%9D%9C%E7%9A%84%E7%88%B5%E5%A3%AB%E6%A8%82/","title":"平靜的爵士樂"},{"content":"快節奏\nElectro Swing Collection Electro Swing Mix 2019 Vol.3 lofi hip hop radio(Live) LoFi爵士 這是我每天努力學習的動力 | 5 hour lofi hip hop / study / work / chill beats ","date":"2022-09-08T08:39:03+09:00","image":"http://kenji.blog/p/%E3%82%AB%E3%83%95%E3%82%A7%E9%9F%B3%E6%A5%BD/images/img_huc541091b3f264af05ecf07abbd33454f_519675_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/cafe-music/","title":"咖啡館音樂"},{"content":"努力不被認可也沒關係 45年の人生で手に入れた。ぐずぐずした時、いつも背中を押してくれる言葉たち。 pic.twitter.com/EQgmujOSpg\n\u0026mdash; いれぶん (@eleven_s_s) September 6, 2022 價值觀是更加多樣化的 成田悠輔「人類所承受的不幸之中」\n自己的行為會直接反映出來 宮崎駿的思考 ","date":"2022-09-08T02:22:52+09:00","image":"http://kenji.blog/p/%E3%83%A2%E3%83%81%E3%83%99%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%B8%8A%E3%81%92%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B%E5%8B%95%E7%94%BB/images/img_hu390d0c8e5d67e265b0c5aa8749ccc95d_193793_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E3%83%A2%E3%83%81%E3%83%99%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%B8%8A%E3%81%92%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B%E5%8B%95%E7%94%BB/","title":"提升動力的影片"},{"content":"我會寫下我目前主要個人電腦的規格。\n項目名稱 值 處理器 Intel Core i7-8700K CPU @ 3.70GHz 3.70 GHz 記憶體 32.0 GB 系統類型 64 位元作業系統，x64 型處理器 作業系統 Windows 11 Enterprise（版本 21H2，組建 22000.856） 製造商 Mouse Computer Co., Ltd. ","date":"2022-09-08T01:55:00+09:00","image":"http://kenji.blog/p/%E4%BB%8A%E3%81%AE%E3%83%A1%E3%82%A4%E3%83%B3pc%E3%82%B9%E3%83%9A%E3%83%83%E3%82%AF/images/img_hu731502385ac0a573daf05287c34d796a_240757_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E7%9B%AE%E5%89%8D%E7%9A%84%E5%80%8B%E4%BA%BA%E9%9B%BB%E8%85%A6%E8%A6%8F%E6%A0%BC/","title":"目前的個人電腦規格"},{"content":"Google Material Symbols and Icons https://fonts.google.com/icons GitHub Octicons https://primer.style/octicons/ Sargam Icons https://sargamicons.com/ 數以千計的免費圖示 https://icon-icons.com/ flaticon https://www.flaticon.com/ ICONFINDER https://www.iconfinder.com/ iconfont https://www.iconfont.cn/ open-iconic https://github.com/iconic/open-iconic ","date":"2022-09-07T16:46:56+09:00","image":"http://kenji.blog/p/%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3%E9%9B%86%E3%82%B5%E3%82%A4%E3%83%88/img_2_hu3b0847646c9f4aefba079615d2db35cd_21041_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E7%B0%A1%E5%96%AE%E7%9A%84%E5%9C%96%E7%A4%BA%E9%9B%86%E7%B6%B2%E7%AB%99/","title":"簡單的圖示集網站"},{"content":"我更改了 PaperMod 主題的配色方案。更改方法參考了以下連結。\nhttps://github.com/adityatelange/hugo-PaperMod/discussions/645\nCSS 的路徑如下。\nthemes/PaperMod/assets/css/extended/blank.css\n1 2 3 4 5 6 7 8 9 10 11 12 13 :root { --entry: #fbf7ef; --primary: rgba(113, 103, 91, 1.00); --secondary: rgba(113, 103, 91, 0.95); --tertiary: rgba(113, 103, 91, 0.50); --content: rgba(113, 103, 91, 0.85); --hljs-bg: #34231B; --code-bg: #ebe4d7; --border: #fdfaf5; --theme: #fbf7ef; } .dark { } 黑暗模式暫時沒有更改。\n","date":"2022-09-07T15:30:21+09:00","image":"http://kenji.blog/p/papermod%E3%81%AE%E9%85%8D%E8%89%B2%E5%A4%89%E6%9B%B4/img_hu74d0722ae4db8273d5e32f97bb10689d_10515_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/papermod%E3%81%AE%E9%85%8D%E8%89%B2%E5%A4%89%E6%9B%B4/","title":"更改 PaperMod 的配色方案"},{"content":"當媽媽生病躺在床上的時候， 在準備晚餐或洗澡時，我問女兒（2歲）：「這個要請媽媽幫忙嗎？」， 她回答說：「不行，她在睡覺！」我覺得她用自己的方式在體貼別人。\n很高興看到她成為一個懂得關心別人的人。\n","date":"2022-09-07T04:40:52+09:00","image":"http://kenji.blog/p/%E5%AD%90%E4%BE%9B%E3%81%AE%E3%81%9D%E3%82%93%E3%81%9F%E3%81%8F/images/img_hud61af1a628f352ef1641794e80547155_144893_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%AD%A9%E5%AD%90%E7%9A%84%E9%AB%94%E8%B2%BC/","title":"孩子的體貼"},{"content":"尋找正在流行起來的事業 向Hot Pepper內部人員或稅務師詢問正在流行起來的事業 不要進入已經飽和且強者雲集的事業 只進入確信能夠吸引顧客的事業（不要進入有現有業者使用特殊吸引顧客方法（無法模仿的方法）的事業） 徹底模仿 在進入之前研究其商業邏輯 徹底抄襲 在此基礎上進行改良 系統化 將一切手冊化，讓任何人都能不費力地完成 思考提高銷售額（增加客數、客單價）和減少經費（人事費、廣告費）的點子，並將其系統化 經營者的理念 經營者的理念就是「企業利潤最大化」，僅此而已 將社會貢獻或討好員工做為經營者理念是NG的（認為這些東西之後自然會隨之而來） ","date":"2022-09-07T02:36:11+09:00","image":"http://kenji.blog/p/%E7%B5%8C%E5%96%B6%E8%80%85%E3%83%A1%E3%83%A2/images/img_hu8e43d40b92b6a98e30d3360e9f3ab85a_162130_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E7%B6%93%E7%87%9F%E8%80%85%E7%AD%86%E8%A8%98/","title":"經營者筆記"},{"content":"我想整理一下我對日本社會感到奇怪和思考的事情。\n關於獎學金 說到日本的獎學金，大部分都是有息貸款並且必須償還的。 此外，大學的學費自1950年以來一直在持續增長，領取獎學金的比例也呈現上升趨勢。\n另一方面，最近的平均總借款額似乎高達324萬日圓。\n在日本學生支援機構的獎學金使用者中，平均總借款額為324萬3,000日圓。參考\n如果一個人在22歲大學畢業時背負著高達300萬日圓的債務，結婚年齡自然會延後，生育孩子也會變得困難，這理所當然是日本少子化問題的原因之一。\n蔓延的自我責任論 這部分可能比較主觀，但我認為社會上存在一種「別人是別人」的冷漠氛圍。 經濟不景氣持續了幾十年，可能難免會有這種傾向，但是 即使是上述的獎學金問題，也沒有被視為整個社會的問題，在選舉中選票較少的年輕人或少數群體的聲音似乎被忽視了。 儘管從長遠來看，這對整個日本來說是一個非常重要的問題。\n我認為，與其走向過度競爭，不如在有困難的人、世代或群體時，大家一起互相幫助的精神，對一個國家來說是非常重要的。 （但是，政府主張「自助、共助」讓我感到有些不對勁。我希望政府能主動致力於救濟弱勢群體。）\n（這篇文章將會隨時更新。）\nAI 眼中的日本人特徵 好的，以下說明日本人的特徵。\n【優點】\n日本人有禮貌，有一種關注尊重和應對他人的文化。 嚴格遵守時間，守時受到尊重。 集體主義思想強烈，重視團隊合作和協調性。 重視清潔，傾向於熱心於公共場所的禮儀和打掃。 重視禮物和紀念品，致謝的文化廣泛傳播。 【缺點】\n有時不擅長表達個人意見，傾向於避免意見衝突。 非常嚴格的勞動文化，加班和過勞死有時被視為問題。 對外國人的歧視和排斥問題仍然存在，有時會被討論與國際社會的協調問題。 有權威主義傾向，常被指出無條件接受上司或長輩的意見。 有時被批評為封閉的社會，傾向於難以接受外部的文化或價值觀。 ","date":"2022-09-06T02:24:11+09:00","image":"http://kenji.blog/p/%E6%97%A5%E6%9C%AC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E6%80%9D%E3%81%86%E3%81%93%E3%81%A8/images/img_hu105ea1ef9d38a7cb8901ff6c857b887e_168534_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E9%97%9C%E6%96%BC%E6%88%91%E5%B0%8D%E6%97%A5%E6%9C%AC%E7%9A%84%E7%9C%8B%E6%B3%95/","title":"關於我對日本的看法"},{"content":"簡介 Rust 是一種相對較新的程式語言，它允許您使用現代語法編寫快速且記憶體效率高的模組。 它支援多平台，也被用於 WebAssembly 和嵌入式系統領域。 著名的是，它被 Firefox、DropBox 和 Cloudflare 採用。\n它也作為 C++ 的替代品而受到關注。\n安裝方法 安裝 Rust\n上述網站提供了各個平台的安裝說明。\n第一個程式 將以下程式儲存為 main.rs。\n1 2 3 fn main() { println!(\u0026#34;Hello, world!\u0026#34;); } 從命令提示字元或終端機執行 rustc main.rs 時，它將被編譯。執行 ./main（在 Windows 上為 main.exe）將輸出 Hello, world!。\n日語文件 The Rust Programming Language 日語版\n學習 Rust 所需的說明都集中在上面的連結（日語翻譯版）中。 它非常全面，以至於您不需要購買 Rust 的書籍。\n如果您想在 Web 上嘗試 如果您想在不安裝編譯器的情況下在 Web 上嘗試，可以使用 The Rust Playground。 輸入程式碼並按下「執行」按鈕後，它將在 Web 上編譯並執行。\n","date":"2022-09-06T00:12:36+09:00","image":"http://kenji.blog/p/rust%E3%81%AE%E3%81%AF%E3%81%98%E3%82%81%E3%81%8B%E3%81%9F/images/rust_logo_huefc2d075e966b0edc0b7186c50038553_22411_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E5%A6%82%E4%BD%95%E9%96%8B%E5%A7%8B%E4%BD%BF%E7%94%A8-rust/","title":"如何開始使用 Rust"},{"content":"自宅的網路環境從Flet\u0026rsquo;s光變更為J:COM 經朋友介紹，我把家裡的網路線路從Flet\u0026rsquo;s光換成了J:COM。原因是，\n每月的費用變便宜了。3,619日圓→2,180日圓 網路速度從100MBps提升到320MBps 這兩點。\n使用後的感想 切換過來大約過了一個星期，目前為止幾乎沒有什麼問題。以下記載一些稍微在意的地方。\n實際變更後才發現，下載速度的確變快了，從原本的60MBps變成可以達到將近320MBps。但是， 上傳速度方面，Flet\u0026rsquo;s光的時候有40MBps，現在卻降到了大約10MBps。這似乎是J:COM方面的規格。 目前為止並沒有進行直播或是上傳大量資料，所以再觀察看看。\n另外，最近我和家人都以遠距工作為主，今天第一次發生了網路斷線約數十分鐘的情況。雖然自動恢復了， 但可能不是個好兆頭。畢竟切換過來還不到一個星期、、、。\n題外話，因為J:COM有管制P2P通訊，所以P2P應用程式的速度似乎出不來。使用P2P的人最好注意一下。\n關於服務 簽約時，如果加入Netflix或Disney+可以獲得價值4萬日圓的QUO卡，與各自的服務簽約費抵銷後，每月的費用 平均會變便宜一些，所以我在簽約的同時也訂閱了服務。Netflix是一年合約，Disney+是半年合約，似乎需要自己辦理手續。\n因為才剛切換不久，如果有其他的使用感或感想，我會再更新這篇文章。那麼，\n09/06 網路變得難以連線 2022/09/06 13:13左右　約3到5分鐘 2022/09/06 13:30左右　約3到5分鐘 之後又發生了幾次・・・ 好像是DNS的問題，所以我參考了這裡設定了DNS伺服器。 這樣會變成怎樣呢・・・即使設定了DNS還是陷入無法連線的狀態，所以向客服詢問後，他們說正在進行緊急維護・・・。詢問後連線狀態馬上變好了，所以我想他們應該有採取了一些對策。\n","date":"2022-09-05T22:48:51+09:00","image":"http://kenji.blog/p/%E3%83%8D%E3%83%83%E3%83%88%E7%92%B0%E5%A2%83%E3%82%92%E3%83%95%E3%83%AC%E3%83%83%E3%83%84%E5%85%89jcom%E3%81%AB%E5%A4%89%E3%81%88%E3%81%9F/jcom_hub0ec31ac66f5927be8b28fe767bbeebb_3349_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E3%83%8D%E3%83%83%E3%83%88%E7%92%B0%E5%A2%83%E3%82%92%E3%83%95%E3%83%AC%E3%83%83%E3%83%84%E5%85%89jcom%E3%81%AB%E5%A4%89%E3%81%88%E3%81%9F/","title":"把網路環境從Flet's光換成了J:COM"},{"content":"安裝 HUGO 下載 下載 HUGO\n從上述網站，下載並解壓縮符合您環境的 Windows 模組。 就我而言，我下載了「hugo_0.102.3_Windows-64bit.zip」。\n解壓縮 解壓縮下載的 zip 檔案，將其中的 hugo.exe 複製到您建立的資料夾中，例如 C:\\bin。\n登錄到環境變數 將其登錄到環境變數中，以便從任何位置執行 hugo.exe。 以下是在 Windows 11 上的操作，但您應該可以透過類似的步驟進行登錄：\n按 Win+Pause 鍵開啟版本資訊 點擊「進階系統設定」 點擊「環境變數」 選擇 Path，然後點擊「編輯」 點擊「新增」，在新的一行輸入「C:\\bin」，然後點擊「確定」關閉對話框 預覽部落格 在命令提示字元中，移動到 HUGO 部落格的資料夾，然後執行以下命令。\nhugo server -D\n執行結果如下。（-D 是顯示草稿文章的選項。）\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 C:\\Users\\win11\\IdeaProjects\\kenji.blog\u0026gt;hugo server -D Start building sites … hugo v0.102.3-b76146b129d7caa52417f8e914fc5b9271bf56fc windows/amd64 BuildDate=2022-09-01T10:16:19Z VendorInfo=gohugoio | JA -------------------+----- Pages | 39 Paginator pages | 0 Non-page files | 7 Static files | 0 Processed images | 0 Aliases | 13 Sitemaps | 1 Cleaned | 0 Built in 161 ms Watching for changes in C:\\Users\\win11\\IdeaProjects\\kenji.blog\\{archetypes,content,themes} Watching for config changes in C:\\Users\\win11\\IdeaProjects\\kenji.blog\\config.toml Environment: \u0026#34;development\u0026#34; Serving pages from memory Running in Fast Render Mode. For full rebuilds on change: hugo server --disableFastRender Web Server is available at http://localhost:1313/ (bind address 127.0.0.1) Press Ctrl+C to stop 由於地址在執行時會顯示（在上述範例中為 http://localhost:1313/），請將該地址複製到您的瀏覽器中。 每次儲存檔案時，預覽都會自動更新。 要結束預覽，請在命令提示字元中輸入 Ctrl+C。\n","date":"2022-09-05T12:28:01+09:00","image":"http://kenji.blog/p/hugo%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7%E7%92%B0%E5%A2%83%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC/img_hu415dc7e70376ac350673d0366f70ca4b_19909_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/hugo%E6%9C%AC%E6%A9%9F%E7%92%B0%E5%A2%83%E9%A1%AF%E7%A4%BA%E9%A0%90%E8%A6%BD/","title":"【HUGO】本機環境顯示預覽"},{"content":"這是我推薦的 3 部以數學家為主角的電影。\n美麗境界 這是一部描繪真實存在的美國天才數學家半生的作品。結局有著令人驚訝的發展。 羅素·克洛作為主角的表現非常有味道。\n攔截密碼戰 改編自羅伯特·哈里斯的小說《Enigma》的 2001 年電影。 來自維基百科\n這是一個關於解密德國製造的「恩尼格瑪」密碼機的故事。\n模仿遊戲 這同樣是處理恩尼格瑪密碼機的解密故事。我很喜歡當時的世界觀。\n天才無限家 這部作品描繪了劍橋大學數學家哈代和印度數學家拉馬努金之間的交流。你能感受到數學的美。\n愛的萬物論 描繪霍金博士半生的作品。\n粒子狂熱 ","date":"2022-09-05T10:41:00+09:00","image":"http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%8C%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E6%98%A0%E7%94%BB/images/img_hua361131ea597bbd428e36b721aabc571_406520_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%8C%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E6%98%A0%E7%94%BB/","title":"有數學家登場的電影"},{"content":"孩子的書桌 孩子睡覺的時間就是我能專心工作的時間。午睡結束後我們去公園玩吧。 如果 iPad 有 Lightning 轉 HDMI 的轉接頭，我就能在右邊的桌子上工作了～\n","date":"2022-09-04T14:29:09+09:00","image":"http://kenji.blog/p/%E4%BB%8A%E6%97%A5%E3%81%AE%E4%BD%9C%E6%A5%AD%E7%92%B0%E5%A2%83/images/today_workplase_hu1fa3ba50725fc9c80ae774069d99ec20_2258565_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/zh-tw/p/%E4%BB%8A%E5%A4%A9%E7%9A%84%E5%B7%A5%E4%BD%9C%E7%92%B0%E5%A2%83/","title":"今天的工作環境"},{"content":"前言 寫這個部落格時，我使用的是 IntelliJ IDEA。它不僅與 Git 的相容性很好，還能顯示 Markdown 的預覽，非常方便。 每次寫部落格時，都必須在 md 檔案的標頭中寫入 date，但似乎沒有插入日期的快捷鍵，因此我參考了下方的網站，建立了一個用來插入日期的指令。希望能對大家有所幫助。\nIs there a shortcut for inserting date/time in IntelliJ IDEA?\n設定步驟 開啟選單中的「File」\u0026gt;「Settings\u0026hellip;」\n在選取「Editor」\u0026gt;「Live Template」\u0026gt;「HTML/XML」的狀態下，點擊「+」 選擇 Live Template 在 Abbreviation 中輸入「date」 在 Description 中輸入「插入日期和時間」 在 Template Text 中輸入「$date$」 點擊 Edit Variables 按鈕\n在 Name 中輸入「date」 在 Expression 中輸入 date(\u0026quot;yyyy-MM-dd'T'HH:mm:ss'+09:00'\u0026quot;) 點擊 OK 關閉對話方塊 按下 Define 或 Change 並勾選「Everywhere」 點擊 OK 關閉對話方塊 在程式碼編輯器中輸入「date」並按下 Enter，若成功插入日期「2022-09-04T05:59:04+09:00」，即代表設定完成！ 以上\n結語 如果再發現 IntelliJ IDEA 的小技巧，我會再繼續發布分享！\n","date":"2022-09-04T05:59:04+09:00","image":"http://kenji.blog/p/intellij-idea%E3%81%A7%E6%97%A5%E4%BB%98%E3%82%92%E8%B2%BC%E3%82%8A%E4%BB%98%E3%81%91%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B/images/IntelliJ_logo_hu4c2377fba6118d83603ae0bd715d16f4_24441_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/intellij-idea%E3%81%A7%E6%97%A5%E4%BB%98%E3%82%92%E8%B2%BC%E3%82%8A%E4%BB%98%E3%81%91%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B/","title":"在 IntelliJ IDEA 中新增插入日期的指令"},{"content":"我開始寫部落格了 類似煙火的東西，程式碼在這裡\n大家好。 不知怎麼地，我決定開始寫部落格了。\n沒有什麼「我想發表這個！」之類的宏大目標， 只是覺得如果有個地方能把關於技術、日常瑣事，或是腦海中浮現的想法原封不動地寫下來，應該會很不錯。\n我打算把它當作筆記本一樣，不會放太多心力進去。\n用一個叫 Hugo 的東西製作 這個部落格是用名為「Hugo」的靜態網站產生器製作的。 因為找到了一個感覺不錯的主題，就順勢套用了。 （挑選主題花了大約 2 個小時這件事是個秘密）\n關於程式碼、感興趣的工具之類的， 我也打算輕鬆地記錄下來。\n關於早晨的 Komeda 順帶一提，今天早上稍微早起，去了 Komeda 咖啡店。 8點半出發，一邊呼吸著早晨的空氣一邊慢慢走去。\n點了迷你冰與火（Shiro-Noir）和咖啡歐蕾的 A 早餐套餐。 印象中大概是 800 日圓左右吧？（不記得了）\n早晨的咖啡館真不錯。 感覺在工作前有一點放空的時間，一整天都會很順利。\n大概就是這種感覺，之後會輕鬆地寫下去。 預計會混合技術方面的話題和日常瑣事。\n請多指教囉！\n","date":"2022-09-02T07:23:00+09:00","image":"http://kenji.blog/p/%E3%83%96%E3%83%AD%E3%82%B0%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F/images/komeda_hue1f0373fafb96162f461ac594cb3e53e_603414_120x120_fill_q75_box_smart1.jpeg","permalink":"http://kenji.blog/zh-tw/p/%E6%88%91%E9%96%8B%E5%A7%8B%E5%AF%AB%E9%83%A8%E8%90%BD%E6%A0%BC%E4%BA%86/","title":"我開始寫部落格了"},{"content":"Salesforce DevTools 您可以搜尋自訂欄位，或是一次大量匯出自訂物件的欄位。\n能夠當場建立 SOQL 也非常方便。\nSalesforce DevTools\nSalesforce advanced Code searcher 這在搜尋 Salesforce 程式碼時非常方便。\nSalesforce advanced Code searcher\n","date":"2022-05-02T10:39:36+09:00","image":"http://kenji.blog/p/salesforce%E3%81%8A%E3%81%99%E3%81%99%E3%82%81chrome%E6%8B%A1%E5%BC%B5/img_huc75a5c8c4d45e738551ca5afb26f380b_13227_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/zh-tw/p/salesforce%E3%81%8A%E3%81%99%E3%81%99%E3%82%81chrome%E6%8B%A1%E5%BC%B5/","title":"Salesforce推薦的Chrome擴充功能"},{"content":"現代網際網路社會中的資訊安全，主要依賴以RSA密碼為首的公開金鑰密碼系統來保護。RSA密碼安全性的基礎，仰賴於 「對巨大的合成數進行質因數分解，在計算複雜度上是極度困難的」 這個事實。\n本文將解析古典電腦中最強的質因數分解演算法 「普通數體篩法」 （General Number Field Sieve, GNFS）的數學機制，並透過數學公式與概念圖，深入探討為何它會被彼得·秀爾（Peter Shor）所發現的 「Shor演算法」 完全擊敗，徹底剖析這場典範轉移。\n1. 古典計算中質因數分解的策略：從費馬質因數分解法的發展 質因數分解問題，是對於給定的合成數 $N$，找出滿足 $N = p \\times q$ 的質數 $p, q$ 的問題。\n基本的想法，可以歸結為尋找滿足以下同餘式的非平凡 $x, y$：\n$$ x^2 \\equiv y^2 \\pmod N $$ 將其變形後可得：\n$$ x^2 - y^2 \\equiv 0 \\pmod N $$ $$ (x - y)(x + y) \\equiv 0 \\pmod N $$ 在此，若 $x \\not\\equiv \\pm y \\pmod N$，藉由計算 $\\gcd(x-y, N)$ 或 $\\gcd(x+y, N)$，就能獲得 $N$ 的非平凡因數。這個事實成為了GNFS等近代質因數分解演算法的基礎。\n2. 最強古典演算法：「普通數體篩法」（GNFS）的深淵 「GNFS」 是目前已知針對古典電腦的質因數分解演算法中速度最快的。它的時間複雜度需要次指數（Sub-exponential）時間。\nGNFS的計算複雜度 當數字 $N$ 的位數為 $b = \\log_2 N$ 時，GNFS的計算複雜度可以表示如下：\n$$ O\\left( \\exp \\left( \\left(\\frac{64}{9} b\\right)^{1/3} (\\log b)^{2/3} \\right) \\right) $$ 從這個公式可以看出，複雜度並非多項式時間，而是比指數函數稍微慢一點的 「次指數時間」 。儘管如此，當位數增加時，計算時間仍會以天文數字般增長。\nGNFS的數學機制 GNFS大致可以分為四個步驟：\n多項式選擇 (Polynomial Selection) 篩法 (Sieving) 矩陣化簡 (Matrix Reduction) 計算平方根 (Square Root) 2.1. 多項式選擇與代數體 首先，選擇以整數為係數的不可約多項式 $f(x)$ 與 $g(x)$。它們被設定為在 modulo $N$ 之下具有共同的根 $m$。也就是說，\n$$ f(m) \\equiv 0 \\pmod N $$ $$ g(m) \\equiv 0 \\pmod N $$ 通常，$g(x)$ 會被選為一次多項式 $g(x) = x - m$。若將 $f(x)$ 的根設為 $\\alpha$，則可建構出名為 $\\mathbb{Q}(\\alpha)$ 的 「代數體」 （Number Field）。透過同態映射 $\\phi: \\alpha \\mapsto m$，來比較 $\\mathbb{Q}(\\alpha)$ 環上的運算與一般整數環 $\\mathbb{Z}$ 的運算。\n2.2. 篩法 (Sieving) 接著，大量搜尋互質的整數對 $(a, b)$。目的是尋找使得以下兩個數值皆為 「B-smooth」 （僅由較小的質因數組成）的配對：\n$a - bm$ （在整數環上的值） $b^d f(a/b)$ （對應到代數體上的範數 $N(a - b\\alpha)$） 這裡使用了一種稱為 「篩法」 （Sieve）的快速搜尋手法。藉此，能從龐大的候選者中有效率地萃取出符合條件的 $(a, b)$ 配對。\n2.3. 矩陣化簡 (Linear Algebra over GF(2)) 從收集到的配對 $(a, b)$ 建構出指數向量，並在 $\\mathbb{F}_2$ （元素僅有0與1的體）上求出巨大稀疏矩陣的左零空間。\n為了讓關係式 $ \\prod (a_i - b_i m) $ 與 $ \\prod (a_i - b_i \\alpha) $ 分別成為平方元素，我們找出向量 $v$ 作為解。這無非就是解以下的線性方程組：\n$$ M \\mathbf{x} \\equiv \\mathbf{0} \\pmod 2 $$ 在此階段，會活用如區塊蘭佐斯法（Block Lanczos Algorithm）或區塊維德曼法（Block Wiedemann Algorithm）等高度數值計算演算法。\n2.4. 計算平方根 最後，在代數體與整數環兩邊皆取平方根，導出 $x^2 \\equiv y^2 \\pmod N$ 這個關係式。接著計算 $\\gcd(x-y, N)$，便能獲得因數。\n3. 量子計算帶來的突破：「Shor演算法」 相對於GNFS需要次指數時間，由彼得·秀爾於1994年發表的 「Shor演算法」 ，透過使用量子電腦，能以 「多項式時間」 解決這個問題。\nShor演算法的計算複雜度 當量子位元數為 $O(\\log N)$ 時，時間複雜度如下：\n$$ O((\\log N)^3) $$ 這意味著計算時間不會相對於位元數產生指數級的爆炸。這是一個驚人的結果：即使是 「古典計算」 需要超過宇宙壽命才能解開的巨大合成數，在 「量子計算」 下也只需數小時至數天即可破解。\nShor演算法的全貌：歸結為週期尋找問題 Shor演算法巧妙地將質因數分解問題歸結為 「週期尋找問題」 。\n選擇一個與 $N$ 互質的隨機整數 $a$ （$1 \u003c a \u003c N$）。 定義函數 $f(x) = a^x \\bmod N$。 尋找 $f(x)$ 的週期 $r$，即尋找使得 $a^r \\equiv 1 \\pmod N$ 成立的最小正整數 $r$。 若 $r$ 為偶數，則確認 $a^{r/2} \\not\\equiv -1 \\pmod N$ 是否成立，並計算 $\\gcd(a^{r/2} \\pm 1, N)$ 來獲得質因數。 這個步驟3的 「尋找週期 $r$ 」 ，正是古典電腦需要耗費指數時間的瓶頸，但量子電腦透過 「量子疊加」 與 「量子傅立葉轉換」 （QFT），能在一瞬間解決這個問題。\n4. 量子傅立葉轉換（QFT）與週期的萃取 讓我們用數學公式詳細檢視Shor演算法的核心：量子狀態的操作。\n4.1. 產生量子疊加態 首先，準備兩個量子暫存器。暫存器1保存輸入 $x$ 的疊加態，暫存器2保存函數計算結果 $f(x)$。對初始狀態 $|0\\rangle |0\\rangle$ 應用阿達馬轉換（Hadamard Transform），創造出所有可能 $x$ 的疊加態。\n$$ |\\psi_1\\rangle = \\frac{1}{\\sqrt{Q}} \\sum_{x=0}^{Q-1} |x\\rangle |0\\rangle $$ （這裡 $Q$ 是滿足 $N^2 \\le Q \u003c 2N^2$ 的2的冪次方）\n接著，使用量子神諭（Quantum Oracle） $U_f$ 計算 $f(x) = a^x \\bmod N$，並儲存至暫存器2。\n$$ |\\psi_2\\rangle = U_f |\\psi_1\\rangle = \\frac{1}{\\sqrt{Q}} \\sum_{x=0}^{Q-1} |x\\rangle |a^x \\bmod N\\rangle $$ 假設我們在這裡測量了暫存器2（實際上即使不測量，數學結構也是相同的）。若觀測到某個值 $y = a^{x_0} \\bmod N$，則暫存器1的狀態會塌縮成所有滿足 $f(x) = y$ 的 $x$ 的疊加態。假設週期為 $r$，則這樣的 $x$ 將會是 $x_0, x_0 + r, x_0 + 2r, \\dots$。\n$$ |\\psi_3\\rangle = \\frac{1}{\\sqrt{M}} \\sum_{k=0}^{M-1} |x_0 + kr\\rangle $$ （這裡 $M \\approx Q/r$ 為項的數量）\n這個狀態蘊含了週期 $r$ 的資訊，但若直接測量，只能得到隨機的 $x_0 + kr$，無法得知週期 $r$。這時QFT就派上用場了。\n4.2. 應用量子傅立葉轉換 (Quantum Fourier Transform) QFT是對量子狀態的振幅進行離散傅立葉轉換的操作。QFT對狀態 $|x\\rangle$ 的作用定義如下：\n$$ \\text{QFT} |x\\rangle = \\frac{1}{\\sqrt{Q}} \\sum_{y=0}^{Q-1} e^{2\\pi i \\frac{xy}{Q}} |y\\rangle $$ 將其應用於 $|\\psi_3\\rangle$ 時，會發生相位的干涉（量子干涉）。\n$$ |\\psi_4\\rangle = \\text{QFT} |\\psi_3\\rangle = \\frac{1}{\\sqrt{MQ}} \\sum_{y=0}^{Q-1} \\sum_{k=0}^{M-1} e^{2\\pi i \\frac{(x_0 + kr)y}{Q}} |y\\rangle $$ 展開這個式子的和，會出現：\n$$ \\sum_{k=0}^{M-1} e^{2\\pi i \\frac{kry}{Q}} $$ 這個幾何級數的和，只有當 $ry/Q$ 接近整數時才會產生建設性干涉（Constructive Interference），在其他情況下則會相互抵消，產生破壞性干涉（Destructive Interference）。\n因此，能以高機率被測量到的狀態 $|y\\rangle$，將是滿足以下條件的整數 $y$：\n$$ \\frac{y}{Q} \\approx \\frac{c}{r} $$ （$c$ 為某個整數）\n4.3. 透過連分數展開找出週期 藉由測量得到 $y$ 後，利用古典電腦對 $y/Q$ 進行 「連分數展開」 （Continued Fraction Expansion）。藉此，計算出 $y/Q$ 的近似分數 $c/r$，便能非常有效率地從分母萃取出週期 $r$ 的候選值。\n5. 概念模型的比較與典範轉移 為了直觀理解GNFS與Shor演算法的差異，以下展示使用Mermaid語法的概念圖。\n透過量子電路的Shor演算法概念圖 1 2 3 4 5 6 7 8 9 10 11 12 13 graph TD A[初始狀態: 0...0] --\u0026gt; B[Hadamard轉換產生全狀態的疊加] B --\u0026gt; C[模冪運算 a^x mod N] C --\u0026gt;|量子糾纏| D[塌縮至具週期性的狀態] D --\u0026gt; E[量子傅立葉轉換 QFT] E --\u0026gt;|透過干涉放大機率| F[測量: 獲得y] F --\u0026gt; G[古典處理: 連分數展開] G --\u0026gt; H[發現週期 r] H --\u0026gt; I[算出N的質因數] style A fill:#f9f,stroke:#333,stroke-width:2px style E fill:#bbf,stroke:#333,stroke-width:2px style I fill:#bfb,stroke:#333,stroke-width:2px 典範轉移的本質 GNFS採取 「在數學空間（代數體）中尋找關係式」 的策略。然而，由於搜尋空間相對於位數呈指數級擴大，使得古典電腦的運算能力（即使包含平行運算），在金鑰長度超過2048位元等情況下，實際上是無法破解的。\n另一方面，Shor演算法利用了 「量子干涉的波特性」 。它同時評估處於疊加態的所有計算路徑，並透過QFT抵消（破壞性干涉）不需要的答案，僅放大（建設性干涉）正確週期答案的機率振幅。藉此，它並非去搜尋空間，而是實現了 「讓正確答案自己浮現出來」 這種完全不同維度的策略。\n6. 總結 本文深入比較了作為古典極限的 「GNFS」 ，以及展現量子計算力量的 「Shor演算法」 ，探討了兩者的數學背景與演算法結構。\nGNFS透過多項式選擇與巨大矩陣計算等數學技巧，將計算複雜度壓低至次指數時間；相對地，Shor演算法將量子力學的基本原理（疊加與干涉）與數學工具（QFT）融合，一舉突破至多項式時間。\n目前，尚不存在能夠以實用規模（數千個量子位元）執行Shor演算法的容錯量子電腦（FTQC）。然而，正是這個數學與理論上的典範轉移，成為了現在全世界急於轉換至後量子密碼學（PQC: Post-Quantum Cryptography）的最大理由。\n","date":"0001-01-01T00:00:00Z","image":"http://kenji.blog/p/gnfs-to-shors-algorithm-math-deepdive/quantum_vs_gnfs_eyecatch_1788616101508_hud95a00206aa1dcf32de9cdc0ccb17972_1096815_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/zh-tw/p/gnfs-to-shors-algorithm-math-deepdive/","title":"【用數學公式完全理解】為何最強古典演算法「GNFS」會敗給量子演算法？質因數分解的典範轉移"}]