[{"content":"前言：量子计算机带来的“计算范式转变” 近年来，我们在新闻和技术文章中几乎每天都能看到“量子计算机”这个词。“现在的超级计算机需要计算几千年的问题，它只需几分钟就能完成”、“现有的密码技术可能会全部被破解”等仿佛科幻电影般的故事被传得神乎其神。从Google、IBM、Microsoft等大型IT企业，到世界各地的大学和初创公司，都在为这项梦幻技术的实用化而展开激烈竞争。\n然而，如果被问到“量子计算机到底是什么？”，恐怕很少有人能准确回答。许多人可能都有“能够同时计算所有组合的魔法盒子”这样模糊的印象，但严格来说，这是不正确的。\n在本文中，我们将从基础开始，彻底且专业但通俗易懂地解说量子计算机与经典计算机（我们平时使用的PC或智能手机）在根本上有什么区别，以及它是如何将“叠加态（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}$（约1100万亿）个状态。而仅仅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）”的三维球体表面上的一个点来表示。北极是“0”，南极是“1”，赤道上则是“0和1各占一半的叠加态”。所谓量子门，无非就是在球体表面上旋转状态（向量）的操作。\n让我们来介绍几个代表性的量子门。\n1. 阿达马门（H门） 这是量子计算机独有的、最基本的一种门，在经典计算机中并不存在。如果让状态完全是“0”的量子比特通过H门，就能制造出0和1被观测到的概率正好各占一半的“完全叠加态”（布洛赫球面上赤道上的点）。作为量子计算的初始化步骤，许多算法一开始都会先将H门应用于所有的量子比特。\n2. 泡利门（X, Y, Z门） 这些门包含了相当于经典计算机中NOT门（将0翻转为1，1翻转为0）的操作。在布洛赫球面上，它们相当于围绕X轴、Y轴、Z轴旋转180度的操作。特别是X门，它会将北极（0）翻转到南极（1），因此作用与经典的NOT门完全相同。而Z门的作用是翻转叠加态的“相位（类似于波的节奏）”，在引发量子干涉时极其重要。\n3. CNOT门（受控非门） 这是用于制造量子纠缠的极其重要的门。它使用两个量子比特（控制比特和目标比特）。 它的运作方式是：“如果控制比特为1，则翻转目标比特的状态（X门）。如果控制比特为0，则什么都不做。”乍一看这只是个简单的IF条件分支，但如果控制比特处于“0和1的叠加态”会怎样呢？目标比特将变成“被翻转和未被翻转的叠加态”，两个比特的命运完全联系在一起。两个量子比特就完美地“纠缠”了。\n像音乐乐谱一样从左到右依次配置并应用这些门，就能执行复杂的算法。\n第4章：量子计算机擅长什么，不擅长什么？ 这里要告诉大家一个重要的事实：量子计算机并不是万能的神。 在网页浏览、视频渲染、Excel宏处理或一般智能手机应用的运行等日常任务中，量子计算机可能永远无法超越经典计算机。对于这些串行处理任务，已经高度优化、拥有压倒性速度和低廉成本的经典计算机更为适合。\n量子计算机只有在面对 “那些经典计算机在计算组合时会呈指数级爆炸，以至于需要花费宇宙寿命般漫长时间的特定问题” 时，才能发挥其真正的价值。这被称为“量子霸权（Quantum Supremacy）”或“量子优势（Quantum Advantage）”。\n量子计算机擅长的事情（杀手级应用） 1. 质因数分解与密码破解（Shor算法） 目前，保护互联网安全通信（如信用卡支付、个人信息传输等）的“RSA密码”等，是建立在“使用经典计算机对巨大数字进行质因数分解实际上是不可能的（需要极其庞大的时间）”这一前提之上的。 然而，如果使用1994年数学家彼得·秀尔（Peter Shor）发现的“Shor算法”，量子计算机就能巧妙利用干涉，以惊人的速度（多项式时间）破解它。因此，未来的现有密码体系有崩溃的风险，世界各地的中央银行和政府机构正急于向“抗量子密码（Post-Quantum Cryptography）”过渡。\n2. 量子化学计算与新材料、新药开发 自然界中分子和原子的行为，原本就遵循量子力学的法则。如果试图用经典计算机来模拟复杂分子的行为，电子之间相互作用的组合将会爆炸，即使是相对较小的分子也会触及计算量的极限。 正如诺贝尔物理学奖得主理查德·费曼所说：“如果你想模拟自然，你就必须用量子力学来构建它”，量子计算机在物质模拟方面能够发挥出压倒性的原生力量。人们期待它能带来解决人类面临课题的突破，比如设计划时代的新药、发现常温超导材料、开发高效的太阳能电池和电池材料，以及合成高能效的肥料等。\n3. 组合优化问题与搜索（Grover算法） 对于从庞大选项中找出最佳方案的问题（如物流路线优化、金融投资组合优化等），量子算法同样能发挥作用。使用“Grover算法”，在从无序的数据库中搜索目标数据时，只需经典计算机所需次数的平方根就能完成。例如，如果有1亿条数据，经典计算机最多需要1亿次搜索，而量子计算机只需大约1万次即可完成。\n第5章：阻碍硬件发展的壁垒——“退相干”与“量子纠错” 虽然在理论上量子计算机拥有如魔法般强大的力量，但在其实用化的道路上，矗立着极高极险峻的物理壁垒。最大的敌人就是 “噪声”。\n量子比特的“叠加态”和“量子纠缠”是极其微妙且脆弱的状态。只需接触到周围微小的热量、电磁波的波动甚至宇宙射线，那种神奇的状态就会瞬间崩溃，变回普通的经典比特。这种现象被称为 “退相干（量子崩塌）”。\n物理实现方式的激烈竞争 目前，为了解决在物理上如何制造这种微妙的量子比特的问题，世界各地都在研究各种不同的方式，并展开了激烈的霸权争夺。\n超导方式（Superconducting）：被Google、IBM、Amazon等采用。使用环状超导电路，通过巨大的制冷机冷却到接近绝对零度（约-273℃）的极低温来控制量子态。这是目前最领先、最容易增加量子比特数量的方式，但冷却设备庞大且昂贵。 离子阱方式（Trapped Ion）：被IonQ、Quantinuum等采用。将离子（原子）用电磁场困在真空中，并用精密的激光照射进行控制。所有量子比特都是均匀的，能长时间保持状态（相干时间长）是其优势，但存在操作速度比超导慢的问题。 光量子方式（Photonic）：PsiQuantum等公司正致力于此。使用光粒子（光子）。很大一部分可以在室温下运行，不需要极低温环境，最大的优点是与现有的硅芯片制造技术和光纤通信技术兼容性好。 拓扑方式（Topological）：Microsoft多年来一直在研究。这是一种野心勃勃的方法，试图利用被称为任意子的特殊粒子的拓扑（拓扑学）性质，制造出从根本上对环境噪声有很强抵抗力（不容易发生错误）的量子比特。理论上最强，但物理实现的门槛被认为是最高的。 迈向终极目标“容错量子计算机（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年代：物理学家保罗·贝尼奥夫和理查德·费曼提出了利用量子力学原理的计算机概念。“如果要模拟自然，就使用量子力学吧”这句话成为了发端。 1994年：彼得·秀尔发表了用于质因数分解的量子算法（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本文的目的是为了向商务人士和对技术感兴趣的普通大众，以通俗易懂的方式解说量子计算的基本概念。请注意，本文在严密的数学和物理学定义（如狄拉克符号（Bra-ket记号）、复数概率振幅的细节等）上进行了一定程度的简化。\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-cn/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），只能用于数字签名。 签名尺寸往往较大。 分为“有状态”和“无状态”，有状态（如XMSS）由于需要严格管理密钥的使用次数，在实现上难度较高。 NIST已将“SLH-DSA（旧称 SPHINCS+）”作为无状态哈希签名进行了标准化。\n3. 多变量多项式密码（Multivariate Cryptography） 多变量多项式密码的安全性依据是求解具有众多变量的非线性方程组系统（MQ问题：Multivariate Quadratic problem）的困难程度。已知该问题是NP困难的。\n机制概要： 发送方将明文（或哈希值）代入作为公钥传递过来的具有众多变量的复杂方程中，从而生成密文（签名）。合法的接收方拥有将“方程结构转换为易于求解的形式的隐藏信息（陷门）”作为私钥，利用它来进行解密（或签名验证）。\n优点：\n签名尺寸非常小。 签名验证速度极快。适合于资源受限的物联网设备等。 缺点：\n公钥尺寸非常大（有时可达数十至数百千字节）。 过去曾出现过有力的算法（如Rainbow）被经典攻击攻破的案例，因此与其他方式相比，建立对其安全性的信任较为困难。 4. 基于编码的密码（Code-based Cryptography） 基于编码的密码是将用于纠正通信路径上错误的“纠错码”理论应用到密码学中。1978年提出的“McEliece密码”最为著名，也是PQC中历史最悠久的算法之一。\n机制概要： 发送方利用接收方的公钥（隐藏了特定结构的纠错码的生成矩阵）对明文进行编码，并故意加入错误（噪声）后发送。接收方使用私钥去除错误，提取出明文。破译者必须从不知其结构的普通随机编码中纠正错误，这被称为“一般伴随式解码问题（Syndrome Decoding Problem）”，并被证明是NP困难的。\n优点：\n经过40多年以上的透彻研究，至今未发现有效的攻击，安全信任度极高。 加解密处理速度快。 缺点：\n公钥尺寸极其巨大（有时可达几兆字节）。因此，在通信带宽和内存受限的环境（如TLS握手等）中难以利用。 NIST推进PQC标准化的最新动向 美国国家标准与技术研究院（NIST）自2016年起开始向全球公开征集新一代后量子密码算法，并经历了多年的严格评估和多轮筛选。\n2024年，NIST终于作为正式的联邦信息处理标准（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的迁移（Migration）。美国国家安全局（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-cn/p/post-quantum-cryptography/","title":"【PQC】量子计算时代的新一代密码学：后量子密码学全景"},{"content":"引言：密码学技术与量子计算机的交汇点 在现代互联网社会中，“公钥加密”是保护通信机密的基础。其中最具代表性的，是1977年由Ron Rivest、Adi Shamir和Leonard Adleman三位学者开发的“RSA加密”。从我们每天使用的在线购物支付、网站浏览（HTTPS）到电子邮件的收发，RSA加密作为互联网基础设施的心脏发挥着作用。\n然而，随着“量子计算机”的出现，人们指出这种安全性有可能被彻底颠覆。媒体上甚至会看到“量子计算机一旦完成，世界上的密码和加密将在几秒钟内被破解”这样耸人听闻的标题。这到底是不是真的呢？\n在本文中，我们将深入探讨经典的密码破解方法GNFS（一般数域筛选法），以及使用量子计算机的密码破解算法终极武器——“秀尔算法（Shor\u0026rsquo;s Algorithm）”的原理。我们将通俗易懂地讲解量子傅里叶变换和周期寻找等高级概念，并详细验证在当前NISQ（含噪中型量子）时代的量子硬件现状，以及实际破解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量子计算机的杀手锏：秀尔算法 在这里登场的是1994年由彼得·秀尔（Peter Shor）提出的“秀尔算法（Shor\u0026rsquo;s Algorithm）”。该算法具有划时代的意义，它能够让质因数分解问题在量子计算机上以 多项式时间（ $ O((\\log N)^3) $ ）被解出。亚指数时间和多项式时间之间的差距是决定性的，这在理论上意味着，如果使用量子计算机，RSA加密将被彻底破坏。\n秀尔算法的整体流程 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[通过量子傅里叶变换求得\u0026lt;br\u0026gt;函数 f_x = a^x mod N 的周期 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 秀尔算法并不是直接去解质因数分解问题，而是利用数论定理将其转换为另一个称为“周期寻找问题（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）”。在秀尔算法中，准备了两个寄存器：用于存储输入的寄存器（第一寄存器）和用于存储计算结果的寄存器（第二寄存器）。\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） 突破这道壁垒的秀尔算法之精髓，就在于对第一寄存器应用 量子傅里叶变换（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）的实力与课题 虽然秀尔算法在理论上是完美的，但如果问“明天RSA加密就会被破解吗？”，答案明确是“否定”的。其原因在于当前量子计算机的硬件技术限制。\nNISQ（含噪中型量子）时代 我们目前正处于被称为“NISQ”的时代。NISQ设备拥有几十到几百个物理量子比特，但对噪声极为脆弱。\n量子比特很容易受到热量和电磁波等外部环境的影响，从而频繁发生导致量子态被破坏的“退相干（量子纠缠丧失）”或门操作时的“门错误”。如果试图运行像秀尔算法这样极其深（运算步骤庞大）的量子电路，错误会在计算过程中累积，最终的输出将变成毫无意义的完全噪声。\n物理量子比特与逻辑量子比特 为了解决这个错误问题，“量子纠错（Quantum Error Correction）”是不可或缺的。 虽然经典计算机中也使用了纠错码，但由于存在禁止复制量子态的“不可克隆定理”，量子纠错极其复杂。\n在量子纠错中，通过使用“表面码（Surface Code）”等技术，将许多充满噪声的“物理量子比特”组合起来，从而创造出一个没有错误的理想“逻辑量子比特”。\n在当前错误率的前提下，据估算，制造1个逻辑量子比特大约需要1,000到10,000个物理量子比特。这被称为“纠错开销（Overhead）”。\n破坏RSA-2048需要怎样的资源？ 那么，为了实际破解RSA-2048而运行秀尔算法，需要多少资源呢？\nCraig Gidney（谷歌）和Martin Ekerå在2021年的一篇论文中进行的突破性资源估算表明，如果使用优化的秀尔算法，并使用表面码进行纠错，则需要以下资源：\n逻辑量子比特数：约 4,096 个 物理量子比特数 ： 约 2000万个（假设错误率在 $10^{-3}$ 左右） 计算时间：约 8小时（需要数百万到数十亿次物理门操作） 对此，当前量子硬件的水平达到了什么程度呢？ 2023年底，IBM发布的超导量子处理器“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年后强大的量子计算机完成的瞬间，再使用秀尔算法将过去的数据全部解密，从而暴露机密信息。\n为了对抗这种时间差带来的威胁，以NIST（美国国家标准与技术研究院）为中心，“后量子密码学（PQC: Post-Quantum Cryptography）” 的标准化进程一直在加紧推进。\nPQC是基于即使使用量子计算机也很难破解（即无法应用秀尔算法）的数学问题的新型加密算法。主要的方法有以下几种：\n基于格的密码学（Lattice-based cryptography）：以LWE（容错学习）等问题为基础。在NIST标准化中占据主流（如Kyber、Dilithium等）。 基于编码的密码学（Code-based cryptography）：依赖于纠错码解码问题的困难性。 多变量密码学（Multivariate cryptography）：依赖于求解多变量非线性多项式方程组的困难性。 基于哈希的签名（Hash-based signatures）：仅依赖于哈希函数安全性的数字签名。 目前在Google Chrome和Apple的iMessage等主要软件和平台上，PQC的导入测试和混合实现已经启动。\n结语 量子计算机正在从科幻世界里的梦想，转变为现实的工程挑战。秀尔算法是数学与量子力学融合的人类伟大智力成果，但同时，它也暗藏着动摇我们数字社会基石的“破坏力”。\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-cn/p/shors-algorithm-and-rsa-breaking/","title":"量子计算机真的会破坏RSA加密吗？——秀尔算法与当前进展"},{"content":"【完全解剖】使用C++实现并理解最强密码破解算法「GNFS」 支撑现代互联网根基的「RSA加密」。其坚固性依赖于一种数学信念：“以目前的计算机，想要对巨大的合数进行素数分解实际上是不可能的”。\n然而，人类从未放弃。如今，在经典计算机（非量子计算机）上，存在着一种用于进行巨大素数分解的 **人类最强、最尖端的算法 **。那就是 「一般数域筛选法（GNFS：General Number Field Sieve）」。\n本文将完全公开使用C++（使用了Boost库的多精度整数 boost::multiprecision）严格建模这一GNFS最尖端计算逻辑的实现代码，并彻底解说其背后的「代数数论」深渊。\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*...) 上， // 执行将缓存效率提升到极限的筛选。 // 为演示添加一个虚拟关系 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 (删除仅出现1次的素数所对应的关系) // 2. Clique merging (合并关系以使稀疏矩阵变稠密) // 实际上会使用并查集等算法将数亿行的矩阵压缩到数百万行。 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; // 迭代进行稀疏矩阵与向量的乘积运算， // 找到多个满足 M * x = 0 mod 2 的解向量(零空间)。 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法等) // 求出巨大代数域 O_K 的元素 gamma，并通过同态映射 phi 映射到现实世界 // Y = phi(gamma) mod N cpp_int Y = 1; // 为了回避理想类群与单位群的障碍(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; // 想要进行素数分解的巨大合数 N (如 RSA-270 等) 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 的格子中， // 执行将缓存效率提升到极限的筛选。 // ... } }; 准备好两个世界后，下一步就是在这两个世界中寻找“平滑数（仅由小素数组成的数）”。 生成无数个整数对 $(a, b)$，并计算以下两个值：\n有理侧的值 ： $a - bm$ 代数侧的范数 ： $b^d f(a/b)$ GNFS的目的是收集几千万到几亿个 “有理侧和代数侧的值都能被小素因子完全分解的整数对（Relation：关系）”。\n在早期的GNFS中，使用“线筛选（Line Sieve）”，即把 $(a, b)$ 排列在 $xy$ 平面上，从头开始依次用素数去除。然而，这种做法会导致在内存各处跳跃访问，引发频繁的缓存未命中，速度非常慢。\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 (删除仅出现1次的素数所对应的关系) // 2. Clique merging (合并关系以使稀疏矩阵变稠密) } }; Phase 2中全球计算机花费数月收集到的数亿个关系。但是，如果直接将这些关系丢给下一个“解方程组步骤（矩阵计算）”，超级计算机的内存也会被撑爆。\n因此，需要进行称为 Filtering（过滤） 的矩阵超压缩过程。\nSingleton removal（奇异点清除） 假设一个巨大的素数 $p$ 在数亿个关系中“仅仅出现了一次”。因为我们的目标是“让所有素数的指数都变为偶数（2的倍数）”，所以只出现一次的素数是绝对无法变成偶数的。 因此，包含该素数的关系会被视为“无用的垃圾”立即删除（清除）。由于这会引起连锁反应，原本数亿行的数据会迅速减少。\nClique merging（团合并） 进一步地，将共享特定素数的关系互相相乘（相加），从而在减少行数的同时，把稀疏（空洞多）的矩阵压缩成更稠密的状态（使用类似图论中的团搜索技术）。\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) { // 迭代进行稀疏矩阵与向量的乘积运算， // 找到多个满足 M * x = 0 mod 2 的解向量(零空间)。 } }; 终于到了拼图的核心。 将收集到的关系相乘，寻找 “所有素因子的指数都变成偶数次方的组合”。\n这在数学上等同于，用一个元素为各素数指数的“偶数/奇数（即0或1）”的巨大矩阵 $M$，和一个表示使用哪些关系的向量 $x$， 求解满足 $M \\cdot x \\equiv 0 \\pmod 2$ 的解向量 $x$（零空间、核）。\n我们需要解开数百万行 × 数百万列这种惊人规模矩阵的联立方程式。如果使用普通的高斯消元法，计算复杂度将达到 $O(N^3)$，即使到宇宙终结也算不完。\n因此，最尖端的实现采用了 “Block Wiedemann（分块维德曼）法”。 这是一种Krylov子空间法，利用矩阵 $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的矩阵计算，我们得到了“一旦相乘，所有素因子都会变为偶数次方的关系集合 $S$”。 借此，我们能够在有理侧和代数侧各自的世界中构建出“平方”。\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最后，通过环同态映射 $\\phi$（将 $x$ 替换为 $m$），把代数侧的平方根 $\\gamma$ 传送回现实世界，得到 $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-cn/p/gnfs-cpp-implementation/","title":"【完全解剖】使用C++实现并理解最强密码破解算法「GNFS」"},{"content":"一般数域筛法（GNFS）的真正数学结构 GNFS的最终目标是找到满足 $X^2 \\equiv Y^2 \\pmod N$ 的 $X, Y$。 为了实现这一目标，数学家们在 “现实的整数世界” 与 “代数数域的世界” 之间架起了一座桥梁。这座桥梁就是“同态映射”。\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$ 的整数构成的同余（模）世界。 此时，定义一个从世界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$ 终于要登场了。 将世界A的元素 $\\gamma$，通过 $\\phi$（将 $\\alpha$ 替换为 $m$ 的映射），跃迁到世界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-cn/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$，“$p$ 进入 $(X - Y)$ 的房间”、“$q$ 进入 $(X + Y)$ 的房间”，被分到不同房间的概率，在数学上是 ** 50%（二分之一）**。\n在只有质数 $p$ 进入了 $(X - Y)$ 房间的状态下，让我们来计算 $(X - Y)$ 和 $N$ 的 “最大公约数（最大的共同部分）”。\n$(X - Y)$ 的内容 ＝ $p \\times$ 某个数 $N$ 的内容 ＝ $p \\times q$ 共同的部分只有 “$p$” 吧！ 也就是说，在计算出最大公约数的瞬间，隐藏着的质数 $p$ 就会掉落出来，密码也就被完全破译了。（※使用“辗转相除法”，即使在智能手机上也能瞬间计算出最大公约数）\n【小专栏：为什么是平方？三次方或两倍不行吗？】\n如果是“$2X - 2Y$”，就会变成 $2(X - Y)$，因为只有一个房间，所以无法分离出质数。如果是“$X^3 - Y^3$”，房间的大小会变得不平衡，计算量会无谓地增加。为了将质数分离成两个，能优美地分成两个房间的“平方”性价比最高。\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这个式子有趣的地方在于，它具有 “只要将 $m$（上例中是4）代入字母 $x$，就随时能穿越回到现实的数字 $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$ 最后，将 $m$ 代入代数式 $Y(x)$ 的 $x$ 中，使其穿越到现实世界并汇合。 于是，就像数学魔法一样，“$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-cn/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），这是一种非常常见的病毒，据说有性经验的女性中80%一生中至少会感染一次。 预防这种病毒感染的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%的异议，人们不会将其视为“同等意见”。然而，媒体由于过于重视“公平性”，或者为了吸引眼球，将拯救数万人生命的数据和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-cn/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年：不安的显性化 疫情后经济恢复的迟缓，以及伴随日元急剧贬值而来的通货膨胀，直接打击了普通家庭。与此同时，在社交网络上，基于片面信息的抱怨开始喷涌而出，比如“对外国人的援助太过丰厚”、“日本人的血汗钱流向了外国人”。\n3. 2025年〜2026年：政治势力与社交网络的融合 在2025年的国政选举中，将“日本人优先”作为正式口号的势力获得了一定的议席。社交网络的算法通过对人们的不安做出反应，优先显示过激的帖子，从而加速了仅仅强化特定价值观的“信息茧房效应”。\n报社实施的最新民意调查（2025年底）显示，对于这个口号，“赞成或倾向于赞成”的占42%，“反对或倾向于反对”的占38%，凸显了目前舆论一分为二的现状。\n第2章：经济与社会保障的真相——是“掠夺者”还是“支柱” 支持“日本人优先”的逻辑支柱之一，是“外国人在掠夺日本人的资源”这一印象。然而，政府部门的一手数据却显示了与这种直觉截然相反的现实。\n1. 劳动力：维持日本经济的“不可或缺的血液” 根据厚生劳动省的《外国人雇佣状况（截至2024年10月底）》，外籍劳动者人数为 **204万8,675人 。根据2026年目前的推算，已经突破了 ** 230万人。\n产业领域 外籍劳动者的比例・增长率 实际情况与作用 建筑业 同比增长约22.7% 在基础设施维护和老化桥梁、道路的修缮中不可或缺。 医疗・福利 同比增长约28.1% 承担着护理现场的最前线，支撑着日本的老年人。 制造业 占整体的约26% 支撑日本出口产业现场的顶梁柱。 如今，外籍劳动者填补的并不是日本人想做却做不了的工作，而是 “日本人已经无法保障的空白”。如果在“日本人优先”的名义下排斥他们，我们的护理系统将会立即崩溃，住房和食品的物价将会进一步飙升几成甚至几倍。\n2. 社会保障：围绕最低生活保障的谣言与实情 在社交网络上最容易扩散的是“外国人优先领取最低生活保障（生活保护）”的言论。但是，查看厚生劳动省的统计数据可以发现，在所有领取家庭中，户主为外国人的比例仅为 约2.8〜2.9%。在过去的十多年里，这个数字基本持平。\n相反，从在留外国人的年龄构成来看，他们中的大多数是 **20多岁到40多岁的适龄劳动一代 **。他们缴纳着厚生年金和健康保险费，发挥着作为 “高龄日本人”领取养老金和医疗费的“出资者” 的作用。填补日本人离去后适龄劳动一代的空白，延续日本社会保障系统寿命的，正是他们。\n第3章：治安与社交网络的偏见——“外国人犯罪”的逻辑解构 对治安的不安最能强烈地刺激“日本人优先”的情绪。然而，如果详细解读警察厅的统计数据和法务省的《犯罪白皮书》，就会发现网上“凶恶的外国人”这种印象，在多大程度上是由认知偏差所制造出来的。\n1. “总数”与“犯罪率”的冷静比较 根据2024年公布的统计数据，在所有被查获人员中，外国人所占比例 约为5.5%。剩下的约95%是日本人犯下的罪行。\n如果按每10万人口的查获人员数（犯罪率）进行比较，就能进一步看清本质。\n区分 每10万人口的查获人员（推算） 日本人（全年龄段） 约142.7人 在留外国人（定居者・居住者） ** 约120.0人** 中长期居住在日本的外国人的犯罪率，低于全体日本人的平均水平，这是统计上的事实。\n2. “世代”导致的偏差魔术 为什么“外国人很可怕”的印象会先入为主呢？其最大的原因在于犯罪学上的 “年龄构成” 差异。\n日本人： 约3成是犯罪率极低的老年人。因为这个群体拉低了“分母”，所以日本整体的数据看起来较低。 外国人： 因为是作为劳动力来到日本的，所以8成以上是 ** 在统计上容易发生犯罪的“青年到中年群体”**。 如果同样在“20多岁”这个条件下比较日本人和外国人的犯罪率，两者并没有显著差异。也就是说，并不是“外国人增加了导致治安恶化”，只不过是 “容易引发犯罪的年龄段（年轻人），以跨国者的形式存在于日本” 而已。\n3. 社交网络制造的“确认偏误” 社交网络的算法将我们的“不安”作为燃料。一旦发生1起外国人犯罪事件，它就会与“属性（国籍）”结合在一起被疯狂转发。于是，在我们的脑海中就只会强化“外国人又惹事了”的记忆。\n这就叫做 “确认偏误（Confirmation Bias）”。占总数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-cn/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-cn/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++一点一点制作新年贺卡制作应用的直播。” “虽然不知道完成前需要直播多少次，但我会作为一个系列逐步推进。” “基本上我会默默地进行工作，希望大家能把它作为工作背景音（BGM）来观看。”\n目标应用概述 “我希望在这个应用中，能够设计新年贺卡的背面。” “加入插入照片、调整字体，以及使用AI进行图像处理和插图生成的功能，最终计划将其上传到 Microsoft Store。”\n今天的工作目标 “作为第一期的今天，我们将搭建环境并建立基础。” “具体来说，\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-cn/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 导入到 [受信任的根证书颁发机构] → [证书] 中。\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-cn/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 年左右，当时我了解到了虚幻引擎的视觉化编程语言 Blueprint。）\n因为不会写代码就无法动手实现。这难道不可惜吗？ 在我工作过的地方，有许多非常优秀的人。\n他们懂得梳理逻辑。能熟练运用 Excel 的各种函数，也能一眼看穿问题的本质。 但是——一到“写代码”这一步，他们就束手无策了。\n“这个工作我每次都要看着操作手册做，能不能自动化呢？” “嗯，可以的。不过……那需要写代码才行……”\n这样的对话上演过无数次。\n每次我都忍不住想： “明明都懂逻辑，却被代码这堵墙挡住了去路，这真的太可惜了。”\n低代码编辑器，一种新的选择 其实在上一份工作中，我参与了可以通过 GUI 操作的 2D CAD 软件开发。 所谓的 CAD，不就是用鼠标把图形拼搭起来吗？ 也就是说，那是一个 “通过操作来构建逻辑” 的世界。\n我当时就觉得：“这和低代码简直是绝配啊。”\n如果再往前追溯，从学生时代起，我就一直在做图像处理、数值计算、Windows 工具、社交媒体自动发帖工具等等。 一有灵感我就会马上写代码，量产了很多小程序。 我觉得起码有 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 还是测试版，并未完全成熟。 还有许多需要改进的地方，也有许多我想加入的功能。\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-cn/p/logicpad-%E9%96%8B%E7%99%BA%E7%A7%98%E8%A9%B1/","title":"LogicPad 开发秘辛"},{"content":"如何使用 PowerShell 批量删除 Excel、Word 等的元数据（个人信息） 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 属性。\nWord 的情况 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-cn/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/","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就是这样。\n用数学的话来说，这被称为“最密堆积问题（Sphere Packing Problem）”，即寻找将球体最密集地填满空间的方法。\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-cn/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/","title":"通俗易懂地讲解开普勒猜想"},{"content":"AI开发的壁垒 〜虽然到了八合目，但接下来的路才是地狱〜\n大家好，我是kenji。\n最近，经常听到有人说“拜托AI，结果连应用都做出来了！”这样的话。 我们已经越过了无代码(No-code)和低代码(Low-code)的时代，进入了“Vibe coding（凭感觉写代码）”之类的阶段。\n例如，如果你说“做一个可以编辑图片并发布到社交网络的应用”，AI就会为你输出代码甚至UI。 很厉害吧，是不是觉得已经不需要人类了呢？\n但是呢，那 就像穿着凉鞋降落在富士山的八合目一样 啊。\n登到八合目之前看起来“轻而易举” 用AI进行开发，一开始真的非常轻松。 文件IO？反正能跑就行。 网络？嗯，能连上。 数据库？用JSON就够了吧。 UI？ChatGPT给我吐出了React代码。 支付？复制粘贴一下Stripe的API就行了。\n到了这里，你就会产生一种错觉：“我该不会已经是工程师了吧？” 但是，真正的地狱才刚刚开始。\n为什么会陷入僵局？ 理由很简单，因为“AI做得有模有样，但最终的调整全都抛给了人类”。\n文件IO会导致数据丢失 数据库缺乏规范化，搜索很慢 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-cn/p/ai%E9%96%8B%E7%99%BA%E3%81%AE%E5%A3%81/","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 错误。 模型的准确 I/O 规范可以使用 Netron 等工具确认。 ✅ 总结 项目 内容 使用API Windows.AI.MachineLearning (WinRT) 语言 C++（基于 Win32） 推荐方法 通过 C++/WinRT 头文件 优点 原生运行 ONNX 模型，也支持 GPU 注意 注意模型的输入名称和 Tensor 形状 ✅ 替代方案：写给不想使用 WinRT 的人 如果使用 Microsoft 提供的 ONNX Runtime，就可以 在完全不使用 WinRT 的情况下从 C++ 处理 ONNX 模型。 它支持跨平台，在 Windows/Linux 上也可以使用通用代码。 📌 结语 Windows ML (Microsoft.Windows.AI) 是一款强大的 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-cn/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/","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-cn/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/","title":"从 C++ 调用 TinyLLaMA 的步骤（使用 llama.cpp）"},{"content":"✅ 使用访问令牌的发布方法（Slack Web API） Slack 的「OAuth Token（如 xoxb-〜）」是使用 Slack 的 Web API 进行发布的密钥。 在这种情况下，与 Webhook 不同，它是向 Slack API 端点 发送带有 Authorization: Bearer 请求头的 POST 请求。\n🔑 必要前提 在 Slack 应用中需要将 chat:write 包含在 OAuth 作用域（Scope）中：\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-cn/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 URL 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-cn/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/","title":"如何使用 C++（Win32 API + WinHTTP）向 Slack 发布消息【支持 Webhook】"},{"content":"市场导向与产品导向 大家好，我是 kenji。\n偶尔在商业书籍或策划书里，\n“我们采用的是市场导向（Market-in）战略” “这是产品导向（Product-out）型呢”\n会看到类似这样的话……。\n但是，市场导向？产品导向？到底哪个更厉害？？？\n大家会不会有这样的疑问呢？\n所以这次，关于“市场导向”和“产品导向”这两个概念， 我想尽量用通俗易懂的方式，带点辛辣地来聊一聊。\n简单来说就是… 市场导向（Market-in）：倾听市场（Market）的声音，然后配合需求去制造商品 产品导向（Product-out）：把自己认为好的东西（Product）造出来，推向世界 就这么简单。非常纯粹。\n比如用拉面店来打比方… 市场导向的拉面店， 感觉就像是：“最近家系拉面很流行啊。好，我们就多放点油脂和大蒜吧！”\n产品导向的拉面店， 感觉就像是：“我做的这个豆乳罗勒盐味拉面，简直最棒了，你们快来吃吧。”\n要说哪个才是正确答案的话…其实都对 市场导向因为迎合了顾客的需求，所以“畅销的概率很高”， 但很难诞生出突破性的想法或创新。\n产品导向则是“将自己坚信的正义具象化”，所以非常尖锐且充满魅力， 但一旦没对上电波，就不会引起任何人的共鸣。\niPhone 就像是产品导向 在大家都说“智能手机根本不需要”的时代，Apple 推出了 iPhone。\n这已经 完全是产品导向 的成功案例了。\n如果听取用户的声音，肯定会被说“没有键盘的手机？不可能不可能”，然后就此结束。\n但是产品导向很容易变成“自我满足” 偶尔会有企业或个人说“我们是产品导向型的”，\n哎，那不就是单纯的无视用户吗？\n有时候我也会这么想。\n“因为想做就做了。但是没卖出去”， 这不叫产品导向，而是“孤芳自赏”了。\n市场导向也有陷阱 另一方面，市场导向也不是万能的。\n如果说“只要用户有需求我们就全做！”， 那么产品的核心就会动摇，最终谁也打动不了。\n不断地添加功能，回过神来发现已经变成了一个混沌的工具，就是这种情况。\n真正厉害的是，“两者兼顾的人” 优秀的产品，能够精准地把“用户真正想要，却无法用语言表达出来的东西” 呈现出来。\n也就是说，“用产品导向的思维，去获得市场导向的共鸣”。\n这话说起来简单，做起来却极其困难。 但如果能做到这一点，就能一跃成为“神级产品”。\n结论：比起词汇，用户的反应才是一切 是市场导向，还是产品导向。 到底哪个才是正确的，这种问题其实没多大意义。\n我认为，“有没有真正触达用户的心？”这才是全部。\n至于“我们走的是偏向哪种的战略”， 这种话只要事后能写在营销资料上就可以了。\n这就是关于市场导向和产品导向的话题啦！\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-cn/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/","title":"市场导向与产品导向"},{"content":"“任何数字最终都会变成1”是真的吗？——玩转考拉兹猜想 大家好！我是kenji。\n突然问一下，如果你听说“任何数字最终都会变成1的规则”， 会不会觉得有些不可思议？\n比如19，或者87，甚至1000000也是如此。 按照特定的规则去处理数字，不知为何最后都会收敛到“1”。\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 确实变成了“1”。欢迎回来！\n用代码试试看：用Python写考拉兹猜想 好了，这种时候写代码测试最快！ 让我们用Python输出一下“考拉兹数列”。\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顺便说一下，即使从 27 开始，也同样会到达1。\n1 print(collatz(27)) 运行结果：\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京呢……？\n能想到这点的你很敏锐。 实际上，用计算机已经验证到了“2的68次方”左右， 全部都到达了1。难以置信……。\n但是，“全部都会这样”并没有在理论上被证明。 这就是数学世界里的“未解决问题”。\n考拉兹是谁？ 读到这里，你肯定会想“考拉兹到底是谁？”吧。 下面就好好介绍一下！\n姓名：洛塔尔·考拉兹（Lothar Collatz） 国籍：德国 生卒年：1910年〜1990年 头衔：数学家（活跃于泛函分析和数论领域） 他在1937年提出了这个猜想， 此后，在长达80多年的时间里，谁也没能证明，也没能推翻。\n顺便一提，这个问题虽然如此简单，却又无比深奥， 以至于连保罗·埃尔德什（超著名的数学家）都这样说过：\n“数学还没有成熟到足以解决考拉兹猜想。”\n也就是说，人类的数学水平可能还没赶上这个谜团……。\n不需要“复杂的公式” 考拉兹猜想的美妙之处在于，任何人都能玩。\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;) 这能一口气输出“1～20”的考拉兹数列。\n结论：这个世界，果然很不可思议 这就是考拉兹猜想。\n明明极其简单 却没人能证明 在数学界是个大难题 它就像是一个不可思议的集合体。\n即使是编程初学者也能尝试，请务必玩玩看哦〜！\n推荐链接（面向感兴趣的人） 维基百科：考拉兹猜想 陶哲轩论文（英文） 用Python做一个可视化版本也会很有趣哦！（如果有需求我会做的） 如果想了解更多这种“不可思议的数学×编程”题材， 请随时向我提出“想了解更多”的请求。 之后，我还会介绍黎曼猜想、素数的故事等各种内容！\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-cn/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 ※ 如果想在频道（Channel）中发布消息，还需要 ChannelMessage.Send 权限\n3. 记录客户端 ID 和租户 ID 记录显示在「概述」选项卡中的以下两项：\n应用程序（客户端）ID 目录（租户）ID 4. 创建客户端密码（Client Secret） 进入「证书和密码」选项卡 选择「新客户端密码」 \u0026gt; 设置过期时间，然后点击「添加」 务必当场记录 显示的值（密码） 🔐 获取访问令牌（OAuth2） 获取令牌时使用 client_credentials 流程。\n使用 curl 执行以下命令，获取访问令牌。\n1 2 3 4 5 6 7 curl -X POST ^ https://login.microsoftonline.com/{租户ID}/oauth2/v2.0/token ^ -H \u0026#34;Content-Type: application/x-www-form-urlencoded\u0026#34; ^ -d \u0026#34;client_id={客户端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; } 🔍 获取聊天 ID 的方法 可以通过 GET /v1.0/me/chats 来查看聊天 ID。\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-cn/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/","title":"如何使用 C++ 向 Microsoft Teams 发送消息（WinHTTP + Graph API）"},{"content":"我结合UI指南资料，整理了海外界面UI（表单）中关于“必填”标记的相关内容。\n📌 主要必填标记及最佳实践 使用星号 (*)\n一般最为普及，在必填字段上添加“*”。 但是，必须在表单开头添加“ 为必填项”等说明* (Nielsen Norman Group, 加州州立大学北岭分校)。 也有使用颜色进行强调的例子（如红色文字）。 在标签上明确标示 “Required” 或 “(required)”\n通过在标签内添加“Required”文字，可以向屏幕阅读器明确提示，从而提高无障碍访问能力 (Deque)。 结合使用 ARIA 属性和 HTML5 的 required 属性\n除了视觉上的显示，还可以使用 aria-required=\u0026quot;true\u0026quot; 或 \u0026lt;input required\u0026gt;，在程序层面上告知其为必填项 (Deque)。 使用 “(optional)” 明示选填字段\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 (加州州立大学北岭分校, 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-cn/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 的方法 让您能够在命令行中使用 Google 的生成式 AI“Gemini”的工具“Gemini CLI”。 在本文中，我们将尽可能以通俗易懂的方式，为您讲解在 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. 安装完成！下一步要做什么 至此，Windows 上的 Gemini CLI 就安装完成了。 今后，您就可以通过命令行使用 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-cn/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/","title":"如何在 Windows 环境下安装 Gemini CLI"},{"content":"再次荣获 Microsoft MVP（2025-2026）！ 大家好，我是 kenji。\n向大家汇报一下。今年我也成功荣获了 Microsoft MVP（最有价值专家）。这也是我 ** 第 9 次** 获奖。\n非常感谢一直支持我的各位。\nMicrosoft 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-cn/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/","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支持操作系统级别的高级控制 鼠标与键盘的全局钩子、窗口样式的微调、系统菜单操作等， 也能实现 在普通语言或库中难以完成的控制。\n缺点 开发效率低 GUI 的构建也完全需要通过代码来实现，有时 仅制作一个按钮就需要几十行代码。 更改设计时的修改也很繁琐，与使用 UI 框架的开发相比，生产力较低。\n维护性容易下降 消息循环和窗口过程等 结构特殊的代码 很多，在可读性和可重用性上存在困难。 也有不适合团队开发或长期维护的一面。\n适配现代 UI 很麻烦 高 DPI 适配、触摸界面、无障碍功能、深色模式等，很难应对近年来对 UX（用户体验）的要求。 必须逐一手动进行适配，非常费力。\n不支持跨平台 因为完全是 Windows 专用的 API，无法移植到 macOS 或 Linux。 如果考虑到多平台部署，则需要选择其他技术。\n学习成本极高 必须理解句柄、GDI、COM、OLE 等 在现代已经不太使用的概念和机制。 文档也有很多是旧的，学习需要时间和毅力。\n适合的用途 文件启动器或快捷键辅助等 轻量级工具 剪贴板操作或 IME 控制等 系统实用程序 全局钩子或窗口捕获等 原生控制系应用 与硬件紧密协作的 驱动辅助工具 不适合的用途 重视现代 UI/UX 的 面向普通消费者的应用 速度优先的 原型制作或 MVP 开发 以长期运营或团队开发为前提的 大规模项目 需要支持多个操作系统的 跨平台产品 评价总结 维度 评价 执行速度 ◎ 非常快 内存效率 ◎ 优秀 开发速度 × 慢 维护性 × 低 跨平台支持 × 不支持 现代 UI 支持 × 弱 OS 控制自由度 ◎ 压倒性地高 结论 Win32API + C++ 是适合“想要自己处理操作系统的一切”的开发者的工具。 虽然它的力量非常强大，但在学习和运用上也需要相应的心理准备。\n是否有“特意去选择”的价值，取决于你目标应用的性质。\n不依赖 GUI 框架或现代语言，跃入 #include \u0026lt;windows.h\u0026gt; 的世界—— 这种选择，至今依然是有意义的。\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-cn/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”。 这次，我们将介绍使用 vcpkg 安装 libcurl（支持OpenSSL），并在Visual Studio中顺畅使用的步骤。\n安装vcpkg（仅限未安装的用户） 首先来安装 vcpkg。请在 PowerShell 中执行以下步骤。\n1 2 3 git clone https://github.com/microsoft/vcpkg cd vcpkg .\\bootstrap-vcpkg.bat ※如果尚未安装Git，请从Git官网进行安装。\n安装libcurl（支持OpenSSL） 接下来，使用vcpkg安装 libcurl。要指定支持OpenSSL的64位版本，请执行以下命令：\n1 vcpkg install curl[ssl] --triplet x64-windows 执行此命令后，所需的依赖项（如OpenSSL等）也会自动设置。\n与Visual Studio的集成设置 为了在Visual Studio项目中方便地使用通过vcpkg安装的库，请使用以下命令进行集成设置。\n1 vcpkg integrate install 进行此设置后，在Visual Studio项目中将自动可以使用 #include \u0026lt;curl/curl.h\u0026gt;，无需再手动配置库路径或链接器设置。\n结语 至此，在Visual Studio中安装 libcurl（支持OpenSSL）的准备工作就完成了。\n使用vcpkg，可以统一管理麻烦的依赖关系 通过 vcpkg install curl[ssl] --triplet x64-windows 轻松安装libcurl 通过 vcpkg 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-cn/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正义与邪恶的对立结构 统治者与被统治者 觉醒的自己 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-cn/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年代～至今） 低代码/无代码开发是一种即使没有编程专业知识也能创建应用程序、网站、数据库等的开发方法。这一理念始于20世纪80年代，随着个人电脑的普及、互联网的发展和云技术的扩展，它已发展成为多种多样的平台。在本文中，我们将按时间顺序列举代表性的工具和服务，并介绍它们的特点和价格。\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等于一体的All-in-One工作区。还具备自定义数据库功能，有助于通过无代码方式改善业务流程。\nConstruct 3 / GameSalad 可以通过拖放制作游戏的工具。Construct 3支持HTML5，可以在浏览器上运行，在教育现场和独立开发者中很受欢迎。\n信息来源与补充 本文基于各产品的官方网站、维基百科以及高度可靠的资料和文章（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-cn/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/","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都写不出来的人……”这样高高在上的言论。\n但是，请等一下。\n真的能断言“写不出FizzBuzz＝不会编程”吗？\n重要的不是会不会，而是有没有处于能做到的“状态” 确实，FizzBuzz要求对语法的理解和基本的逻辑思维。所以被用来做“基础确认”也是可以理解的。\n但是，听我说。\n环境不同，结果也会不同。\n比如，\n在初次见面的面试官面前紧张的时候 突然被递给一块白板，手边没有编辑器的时候 突然想不起“那个，modulo是什么来着？”的时候 ……这种经历，大家都有过吧？毕竟都是人类。我觉得肯定有。\n所以，比起“能不能写出FizzBuzz”，“能不能让自己处于能写出FizzBuzz的状态”，其实更重要。\n常见的“只要训练就行”这种建议的陷阱 一说到这个话题，很容易就会出现“所以要每天练习！”这种建议。\n确实，通过反复练习能写得很流畅是事实，这本身也是件好事。但是，如果站在“写不出FizzBuzz就不合格”这个前提下，它可能就会变成纯粹的恐惧。\n也就是说，很容易变成“犯错了＝自己不行”这种思维结构。\n比如，早上睡懒觉的那天，是不是很容易觉得“我真是个懒虫……”？但那也许只是刚好身体累了而已。\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-cn/p/fizzbuzz/","title":"FizzBuzz"},{"content":"汉诺塔 你好！\n今天，我想一边展示Python的示例程序，一边为大家讲解“汉诺塔”。\n什么是汉诺塔？ 汉诺塔是一个使用3根柱子和多个圆盘的益智游戏。圆盘大小不一，最初按照从大到小的顺序堆叠在一根柱子上。规则如下：\n每次只能移动1个圆盘。 较小的圆盘上不能放置较大的圆盘。 这个益智游戏被认为是学习递归思维的最佳教材。递归是一种将某个问题分解为同类型的较小问题来解决的方法。在汉诺塔中，为了移动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 次移动。即使每秒移动一次，大约也需要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-cn/p/%E3%83%8F%E3%83%8E%E3%82%A4%E3%81%AE%E5%A1%94/","title":"汉诺塔"},{"content":"源代码的行数 你好！\n今天我想谈论一个稍微有些不同寻常的主题。\n那就是“与过去相比，源代码的行数增加了多少？”。\n例如，航天飞机的软件由大约42万行代码组成。这段代码为了满足NASA的高质量标准，经历了非常严格的开发过程。另一方面，在现代的大型软件项目中，代码行数超过数千万行也并不罕见。例如，据说Google的代码库达到了大约20亿行。\n像这样，软件的规模随着时代的变迁变得越来越大。\n但是，请等一下。\n代码行数的增加并不一定是坏事。为了添加新功能或满足用户需求，代码的增加是很自然的。然而，代码增加，出现Bug的风险也会随之升高。事实上，一项研究表明，当开源项目超过100万行时，Bug发生率呈现上升趋势。\n话虽如此，并非所有的项目都在以相同的方式增加代码。\n例如，Linux内核在1994年的1.0版本中大约有20万行，但在2015年的4.2版本中增加到了大约2000万行。这种增加是为了适应硬件的发展和添加新功能。\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-cn/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/","title":"源代码的行数"},{"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","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-cn/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/","title":"柯克霍夫原则"},{"content":"🎯 通过 C++/CLI DLL 从 C++ 执行 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++] → [常规] → [公共语言运行时支持] → 更改为 /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-cn/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++/CLI DLL 从 C++ 执行 PowerShell 的步骤"},{"content":"【Windows】查看许可证状态的方法（只需一条命令） 您是否曾经想过您的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-cn/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 转换参数 为了能在 iOS 设备（iPhone 或 iPad）上流畅播放，向您介绍用于转换视频的 ffmpeg 命令。\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-cn/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）”、“卡在 Logo 画面”或“运行极度不稳定”等严重的系统故障时，您可以使用 Google 官方提供的 “Pixel Update and Software Repair” 工具，通过浏览器安全地修复（恢复）设备的软件。\n本文将详细介绍具体的操作步骤和注意事项。\n1. 访问恢复工具 首先，请在您的电脑（Windows 或 Mac）浏览器（推荐使用 Google Chrome 或 Microsoft Edge）中，访问以下官方修复工具页面。\n🔗 Pixel Update and Software Repair 官网\n※注意事项※ 执行恢复过程可能会导致设备中的所有数据（照片、应用、联系人等）被全部清除（初始化）。如果设备仍可操作，请务必提前备份到 Google 云端硬盘等位置。\n2. 恢复前的准备工作 为了确保过程顺利，请做好以下准备工作。\n电池充电 如果过程中断电，设备可能会变成“砖头”（完全损坏）。请确保至少有 50% 的电量，最好充满电。 准备原装 USB 数据线 为了保证数据传输的稳定性，强烈建议使用设备附带的原装 USB-C 数据线。 （必要时）安装驱动程序 如果您使用的是 Windows 电脑，设备可能无法被正确识别。在这种情况下，请安装 Google USB 驱动程序。 3. 具体恢复步骤 准备就绪后，请按照屏幕提示进行恢复。\nStep 1: 选择运营商并连接设备 打开网站后，首先会显示选择通信运营商的界面。如果是无锁版或没有绑定运营商，请选择“其他（Other）”。 然后，使用 USB 数据线将电脑与 Pixel 设备连接。\nStep 2: 让设备进入“Rescue Mode（Fastboot 模式）” 根据屏幕提示，在设备关机状态下，同时长按“电源键”和“音量减键”，启动 Fastboot 模式（黑色背景，显示倒地的安卓机器人的画面）。\nStep 3: 在电脑端识别设备 在浏览器上点击“连接设备”按钮后，浏览器会弹出一个窗口，列表中会显示已连接的 Pixel 设备。选择目标设备并允许连接。\nStep 4: 下载并安装软件 识别到设备后，系统会自动为其选择最佳版本的 Android OS（固件）。点击“安装”后，电脑会开始下载软件，并直接将其刷入（Flash）设备中。\n⚠️ 警告: 在此过程中，** 绝对不要拔下 USB 数据线或关闭电脑电源。**\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-cn/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-cn/p/gmail%E3%82%92curl%E3%81%8B%E3%82%89%E9%80%81%E3%82%8B/","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-cn/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-cn/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":"高股息股票汇总 三菱UFJ金融集团（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-cn/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发布后运营: 收集用户反馈、修复漏洞、添加功能。 增长策略: 制定增加用户数的方法、向其他国家扩展及开发新功能的计划。 风险管理: 准备应对法律问题和技术故障的对策。 ","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-cn/p/%E7%9B%AE%E6%A8%99/","title":"目标"},{"content":"最近，我开始对皮革制品产生兴趣，并购买了各种各样的物品。在此过程中，我对皮革制品的保养也产生了兴趣，收集了一些相关用品，现在向大家介绍一下。\n最近购买的皮革保养产品 M.MOWBRAY DELICATE CREAM 价格: 约1,320日元\n这款乳霜具有补充营养、保湿和柔化效果。 虽然没有光泽，但非常适合水分多且需要滋润的皮革。 味道并不难闻，但稍微有一点气味。 因为是无色的，所以通用性很高。由于是比较清爽的乳霜， 与其他乳霜相比，稍微多用一点可能会更好。\nCollonil 1909 Supreme Creme Deluxe 价格: 约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-cn/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/","title":"皮革制品的保养"},{"content":"大家好！今天我们要聊聊“汉隆的剃刀” 今天我想写一写关于一个名字有些奇特的思考方式——“汉隆的剃刀”。只听名字的话，可能会觉得“好像有点可怕……？”，但实际上这是一个非常贴近生活、能给人带来温柔视角的概念。\n大家有没有过“那个人可能讨厌我……”的想法？ 比如，有没有过这样的经历？\n・微信/LINE 回复很慢\n・对上眼了，却没有打招呼\n・拜托的事情被无视了\n这种时候，是不是会不安地想：“难道是被讨厌了？”\n我也经常这样。然后就自己在一旁暗自沮丧。\n什么是汉隆的剃刀？ 这时候出场的就是“汉隆的剃刀”了。\n这个词原本在英语中叫 \u0026ldquo;Hanlon\u0026rsquo;s Razor\u0026rdquo;。\n意思大致是这样的：\n“能用愚蠢来解释的事情，就不要归咎于恶意。”\n……这种说法稍微有点刺耳对吧。\n如果说得再柔和一点，就是：\n“即使对方看起来像是在刁难你，也可能只是一时的疏忽或粗心。”\n就是这样一种思维方式。\n谁提出来的？罗伯特·J·汉隆是谁？ 据说这个词最早出现在 1980 年出版的《墨菲定律第二部》（Murphy’s Law Book Two）一书中。\n因为书的作者之一 罗伯特·J·汉隆（Robert J. Hanlon）提交的创意被原封不动地采用了，所以就被命名为“汉隆的剃刀”。\n顺便一提，这里的“剃刀（Razor）”指的是“剔除多余的东西，进行简单的思考”这样一种哲学意义上的工具，与奥卡姆剃刀等一样，是用来整理思绪的表达方式。\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-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-cn/p/%E3%83%8F%E3%83%B3%E3%83%AD%E3%83%B3%E3%81%AE%E5%89%83%E5%88%80/","title":"汉隆的剃刀"},{"content":"计算机基础知识 本页面介绍什么是计算机。\n计算机的定义 计算机是拥有以下5种设备的机器。\n输入设备 输出设备 存储设备 控制设备 运算设备 简单来说，计算机就是对特定的输入进行特定的处理，并将结果输出的机器。 它可以将输入的数据进行存储、运算和输出。控制则起到控制上述4种设备的作用。\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-cn/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-cn/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81ios%E3%82%A2%E3%83%97%E3%83%AA/","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-cn/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/","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-cn/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 应用程序。 对于这样的人，我推荐“Qt Extension Pack”。 只需安装此扩展包，即可一次性备齐主要的 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. 搜索“Qt Extension Pack” 在搜索栏中输入以下关键字：\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（需要将 Qt Designer 包含在环境变量 PATH 中）。\n总结 步骤 内容 1 启动 VSCode 2 打开扩展面板 3 搜索“Qt Extension Pack” 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-cn/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卡锁 主屏幕＞设置＞通用＞关于本机＞运营商锁\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-cn/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类问题是指，当给定一个“是”的证据（称为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-cn/p/pnp%E4%BA%88%E6%83%B3/","title":"P≠NP猜想"},{"content":"再次荣获 Microsoft MVP（2024-2025） 大家好，我是 kenji。 很高兴向大家报告，今年我再次荣获了 Microsoft MVP（最有价值专家）。这已经是我第 8 次获奖了。\n难得有机会，我想从“MVP 是什么？”开始简单写几句。\nMicrosoft MVP 是什么？ 说到 MVP，这里指的并不是体育运动中的最有价值球员（虽然偶尔会被问到……）。 Microsoft MVP（最有价值专家） 是颁发给那些积极向社区分享和传播有关 Microsoft 技术的知识与经验的人士的荣誉称号。\n例如撰写技术博客、在问答网站上解答问题、 公开示例代码、或者在活动中发表演讲等。 “将自己所知道的知识，以对他人有用的形式分享出来”——这种脚踏实地的活动会得到认可。\n获奖者遍布全球，但每年的名额有限，能够再次获奖也并非易事。 在这样的情况下，能再次获得这项认定，我真的感到非常感激。\n关于获奖理由 这次我是在“Developer Technologies（开发者技术）”类别中再次获奖的。 过去的一年里，我主要参与了以下活动：\n撰写关于 Microsoft 相关技术的博客文章 在技术问答网站上发布回答 在 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-cn/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/","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-cn/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-cn/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/","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-cn/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/","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-cn/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/","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-cn/p/%E5%90%9B%E6%AD%BB%E3%81%AB%E3%81%9F%E3%81%BE%E3%81%B5%E3%81%93%E3%81%A8%E3%81%AA%E3%81%8B%E3%82%8C/","title":"《请君勿死》"},{"content":"\n🔹 人物概要 与谢野晶子（Yosano Akiko，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-cn/p/%E4%B8%8E%E8%AC%9D%E9%87%8E%E6%99%B6%E5%AD%90%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/","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-cn/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 这是构建网站的命令。会在 public 目录下生成HTML文件。\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-cn/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 Request 代码管理 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 支持Particle提供的开发环境，从固件、库、云连接等全面支持物联网开发 C/C++ C/C++ Extension Pack Microsoft 支持C/C++开发 C/C++ C/C++ Runner franneck94 运行C/C++代码（支持gcc、msvc、cuda nvccc编译器） C/C++ Cortex-Debug marus25 支持Cortex-A/R/M微控制器的调试 Python Python Extension Pack Microsoft 支持Python开发 Python jupyter Microsoft 支持Jupyter Notebook开发 实用工具·UI扩展 Markdown 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-cn/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在 hugo 中启用 mermaid.js 步骤如下。\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: 输入账号/密码 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: 输入账号/密码 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-cn/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 确认重置前的提交 ID 使用 git reset --hard HEAD@{数字} 恢复到重置前的状态 以上就是撤销 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-cn/p/git-reset%E3%82%92%E5%8F%96%E3%82%8A%E6%B6%88%E3%81%99%E6%96%B9%E6%B3%95/","title":"撤销git reset的方法"},{"content":"MS-DOS 4.0 开源化 微软公司公开了约 40 年前发布的 MS-DOS 4.0 的源代码。 几乎完全是用 8086 汇编代码编写的。\ngithub 仓库 https://github.com/microsoft/MS-DOS\n参考网站 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-cn/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":" 编写可读代码的艺术 编程的原则 程序员修炼之道 支撑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-cn/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/","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-cn/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-cn/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/","title":"多显示器下每次开机DPI设置都被重置的解决方法"},{"content":"仅获取仓库的最新内容 可以使用以下命令仅获取仓库的最新内容。 当您想要节省磁盘空间或快速获取仓库时，这非常有用。\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-cn/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/","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的一个bug。在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-cn/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/","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-cn/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-cn/p/loadicon%E3%81%AFdestroyicon%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E5%BF%85%E8%A6%81%E3%81%AF%E3%81%AA%E3%81%84/","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-cn/p/%E7%94%9F%E6%88%90ai%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/","title":"关于生成式AI"},{"content":"使用 curl 生成二维码 注意：介绍的方法是由服务器端生成并返回二维码，因此服务器可能会保留日志。在将个人信息等机密信息转换为二维码时请务必小心。\n方法1 这是在命令提示符中生成二维码的方法。 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-cn/p/curl%E3%81%A7qr%E3%82%B3%E3%83%BC%E3%83%89%E7%94%9F%E6%88%90/","title":"使用 curl 生成二维码"},{"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-cn/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-cn/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 快捷键。 记住这些键盘操作快捷键，可以有效地提高开发效率。请务必加以利用。\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-cn/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/","title":"Visual Studio 快捷键一览"},{"content":"介绍如何在 Windows 10/11 中，将秀丸编辑器的 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-cn/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/","title":"在资源管理器的右键菜单中添加秀丸编辑器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-cn/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 Snipping Tool 是 Windows 自带的屏幕截图工具。您可以截取屏幕的一部分并保存，或者捕获整个屏幕，还可以进行录屏。\nSnipping Tool 启动方法 主要可以通过以下 3 种方法启动。\n按 Win键，输入 Snipping Tool 并按 Enter键。 按 Win键 + Shift + S键。 按 Win键 + R键，输入 snippingtool 并按 Enter键。 Snipping Tool 使用方法 保存截图的方法如下： 选择 相机 图标。 点击 新建 按钮。 选择要截取的范围。 点击 另存为 按钮。 输入保存路径和文件名并保存。 录制屏幕视频的方法如下： 选择 视频 图标。 点击 新建 按钮。 选择要录制的范围。 点击 开始 按钮。 录制屏幕。 点击 停止 按钮。 点击 另存为 按钮。 输入保存路径和文件名并保存。 参考 使用 Snipping Tool 捕获屏幕截图 ","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-cn/p/snipping-tool%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/","title":"Snipping Tool 使用方法"},{"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-cn/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/","title":"如何创建锁定计算机的快捷方式"},{"content":"什么是蒙提霍尔问题 蒙提霍尔问题（Monty Hall problem）是源自美国电视节目《Let\u0026rsquo;s Make a Deal》中的一个游戏，问题如下：\n前提条件：3扇门中只有1扇门后有奖品，其余2扇门后是没有奖品的。\n参赛者在3扇门中选择1扇。 主持人在参赛者未选择的2扇门中，打开1扇没有奖品的门。 主持人询问参赛者是否要更换选择的门。 此时，问题是参赛者改变选择好，还是不改变选择好。\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-cn/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-cn/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/","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-cn/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-cn/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-cn/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-cn/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/","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-cn/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/","title":"编程中可用的字体集合"},{"content":"介绍如何通过命令“hide”启动秀丸编辑器。 注：此方法已在Windows 10/11上进行测试。\n打开注册表编辑器。 导航到 HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths。 在 App Paths 下创建一个名为 hide.exe 的项。※该项名称中 .exe 前面的部分即为命令名。 将 hide.exe 项的 (默认) 值设置为秀丸编辑器的可执行文件路径。在我的环境中，路径为 \u0026quot;C:\\Program Files (x86)\\Hidemaru\\Hidemaru.exe\u0026quot;。 在 hide.exe 项下创建一个名为 Path 的字符串值。 将 Path 的数值数据设置为包含秀丸编辑器可执行文件的文件夹路径。在我的环境中，路径为 \u0026quot;C:\\Program Files (x86)\\Hidemaru\u0026quot;。 现在，在按 Win键 + R键 打开的 运行 窗口中，你可以使用 hide 命令启动秀丸编辑器。此外，在命令提示符中也可以使用 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-cn/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/","title":"通过命令“hide”启动秀丸编辑器的方法"},{"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-cn/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/","title":"数学的未解决问题"},{"content":"收集了各种版本信息对话框 Windows 11 首先是现在正在使用的Windows 11的版本信息。 IntelliJ IDEA (Community Edition) 这是写这篇博客的环境。 Visual Studio Code 这也是经常使用的编辑器。意外地很简单。 Visual Studio 这是在C++中使用的开发环境。 LINE(Windows) 这是LINE的Windows版。 Paint.NET 这是图像编辑软件。 sakura编辑器 这是文本编辑器。 Google Chrome 这是Google Chrome。Edge出现后就很少使用了。 Firefox 这是Firefox。最近很少使用了。 Microsoft Edge 这是Microsoft Edge。最近经常使用这个。 OBS Studio 这是OBS Studio。最近很少使用了。 TradingView 这是TradingView。最近用来查看美元/日元的图表。 Spy++ 这是Spy++。是包含在Windows SDK中的工具。 depency walker 这是depency walker。是包含在Windows SDK中的工具。 resource hacker 这是resource hacker。是用来编辑和提取可执行文件资源的工具。 Microsoft Excel 这是Microsoft Excel。 bandy cam 这是bandy cam。视频捕捉工具。 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-cn/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-cn/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/","title":"GIF动画屏幕录制工具"},{"content":"PMP备考学习总结 这是PMP备考学习的总结。\n概述 PMP是项目管理的资格认证。它是基于名为PMBOK（最新第7版）的指南的资格认证。 PMP考试时间为230分钟，共180道题，其中5道为测试题不计分，因此在175道计分题中答对106道以上即可及格。 回答为选择题，大部分是单选题（4选1），但也有5选1或多选题。\n仆人式领导 不是自上而下发号施令，而是自下而上提供支持的领导风格。\n仆人式领导的10个原则（特征） 倾听 共情 治愈 觉察 劝服 概念化 远见 管家 承诺员工成长 构建社区 敏捷宣言 4个核心价值观 我们一直在实践中探寻更好的软件开发方法， 身体力行的同时也帮助他人。 由此，我们体会到了以下价值：\n个体和互动 高于 流程和工具 工作的软件 高于 详尽的文档 客户合作 高于 合同谈判 响应变化 高于 遵循计划 也就是说，尽管右项有其价值， 我们更重视左项的价值。\n敏捷宣言\n敏捷 敏捷宣言背后的12条原则 我们最重要的目标，是通过持续不断地及早交付有价值的软件使客户满意。 欣然面对需求变化，即使在开发后期也一样。为了客户的竞争优势，敏捷过程掌控变化。 经常地交付可工作的软件，相隔几个星期或几个月，倾向于采取较短的周期。 业务人员和开发人员必须相互合作，项目中的每一天都不例外。 激发个体的斗志，以他们为核心搭建项目。提供所需的环境和支援，辅以信任，从而达成目标。 不论团队内外，传递信息效果最好效率也最高的方式是面对面的交谈。 可工作的软件是进度的首要度量标准。 敏捷过程倡导可持续开发。责任人、开发人员和用户要能够共同维持其步调稳定延续。 坚持不懈地追求技术卓越和良好设计，敏捷能力由此增强。 以简洁为本，它是极力减少不必要工作量的艺术。 最好的架构、需求和设计出自自组织团队。 团队定期地反思如何能提高成效，并依此调整自身的举止表现。 敏捷宣言背后的原则\n术语 史诗（Epic，概要） 用户故事（User Story，注册到产品待办事项的单位，进行优先级排序的单位） 任务（Task，技术性工作项目，所需时间估算的对象） 产品待办事项 / 产品待办事项条目（Product Backlog / Product Backlog Item） 产品负责人（Product Owner） 相关方/干系人（Stakeholder） 敏捷实践指南（书籍） 精益开发（Lean Development） 看板（Kanban） 价值链（Value Chain） AC (Actual Cost, 实际成本) EV (Earned Value, 挣值) PV (Planned Value, 计划价值) EVA (Earned Value Analysis, 挣值分析) SPI (Schedule Performance Index, 进度绩效指数 = EV / PV) CPI (Cost Performance Index, 成本绩效指数 = EV / AC) EVM (Earned Value Management, 挣值管理) BAC (Budget at Completion, 完工预算) ETC (Estimate To Complete, 完工尚需估算) EAC (Estimate At Completion, 完工估算) 职能型（Functional） 矩阵型（Matrix） 项目型（Projectized） 仆人式领导（Servant Leadership） 塔克曼阶梯理论（形成阶段、震荡阶段、规范阶段、成熟阶段、解散阶段） 团队章程（Team Charter） 计划扑克（斐波那契数列） 回顾会议（Retrospective，反思活动） 虚拟团队（Virtual Team） 项目章程（Project Charter） 冲突（面对/解决问题、合作、妥协、缓和/包容、强迫、撤退/回避） 价值流图（Value Stream Mapping） 辅导（Mentoring） 教练（Coaching） 培训（Training） 道格拉斯·麦格雷戈的XY理论（Theory X and Theory Y） SWOT分析：Strength（优势）、Weakness（劣势）、Opportunity（机会）、Threat（威胁） SECI模型（Socialization社会化、Externalization外化、Combination组合化、Internalization内化） PDCA, PDSA PESTLE (Political政治、Economic经济、Social社会、Technological技术、Legal法律、Environmental环境) VUCA (Volatility易变性、Uncertainty不确定性、Complexity复杂性、Ambiguity模糊性) 蒙特卡洛分析（Monte Carlo Simulation） 决策树分析（Decision Tree Analysis） 预期货币价值（EMV, Expected Monetary Value） 净推荐值（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: Fixed Price Incentive Fee) 范围蔓延（Scope Creep） 卡诺模型（Kano Model） 资金分配法 / 资金限制平衡（Funding Limit Reconciliation） 100分法 (100-Point Method) MoSCoW法则 (Must, Should, Could, Won\u0026rsquo;t/Would) 需求跟踪矩阵 (Traceability Matrix) WBS词典 (WBS Dictionary) 速率 / 速度（Velocity，每个迭代中完成的故事点数） 速率图表 (Velocity Chart) 相关方参与度评估矩阵（不知晓、抵制、中立、支持、领导） 阶段关口 (Phase Gate) 信息发射源 (Information Radiator) 燃尽图 (Burndown Chart) 燃起图 (Burnup Chart) 累积流量图 (Cumulative Flow Diagram, CFD) QCD (Quality质量、Cost成本、Delivery交付) 螺旋型 (Spiral) 关键链 (Critical Chain) 特性 (Feature) 迭代 / 冲刺 (Iteration / Sprint) 迭代的 (Iterative) 增量的 (Incremental) 增量 (Increment，增量的可交付成果) 韧性 / 弹性 (Resilience) 管家精神（Stewardship）：诚实守信的行为和负责任的行动（决策） 升级 (Escalation) KPT (Keep保留、Problem问题、Try尝试) RACI矩阵（Responsible执行、Accountable负责、Consulted咨询、Informed知情） PMO（Project Management Office，项目管理办公室）：支持型、控制型、指令型 节奏 (Cadence) 裁剪 (Tailoring) 神经逻辑层次（环境、行为、能力、信念/价值观、身份/自我认知） 商业论证（Business Case：记录项目目的、收益、风险、投资回报等的文档） 趋势分析（使用趋势图进行，并运用数学技术根据结果预测未来的成果） 质量管理计划（定义有关项目可交付成果质量的策略和方法） 治理过程（Governance Process） 产品负责人（产品愿景、产品待办事项优先级排序、产品发布） 项目出资人/发起人（Project Owner/Sponsor：项目的发包方/委托方） 项目经理（管理整个项目） 项目主管/组长（在现场指挥） 项目成员（推进项目） 混合方法（Hybrid Approach） 最小可行产品 (MVP, Minimum Viable Product) 迭代评审 (Iteration Review) 研讨会 (Workshop) 项目收益管理计划（项目目标的收益、实现收益的战略手段以及实现收益的时间框架） 关键绩效指标 (KPI, Key Performance Indicator) 现场 (On-site) 类比估算 (Analogous Estimating) 三点估算 (Three-Point Estimating) 参数估算 (Parametric Estimating) 项目评审 (Project Review) 大爆炸法 (Big Bang Approach) DSDM（动态系统开发方法） 布鲁克斯法则 (Brooks\u0026rsquo;s law) 大爆炸法（同时一次性全部导入） 风险登记册（Risk Register：作为识别项目中潜在挫折的风险管理工具而使用的文档） 风险登记册 情境领导理论 (Situational Leadership Theory：根据对方的情况采取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-cn/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-cn/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-cn/p/%E4%B8%83%E8%8D%89%E7%B2%A5%E3%81%AE%E3%83%AC%E3%82%B7%E3%83%94/","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 - 片头曲 たしかなこと / 小田和正 - 翻唱：朴允荷 【日本治愈歌曲】Hana／Kosuke Atari（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-cn/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E9%82%A6%E6%A5%BD/","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) Bob Dylan - 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 Feeling 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-cn/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-cn/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-cn/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/","title":"向能做到自己做不到的事情的人致敬"},{"content":"斯普拉遁2 斯普拉遁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-cn/p/%E3%82%B9%E3%83%97%E3%83%A9%E3%83%88%E3%82%A5%E3%83%BC%E3%83%B32/","title":"斯普拉遁2"},{"content":"关于获得Microsoft MVP (2023-2024) 这次我荣获了Microsoft MVP (2023-2024)。 这是我自2017年以来连续第7年获奖。\n获奖类别是 Developer Technologies。\n回顾我过去的活动，我进行了以下活动：\n在GitHub上公开代码 在博客和SNS（如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-cn/p/microsoft-mvp%E5%8F%97%E8%B3%9E%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A62023-2024/","title":"关于获得Microsoft MVP (2023-2024)"},{"content":"古希腊三大作图问题 给定一个圆，作一个与该圆面积相等的正方形（化圆为方问题） 给定任意角，将其三等分（三等分角问题） 给定一个立方体，作一个体积为其两倍的立方体（倍立方体问题） 阿基米德螺线 在平面上，使射线OB绕定点O匀速旋转。设初始位置为OA， 在其从OA开始旋转的同时，点P从O点出发，沿OB以恒定速度移动，此时点P所描绘的 曲线即为阿基米德螺线。\n帕普斯定理 摆线 尼科梅德斯蚌线 狄奥克莱斯蔓叶线 费马切线法 笛卡尔法线法 年表 年份 事件 约公元前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-cn/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%AD%B4%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-cn/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/","title":"推荐使用轨迹球Deft Pro（M-DPT1MRBK）"},{"content":"什么是 wxWidgets wxWidgets 是一个在 Windows、Mac、Linux、Android、iOS 等平台上运行的 C++ GUI 库。\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-cn/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-cn/p/%E6%98%A0%E7%94%BBtodo%E3%83%AA%E3%82%B9%E3%83%88/","title":"电影待办清单"},{"content":"帅气的Web页面模板\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-cn/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":"帅气的Web页面模板（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++中以ISO8601格式输出当前时间的方法。\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-cn/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++中以ISO8601格式输出当前时间"},{"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-cn/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/","title":"如何创建关闭 Windows 的快捷方式"},{"content":"本文将介绍如何在paint.net中为图片的特定部分添加马赛克。\n在将图片上传到网络时，有时可能需要为图片的特定部分添加马赛克， 使用paint.net可以快速地对图片进行处理。\n步骤 1. 在paint.net中打开需要进行马赛克处理的图片 2. 使用选择工具，选择想要打马赛克的部分（可以多选） 3. 选择 菜单＞效果＞扭曲＞马赛克 通过单元格大小设置马赛克处理的粗糙度。数值越大，隐蔽性越高。 [缩小] 选择多重采样双线性法 [放大] 选择最近邻接法 点击确定关闭对话框。\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-cn/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-cn/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/","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-cn/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 Microsoft 提供的在线开发环境。但是，无法执行或调试需要编译的语言。\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-cn/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 个元素的 bool 值数组，并将所有元素初始化为 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数组不使用 true 而是使用 false 进行初始化（这样更快） 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-cn/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/","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-cn/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-cn/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/","title":"如何使用Salesforce的SOQL获取每日创建的记录数"},{"content":"\n所需条件 Google 账号 步骤 访问 https://colab.research.google.com/ 选择“文件” -\u0026gt; “新建笔记本” 粘贴并运行以下代码 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-cn/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/","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申请流程 【免去繁琐设置！】想要体验Twitter API，强烈推荐Google Colaboratory【内附源码】 【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-cn/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/","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-cn/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字符集（标准字符编码等） 文字方向（从左到右、从右到左、从上到下向左等） 文本 字体 格式 数字（小数点字符、千位分隔符、分隔位数等） 日期和时间（年月日的表示方式，使用伊斯兰历/公历/犹太历/日本历等不同历法的差异，以及其他） 日期和时间的时差 货币信息 国际化与本地化 - Wikipedia\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-cn/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-cn/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-cn/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的开源调试器。专门用于“动态分析”，即在执行文件的同时通过步进执行来分析内容和内存状态，常用于破解（供分析用的挑战程序）和调查恶意软件的行为。\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-cn/p/%E5%88%86%E6%9E%90%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6exe%E5%86%85%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-cn/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-cn/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":"前言 我使用的是美式（US）键盘，在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-cn/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 中查找已添加到 PATH 路径的可执行文件位置的方法 在指定可执行文件并运行命令时，有时我们会想知道该可执行文件到底在哪里。这种情况下，可以使用以下命令来查找可执行文件的位置。\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-cn/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 中查找已添加到 PATH 路径的可执行文件位置的方法"},{"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-cn/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-cn/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/","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-cn/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/","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-cn/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/","title":"在hugo中启用KaTeX（类似LaTeX的数学公式显示）的方法"},{"content":"人性的弱点 https://amzn.to/3YTv0Dr\n被讨厌的勇气 https://amzn.to/3n3SVCQ\n百岁人生：长寿时代的生活和工作 https://amzn.to/3TtKUDf\n高效能人士的七个习惯 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-cn/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/","title":"推荐的商业书籍"},{"content":"推荐的Chrome扩展 介绍一下我目前正在使用的Chrome扩展。虽说是Chrome扩展，但在Microsoft Edge中也可以使用。\n1. simpleGestures 这是一个使浏览器能够使用鼠标手势的扩展。 无需使用键盘或将鼠标对准工具栏按钮即可操作浏览器。\n例如，按住鼠标右键向左滑动可以后退，按住鼠标右键向右滑动可以前进等。\n由于该扩展是开源的，因此可靠性很高。\nsimpleGestures github 2. uBlock Origin 这是一个拦截广告的扩展。由于它是开源的，所以可靠性很高。此外，它的CPU和内存使用率也很低，运行十分流畅。\nuBlock Origin github 3. DeepL翻译 这是一个可以在页面内使用全球知名的翻译服务DeepL进行翻译的Chrome扩展。在浏览器上选择想要翻译的文本，就会显示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-cn/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":"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-cn/p/egui%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/","title":"尝试使用 egui"},{"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-cn/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":"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-cn/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-cn/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-cn/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-cn/p/hugo%E3%81%A7html%E3%82%BF%E3%82%B0%E3%82%92%E4%BD%BF%E3%81%86/","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-cn/p/github%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B5%E3%83%BC%E5%8B%9F%E9%9B%86/","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-cn/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-cn/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-cn/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/","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-cn/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-cn/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-cn/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/","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-cn/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/","title":"全选网页内的所有复选框"},{"content":"威尔逊定理 当 $p$ 为素数时，$(p−1)!≡−1 \\pmod p$ 成立\n欧拉公式 $e^{iπ}+1=0$\n费马大定理 对于 $n≥3$ 的整数 $n$，不存在满足 $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-cn/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-cn/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 开发的相对较新的开源编程语言 没有垃圾回收，是一种专注于系统编程的高速语言 拥有“所有权”和“借用”这种独特的机制作为语言规范，并保证内存安全 跨平台运行 标配 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-cn/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-cn/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-cn/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-cn/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-cn/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-cn/p/rust%E3%81%A7messagebox%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/","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-cn/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/","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-cn/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-cn/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/","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. Hasse, 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-) 出生于英国的数学家。在岩泽主猜想、贝赫和斯维讷通-戴尔猜想（BSD猜想）等研究中做出了巨大贡献，是该领域的领军人物。\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-cn/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E5%81%89%E4%BA%BA%E3%81%9F%E3%81%A1/","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 输入体验 文档 - 写字板 ","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-cn/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/","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-cn/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 中清空所有帖子和附件的命令。 打开开发者控制台，在 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-cn/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。按两次可恢复到原来的窗口状态。想瞬间查看桌面时非常方便。 Win + M。最小化所有应用。按两次无法恢复原状。 语音输入 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 关机 在使用 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 则为强制重启。 睡眠 在使用 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 可进入休眠状态。 注销（登出） 在使用 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)] [キャンセル] 将命令提示符的输出保存到剪贴板 在 echo \u0026quot;hello\u0026quot; | clip 等命令后加上 | clip（管道符 + 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-cn/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/","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-cn/p/paint.net%E3%81%AE%E9%AD%85%E5%8A%9B/","title":"paint.net的魅力"},{"content":"要为 Github 仓库配置自定义域名，你需要修改域名的 DNS 设置。 这里我们假设你是在 お名前.com 管理你的域名来进行说明。 在其他注册商处，也可以通过重写 A 记录来进行类似的设置。\n在お名前.com中修改 DNS 设置 要修改域名的 DNS 设置，请登录 お名前.com 的管理界面。 登录后，进入域名管理界面。 进入域名管理界面后，修改 DNS 设置。 要修改 DNS 设置，请按照以下步骤操作：\n访问 https://www.onamae.com/ 并点击“お名前.com Navi 登录” 输入“お名前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 小时后仍未生效，请尝试联系お名前.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-cn/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/","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 的文件，但也包含了像 Mac 的 “.DS_Store” 等通常不需要在 git 中进行管理的文件。\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-cn/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①沙加2 秘宝传说 1990年由 Square（现 Square Enix）发售的 RPG 游戏。 故事讲述在各种关卡中不断收集被称为秘宝的宝物， 这是我玩过的第一款 RPG 游戏。\n②星之卡比 1992年由任天堂发售的动作游戏。开发商是 HAL 研究所。 通过吸入敌人或吸入空气在空中漂浮来推进游戏。 音乐和音效也做得非常出色，是一款可以充满节奏感地游玩的作品。\n③宝可梦 红·绿 1996年由任天堂发售的 RPG 游戏。开发商是任天堂情报开发本部、Game Freak 和 Creatures。 之后虽然被改编成动画并获得了爆炸性的人气，但我只玩过这第一代。\nSuper Famicom 1990年由任天堂发售的家用游戏机。在海外也被称为 SNES（Super Nintendo Entertainment System）。\n④超级马力欧卡丁车 1992年由任天堂发售的 Super Famicom 游戏软件。 通过投掷龟壳或香蕉皮等道具妨碍对手，同时争夺名次的竞速游戏。 我还记得和家人朋友一起玩的情景。\n⑤勇者斗恶龙V 天空的新娘 1992年由 Enix 发售的 RPG 游戏。 这是一款有着选择结婚对象要素，以及让打倒的怪物成为同伴要素的游戏。 我一直深入游玩，直到让好几只失散金属史莱姆成为同伴。\n⑥最终幻想V 1992年由 Square 发售的 RPG 游戏。 有着选择职业并将技能练到极致的可深入游玩要素。 我记得和勇者斗恶龙一样，曾经一直在洞穴里刷怪练级。\n⑦特鲁尼克大冒险 不可思议的迷宫 1993年由 Chunsoft 发售的 Roguelike 游戏。 《不可思议的迷宫》系列的前身。 其特点是每次迷宫的形状都会随机改变。 宣传标语是“可以玩1000次的 RPG”。\n⑧不可思议的迷宫2 风来的西林 1995年由 Chunsoft 发售的 Roguelike 游戏。 不可思议的迷宫系列《特鲁尼克大冒险》的续作。 迷宫内有商店，可以购买道具。 （如果不付钱就离开商店，店主会追过来。）\n⑨MOTHER2 1994年由任天堂发售的 MOTHER 系列第2作。开发商是 Ape 和 HAL 研究所。 之后在2006年发售了 MOTHER3。这是由系井重里先生制作的作品， 其中点缀着独特的世界观和充满哲理的语言。\n⑩塞尔达传说 众神的三角力量 1991年由任天堂发售的动作冒险游戏。 通过收集各种道具并解开一些小谜题来推进游戏。 之后发售了各种续作。（参考）\nNintendo Switch 2017年由任天堂发售的家用游戏机。\n⑪斯普拉遁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-cn/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%B2%E3%83%BC%E3%83%A011%E9%81%B8/","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-cn/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/","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-cn/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/","title":"使用PowerShell批量删除.DS_Store"},{"content":"HUGO 中可用的简码 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-cn/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 中可用的简码"},{"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 中以下位置的一行。\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-cn/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/","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-cn/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，然后搜索“GitHub Copilot” 点击 Install 按钮进行安装 点击 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-cn/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/","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-cn/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/","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-cn/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/","title":"黑格尔的辩证法"},{"content":"时隔多年，我又去吃了神座（Kamukura）（拉面）。\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-cn/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":"时隔多年的神座（Kamukura）（拉面）"},{"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-cn/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/","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-cn/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/","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-cn/p/%E3%82%AB%E3%83%95%E3%82%A7%E9%9F%B3%E6%A5%BD/","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-cn/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 企业版（版本 21H2，内部版本 22000.856） 制造商 Mouse Computer 株式会社 ","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-cn/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/","title":"当前主力电脑配置"},{"content":"Google Material Symbols and Icons https://fonts.google.com/icons GitHub Octicons https://primer.style/octicons/ Sargam Icons https://sargamicons.com/ Thousands of free icons 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-cn/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/","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-cn/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-cn/p/%E5%AD%90%E4%BE%9B%E3%81%AE%E3%81%9D%E3%82%93%E3%81%9F%E3%81%8F/","title":"孩子的体贴"},{"content":"发现正在流行的事业 正在流行的事业可以向 Hot Pepper 的内部人员或税务师打听 不要进入强者云集、已经处于饱和状态的行业 只进入确信能够吸引到客流的行业（如果现有经营者使用了特殊的集客方法（无法模仿的方法），则不要进入该行业） 彻底地模仿 进入前研究其商业逻辑是什么 彻底地抄袭 在此基础上进行改良 机制化 将一切手册化，让任何人无需努力也能做到 思考提高销售额（增加客流、提高客单价）和削减经费（人工费、广告费）的点子并将其机制化 经营者的理念 经营者的理念就是“实现企业利润最大化”，仅此而已 将社会贡献或让员工喜欢作为经营者的理念是不行的（要认为这些会在之后自然而然地实现） ","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-cn/p/%E7%B5%8C%E5%96%B6%E8%80%85%E3%83%A1%E3%83%A2/","title":"经营者笔记"},{"content":"我打算整理一下自己认为日本社会中有些奇怪的地方以及我的一些思考。\n关于奖学金 说到日本的奖学金，大部分都是带息并且必须偿还的。 另外，大学学费从1950年起就一直在增加，（奖学金的）领取率也呈上升趋势。\n另一方面，最近的平均借款总额似乎高达324万日元。\n在日本学生支援机构的奖学金使用者中，平均借款总额为324万3000日元。参考\n在大学毕业的22岁阶段就背负着高达300万日元的债务，结婚的时期自然会推迟，生孩子也会变得困难，我认为这是造成日本少子化问题的原因之一。\n蔓延的自我责任论 这可能是出于直觉，但我认为存在着一种“别人是别人”的冷漠世态。 经济持续低迷了几十年，出现这种倾向或许也是无可奈何的， 但即便是上述的奖学金问题，也没有被视为整个社会的问题。我感觉在选举中票数较少的年轻人和少数派的声音被忽视了。 尽管从长远来看，这对整个日本来说是一个非常重要的问题。\n我认为，对国家而言，与其走向过度竞争，不如培养一种如果有人、某一代人或某个群体陷入困境，大家就一起伸出援手的精神，这是非常重要的。 （不过，国家主张“自助、共助”让我感到有些违和。我希望他们能主动致力于救助弱势群体。）\n（本文将随时更新。）\n从AI看日本人的特征 好的，下面为您说明日本人的特征。\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-cn/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/","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-cn/p/rust%E3%81%AE%E3%81%AF%E3%81%98%E3%82%81%E3%81%8B%E3%81%9F/","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-cn/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-cn/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/","title":"【HUGO】在本地环境预览显示"},{"content":"这是我推荐的3部以数学家为主角的电影。\n美丽心灵 描绘了真实存在的美国天才数学家半生的作品。最后有令人惊讶的剧情展开。 主演罗素·克劳的表现非常出彩。\n拦截密码战 改编自罗伯特·哈里斯的小说《挑战恩尼格玛密码机》，于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-cn/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-cn/p/%E4%BB%8A%E6%97%A5%E3%81%AE%E4%BD%9C%E6%A5%AD%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-cn/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”的静态网站生成器制作的。 因为发现了一个不错的主题，就凭直觉引入了。 （选主题花了大概两个小时，这是个秘密）\n关于代码的事情，或者是感兴趣的工具， 我也打算轻松地记录下来。\n早上在Komeda（客美多）的故事 顺便说一下，今天早上我起得比较早，去了Komeda咖啡店。 8点半出发，呼吸着早晨的空气，悠哉地走着。\n点了一份迷你冰与火（冰淇淋丹麦面包）和咖啡欧蕾的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-cn/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/","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-cn/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）的数学机制，并通过公式和概念图深入探讨它为何会被彼得·肖尔发现的 “Shor算法” 彻底击败，揭示这场范式转变。\n1. 经典计算中的因数分解方法：从费马因数分解法的发展 因数分解问题是指：对于给定的合数 $N$，找到素数 $p, q$ 使得 $N = p \\times 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)$。它们被设定为在模 $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找到向量 $v$ 作为解，使得关系式 $ \\prod (a_i - b_i m) $ 和 $ \\prod (a_i - b_i \\alpha) $ 都成为平方元。这无异于求解如下线性方程组：\n$$ M \\mathbf{x} \\equiv \\mathbf{0} \\pmod 2 $$ 在这里，使用了如分块Lanczos法（Block Lanczos Algorithm）和分块Wiedemann法（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接着，利用量子预言机 $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[阿达马变换实现全状态叠加] 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算法”，探讨了各自的数学背景和算法结构。\n相较于GNFS倾尽多项式选择或巨大矩阵计算等数学技巧将计算复杂度降至亚指数时间，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-cn/p/gnfs-to-shors-algorithm-math-deepdive/","title":"【公式完全解析】经典最强“GNFS”为何败给量子算法？因数分解的范式转变"}]