-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
1541 lines (807 loc) · 449 KB
/
Copy pathatom.xml
File metadata and controls
1541 lines (807 loc) · 449 KB
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
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
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>GoodBoyboy 's Blog|惬意小屋-点滴记忆</title>
<link href="https://blog.goodboyboy.top/atom.xml" rel="self"/>
<link href="https://blog.goodboyboy.top/"/>
<updated>2026-08-19T14:41:04.000Z</updated>
<id>https://blog.goodboyboy.top/</id>
<author>
<name>GoodBoyboy</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>博客评论数据已全部完成迁移</title>
<link href="https://blog.goodboyboy.top/posts/1318119464.html"/>
<id>https://blog.goodboyboy.top/posts/1318119464.html</id>
<published>2026-08-19T14:41:04.000Z</published>
<updated>2026-08-19T14:41:04.000Z</updated>
<content type="html"><![CDATA[<h2 id="正文">正文</h2><p>所有评论数据目前已完成迁移,目前正部署Furtalk博客评论区组件。</p><p>为保证数据一致性,迁移期间评论功能不可用。</p><h2 id="小记">小记</h2><p>几年下来不知不觉博客已经累积了这么多的网友和评论,这次迁移才注意到有这么多网友给我留过言,在今后的日子里,希望和各位继续努力,无限进步!</p><p><img src="https://pic.goodboyboy.top/imgs/2026/08/19/f44e80fa-eeb2-494d-9444-3bb8fabe940f.webp" alt="评论一览"></p><p><img src="https://pic.goodboyboy.top/imgs/2026/08/19/869dcb73-e85d-4284-b819-4fea08523cd9.webp" alt="用户一览"></p><p><img src="https://pic.goodboyboy.top/imgs/2026/08/19/31d7f993-9eb2-4cb0-93dd-01a7fdc2c3a0.webp" alt="全部数据"></p>]]></content>
<summary type="html"><h2 id="正文">正文</h2>
<p>所有评论数据目前已完成迁移,目前正部署Furtalk博客评论区组件。</p>
<p>为保证数据一致性,迁移期间评论功能不可用。</p>
<h2 id="小记">小记</h2>
<p>几年下来不知不觉博客已经累积了这么多的网友和评论,这</summary>
<category term="公告" scheme="https://blog.goodboyboy.top/categories/%E5%85%AC%E5%91%8A/"/>
<category term="公告" scheme="https://blog.goodboyboy.top/tags/%E5%85%AC%E5%91%8A/"/>
<category term="迁移" scheme="https://blog.goodboyboy.top/tags/%E8%BF%81%E7%A7%BB/"/>
</entry>
<entry>
<title>评论系统即将更换</title>
<link href="https://blog.goodboyboy.top/posts/2703472613.html"/>
<id>https://blog.goodboyboy.top/posts/2703472613.html</id>
<published>2026-08-19T03:46:49.000Z</published>
<updated>2026-08-19T03:46:49.000Z</updated>
<content type="html"><![CDATA[<h2 id="正文">正文</h2><p>Furtalk评论系统初版已完成开发,将在近日完成主题适配和数据迁移</p><p>目前Furtalk已全部开源,采用MIT开源协议。</p><p>项目地址:<a href="https://github.com/GoodBoyboy666/furtalk">https://github.com/GoodBoyboy666/furtalk</a></p>]]></content>
<summary type="html"><h2 id="正文">正文</h2>
<p>Furtalk评论系统初版已完成开发,将在近日完成主题适配和数据迁移</p>
<p>目前Furtalk已全部开源,采用MIT开源协议。</p>
<p>项目地址:<a href="https://github.com/GoodBoybo</summary>
<category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
<category term="说说" scheme="https://blog.goodboyboy.top/tags/%E8%AF%B4%E8%AF%B4/"/>
<category term="评论系统" scheme="https://blog.goodboyboy.top/tags/%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F/"/>
</entry>
<entry>
<title>在WSL中使用Canokey智能卡进行Git Commit签名</title>
<link href="https://blog.goodboyboy.top/posts/602251247.html"/>
<id>https://blog.goodboyboy.top/posts/602251247.html</id>
<published>2026-08-17T10:35:18.000Z</published>
<updated>2026-08-17T10:35:18.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2><p>最近有在WSL开发的需求,不过发现在WSL里使用Canokey智能卡签名Git Commit有些问题,因此出这一篇教程</p><h2 id="正文">正文</h2><h3 id="确认WSL版本">确认WSL版本</h3><p>下面的步骤都需要时WSL2才能进行</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wsl -l -v</span><br></pre></td></tr></table></figure><p>应该类似为:</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"> NAME STATE VERSION</span><br><span class="line">* Ubuntu Running 2</span><br></pre></td></tr></table></figure><p>如果是WSL1则需要切换到WSL2</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wsl --<span class="built_in">set</span>-version Ubuntu <span class="number">2</span></span><br></pre></td></tr></table></figure><h3 id="安装usbipd-win">安装usbipd-win</h3><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">winget install --interactive --exact dorssel.usbipd-win</span><br></pre></td></tr></table></figure><p>插入Canokey后</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">usbipd list</span><br></pre></td></tr></table></figure><p>应该会看到类似输出:</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">BUSID VID:PID DEVICE STATE</span><br><span class="line">2-4 20a0:42d4 USB 输入设备, WebUSB, Microsoft Usbccid Smartcard Reader ... Not shared</span><br></pre></td></tr></table></figure><p>这里需要记住<code>BUSID</code></p><p>启动管理员命令提示符</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">usbipd bind --busid <span class="number">2</span>-<span class="number">4</span></span><br></pre></td></tr></table></figure><p>然后输入</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">usbipd list</span><br></pre></td></tr></table></figure><p>这时设备应该从<code>Not shared</code>转变为<code>Shared</code></p><h3 id="附加设备">附加设备</h3><p>将设备附加到WSL</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">usbipd attach --wsl --busid <span class="number">2</span>-<span class="number">4</span></span><br></pre></td></tr></table></figure><p>此时再执行usbipd list,应该会看到<code>Shared</code>转变为了<code>Attached</code>,并且会有Windows提示音</p><p>然后进入WSL检查设备情况:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">lsusb</span><br></pre></td></tr></table></figure><p>应该会出现下面类似输出</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Bus 001 Device 003: ID 20a0:42d4 Clay Logic CanoKey Canary</span><br></pre></td></tr></table></figure><h3 id="安装PC-SC组件">安装PC/SC组件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt install pcscd pcsc-tools libccid</span><br></pre></td></tr></table></figure><p>启动组件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> systemctl <span class="built_in">enable</span> --now pcscd.socket</span><br><span class="line"><span class="built_in">sudo</span> systemctl restart pcscd</span><br></pre></td></tr></table></figure><p>然后检查card情况</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pcsc_scan</span><br></pre></td></tr></table></figure><p>如果出现智能卡信息则代表成功</p><p>如果出现Access denied,但是<code>sudo pcsc_scan</code>可以看到智能卡信息,则还需要一些配置:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> nano /etc/polkit-1/rules.d/49-pcscd.rules</span><br></pre></td></tr></table></figure><p>写入(注意改用户名):</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">polkit.addRule(function(action, subject) {</span><br><span class="line"> if ((action.id == "org.debian.pcsc-lite.access_pcsc" ||</span><br><span class="line"> action.id == "org.debian.pcsc-lite.access_card") &&</span><br><span class="line"> subject.user == "goodboyboy") {</span><br><span class="line"> return polkit.Result.YES;</span><br><span class="line"> }</span><br><span class="line">});</span><br></pre></td></tr></table></figure><p>继续重启:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> systemctl restart polkit</span><br><span class="line"><span class="built_in">sudo</span> systemctl restart pcscd.socket</span><br><span class="line"><span class="built_in">sudo</span> systemctl restart pcscd</span><br></pre></td></tr></table></figure><p>然后<code>pcsc_scan</code>应该能够正常输出智能卡信息</p><h3 id="调整gpg配置">调整gpg配置</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> ~/.gnupg/scdaemon.conf</span><br></pre></td></tr></table></figure><p>查看是否有<code>disable-ccid</code>字样</p><p>如果没有这个文件的话:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> -p ~/.gnupg</span><br><span class="line"><span class="built_in">chmod</span> 700 ~/.gnupg</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">'disable-ccid'</span> > ~/.gnupg/scdaemon.conf</span><br><span class="line"><span class="built_in">chmod</span> 600 ~/.gnupg/scdaemon.conf</span><br></pre></td></tr></table></figure><p>最后:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gpgconf --<span class="built_in">kill</span> all</span><br></pre></td></tr></table></figure><p>测试:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gpg --card-status</span><br></pre></td></tr></table></figure><p>此时应该就能正常输出智能卡信息了</p><h3 id="导入公钥">导入公钥</h3><p>这个没什么好说的</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gpg --import <公钥文件路径></span><br></pre></td></tr></table></figure><h3 id="配置GPG-TTY">配置GPG TTY</h3><p>有大概率GPG会找不到TTY,导致pinentry出现问题</p><p>可以先测试</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> GPG_TTY=$(<span class="built_in">tty</span>)</span><br><span class="line">gpg-connect-agent updatestartuptty /bye</span><br></pre></td></tr></table></figure><p>然后尝试签名:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git commit -S -m <span class="string">"test signed commit"</span></span><br></pre></td></tr></table></figure><p>如果能正常显示Card PIN输入界面,即配置完成</p><p>将配置持久化:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nano ~/.bashrc</span><br></pre></td></tr></table></figure><p>将</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> GPG_TTY=$(<span class="built_in">tty</span>)</span><br><span class="line">gpg-connect-agent updatestartuptty /bye >/dev/null 2>&1</span><br></pre></td></tr></table></figure><p>放在文件末尾</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.bashrc</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><h2 id="前言">前言</h2>
<p>最近有在WSL开发的需求,不过发现在WSL里使用Canokey智能卡签名Git Commit有些问题,因此出这一篇教程</p>
<h2 id="正文">正文</h2>
<h3 id="确认WSL版本">确认WSL版本</h3>
<p></summary>
<category term="教程" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/"/>
<category term="Software" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/Software/"/>
<category term="Canokey" scheme="https://blog.goodboyboy.top/tags/Canokey/"/>
<category term="Git" scheme="https://blog.goodboyboy.top/tags/Git/"/>
<category term="WSL" scheme="https://blog.goodboyboy.top/tags/WSL/"/>
<category term="智能卡" scheme="https://blog.goodboyboy.top/tags/%E6%99%BA%E8%83%BD%E5%8D%A1/"/>
</entry>
<entry>
<title>博客评论系统的一些设计</title>
<link href="https://blog.goodboyboy.top/posts/2809720001.html"/>
<id>https://blog.goodboyboy.top/posts/2809720001.html</id>
<published>2026-08-08T12:34:43.000Z</published>
<updated>2026-08-08T12:34:43.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2><p>开发接近尾声了,这里展示一下部分设计细节</p><h2 id="凭据种类与类型">凭据种类与类型</h2><p>总共设计有三种凭据,均为JWT凭据</p><h3 id="第一方登录凭据">第一方登录凭据</h3><p>该凭据为评论系统本站使用的登录凭据,用于操作评论系统</p><h3 id="登录模式评论凭据">登录模式评论凭据</h3><p>在登录模式下,第三方网站中的Widget使用</p><h3 id="匿名模式评论凭据">匿名模式评论凭据</h3><p>在匿名模式下,第三方网站中的Widget使用</p><h2 id="凭据存储">凭据存储</h2><p>三种凭据均存储于Cookie中,请求时由浏览器自动提交,并设置<code>__Host-</code>头,禁止子域写入</p><p>其中评论凭据采用CHIPS,以支持第三方Cookie嵌入。</p><h2 id="评论提交">评论提交</h2><p>系统总共有两种模式:匿名模式和登录模式</p><p>这个是匿名模式评论提交时序图</p><pre><code class="highlight mermaid">sequenceDiagram autonumber participant U as 用户 participant W as Widget participant CA as 匿名凭据端点 participant CC as 评论端点 U->>W: 填写昵称、邮箱、网址 W->>CA: 请求匿名凭据 CA-->>W: 返回评论凭据 W->>CC: 携带评论凭据提交评论</code></pre><p>这个是登录模式评论提交时序图</p><pre><code class="highlight mermaid">sequenceDiagram autonumber participant U as 用户 participant W as Widget participant A as 授权页面 participant T as 凭据交换端点 participant C as 评论端点 U->>W: 填写昵称、邮箱、网址 W->>A: 附带邮箱参数跳转授权页面 A-->>W: 授权后返回授权码 W->>T: 使用授权码请求评论凭据 T-->>W: 返回评论凭据 W->>C: 携带评论凭据提交评论</code></pre><h2 id="登录方式">登录方式</h2><p>总共设计有四种登录方式</p><h3 id="邮箱验证码">邮箱验证码</h3><p>通过邮箱验证码进行无密码登录,未注册情况下自动完成注册。</p><p>一般来说推荐开启登录模式时采用该方式,兼顾安全与便利</p><h3 id="Passkey">Passkey</h3><p>通过通行密钥进行无用户名,无密码登录</p><p>但是需要用户提前去评论系统网站注册Passkey才可用,便利程度与邮箱验证码相比较低,但是安全性最高。</p><h3 id="密码">密码</h3><p>通过邮箱,密码进行登录,便利程度较低,安全性取决于密码复杂度</p><h3 id="第三方登录">第三方登录</h3><p>支持GitHub,Google,OIDC等第三方登录。</p><p>便利程度一般,安全性取决于第三方身份提供商。</p><p>另外如果邮箱已经被注册,则会禁止从未绑定的第三方登录进行登录。</p><p>需要进入评论系统手动绑定对应的第三方账户才可通过第三方登录进行登录。</p><h2 id="Captcha支持">Captcha支持</h2><p>支持市面上常见的CloudFlare Turnstile、Google ReCaptcha、hcaptcha、Cap</p><p>Geetest后续考虑支持</p><h2 id="后记">后记</h2><p>其实系统本身不复杂(迫真),有三到四天的时间全在调整架构,果然让AI从零开始写就喜欢乱搞架构</p><p>目前大部分架构已经确立完毕,现在正边打磨细节,边慢慢处理AI拉的屎。</p>]]></content>
<summary type="html"><h2 id="前言">前言</h2>
<p>开发接近尾声了,这里展示一下部分设计细节</p>
<h2 id="凭据种类与类型">凭据种类与类型</h2>
<p>总共设计有三种凭据,均为JWT凭据</p>
<h3 id="第一方登录凭据">第一方登录凭据</h3>
<p>该凭据为</summary>
<category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
<category term="说说" scheme="https://blog.goodboyboy.top/tags/%E8%AF%B4%E8%AF%B4/"/>
<category term="评论" scheme="https://blog.goodboyboy.top/tags/%E8%AF%84%E8%AE%BA/"/>
</entry>
<entry>
<title>打算做个博客评论系统</title>
<link href="https://blog.goodboyboy.top/posts/3370655395.html"/>
<id>https://blog.goodboyboy.top/posts/3370655395.html</id>
<published>2026-07-31T09:37:49.000Z</published>
<updated>2026-07-31T09:37:49.000Z</updated>
<content type="html"><![CDATA[<p>最近打算做一个博客评论系统,给自己博客评论系统升级一下。</p><p>Artalk都好久没更新了,想要一些功能但是又没有。</p><p>现在AI这么好用,打算和AI一起搓一个,等搓完后会开源出来😄</p>]]></content>
<summary type="html"><p>最近打算做一个博客评论系统,给自己博客评论系统升级一下。</p>
<p>Artalk都好久没更新了,想要一些功能但是又没有。</p>
<p>现在AI这么好用,打算和AI一起搓一个,等搓完后会开源出来😄</p>
</summary>
<category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
<category term="说说" scheme="https://blog.goodboyboy.top/tags/%E8%AF%B4%E8%AF%B4/"/>
<category term="评论" scheme="https://blog.goodboyboy.top/tags/%E8%AF%84%E8%AE%BA/"/>
</entry>
<entry>
<title>开了一个游泳馆的月卡</title>
<link href="https://blog.goodboyboy.top/posts/3857671253.html"/>
<id>https://blog.goodboyboy.top/posts/3857671253.html</id>
<published>2026-07-29T09:45:03.000Z</published>
<updated>2026-07-29T09:45:03.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2><p>这个暑假打算游泳减肥,但是之前的那个太远,而且设施一般,于是换了一家</p><h2 id="正文">正文</h2><p>这次换了一家连锁的专业游泳馆,充完卡体验了一下,真的不错</p><p>无论是水质,设施,还是服务,都比我之前的那个好。</p><p>游泳馆月卡价格是499,折合下来一天16块</p><p>之前那个是25一次,再加上车费等等,性价比太低了。</p><p>这下可以爽游到开学了😄</p>]]></content>
<summary type="html"><h2 id="前言">前言</h2>
<p>这个暑假打算游泳减肥,但是之前的那个太远,而且设施一般,于是换了一家</p>
<h2 id="正文">正文</h2>
<p>这次换了一家连锁的专业游泳馆,充完卡体验了一下,真的不错</p>
<p>无论是水质,设施,还是服务,都比我之前</summary>
<category term="生活" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/"/>
<category term="日常" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/%E6%97%A5%E5%B8%B8/"/>
<category term="游泳" scheme="https://blog.goodboyboy.top/tags/%E6%B8%B8%E6%B3%B3/"/>
<category term="月卡" scheme="https://blog.goodboyboy.top/tags/%E6%9C%88%E5%8D%A1/"/>
</entry>
<entry>
<title>今天游泳累炸了</title>
<link href="https://blog.goodboyboy.top/posts/1191362153.html"/>
<id>https://blog.goodboyboy.top/posts/1191362153.html</id>
<published>2026-07-22T12:38:04.000Z</published>
<updated>2026-07-22T12:38:04.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2><p>跑步还是太折腾了,而且一次也就300大卡,尝试一下游泳减肥。</p><h2 id="正文">正文</h2><p>冲浪设施最好玩但也是最累的。</p><p>设施前面有个制浪机,会不断制造浪,把整个池子里的水翻涌起来。</p><p>我是站在靠近制浪机的位置,这个地方水深大概1.6m,以至于我需要微微踮起脚才能保证鼻子离水面有一定距离</p><p>但是制浪机启动时,即使没有开始制造大浪,水面的轻微波动也会刚好往我鼻子里灌水,以至于需要持续微微跳动才能保证鼻子不进水。</p><p>而大浪拍过来时,水面大概可以到2m左右,靠近岸边的地方应该更高,所以就必须跟随着浪起跳,不然必吃水😂</p><p>虽然看着只需要跟着浪起跳,就不会呛水。</p><p>但是没有失误的机会。</p><p>如果某次起跳时没起跳好,导致鼻子或者嘴里里进水了,就需要疏通一下嘴巴或者鼻腔(不疏通就吸气,那就等着水吸到气管里被呛吧doge),但是这就会错过换气的机会,而且疏通会排出肺里大部分空气。等疏通完尝试向上蹬换气时,要么刚好被下一个浪继续拍进鼻子和嘴里,猛喝池水,要么刚好浪在头上,往上蹬完全蹬不出水面,继续呛水😂</p><p>而浪又是连着的,如果没及时调整过来,那么有多少次浪基本上就要喝多少口水</p><p>相比之下,喝水其实还算好的,一直呛水导致的窒息是真的难受。</p><p>连续呛了三次,能感受到身体发觉有窒息风险后不自主的应激的那种感觉,心率都飙到166了😂</p><p>回到家感觉身子都要散架了。</p><p>虽然但是,下次还玩(doge</p><h2 id="效果">效果</h2><p>玩了大概四个小时(不是全部在玩制浪机),轻松拉出1000大卡的热量缺口,比跑步性价比高多了</p><p>不过太阳的效果还是太好了,洗完冲水的时候,把手环一脱,能明显看到一个白色环带,真就是一个下午就晒黑了😂</p>]]></content>
<summary type="html"><h2 id="前言">前言</h2>
<p>跑步还是太折腾了,而且一次也就300大卡,尝试一下游泳减肥。</p>
<h2 id="正文">正文</h2>
<p>冲浪设施最好玩但也是最累的。</p>
<p>设施前面有个制浪机,会不断制造浪,把整个池子里的水翻涌起来。</p>
<p</summary>
<category term="生活" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/"/>
<category term="日常" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/%E6%97%A5%E5%B8%B8/"/>
<category term="游泳" scheme="https://blog.goodboyboy.top/tags/%E6%B8%B8%E6%B3%B3/"/>
<category term="减肥" scheme="https://blog.goodboyboy.top/tags/%E5%87%8F%E8%82%A5/"/>
</entry>
<entry>
<title>回家吵的第一场架</title>
<link href="https://blog.goodboyboy.top/posts/3228333651.html"/>
<id>https://blog.goodboyboy.top/posts/3228333651.html</id>
<published>2026-07-17T02:26:11.000Z</published>
<updated>2026-07-17T02:26:11.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2><p>不是和家里人吵架,是和外人吵架😋</p><h2 id="起因">起因</h2><p>因为今年比较热,楼上可能是想给客厅装空调,然后准备把空调外机装在我家窗户旁。</p><p>本来这玩意声音就大,被我妈发现后就表示要装就装到他们自己家阳台窗户那去,别影响我家,然后就开始吵起来了</p><h2 id="开始">开始</h2><p>一开始早上我出去去剪头发了,没开局参团,回来时老远就听到我妈的声音。</p><p>到楼下后发现我妈正在和一楼和住在楼上的男方对线,我先站在一旁了解一下原委,方便加入战局。</p><p>了解完原委后迅速加入战局开始持续输出😋</p><h2 id="输出">输出</h2><p>首先是对方尝试用所谓的“国家规定”,表示空调排水管要低于外机,试图尝试证明“将空调外机安装在我家窗户边”的合理性,还表示开发商是这么设计的。</p><p>我妈先是使用道德,表示虽然是“国家规定”,但是会影响到其他人来尝试化解。当前暂时没找到破局之法,所以也只能先跟团。</p><p>这其实是最关键的一点,也是破局之点,这个之后说。</p><p>输出了一会发现效果并不好,还是被压一头,我妈又开始换方向,我当然是继续跟团。</p><p>房屋设计时其实不止外面的那个排水管,阳台另一侧内部还有一个专门的用于排水的排水管,但是它又不用,非要装在这一侧。</p><p>这里就可以体现出自私性了,另一侧有专门的内侧排水管不装,非要装到楼道这一侧,可能是觉得装到另一侧制冷效果不好还是咋滴,还想用规定来把空调外机装到人家窗户边影响别人</p><p>典型的规矩有利时就用规矩压人捏😋</p><p>玩互联网这么多年不是白玩的,瞬间识破。</p><p>不过这会依旧是没找到破局之法,暂不说吵架的时候有没有时间查所谓的“规定”,这种用有利的规矩压一头确实是很有效的办法,所以进入持续垃圾时间。</p><p>这时那气势上就不能输,同时继续想破局之法。</p><p>吵架时,我无意间得知对方还是一名老师,众所周知嘛,所以我稍微穿插了一点点人身攻击(人身攻击是不对的哦,大家不要学我),瞬间把对面惹炸毛了😂。不过对方也确实挺敏锐的,说我不要指指点点他,我也意识到这也可能起反作用,容易被扣上不讲理、人身攻击这类帽子,不过把他营设的那种“很讲理”的人设卸掉就行了。</p><p>突然,我妈找到了战局关键一点,那就是排水管的设计其实每户就是自己窗户旁边的!</p><p>我也迅速意识到这一点,经过确认,排水管口数量刚好和楼户数对应!</p><p>示意图:蓝色为楼上以及他想要安装的空调外机,红色为排水管道,排水管道后面是楼道</p><p><img src="https://pic.goodboyboy.top/imgs/2026/07/17/7437c0ff-e867-4913-bb4e-f6c756e32948.png" alt=""></p><p>也就是说,这个排水管设计时就是就是高于所谓的“规定”的,那么如果说这个规定是真的(不确定是不是真的,不过看着像是有备而来),那就是开发商设计问题,那就和前文一开始他自己说“是开发商这样设计的”前呼后应,属于是搬起石头砸自己脚了😂</p><p>他自己也数了一遍,发现好像确实是这样,瞬间熄火了</p><p>到这里赢面已经占了一大半了。</p><p>这时女方在阳台上可能发现战局有点不对头了,也开始加入战局,尝试使用少数服从多数战略,说其他家都是这么装的。</p><p>但是这牌打得太晚了,而且互联网上这种对线实在是太多了</p><p>直接“人家这么做你就要这么做吗?”,“别人这么做别人就是对的吗?”直接秒了。</p><p>而且我妈观察更敏锐,虽然说其他楼栋的是这样装的,但是我们这栋楼没一个这样装,也就是说,他的楼上并没有占据属于他的那一层的排水管,因此事实上他是有使用自己楼层排水管的客观条件的,不会出现人家占了他的排水管,他只能用我们家的这种情况了。</p><p>到这里男方就吵不下去了,毕竟无论从哪个角度来说已经没有理由</p><p>这时我继续补刀,表示又不想安装在另一侧,又想要把外机安装在别人窗户边,那不就是自私自利么</p><p>此时胜局已定,男方也只能轻飘飘的说一句“你们不讲理”这种毫无作用的话了。</p><p>说实在的,一开始和你讲理的时候,你自己非要趾高气扬的拿着规定,不顾别人的感受,要把外机安装在别人阳台窗户边,最后发现自己拿出的“规矩牌”反倒被别人拿来制衡自己后又说别人不讲理,多多少少有点难蚌。而且虽然其他栋的住户有这样安装的,那也是要和楼下住户商量啊,让你装是情分,不让你装是本分,属实是有点拎不清了。。。</p><h2 id="收尾">收尾</h2><p>吵得差不多的时候,又有另外一个邻居过来想缓和一下关系。在这种胜局已定的情况下当然是没有问题的,最后我们也是借坡下驴,完成收尾😋。</p><h2 id="另一种可能">另一种可能</h2><p>可能那个安装师傅觉得安装不好装,然后说些七七八八的蹿楼上来和我妈吵架。不过我觉得这种可能是很低,毕竟是这么大的人还是老师,被别人拱火当枪使的概率还是太低了。</p><h2 id="后记">后记</h2><p>真的好久没吵过架了,这次输出还是没有发挥好,大部分时间还是只起到辅助作用,还得是老妈AOE全场</p><h2 id="最后">最后</h2><p>只是单纯分享和复盘一下这次吵架,邻里之间有摩擦很正常,如有雷同,请不要对号入座</p>]]></content>
<summary type="html"><h2 id="前言">前言</h2>
<p>不是和家里人吵架,是和外人吵架😋</p>
<h2 id="起因">起因</h2>
<p>因为今年比较热,楼上可能是想给客厅装空调,然后准备把空调外机装在我家窗户旁。</p>
<p>本来这玩意声音就大,被我妈发现后就表示要装就装到他们</summary>
<category term="生活" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/"/>
<category term="日常" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/%E6%97%A5%E5%B8%B8/"/>
<category term="吵架" scheme="https://blog.goodboyboy.top/tags/%E5%90%B5%E6%9E%B6/"/>
</entry>
<entry>
<title>新设计了一个Astro主题</title>
<link href="https://blog.goodboyboy.top/posts/1365608464.html"/>
<id>https://blog.goodboyboy.top/posts/1365608464.html</id>
<published>2026-07-14T15:57:38.000Z</published>
<updated>2026-07-14T15:57:38.000Z</updated>
<content type="html"><![CDATA[<h2 id="正文">正文</h2><p>最近闲的无聊,设计了一款叫Furnest的Astro的主题,中文名叫绒毛小窝,定位是一款Furry主题。</p><p>虽然说定位是Furry,但是整个主题除了首页大屏是一张Furry图以外好像其他地方并没有看见Furry元素(逃</p><p>主要还是因为手上没多少Furry素材,不过现在主题绝大部分功能已经设计完成了,后续会补齐一些Furry元素(确信</p><h2 id="展示">展示</h2><p><img src="https://pic.goodboyboy.top/imgs/2026/07/14/90413278-7231-45e8-8091-2505d204be74.webp" alt=""></p><p><img src="https://pic.goodboyboy.top/imgs/2026/07/14/48f74e2f-23bb-4166-9398-a7cca62d0e52.webp" alt=""></p><p><img src="https://pic.goodboyboy.top/imgs/2026/07/14/3e4b6368-eb25-4e76-844f-634bda6013f6.webp" alt=""></p><p><img src="https://pic.goodboyboy.top/imgs/2026/07/14/a4638da9-d4e1-42d0-94a9-b4bb15a0eeeb.webp" alt=""></p><h2 id="Demo">Demo</h2><p>如果有兴趣的话可以看看Demo哦,等完善的差不多后会进行开源供大家使用。</p><p>Demo:<a href="https://www.furwolf.com/">https://www.furwolf.com/</a></p><p>是的,官网即Demo(逃</p><h2 id="参与">参与</h2><ul><li>Penpot:<a href="https://penpot.app/">https://penpot.app/</a> 感谢由Penpot提供开源UI设计解决方案</li><li>DeepSeekk:<a href="https://www.deepseek.com/">https://www.deepseek.com/</a> 感谢由DeepSeek提供开源AI模型</li><li>ChatGPT:<a href="https://chatgpt.com/">https://chatgpt.com/</a></li></ul>]]></content>
<summary type="html"><h2 id="正文">正文</h2>
<p>最近闲的无聊,设计了一款叫Furnest的Astro的主题,中文名叫绒毛小窝,定位是一款Furry主题。</p>
<p>虽然说定位是Furry,但是整个主题除了首页大屏是一张Furry图以外好像其他地方并没有看见Furry元素(逃</</summary>
<category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
<category term="主题" scheme="https://blog.goodboyboy.top/tags/%E4%B8%BB%E9%A2%98/"/>
<category term="Astro" scheme="https://blog.goodboyboy.top/tags/Astro/"/>
<category term="Furnest" scheme="https://blog.goodboyboy.top/tags/Furnest/"/>
</entry>
<entry>
<title>Cap,一个基于PoW的自托管验证码系统</title>
<link href="https://blog.goodboyboy.top/posts/1964691587.html"/>
<id>https://blog.goodboyboy.top/posts/1964691587.html</id>
<published>2026-07-09T10:25:56.000Z</published>
<updated>2026-07-09T10:25:56.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2><p>最近发现一款开源的自托管验证码系统,研究了下觉得设计思想很有趣,打算写一篇博文分享一下。</p><h2 id="什么是Cap">什么是Cap</h2><p>Cap 是一款自托管的验证码系统,用隐形的工作量证明替代了传统的图像拼图。用户只需点击一个复选框,工作量便会在其浏览器中静默运行,而用户的任何数据都不会离开你的服务器。无需谷歌、无遥测、无按次收费。</p><p>项目地址:<a href="https://trycap.dev">https://trycap.dev</a></p><p>下面是我自己部署的一个demo:</p><script src="https://cdn.jsdelivr.net/npm/cap-widget"></script><p>SHA-256版:</p><p><cap-widget id="cap" data-cap-api-endpoint="https://cap.furwolf.com/1118fa888d/"></cap-widget></p><p>RSW版:</p><p><cap-widget data-cap-api-endpoint="https://cap.furwolf.com/b2675e884b/"></cap-widget></p><h2 id="验证流程">验证流程</h2><p>首先,客户端会向验证码服务器发起请求,拿到挑战。</p><p>然后客户端会在本地完成完成PoW,以及运行挑战里附带的JavaScript程序来验证浏览器环境。</p><p>完成指定轮数的PoW和浏览器环境验证后,向验证码服务器发送结果。</p><p>验证码服务器完成校验后,下发token。</p><p>此时用户浏览器再携带token向资源服务器发起实际请求。</p><p>资源服务器收到请求后使用向验证码服务器验证token正确性。</p><p>验证码服务器回应验证情况,资源服务器确认验证成功后允许请求。</p><h2 id="什么是PoW">什么是PoW</h2><blockquote><p>以下是维基百科 <a href="https://zh.wikipedia.org/zh-hans/%E5%B7%A5%E4%BD%9C%E9%87%8F%E8%AD%89%E6%98%8E">工作量证明</a>的解释</p></blockquote><p>工作量证明(Proof-of-Work,PoW)是一种对应服务与资源滥用、或是阻断服务攻击的经济对策。一般要求使用者进行一些耗时适当的复杂运算,并且答案能被服务方快速验算,以此耗用的时间、设备与能源做为担保成本,以确保服务与资源是被真正的需求所使用。此概念最早由Cynthia Dwork和Moni Naor于1993年的学术论文提出,而工作量证明一词则是在1999年由Markus Jakobsson与Ari Juels.所发表。现时此技术成为了加密货币的主流共识机制之一,如比特币所采用的技术。</p><p>工作量证明系统的核心特性在于其非对称性:证明者需完成适度困难(但可行)的计算工作,而验证者能极高效地验证结果。Hal Finney于2004年透过“可重用工作量证明”(RPOW)概念将此机制应用于数位代币,采用160位元SHA-1演算法。</p><h2 id="为什么是PoW">为什么是PoW</h2><p>下面是Cap官网的原话:</p><blockquote><p>Every CAPTCHA can eventually be solved, whether by AIs, algorithms, reverse-engineering and spoofing fingerprints, or humans paid via CAPTCHA farms, and this results in an endless cat-and-mouse game between attackers and defenders. The crucial difference lies in the cost imposed on attackers.<br>Cap’s goal is to make automated abuse expensive and hard while keeping the experience fast and virtually invisible for real users. Proof-of-work is a perfect balance for this issue, stopping abuse by requiring computational effort rather than relying solely on human verification methods that bots continuously learn to mimic.<br>Imagine sending 10,000 spam messages costs $1, potentially earning $10 – a profitable venture. If Cap increases the computational cost so that sending those messages now costs $100, the spammer loses $90. This eliminates the financial incentive.<br>Cap’s proof-of-work is heavily inspired by Hashcash. Our instrumentation challenges are inspired by Twitter and YouTube’s own custom challenges.</p></blockquote><p>简而言之,就是通过PoW,增加攻击者的成本,拉低其收益。让原来一次攻击只要花费1块钱,变成10块钱甚至100块钱。从而消除掉攻击者的动机。</p><p>最直观的就是,通过PoW,让原来一秒可以向一个端口请求一万次的脚本,强行限制到一秒请求两次,甚至两秒请求一次,让其效率约等于人工手动点击。</p><p>而且相较于传统验证码,我觉得它的另一个亮点是——Open</p><p>它的整个工作流程都是透明且公开的,没有混淆,没有对抗。</p><p>它就这样明晃晃的摆在那,但是你却无可奈何,必须要消耗掉一定的资源才能完成。</p><p>就像<a href="https://baike.baidu.com/item/%E6%9F%AF%E5%85%8B%E9%9C%8D%E5%A4%AB%E5%8E%9F%E5%88%99">柯克霍夫原则(Kerckhoffs’s principle)</a>。</p><p>好的加密方法绝不依赖闭源,一个真正强大、优秀的加密算法,不仅不怕开源,反而必须开源。</p><p>只有经过全球顶尖密码学家和黑客长年累月的公开攻击和审查却依然屹立不倒,才能证明它是安全的。</p><p>也因为Open,所以完全不惧开源。</p><p>还有一个亮点,也是Cap主要亮点之一——隐私友好</p><p>因为PoW主打的是资源消耗,完全不需要任何个人信息参与和用户行为判定</p><p>可以在<a href="https://trycap.dev/guide/compliance.html">https://trycap.dev/guide/compliance.html</a>看到</p><blockquote><p>用户数据始终不会离开你的基础设施。终端用户无需使用Cookie或追踪机制,验证流程中无第三方调用,工作量证明完全在访客浏览器中运行。</p></blockquote><h2 id="PoW工作原理">PoW工作原理</h2><p>Cap有好几种工作模式,这里举例最简单的一种</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> tokenFnv = <span class="title function_">fnv1a</span>(token); <span class="comment">// ① FNV-1a(token全文)</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i < c; i++) {</span><br><span class="line"> <span class="keyword">const</span> idxStr = <span class="title class_">String</span>(i + <span class="number">1</span>); <span class="comment">// ② "1", "2", "3"...</span></span><br><span class="line"> <span class="keyword">const</span> saltSeed = <span class="title function_">fnv1aResume</span>(tokenFnv, idxStr); <span class="comment">// ③ 续算索引号</span></span><br><span class="line"> <span class="keyword">const</span> targetSeed = <span class="title function_">fnv1aResume</span>(saltSeed, <span class="string">"d"</span>); <span class="comment">// ④ 续算固定字母"d"</span></span><br><span class="line"> <span class="keyword">const</span> salt = <span class="title function_">prngFromHash</span>(saltSeed, size); <span class="comment">// ⑤ xorshift32 PRNG,参数s</span></span><br><span class="line"> <span class="keyword">const</span> target = <span class="title function_">prngFromHash</span>(targetSeed, difficulty); <span class="comment">//参数d</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>然后暴力枚举 SHA-256 前缀匹配</p><p>假设 target = “0000”(d=4),salt = “a1b2c3…”:<br>n=0: SHA-256(“a1b2c3…0”) → c4f8… 前缀不匹配<br>n=1: SHA-256(“a1b2c3…1”) → 9e2d… 前缀不匹配<br>n=2: SHA-256(“a1b2c3…2”) → 00007f… 前缀匹配</p><p>那么答案就是2</p><p>客户端要做的,就是根据题目要求,找到一个n,使得符合题目对于哈希前缀的要求。</p><p>众所周知,密码学哈希函数有一个著名的特性叫雪崩效应(Avalanche Effect),哪怕仅仅将输入数据改变了1个比特,输出的256位哈希值也会发生翻天覆地的、毫无规律的改变。</p><p>因此无法通过前一个值预测后一个值是什么,只能老老实实花时间算。</p><p>而出题者只需要根据你的答案重新算一次,就知道是不是符合题目的要求了,这也体现了PoW中非对称特性。</p><p>另外我们也可以进行一个期望计算:</p><p>SHA-256的输出结果在整个可能的值域[0,(2^256)-1]里是均匀分布的,而且每次计算只有成功与失败两种结果,每次计算因为雪崩效应也是独立的,因此它是契合几何分布的。</p><p>例如d为4,要求前四个字符为某个特定值(假设为0000)</p><p>哈希值的每一位出现 <code>0</code> 的概率是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mn>1</mn><mn>16</mn></mfrac></mrow><annotation encoding="application/x-tex">\frac{1}{16}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1901em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">16</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>。</p><p>要哈希值的前四个字符连续都是0,那么概率就是相乘:</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>p</mi><mo>=</mo><mfrac><mn>1</mn><mn>16</mn></mfrac><mo>×</mo><mfrac><mn>1</mn><mn>16</mn></mfrac><mo>×</mo><mfrac><mn>1</mn><mn>16</mn></mfrac><mo>×</mo><mfrac><mn>1</mn><mn>16</mn></mfrac><mo>=</mo><msup><mrow><mo fence="true">(</mo><mfrac><mn>1</mn><mn>16</mn></mfrac><mo fence="true">)</mo></mrow><mn>4</mn></msup><mo>=</mo><mfrac><mn>1</mn><mn>65536</mn></mfrac></mrow><annotation encoding="application/x-tex">p = \frac{1}{16} \times \frac{1}{16} \times \frac{1}{16} \times \frac{1}{16} = \left(\frac{1}{16}\right)^4 = \frac{1}{65536}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">16</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">16</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">16</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">16</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.604em;vertical-align:-0.95em;"></span><span class="minner"><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size3">(</span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">16</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size3">)</span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.654em;"><span style="top:-3.9029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">4</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">65536</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>根据几何分布的期望公式 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mn>1</mn><mi>p</mi></mfrac></mrow><annotation encoding="application/x-tex">E(X) = \frac{1}{p}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.3262em;vertical-align:-0.4811em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">p</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.4811em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>,期望值就是:</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>E</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mn>1</mn><mrow><mn>1</mn><mi mathvariant="normal">/</mi><mn>65536</mn></mrow></mfrac><mo>=</mo><mn>65536</mn></mrow><annotation encoding="application/x-tex">E(X) = \frac{1}{1 / 65536} = 65536</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.2574em;vertical-align:-0.936em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1/65536</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">65536</span></span></span></span></span></p><p>也就是平均要计算65536次哈希,才能找到一个前缀为四个<code>0</code>的合法哈希。</p><h2 id="优化">优化</h2><p>众所周知,SHA-256这种算法,GPU算起来最快了。因此Cap还支持RSW时间锁谜题算法,专门用来抗GPU。</p><p>具体算法原理这里就不展开了。</p><p>不过目前RSW还处于实验阶段,并且不是默认开启的。</p><h2 id="缺点">缺点</h2><p>与其说是缺点,我觉得应该是有些人对于Cap的设计理念理解错了。</p><p>Cap的核心理念是通过PoW来提高攻击成本,但它并没有阻止脚本程序的功能。</p><p>我让AI写了个python解题脚本,测试参数如下:</p><ul><li>Challenge protocol:SHA-256</li><li>Difficulty:4</li><li>Challenge count:80</li><li>Enable instrumentation challenges</li><li>Attempt to block headless browsers</li><li>Block non-browser user agents</li><li>Require browser headers</li></ul><p>不考虑出题和验证,以及传输的时间,在使用纯CPU计算下:</p><p>PoW工作量证明花费<code>4s19'</code>,调起浏览器完成浏览器环境检测<code>1s22'</code></p><p><img src="https://pic.goodboyboy.top/imgs/2026/07/09/28a9617d-f2ac-4869-9a5b-5c6ad4de09c5.webp" alt=""></p><p><img src="https://pic.goodboyboy.top/imgs/2026/07/09/53ef0663-d32d-4b2a-b86b-08a9dcac29bd.webp" alt=""></p><p>可见用脚本完全可以实现自动化,只是原来一次一秒可以打几千发,现在只能老老实实五秒一发了。</p><p>另外如果用cuda写结合GPU算,时间应该会更短。</p><h2 id="后记">后记</h2><p>Cap还是蛮好玩的。</p>]]></content>
<summary type="html"><h2 id="前言">前言</h2>
<p>最近发现一款开源的自托管验证码系统,研究了下觉得设计思想很有趣,打算写一篇博文分享一下。</p>
<h2 id="什么是Cap">什么是Cap</h2>
<p>Cap 是一款自托管的验证码系统,用隐形的工作量证明替代了传统的图像拼图。</summary>
<category term="教程" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/"/>
<category term="Web" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/Web/"/>
<category term="验证码" scheme="https://blog.goodboyboy.top/tags/%E9%AA%8C%E8%AF%81%E7%A0%81/"/>
<category term="Cap" scheme="https://blog.goodboyboy.top/tags/Cap/"/>
<category term="自托管" scheme="https://blog.goodboyboy.top/tags/%E8%87%AA%E6%89%98%E7%AE%A1/"/>
</entry>
<entry>
<title>公益服务迁移通知</title>
<link href="https://blog.goodboyboy.top/posts/2030627247.html"/>
<id>https://blog.goodboyboy.top/posts/2030627247.html</id>
<published>2026-07-08T08:51:55.000Z</published>
<updated>2026-07-08T08:51:55.000Z</updated>
<content type="html"><![CDATA[<h2 id="正文">正文</h2><p>由于资源组合调整,现将大部分公益服务已从<code>goodboyboy.top</code>迁移至<code>furwolf.com</code>下。</p><p>并关闭了部分使用较少或项目已被出售的服务。</p><p>对于接口类的公益服务已在原有域名上设定了301重定向,短期不会影响服务正常运行,但仍建议迁移至新域名。</p><p>具体变更请见公益服务页面:<a href="https://blog.goodboyboy.top/free/">https://blog.goodboyboy.top/free/</a></p>]]></content>
<summary type="html"><h2 id="正文">正文</h2>
<p>由于资源组合调整,现将大部分公益服务已从<code>goodboyboy.top</code>迁移至<code>furwolf.com</code>下。</p>
<p>并关闭了部分使用较少或项目已被出售的服务。</p>
<p>对于接口</summary>
<category term="公告" scheme="https://blog.goodboyboy.top/categories/%E5%85%AC%E5%91%8A/"/>
<category term="公告" scheme="https://blog.goodboyboy.top/tags/%E5%85%AC%E5%91%8A/"/>
</entry>
<entry>
<title>一种基于argon2id算法与shamir算法的内存PoW(工作量证明)解密游戏</title>
<link href="https://blog.goodboyboy.top/posts/4010684677.html"/>
<id>https://blog.goodboyboy.top/posts/4010684677.html</id>
<published>2026-07-07T10:45:47.000Z</published>
<updated>2026-07-07T10:45:47.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2><p>其实一个月前就设计了这个游戏,今天正式整理发布。</p><h2 id="算法采用">算法采用</h2><p>通过利用argon2id算法的内存硬度来对抗GPU运算,实现基于内存的PoW,拉低硬件差距。</p><p>通过利用shamir算法门限方案,增加游戏乐趣。</p><h2 id="游戏整体流程图">游戏整体流程图</h2><pre><code class="highlight mermaid">flowchart TD Enumerate(Enumerate Nonce) --> |枚举 Nonce| Target[Target Nonce] M[Memory Cost] --> Parameters[Parameters] T[Time Cost] --> Parameters[Parameters] Parallelism[Parallelism] --> Parameters[Parameters] Length[Output Length] --> Parameters[Parameters] Salt[Salt] --> Parameters[Parameters] Parameters[Parameters] --> |参与计算| Argon2id[Argon2id PoW] Target[Target Nonce] --> |参与计算| Argon2id[Argon2id PoW] Argon2id[Argon2id PoW] --> |派生内容| Secret[Secret] Secret[Secret] --> |转换| AES1Key[AES Key] AES1Key[AES Key] --> |参与计算| AES1[AES Algorithm] EncryptedShamirContent[Encrypted Shamir Key] --> |参与计算| AES1[AES Algorithm] AES1[AES Algorithm] --> |解密内容| TagShamirKey[Tag + Shamir Key] TagShamirKey[Tag + Shamir Key] --> |匹配 Tag| CorrectTag{Correct Tag} CorrectTag{Correct Tag} --> |No| Enumerate(Enumerate Nonce) CorrectTag{Correct Tag} --> |Yes| ShamirKey[Shamir Key] ShamirKey[Shamir Key 1] --> |参与计算| Shamir[Shamir Algorithm] ShamirKey2[Shamir Key 2] --> |参与计算| Shamir[Shamir Algorithm] ShamirKey3[Shamir Key 3] --> |参与计算| Shamir[Shamir Algorithm] MoreShamirKey[...] --> |参与计算| Shamir[Shamir Algorithm] Shamir[Shamir Algorithm] --> |合成 AES Master Key| MasterAESKey[AES Master Key] MasterAESKey[Master AES Key] --> |参与计算| AES2[AES Algorithm] EncryptedContent[Encrypted Content] --> |参与计算| AES2[AES Algorithm] AES2[AES Algorithm] --> |得到解密密文| DecryptedContent(Decrypted Content)</code></pre><h2 id="玩法讲解">玩法讲解</h2><h3 id="公开参数">公开参数</h3><p>首先,出题者会给出本次游戏难度(Argon2id算法)参数:</p><ul><li>Memory Cost(m) - 内存开销:指定算法在计算过程中需要使用的内存总量</li><li>Time Cost / Iterations (t) - 时间开销 / 迭代次数:指定算法的执行轮数。</li><li>Parallelism / Lanes (p) - 并发度 / 线程数:指定计算时可以同时使用的独立计算通道(lanes)或线程数量。</li><li>Salt (S) - 盐值:随机数据。</li><li>Output Length / Hash Length (l) - 输出长度:最终哈希结果的字节长度,一般为32用于匹配AES256密钥长度</li></ul><p>下方为可选的公开数据:</p><ul><li>Range - Nonce范围:Nonce的范围,可用于降低游戏难度。</li></ul><p>然后,出题者会公开本次游戏奖池数与最少碎片数(Shamir算法):</p><ul><li>Total shares(n) - 总份额数 / 碎片总数:指定总奖池数量。</li><li>Threshold(k) - 阈值 / 门限值:拼凑出最终Key所需的最少碎片数。</li></ul><h3 id="公开密文">公开密文</h3><p>接着,出题者会公开本次游戏所有的被加密的密文以及标识:</p><ul><li>所有被加密的Shamir Key(奖池)的密文</li><li>最终需要解密的密文</li><li>正确解密的内容所包含的Tag</li></ul><h3 id="开始计算">开始计算</h3><p>首先,解题者需要从挑选一个奖池,确定奖池的密文。</p><p>然后找出一个Nonce(随机数),将公开的游戏难度参数与Nonce通过argon2id算法进行计算,计算时间由出题者设置的难度决定。</p><p>如果出题者公开了Nonce范围,则在范围内寻找。</p><p>计算完成后会得到一个派生内容。</p><p>接着解题者需要将派生内容转换为 AES Key(具体转换规则由出题者公布),通过AES算法将奖池密文解密出来。</p><p>解密出内容后,可以通过Tag进行匹配(其实也可以不用匹配,AES-CGM模式下自带MAC校验),如果能成功匹配,则说明是正确的Nonce,成功得到一枚碎片;如果不能匹配成功,则说明是错误的Nonce,需要重新寻找。</p><p>当集齐出题者所设置的最少数量的碎片时,即可通过Shamir算法将碎片合成一个AES Master Key。</p><p>最后,通过这个AES Master Key,解密得到最终的奖品。</p><h3 id="计算优化">计算优化</h3><h4 id="寻找Nonce">寻找Nonce</h4><p>如果出题者给出Nonce范围,则可以尝试采用随机+HashMap去重的方式,将一部分期望压在你的lucky上。</p><p>你可能计算一次就中,也可能计算完整个奖池才中😄。</p><p>当然,你也可以一个一个算。</p><h4 id="并行计算">并行计算</h4><p>虽然出题者可以限制argon2id算法的并行数,但解题者可以并行的寻找Nonce并计算,只要解题者愿意付出额外的资源与成本😄。</p><h2 id="算法讲解">算法讲解</h2><h3 id="argon2算法">argon2算法</h3><p>argon2有些复杂,不讲(</p><h3 id="Shamir算法">Shamir算法</h3><div class="note info flat"><p>以下内容参考于Gemini</p></div><p>Shamir算法全名叫<code>Shamir 秘密共享算法 (Shamir's Secret Sharing)</code>。</p><p>Shamir算法的数学基础是多项式插值。</p><p>首先构造一个多项式</p><p>假设要隐藏的密钥是数值 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span>。随机生成一个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">m-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 次的多项式:</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi>a</mi><mn>0</mn></msub><mo>+</mo><msub><mi>a</mi><mn>1</mn></msub><mi>x</mi><mo>+</mo><msub><mi>a</mi><mn>2</mn></msub><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mo>⋯</mo><mo>+</mo><msub><mi>a</mi><mrow><mi>m</mi><mo>−</mo><mn>1</mn></mrow></msub><msup><mi>x</mi><mrow><mi>m</mi><mo>−</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">f(x) = a_0 + a_1x + a_2x^2 + \dots + a_{m-1}x^{m-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.0141em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.0724em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span></span></p><p>在这个多项式中,常数项 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">a_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 为要隐藏的密钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span>(即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mn>0</mn><mo stretchy="false">)</mo><mo>=</mo><mi>S</mi></mrow><annotation encoding="application/x-tex">f(0) = S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord">0</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span>),而其他的系数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>a</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>a</mi><mrow><mi>m</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">a_1, a_2, \dots, a_{m-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span> 为随机生成。</p><p>然后,在这个多项式的曲线上取 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 个不同的点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>y</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo separator="true">,</mo><mo stretchy="false">(</mo><msub><mi>x</mi><mn>2</mn></msub><mo separator="true">,</mo><msub><mi>y</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><mo stretchy="false">(</mo><msub><mi>x</mi><mi>n</mi></msub><mo separator="true">,</mo><msub><mi>y</mi><mi>n</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(x_1, y_1), (x_2, y_2), \dots, (x_n, y_n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> 。</p><p>在数学上,要唯一确定一个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">m-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 次的多项式,刚好需要 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 个点。</p><p>只要任意 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 个点,就可以通过<strong>拉格朗日插值法</strong>计算出完整的原多项式,从而求出 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">a_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>,也就是还原出了真正的密钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span>。</p><p>如果凑齐点数少于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 个,即使拥有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">m-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 个点,也无法推导出常数项 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">a_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 。</p><h4 id="示例">示例</h4><p>例如典型的 (3, 5) 门限方案</p><p>门限 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>=</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">m=3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3</span></span></span></span>,因此需要一个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>3</mn><mo>−</mo><mn>1</mn><mo>=</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">3-1=2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">3</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span> 次的多项式。</p><p>二次多项式也就是<strong>一元二次方程</strong>,它的图像是一条<strong>抛物线 (Parabola)</strong>。<br>方程的形式为:</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi>a</mi><mn>2</mn></msub><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><msub><mi>a</mi><mn>1</mn></msub><mi>x</mi><mo>+</mo><mi>S</mi></mrow><annotation encoding="application/x-tex">f(x) = a_2x^2 + a_1x + S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0141em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span></span></p><p>在这条抛物线上,随机切下 5 个不同的点(比如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>=</mo><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>3</mn><mo separator="true">,</mo><mn>4</mn><mo separator="true">,</mo><mn>5</mn></mrow><annotation encoding="application/x-tex">x=1, 2, 3, 4, 5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8389em;vertical-align:-0.1944em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">5</span></span></span></span> 对应的坐标)。<br>5 个坐标点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>y</mi><mn>1</mn></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(x_1, y_1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> 到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><msub><mi>x</mi><mn>5</mn></msub><mo separator="true">,</mo><msub><mi>y</mi><mn>5</mn></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(x_5, y_5)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">5</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">5</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>。</p><p>在几何学中,<strong>任意三个不在一条直线上的点,可以唯一确定一条抛物线</strong>。只要有 3 个坐标点,通过方程计算,就能还原出这条抛物线,找到它与 Y 轴的交点(即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">x=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> 时的值),即可把 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span> 算出来。</p><p>如果只有 2 个点,两点只能确定一条直线。<strong>经过这两个点的抛物线有无数条</strong>,无法知道哪一条是真正的抛物线,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span> 的可能性为无限大。</p><p>下面为具体数值演示</p><p><strong>隐藏的密钥</strong>:<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mo>=</mo><mn>42</mn></mrow><annotation encoding="application/x-tex">S = 42</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">42</span></span></span></span> (也就是抛物线与 Y 轴交点的值,即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">x=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> 时的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 值)。</p><p><strong>方程</strong>:<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><mn>2</mn><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mn>5</mn><mi>x</mi><mo>+</mo><mn>42</mn></mrow><annotation encoding="application/x-tex">f(x) = -2x^2 + 5x + 42</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">5</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">42</span></span></span></span> (对还原者隐藏)。</p><p><strong>生成的 5 个坐标点</strong>:</p><ol><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">,</mo><mn>45</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(1, 45)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">45</span><span class="mclose">)</span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>2</mn><mo separator="true">,</mo><mn>44</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(2, 44)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">44</span><span class="mclose">)</span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>3</mn><mo separator="true">,</mo><mn>39</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(3, 39)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">39</span><span class="mclose">)</span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>4</mn><mo separator="true">,</mo><mn>30</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(4, 30)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">30</span><span class="mclose">)</span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>5</mn><mo separator="true">,</mo><mn>17</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(5, 17)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">5</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">17</span><span class="mclose">)</span></span></span></span></li></ol><p>假设已知的坐标分别是 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">,</mo><mn>45</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(1, 45)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">45</span><span class="mclose">)</span></span></span></span></strong>、<strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>3</mn><mo separator="true">,</mo><mn>39</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(3, 39)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">39</span><span class="mclose">)</span></span></span></span></strong> 和 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>4</mn><mo separator="true">,</mo><mn>30</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(4, 30)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">30</span><span class="mclose">)</span></span></span></span></strong></p><h4 id="拉格朗日插值法-Lagrange-Interpolation">拉格朗日插值法 (Lagrange Interpolation)</h4><p>拉格朗日插值法的核心思想是“加权”。对于每一个点的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 值,乘以一个特定的“权重系数”(通常用 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>l</mi></mrow><annotation encoding="application/x-tex">l</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span></span></span></span> 表示),然后相加即可得到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">x=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> 时的密钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span>。</p><p>公式如下:</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>S</mi><mo>=</mo><msub><mi>y</mi><mn>1</mn></msub><mo>⋅</mo><msub><mi>l</mi><mn>1</mn></msub><mo>+</mo><msub><mi>y</mi><mn>2</mn></msub><mo>⋅</mo><msub><mi>l</mi><mn>2</mn></msub><mo>+</mo><msub><mi>y</mi><mn>3</mn></msub><mo>⋅</mo><msub><mi>l</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">S = y_1 \cdot l_1 + y_2 \cdot l_2 + y_3 \cdot l_3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>权重 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>l</mi></mrow><annotation encoding="application/x-tex">l</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span></span></span></span> 它只和的 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标</strong> 有关。</p><p>计算规则是:用其他的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标除以“其他的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标减去自己的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标”,然后相乘。</p><p>把选出的三个点的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标分别记为:<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>1</mn></msub><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">x_1=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>2</mn></msub><mo>=</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">x_2=3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3</span></span></span></span>,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub><mo>=</mo><mn>4</mn></mrow><annotation encoding="application/x-tex">x_3=4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span></span></span></span>。</p><p><strong>计算 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">,</mo><mn>45</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(1, 45)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">45</span><span class="mclose">)</span></span></span></span> 的权重 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>l</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">l_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>:</strong> 提取另外两个的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>3</mn></mrow><annotation encoding="application/x-tex">3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>4</mn></mrow><annotation encoding="application/x-tex">4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span></span></span></span>),与 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>)进行计算:</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>l</mi><mn>1</mn></msub><mo>=</mo><mfrac><msub><mi>x</mi><mn>2</mn></msub><mrow><msub><mi>x</mi><mn>2</mn></msub><mo>−</mo><msub><mi>x</mi><mn>1</mn></msub></mrow></mfrac><mo>⋅</mo><mfrac><msub><mi>x</mi><mn>3</mn></msub><mrow><msub><mi>x</mi><mn>3</mn></msub><mo>−</mo><msub><mi>x</mi><mn>1</mn></msub></mrow></mfrac></mrow><annotation encoding="application/x-tex">l_1 = \frac{x_2}{x_2 - x_1} \cdot \frac{x_3}{x_3 - x_1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.9436em;vertical-align:-0.836em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.9436em;vertical-align:-0.836em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>l</mi><mn>1</mn></msub><mo>=</mo><mfrac><mn>3</mn><mrow><mn>3</mn><mo>−</mo><mn>1</mn></mrow></mfrac><mo>⋅</mo><mfrac><mn>4</mn><mrow><mn>4</mn><mo>−</mo><mn>1</mn></mrow></mfrac><mo>=</mo><mfrac><mn>3</mn><mn>2</mn></mfrac><mo>⋅</mo><mfrac><mn>4</mn><mn>3</mn></mfrac><mo>=</mo><mfrac><mn>12</mn><mn>6</mn></mfrac><mo>=</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">l_1 = \frac{3}{3 - 1} \cdot \frac{4}{4 - 1} = \frac{3}{2} \cdot \frac{4}{3} = \frac{12}{6} = 2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">3</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">3</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">6</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">12</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span></span></p><p><strong>计算 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>3</mn><mo separator="true">,</mo><mn>39</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(3, 39)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">39</span><span class="mclose">)</span></span></span></span> 的权重 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>l</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">l_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>:</strong> 提取另外两个的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>4</mn></mrow><annotation encoding="application/x-tex">4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span></span></span></span>),与 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>3</mn></mrow><annotation encoding="application/x-tex">3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3</span></span></span></span>)进行计算:</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>l</mi><mn>2</mn></msub><mo>=</mo><mfrac><msub><mi>x</mi><mn>1</mn></msub><mrow><msub><mi>x</mi><mn>1</mn></msub><mo>−</mo><msub><mi>x</mi><mn>2</mn></msub></mrow></mfrac><mo>⋅</mo><mfrac><msub><mi>x</mi><mn>3</mn></msub><mrow><msub><mi>x</mi><mn>3</mn></msub><mo>−</mo><msub><mi>x</mi><mn>2</mn></msub></mrow></mfrac></mrow><annotation encoding="application/x-tex">l_2 = \frac{x_1}{x_1 - x_2} \cdot \frac{x_3}{x_3 - x_2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.9436em;vertical-align:-0.836em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.9436em;vertical-align:-0.836em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>l</mi><mn>2</mn></msub><mo>=</mo><mfrac><mn>1</mn><mrow><mn>1</mn><mo>−</mo><mn>3</mn></mrow></mfrac><mo>⋅</mo><mfrac><mn>4</mn><mrow><mn>4</mn><mo>−</mo><mn>3</mn></mrow></mfrac><mo>=</mo><mfrac><mn>1</mn><mrow><mo>−</mo><mn>2</mn></mrow></mfrac><mo>⋅</mo><mfrac><mn>4</mn><mn>1</mn></mfrac><mo>=</mo><mo>−</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">l_2 = \frac{1}{1 - 3} \cdot \frac{4}{4 - 3} = \frac{1}{-2} \cdot \frac{4}{1} = -2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">3</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">3</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">−</span><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">2</span></span></span></span></span></p><p><strong>计算 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>4</mn><mo separator="true">,</mo><mn>30</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(4, 30)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">30</span><span class="mclose">)</span></span></span></span> 的权重 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>l</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">l_3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>:</strong> 提取另外两个的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>3</mn></mrow><annotation encoding="application/x-tex">3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3</span></span></span></span>),与 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>4</mn></mrow><annotation encoding="application/x-tex">4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span></span></span></span>)进行计算:</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>l</mi><mn>3</mn></msub><mo>=</mo><mfrac><msub><mi>x</mi><mn>1</mn></msub><mrow><msub><mi>x</mi><mn>1</mn></msub><mo>−</mo><msub><mi>x</mi><mn>3</mn></msub></mrow></mfrac><mo>⋅</mo><mfrac><msub><mi>x</mi><mn>2</mn></msub><mrow><msub><mi>x</mi><mn>2</mn></msub><mo>−</mo><msub><mi>x</mi><mn>3</mn></msub></mrow></mfrac></mrow><annotation encoding="application/x-tex">l_3 = \frac{x_1}{x_1 - x_3} \cdot \frac{x_2}{x_2 - x_3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.9436em;vertical-align:-0.836em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.9436em;vertical-align:-0.836em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>l</mi><mn>3</mn></msub><mo>=</mo><mfrac><mn>1</mn><mrow><mn>1</mn><mo>−</mo><mn>4</mn></mrow></mfrac><mo>⋅</mo><mfrac><mn>3</mn><mrow><mn>3</mn><mo>−</mo><mn>4</mn></mrow></mfrac><mo>=</mo><mfrac><mn>1</mn><mrow><mo>−</mo><mn>3</mn></mrow></mfrac><mo>⋅</mo><mfrac><mn>3</mn><mrow><mo>−</mo><mn>1</mn></mrow></mfrac><mo>=</mo><mfrac><mn>3</mn><mn>3</mn></mfrac><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">l_3 = \frac{1}{1 - 4} \cdot \frac{3}{3 - 4} = \frac{1}{-3} \cdot \frac{3}{-1} = \frac{3}{3} = 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">4</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">3</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">4</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">−</span><span class="mord">3</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">−</span><span class="mord">1</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">3</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></span></p><p>现在,将三个点的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 值与各自算出的权重相乘,然后相加:</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>S</mi><mo>=</mo><mo stretchy="false">(</mo><msub><mi>y</mi><mn>1</mn></msub><mo>⋅</mo><msub><mi>l</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><msub><mi>y</mi><mn>2</mn></msub><mo>⋅</mo><msub><mi>l</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><msub><mi>y</mi><mn>3</mn></msub><mo>⋅</mo><msub><mi>l</mi><mn>3</mn></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">S = (y_1 \cdot l_1) + (y_2 \cdot l_2) + (y_3 \cdot l_3)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>S</mi><mo>=</mo><mo stretchy="false">(</mo><mn>45</mn><mo>⋅</mo><mn>2</mn><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><mn>39</mn><mo>⋅</mo><mo>−</mo><mn>2</mn><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><mn>30</mn><mo>⋅</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">S = (45 \cdot 2) + (39 \cdot -2) + (30 \cdot 1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">45</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">39</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">−</span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">30</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>S</mi><mo>=</mo><mn>90</mn><mo>−</mo><mn>78</mn><mo>+</mo><mn>30</mn></mrow><annotation encoding="application/x-tex">S = 90 - 78 + 30</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">90</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">78</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">30</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>S</mi><mo>=</mo><mn>42</mn></mrow><annotation encoding="application/x-tex">S = 42</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">42</span></span></span></span></span></p><p>最后还原出了最初设定的密钥 <strong>42</strong>。</p><h4 id="原始的解方程">原始的解方程</h4><p>依然使用上文 3 个坐标点:<strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">,</mo><mn>45</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(1, 45)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">45</span><span class="mclose">)</span></span></span></span></strong>、<strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>3</mn><mo separator="true">,</mo><mn>39</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(3, 39)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">39</span><span class="mclose">)</span></span></span></span></strong> 和 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>4</mn><mo separator="true">,</mo><mn>30</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(4, 30)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">30</span><span class="mclose">)</span></span></span></span></strong>。</p><p>3 个点确定的抛物线,它的标准方程形式则为:</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>y</mi><mo>=</mo><mi>a</mi><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mi>b</mi><mi>x</mi><mo>+</mo><mi>c</mi></mrow><annotation encoding="application/x-tex">y = ax^2 + bx + c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.9474em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">a</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">b</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span></span></p><p>目标是求出未知的系数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span>、<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi></mrow><annotation encoding="application/x-tex">c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span>。</p><p><strong>注意:</strong> 当 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">x = 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> 时,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>=</mo><mi>c</mi></mrow><annotation encoding="application/x-tex">y = c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span>。因此,<strong>因此需要寻找的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span> 其实就是常数项 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi></mrow><annotation encoding="application/x-tex">c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span></strong>。</p><p>将 3 个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(x, y)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span></span></span></span> 坐标分别代入标准方程中:</p><ol><li>代入点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">,</mo><mn>45</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(1, 45)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">45</span><span class="mclose">)</span></span></span></span>:</li></ol><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>a</mi><mo stretchy="false">(</mo><mn>1</mn><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mo>+</mo><mi>b</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo><mo>+</mo><mi>c</mi><mo>=</mo><mn>45</mn></mrow><annotation encoding="application/x-tex">a(1)^2 + b(1) + c = 45</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1141em;vertical-align:-0.25em;"></span><span class="mord mathnormal">a</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">45</span></span></span></span></span></p><p>化简得:<strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo>+</mo><mi>b</mi><mo>+</mo><mi>c</mi><mo>=</mo><mn>45</mn></mrow><annotation encoding="application/x-tex">a + b + c = 45</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">45</span></span></span></span></strong> (方程 ①)</p><ol start="2"><li>代入点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>3</mn><mo separator="true">,</mo><mn>39</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(3, 39)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">39</span><span class="mclose">)</span></span></span></span>:</li></ol><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>a</mi><mo stretchy="false">(</mo><mn>3</mn><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mo>+</mo><mi>b</mi><mo stretchy="false">(</mo><mn>3</mn><mo stretchy="false">)</mo><mo>+</mo><mi>c</mi><mo>=</mo><mn>39</mn></mrow><annotation encoding="application/x-tex">a(3)^2 + b(3) + c = 39</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1141em;vertical-align:-0.25em;"></span><span class="mord mathnormal">a</span><span class="mopen">(</span><span class="mord">3</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord">3</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">39</span></span></span></span></span></p><p>化简得:<strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>9</mn><mi>a</mi><mo>+</mo><mn>3</mn><mi>b</mi><mo>+</mo><mi>c</mi><mo>=</mo><mn>39</mn></mrow><annotation encoding="application/x-tex">9a + 3b + c = 39</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">9</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord">3</span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">39</span></span></span></span></strong> (方程 ②)</p><ol start="3"><li>代入点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>4</mn><mo separator="true">,</mo><mn>30</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(4, 30)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">30</span><span class="mclose">)</span></span></span></span>:</li></ol><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>a</mi><mo stretchy="false">(</mo><mn>4</mn><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mo>+</mo><mi>b</mi><mo stretchy="false">(</mo><mn>4</mn><mo stretchy="false">)</mo><mo>+</mo><mi>c</mi><mo>=</mo><mn>30</mn></mrow><annotation encoding="application/x-tex">a(4)^2 + b(4) + c = 30</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1141em;vertical-align:-0.25em;"></span><span class="mord mathnormal">a</span><span class="mopen">(</span><span class="mord">4</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord">4</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">30</span></span></span></span></span></p><p>化简得:<strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>16</mn><mi>a</mi><mo>+</mo><mn>4</mn><mi>b</mi><mo>+</mo><mi>c</mi><mo>=</mo><mn>30</mn></mrow><annotation encoding="application/x-tex">16a + 4b + c = 30</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">16</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord">4</span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">30</span></span></span></span></strong> (方程 ③)</p><p>现在,得到了一个包含三个未知数 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo separator="true">,</mo><mi>b</mi><mo separator="true">,</mo><mi>c</mi></mrow><annotation encoding="application/x-tex">a, b, c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">a</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">b</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">c</span></span></span></span>) 的三元一次方程组。</p><p>为了解开它,可以通过两个方程相减,先消去常数项 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi></mrow><annotation encoding="application/x-tex">c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span>:</p><p><strong>1. 用方程 ② 减去方程 ①:</strong></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mn>9</mn><mi>a</mi><mo>+</mo><mn>3</mn><mi>b</mi><mo>+</mo><mi>c</mi><mo stretchy="false">)</mo><mo>−</mo><mo stretchy="false">(</mo><mi>a</mi><mo>+</mo><mi>b</mi><mo>+</mo><mi>c</mi><mo stretchy="false">)</mo><mo>=</mo><mn>39</mn><mo>−</mo><mn>45</mn></mrow><annotation encoding="application/x-tex">(9a + 3b + c) - (a + b + c) = 39 - 45</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">9</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord">3</span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">39</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">45</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mn>8</mn><mi>a</mi><mo>+</mo><mn>2</mn><mi>b</mi><mo>=</mo><mo>−</mo><mn>6</mn></mrow><annotation encoding="application/x-tex">8a + 2b = -6</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">8</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord">2</span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">6</span></span></span></span></span></p><p>两边同除以 2,化简得:<strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>4</mn><mi>a</mi><mo>+</mo><mi>b</mi><mo>=</mo><mo>−</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">4a + b = -3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">4</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">3</span></span></span></span></strong> (方程 ④)</p><p><strong>2. 用方程 ③ 减去方程 ②:</strong></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mn>16</mn><mi>a</mi><mo>+</mo><mn>4</mn><mi>b</mi><mo>+</mo><mi>c</mi><mo stretchy="false">)</mo><mo>−</mo><mo stretchy="false">(</mo><mn>9</mn><mi>a</mi><mo>+</mo><mn>3</mn><mi>b</mi><mo>+</mo><mi>c</mi><mo stretchy="false">)</mo><mo>=</mo><mn>30</mn><mo>−</mo><mn>39</mn></mrow><annotation encoding="application/x-tex">(16a + 4b + c) - (9a + 3b + c) = 30 - 39</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">16</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord">4</span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">9</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord">3</span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">30</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">39</span></span></span></span></span></p><p><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>7</mn><mi>a</mi><mo>+</mo><mi>b</mi><mo>=</mo><mo>−</mo><mn>9</mn></mrow><annotation encoding="application/x-tex">7a + b = -9</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">7</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">9</span></span></span></span></strong> (方程 ⑤)</p><p><strong>3. 用方程 ⑤ 减去方程 ④,消去 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span>:</strong></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mn>7</mn><mi>a</mi><mo>+</mo><mi>b</mi><mo stretchy="false">)</mo><mo>−</mo><mo stretchy="false">(</mo><mn>4</mn><mi>a</mi><mo>+</mo><mi>b</mi><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><mn>9</mn><mo>−</mo><mo stretchy="false">(</mo><mo>−</mo><mn>3</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(7a + b) - (4a + b) = -9 - (-3)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">7</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">4</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">9</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">−</span><span class="mord">3</span><span class="mclose">)</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mn>3</mn><mi>a</mi><mo>=</mo><mo>−</mo><mn>6</mn></mrow><annotation encoding="application/x-tex">3a = -6</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">6</span></span></span></span></span></p><p><strong>解得:<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo>=</mo><mo>−</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">a = -2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">2</span></span></span></span></strong></p><p><strong>4. 把 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo>=</mo><mo>−</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">a = -2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">2</span></span></span></span> 代回方程 ④,求 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span>:</strong></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mn>4</mn><mo stretchy="false">(</mo><mo>−</mo><mn>2</mn><mo stretchy="false">)</mo><mo>+</mo><mi>b</mi><mo>=</mo><mo>−</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">4(-2) + b = -3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">4</span><span class="mopen">(</span><span class="mord">−</span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">3</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo>−</mo><mn>8</mn><mo>+</mo><mi>b</mi><mo>=</mo><mo>−</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">-8 + b = -3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">8</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">3</span></span></span></span></span></p><p><strong>解得:<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi><mo>=</mo><mn>5</mn></mrow><annotation encoding="application/x-tex">b = 5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">5</span></span></span></span></strong></p><p>现在已知 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo>=</mo><mo>−</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">a = -2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">2</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi><mo>=</mo><mn>5</mn></mrow><annotation encoding="application/x-tex">b = 5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">5</span></span></span></span>。将其代入方程 ① 中:</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>a</mi><mo>+</mo><mi>b</mi><mo>+</mo><mi>c</mi><mo>=</mo><mn>45</mn></mrow><annotation encoding="application/x-tex">a + b + c = 45</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">45</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo>−</mo><mn>2</mn><mo>+</mo><mn>5</mn><mo>+</mo><mi>c</mi><mo>=</mo><mn>45</mn></mrow><annotation encoding="application/x-tex">-2 + 5 + c = 45</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">2</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">5</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">45</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mn>3</mn><mo>+</mo><mi>c</mi><mo>=</mo><mn>45</mn></mrow><annotation encoding="application/x-tex">3 + c = 45</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">3</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">45</span></span></span></span></span></p><p><strong>解得:<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo>=</mo><mn>42</mn></mrow><annotation encoding="application/x-tex">c = 42</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">42</span></span></span></span></strong></p><h2 id="后记">后记</h2><p>其实这个游戏不仅可以用argon2id算法,也可以用RSW时间锁谜题这类算法。</p>]]></content>
<summary type="html"><h2 id="前言">前言</h2>
<p>其实一个月前就设计了这个游戏,今天正式整理发布。</p>
<h2 id="算法采用">算法采用</h2>
<p>通过利用argon2id算法的内存硬度来对抗GPU运算,实现基于内存的PoW,拉低硬件差距。</p>
<p>通过利用sha</summary>
<category term="笔记" scheme="https://blog.goodboyboy.top/categories/%E7%AC%94%E8%AE%B0/"/>
<category term="Python" scheme="https://blog.goodboyboy.top/categories/%E7%AC%94%E8%AE%B0/Python/"/>
<category term="游戏" scheme="https://blog.goodboyboy.top/tags/%E6%B8%B8%E6%88%8F/"/>
<category term="argon2id" scheme="https://blog.goodboyboy.top/tags/argon2id/"/>
<category term="shamir" scheme="https://blog.goodboyboy.top/tags/shamir/"/>
<category term="PoW" scheme="https://blog.goodboyboy.top/tags/PoW/"/>
</entry>
<entry>
<title>记忆里的屋子(一)</title>
<link href="https://blog.goodboyboy.top/posts/930007696.html"/>
<id>https://blog.goodboyboy.top/posts/930007696.html</id>
<published>2026-06-28T12:18:55.000Z</published>
<updated>2026-06-28T12:18:55.000Z</updated>
<content type="html"><![CDATA[<h2 id="一">一</h2><p>我的老家在一个小县城的乡下。</p><p>虽然从我记事起,我就一直住在县城里,唯有过年时,我才跟随爸妈一起回到乡下,和周围的亲朋好友一起过年。</p><p>那会我很讨厌回乡下,因为每次都需要坐两个小时的大巴车,沿着弯弯曲曲的山路,摇摇晃晃来到那个屋子。那个承载了爷爷奶奶,爸妈,以及我记忆的屋子。</p><p>在我记事以前,听我爸妈说,家里有一条大黄狗。</p><p>每次我只要上完厕所,学着小狗呜呜叫几声,大黄狗就会跑过来舔我屁股。</p><p>我很喜欢和大黄狗玩,喜欢踩它尾巴,但是它不敢反抗,因为爷爷会在旁边用树枝打它。</p><p>只可惜有一天,它不知道去了哪,可能是被偷狗的贼偷走了,也可能是被什么人打死了。</p><p>每次想到这里,我就觉得很可惜,如果我能更早一点记事,可能我就能永远记得你的样子了吧。</p><h2 id="二">二</h2><p>过年总是热闹的。</p><p>要么和我堂弟在屋子里玩,要么和隔壁屋子的小朋友一起玩。</p><p>当然,还有那些喜欢逗我们的大朋友。</p><p>小时候没有什么可以玩的,我和堂弟便不断找那些大朋友讨嫌,叫他们的绰号,然后奔回家。</p><p>如果跑慢了被抓到,那就免不了一顿暴揍。</p><p>而我逃脱的阻拦之一,便是一个土坡。</p><p>那时还没有水泥路,全是些土路。</p><p>平常不在乡下,没有大人们说的麻利,每次跨上那个土坡都是一次挑战。</p><p>不过好在我从来没有被抓住过,因为我不跳下土坡,自然也就不用跨上土坡了。</p><h2 id="三">三</h2><p>跨年夜十分热闹。</p><p>大人们在屋子里打麻将,我便和堂弟在外面放烟花,放炮仗。</p><p>那时口袋里必然是随时揣着一个打火机的,不是用来抽烟,而是用来放另一个口袋里的擦炮的。</p><p>等到零点的时,四面八方便传来烟花声,各种颜色和花色的烟花在黑夜里绽放。</p><p>大人们也在院子里放起鞭炮,劈里啪啦的声音和天边的烟花声遥相呼应,预示着新的一年的到来。</p><p>我和堂弟也燃起冲天炮,对着天空燃放。</p><p>虽然大人们说过不能对着人放,但在某一年的跨年夜里,我们不知为何,放着放着便对冲起来。</p><p>烟花爆炸的激动和违背大人的偷感交杂在一起,令人兴奋不已。</p><p>本以为这件事不会被发现,却在第二天早上被老妈点出。</p><p>看我一脸疑惑,老妈便拎起我胸前的衣服,给我展示羽绒服上被烧出的密密麻麻的小洞。</p><p>不过好在最后没有被老妈深究。</p><h2 id="四">四</h2><p>每次来到乡下,第一件事必然是在小卖部买个打火机和一板的擦炮。</p><p>那会没有手机电脑这些电子产品,唯一的乐趣就只有放擦炮。</p><p>一盒擦炮里,大部分是普通的小擦炮,还有一两个二连炮,以及一个雷公炮。</p><p>整个冬天下来,擦炮都被我和堂弟玩出花来了。</p><p>一次去别人家拜年时,大人们在屋子里说话,我和堂弟便在院子里放擦炮。</p><p>不经意间,我撇到一个放在水龙头下盛满水的大盆子。</p><p>我便灵机一动,扔了几个小擦炮进去,然而结果只是不痛不痒的。</p><p>于是我拿出那个雷公炮丢进去。</p><p>咚的一声,好像没有什么变化。</p><p>就当我觉得无聊时,发现怎么从盆底开始流出了一些水来。</p><p>看着盆里越来越少的水,我忽然意识到,这下闯祸了……</p><h2 id="五">五</h2><p>那会屋子前还养着一些鸡。</p><p>白天的时候他们会在院子前的橘子树林里活动,晚上则会回到鸡圈里。</p><p>小鸡们很可爱,可是大人们不允许我们捉小鸡。</p><p>直到某一天,一次偶然的情况下,大人们出去了,屋子里只剩我和堂弟。</p><p>我们便一起捉了几只小鸡玩。</p><p>我们把小鸡放在床上玩。</p><p>我用那种黄色空心的透明胶环住小鸡,刚好能围住小鸡。</p><p>玩了一会,我下床取取东西,回来时便看到堂弟匆忙告诉我,鸡在床上拉屎了。</p><p>看到床上那一小坨鸡屎,我有些不知所措,最后还是堂弟把它清理了。</p><p>后面我去看电视,堂弟则是又去捉了一些小鸡,把小鸡挂在门口的渔网上玩。</p><p>好巧不巧,这时大人们回来了,看到被挂在渔网上的小鸡,堂弟当然免不了被一顿说教。</p><p>过了几天,我又想玩小鸡了,便和堂弟又捉了一些小鸡,结果不小心玩死了两只。</p><p>我们便拿着锄头挖了一个小坑给小鸡埋了起来。</p><p>本以为不会被发现,后面却听见大人们嘀咕怎么少了几只小鸡。</p><p>我们那当然只能是不清楚,不知道,不了解了。</p><p>不知道小鸡会不会怪罪我们……</p><h2 id="六">六</h2><p>上初中后,我便再也没有回到这里。</p><p>直到上了大学,我才在清明节跟着父亲,和堂弟一起回到这个屋子。</p><p>在这六年里,周围邻里渐渐都搬去了城里,这个屋子也因为没人住越来越破烂。</p><p>土路变成了柏油路,小朋友变成了大朋友。</p><p>记忆里的土坡被一脚跨过,记忆里的小卖部走几步便到。</p><p>而记忆里的热闹却再也不复,只剩下公路边偶尔驶过的车辆,和拂过耳边的微风。</p><p>小时候的玩伴早已各奔东西,小时候的热闹早已不复存在。</p><p>只剩下一地的荒芜,和空荡的屋子……</p>]]></content>
<summary type="html"><h2 id="一">一</h2>
<p>我的老家在一个小县城的乡下。</p>
<p>虽然从我记事起,我就一直住在县城里,唯有过年时,我才跟随爸妈一起回到乡下,和周围的亲朋好友一起过年。</p>
<p>那会我很讨厌回乡下,因为每次都需要坐两个小时的大巴车,沿着弯弯曲曲的山路,摇摇</summary>
<category term="生活" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/"/>
<category term="回忆" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/%E5%9B%9E%E5%BF%86/"/>
<category term="记忆" scheme="https://blog.goodboyboy.top/tags/%E8%AE%B0%E5%BF%86/"/>
<category term="屋子" scheme="https://blog.goodboyboy.top/tags/%E5%B1%8B%E5%AD%90/"/>
</entry>
<entry>
<title>Ubuntu 26.04 Btrfs+LUKS2安装</title>
<link href="https://blog.goodboyboy.top/posts/4123452949.html"/>
<id>https://blog.goodboyboy.top/posts/4123452949.html</id>
<published>2026-06-18T13:04:44.000Z</published>
<updated>2026-06-18T13:04:44.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2><p>Ubuntu官方的安装器手动安装下只能识别普通设备分区,并不能把系统安装在mapper设备上。</p><p>这篇教程非新手教程,需要有一定相关知识积累。</p><p>新手建议走官方启动器安装流程。</p><h2 id="正文">正文</h2><blockquote><p>后面教程以/dev/sda设备作为演示,请根据自身实际情况调整</p></blockquote><h3 id="创建分区">创建分区</h3><p>创建三个分区,怎么创建都行,这里不做演示</p><ul><li>/dev/sda1 512MB EFI分区</li><li>/dev/sda2 1G Boot分区</li><li>/dev/sda3 剩余空间 系统分区</li></ul><h3 id="下载镜像">下载镜像</h3><p>可以下载Desktop版,也可以下载Server版,Server版会精简很多,下面演示采用Server版,安装流程和Desktop版没有什么差别,有差别的地方后文会标注出。</p><h3 id="制作Live-CD启动盘">制作Live CD启动盘</h3><p>使用rufus工具(如果自己有其他的烧录工具都行)将镜像烧录至准备的U盘(光盘或者其他什么介质都行,能启动就行)</p><h3 id="前置准备">前置准备</h3><p>重启进入Live CD环境,选择试用Ubuntu。</p><p>Desktop镜像打开终端,Server镜像按ALT+F2切换至终端。</p><p>首先查看并确认设备以及分区</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">lsblk</span><br></pre></td></tr></table></figure><p>确认完成后切换为root用户</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> -i</span><br></pre></td></tr></table></figure><p>后面操作均以root身份操作</p><h3 id="配置LUKS2加密容器">配置LUKS2加密容器</h3><p>对系统分区进行LUKS2加密,并将其解锁。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 需要输入两次你想要设置的密码</span></span><br><span class="line">cryptsetup luksFormat --<span class="built_in">type</span> luks2 /dev/sda3</span><br></pre></td></tr></table></figure><p>打开刚刚创建的加密分区,并将其映射为"cryptroot"</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cryptsetup open /dev/sda3 cryptroot</span><br></pre></td></tr></table></figure><h3 id="格式化并创建Btrfs子卷">格式化并创建Btrfs子卷</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 格式化EFI分区为 FAT32</span></span><br><span class="line">mkfs.fat -F32 /dev/sda1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 格式化boot分区为Ext4</span></span><br><span class="line">mkfs.ext4 /dev/sda2</span><br><span class="line"></span><br><span class="line"><span class="comment"># 将解密后的映射设备格式化为Btrfs</span></span><br><span class="line">mkfs.btrfs /dev/mapper/cryptroot</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">mount /dev/mapper/cryptroot /mnt</span><br><span class="line">btrfs subvolume create /mnt/@</span><br><span class="line">btrfs subvolume create /mnt/@home</span><br><span class="line">umount /mnt</span><br></pre></td></tr></table></figure><h3 id="重新挂载目录树">重新挂载目录树</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">mount -o subvol=@ /dev/mapper/cryptroot /mnt</span><br><span class="line"><span class="built_in">mkdir</span> -p /mnt/home</span><br><span class="line">mount -o subvol=@home /dev/mapper/cryptroot /mnt/home</span><br><span class="line">mount /dev/sda2 /mnt/boot</span><br><span class="line">mount /dev/sda1 /mnt/boot/efi</span><br></pre></td></tr></table></figure><h3 id="解压SquashFS">解压SquashFS</h3><p>在<code>/cdrom/casper/</code>下,寻找后缀为<code>.squashfs</code>的核心系统文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">ls</span> -lh /cdrom/casper/*.squashfs</span><br></pre></td></tr></table></figure><p>Server版通常叫<code>ubuntu-server-minimal.squashfs</code>,桌面版可能叫<code>filesystem.squashfs</code></p><p>将这个文件挂载出来</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> -p /tmp/squashfs</span><br><span class="line">mount -o loop /cdrom/casper/ubuntu-server-minimal.squashfs /tmp/squashfs</span><br></pre></td></tr></table></figure><h3 id="同步系统">同步系统</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rsync -aAXv /tmp/squashfs/ /mnt/</span><br></pre></td></tr></table></figure><p>同步完成后解除挂载</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">umount /tmp/squashfs</span><br></pre></td></tr></table></figure><h3 id="Chroot">Chroot</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> /dev /dev/pts /proc /sys /run; <span class="keyword">do</span> mount -B <span class="variable">$i</span> /mnt<span class="variable">$i</span>; <span class="keyword">done</span></span><br><span class="line"><span class="built_in">chroot</span> /mnt /bin/bash</span><br></pre></td></tr></table></figure><h3 id="最小配置">最小配置</h3><p>配置DNS</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">rm</span> -f /etc/resolv.conf</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"nameserver 223.5.5.5"</span> > /etc/resolv.conf</span><br></pre></td></tr></table></figure><p>配置普通用户(不建议直接使用root用户)</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">adduser your_username</span><br><span class="line">usermod -aG <span class="built_in">sudo</span> your_username</span><br></pre></td></tr></table></figure><p>配置软件源</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">"deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ resolute main restricted universe multiverse"</span> > /etc/apt/sources.list</span><br><span class="line">apt update</span><br></pre></td></tr></table></figure><h3 id="补齐缺少软件包">补齐缺少软件包</h3><p>安装核心套件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apt install linux-image-generic grub-efi-amd64 cryptsetup-initramfs btrfs-progs -y</span><br></pre></td></tr></table></figure><p>安装桌面环境</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apt install ubuntu-desktop^ -y</span><br></pre></td></tr></table></figure><h3 id="配置fstab与crypttab">配置fstab与crypttab</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 写入crypttab</span></span><br><span class="line">LUKS_UUID=$(blkid -s UUID -o value /dev/sda3)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"cryptroot UUID=<span class="variable">${LUKS_UUID}</span> none luks,discard"</span> > /etc/crypttab</span><br><span class="line"></span><br><span class="line"><span class="comment"># 写入fstab</span></span><br><span class="line">BTRFS_UUID=$(blkid -s UUID -o value /dev/mapper/cryptroot)</span><br><span class="line">BOOT_UUID=$(blkid -s UUID -o value /dev/sda2)</span><br><span class="line">EFI_UUID=$(blkid -s UUID -o value /dev/sda1)</span><br><span class="line"></span><br><span class="line"><span class="built_in">cat</span> <<<span class="string">EOF > /etc/fstab</span></span><br><span class="line"><span class="string">UUID=${BTRFS_UUID} / btrfs subvol=@,defaults,discard=async 0 0</span></span><br><span class="line"><span class="string">UUID=${BTRFS_UUID} /home btrfs subvol=@home,defaults,discard=async 0 0</span></span><br><span class="line"><span class="string">UUID=${BOOT_UUID} /boot ext4 defaults 0 2</span></span><br><span class="line"><span class="string">UUID=${EFI_UUID} /boot/efi vfat umask=0077 0 1</span></span><br><span class="line"><span class="string">EOF</span></span><br></pre></td></tr></table></figure><h3 id="生成引导">生成引导</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">update-initramfs -u -k all</span><br><span class="line">grub-install /dev/sda</span><br><span class="line">update-grub</span><br></pre></td></tr></table></figure><h3 id="安全启动(可选)">安全启动(可选)</h3><p>这时的引导是没有签名的,如果BIOS开启了安全启动将无法引导,如果有安全启动需求可以安装带签名的GRUB和Shim模块</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">apt install grub-efi-amd64-signed shim-signed -y</span><br><span class="line">grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu</span><br><span class="line">update-grub</span><br></pre></td></tr></table></figure><p>最后退出并重启</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">exit</span></span><br><span class="line">umount -R /mnt</span><br><span class="line">reboot</span><br></pre></td></tr></table></figure><h3 id="设置中文">设置中文</h3><p>此时系统是英文的,可以在设置里安装Chinese语言包,然后</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> localectl set-locale LANG=zh_CN.UTF-8</span><br></pre></td></tr></table></figure><h3 id="删除Snap(可选)">删除Snap(可选)</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt purge snapd -y</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">rm</span> -rf ~/snap</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">rm</span> -rf /snap</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">rm</span> -rf /var/snap</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">rm</span> -rf /var/lib/snapd</span><br></pre></td></tr></table></figure><p>安装桌面环境时虽然日志中有安装snap和snap的firefox之类的组件</p><p>但是进入桌面后却没看到任何snap应用,包括应用商店,不过snap服务还是在的</p><h3 id="Bug解决">Bug解决</h3><p>systemd-networkd-wait-online.service卡开机问题</p><p>取消开机自启</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> systemctl <span class="built_in">disable</span> systemd-networkd-wait-online.service</span><br><span class="line"><span class="built_in">sudo</span> systemctl mask systemd-networkd-wait-online.service</span><br></pre></td></tr></table></figure><h3 id="安装Timeshift">安装Timeshift</h3><p>玩Btrfs当然少不了Timeshift</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt update</span><br><span class="line"><span class="built_in">sudo</span> apt install timeshift -y</span><br></pre></td></tr></table></figure><h3 id="安装Flatpak(可选)">安装Flatpak(可选)</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt update</span><br><span class="line"><span class="built_in">sudo</span> apt install flatpak -y</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt install gnome-software gnome-software-plugin-flatpak -y</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><h2 id="前言">前言</h2>
<p>Ubuntu官方的安装器手动安装下只能识别普通设备分区,并不能把系统安装在mapper设备上。</p>
<p>这篇教程非新手教程,需要有一定相关知识积累。</p>
<p>新手建议走官方启动器安装流程。</p>
<h2 id="正文"></summary>
<category term="教程" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/"/>
<category term="Software" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/Software/"/>
<category term="Ubuntu" scheme="https://blog.goodboyboy.top/tags/Ubuntu/"/>
<category term="Btrfs" scheme="https://blog.goodboyboy.top/tags/Btrfs/"/>
<category term="LUKS2" scheme="https://blog.goodboyboy.top/tags/LUKS2/"/>
</entry>
<entry>
<title>主域名服务不稳定通知</title>
<link href="https://blog.goodboyboy.top/posts/630772453.html"/>
<id>https://blog.goodboyboy.top/posts/630772453.html</id>
<published>2026-05-27T14:41:44.000Z</published>
<updated>2026-05-27T14:41:44.000Z</updated>
<content type="html"><![CDATA[<h2 id="正文">正文</h2><p>由于阿里云公网权威解析服务免费版即将限速,为保障各项服务稳定,计划将托管于阿里云的主域名<code>goodboyboy.top</code>DNS解析进行迁移。</p><p>主域名<code>goodboyboy.top</code> DNS解析于 2026-5-26 晚开始迁移</p><p>原定迁移至华为云,但出现海外IP无法正常解析问题。因此计划重新迁移至CloudFlare。</p><p>目前主域名<code>goodboyboy.top</code>DNS解析已全部迁移至CloudFlare,由于NS记录缓存问题,NS记录同步全球最长需要48小时,因此在接下来的48小时内主域名下的各项服务质量可能会下降,包括<code>Gravatar 头像加速</code>、<code>Steam 卡片生成</code>等服务。</p>]]></content>
<summary type="html"><h2 id="正文">正文</h2>
<p>由于阿里云公网权威解析服务免费版即将限速,为保障各项服务稳定,计划将托管于阿里云的主域名<code>goodboyboy.top</code>DNS解析进行迁移。</p>
<p>主域名<code>goodboyboy.top</cod</summary>
<category term="公告" scheme="https://blog.goodboyboy.top/categories/%E5%85%AC%E5%91%8A/"/>
<category term="公告" scheme="https://blog.goodboyboy.top/tags/%E5%85%AC%E5%91%8A/"/>
</entry>
<entry>
<title>腾讯元宝客户端实习二面凉经</title>
<link href="https://blog.goodboyboy.top/posts/3668760505.html"/>
<id>https://blog.goodboyboy.top/posts/3668760505.html</id>
<published>2026-05-19T10:10:36.000Z</published>
<updated>2026-05-19T10:10:36.000Z</updated>
<content type="html"><![CDATA[<h2 id="二编">二编</h2><blockquote><p>已凉</p></blockquote><h2 id="前言">前言</h2><p>最近身体不太舒服(体测,一生之敌),感觉今天面试发挥一般般</p><h2 id="正文">正文</h2><h3 id="算法相关">算法相关</h3><p>这次不是手撕了,而是根据场景选择合适的数据结构来完成场景任务。</p><p>场景任务为选择一个合适的数据结构维护一个top10的热搜词,还有千亿级的搜索词</p><p>因为之前从来没有接触过这类问题,前半段答得牛头不对马嘴😭</p><p>后面经过面试官持续描述,加上说到O(1)的时间复杂度,才想起哈希表qwq</p><p>然后关于top10热搜词,我想到了二叉树,然后就是堆,但是我之前堆接触的比较少,凭着记忆以为是最大堆,后面面试官说应该是最小堆()</p><h3 id="项目相关">项目相关</h3><p>提问:MVC、MVP、MVVM、MVI是什么,有什么区别</p><p>这个问题我会,属于是八股内容了,然而接下来问题让我懵了</p><p>那MVVM有哪些缺点?如果一个简单的应用,不考虑activity生命周期以及屏幕旋转,是用MVVM好还是MVC好?</p><p>说实话我之前还真没觉得MVVM这种架构有什么缺点,它基本上解决了Android APP MVC架构下各种耦合、引用持有问题,而且平常也没有那种极致渲染要求场景,确实是没考虑到。</p><p>面试官的回答是MVC架构更简单,MVVM有一层封装,会有额外的性能开销。确实,对于这种人为限定场景来说,MVC确实比MVVM合适。</p><p>提问:协程和线程有什么区别</p><p>这个问题属于八股内容,八股答法+结合自己的理解</p><p>提问:协程是否能实现真正的并发,再加上额外限制例如单核CPU。</p><p>当时脑子不在状态,答得不是很好。这个具体看实现,而且并发和并行是两个概念,想要实现真正的并行那确实是需要多核CPU,但是并发只需要多个任务同时执行,通过切分CPU时间片达到并发任务执行。而协程是建立在线程之上的,如果按照并发设计是可以实现真正的并发的。</p><p>提问:协程和线程哪个是用户态,哪个是内核态</p><p>这个没什么异议,协程底层就是一个线程池,本质是一个状态机,没有系统调用等开销,运行在用户态。而线程需要通过系统调用和系统进行交互,开销大。</p><p>提问:activity生命周期,activity跳转的生命周期</p><p>依旧是八股问题,第一个答对了,第二个之前看过但是忘记了qwq,面试官叫我面试完自己试试😭</p><p>提问:Compose重组发生在什么时候,如何避免无效的重组(终于有compose的内容了qwq)</p><p>直接秒了</p><p>提问:http中1.x,2.x,3.x有什么区别。分别优化了什么</p><p>秒了</p><p>追问:http2.x相较于http1.x,内容传输上有什么不同</p><p>这个确实是忘了,主要是变成了二进制传输来连接复用</p><p>提问:询问项目缓存机制</p><p>秒了</p><p>提问:列表如何进行缓存设计</p><p>答得不是很好,一个是语言组织上,另一个是没回答完全,只说到了本地缓存,后面面试官说可以做二级缓存,使用内存进行缓存才恍然大悟。</p><p>提问:平常哪些场景使用了AI Coding</p><p>劈里啪啦说了一大堆,过</p><p>最后反问</p><h2 id="后记">后记</h2><p>这次发挥的不是很好,希望能过吧qwq</p>]]></content>
<summary type="html"><h2 id="二编">二编</h2>
<blockquote>
<p>已凉</p>
</blockquote>
<h2 id="前言">前言</h2>
<p>最近身体不太舒服(体测,一生之敌),感觉今天面试发挥一般般</p>
<h2 id="正文">正文</h2>
<h3 id</summary>
<category term="笔记" scheme="https://blog.goodboyboy.top/categories/%E7%AC%94%E8%AE%B0/"/>
<category term="面试" scheme="https://blog.goodboyboy.top/categories/%E7%AC%94%E8%AE%B0/%E9%9D%A2%E8%AF%95/"/>
<category term="面试" scheme="https://blog.goodboyboy.top/tags/%E9%9D%A2%E8%AF%95/"/>
<category term="腾讯" scheme="https://blog.goodboyboy.top/tags/%E8%85%BE%E8%AE%AF/"/>
</entry>
<entry>
<title>腾讯元宝客户端实习一面面经</title>
<link href="https://blog.goodboyboy.top/posts/2566688502.html"/>
<id>https://blog.goodboyboy.top/posts/2566688502.html</id>
<published>2026-05-12T02:58:59.000Z</published>
<updated>2026-05-12T02:58:59.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2><p>相较于搜狗输入法那场面试的面试官,这次的面试官明显就对我感兴趣很多了,和面试官互动得很深入。</p><p>依旧是深度定制DIY面试,无八股盛宴</p><h2 id="正文">正文</h2><h3 id="手撕环节">手撕环节</h3><p>无自我介绍,上来直接开始手撕代码</p><p>题目是二维矩阵最优寻找target数(<a href="https://leetcode.cn/problems/search-a-2d-matrix-ii">240. 搜索二维矩阵 II</a>)</p><p>虽然leetcode做过,但是测试程序依旧是不支持Kotlin,面试官说可以用Java,然鹅我Java都忘得差不多了😂</p><p>没办法,最后面试官让我用JavaScript写,不得不说,JavaScript和Kotlin在基础语法上真的就大差不差,直接救我老命😂</p><p>虽然基础语法上大差不差,但是细节上坑死我了,把console.print写成print,把数组长度的length写成size和size(),在那里测试半天,最后还是面试官提醒我该怎么写🥹</p><p>最后代码出来了,但是边界条件没做好,又卡半天,面试官又善良的提醒了我一下while的边界条件,才把题目A掉。(面试官太善良了🥹)</p><p>本来面试官打算出第二道题的,看时间有点不够了,便结束了手撕环节</p><h3 id="项目盘点环节">项目盘点环节</h3><p>先是让我介绍一下简历里的两个项目,挑重点讲。于是我便快速的过了一遍项目重点和难点。</p><p>然后问了下简历中写的项目优化是怎么优化的</p><p>接着问了下项目用户受众情况</p><p>询问了下项目缓存的实现逻辑以及缓存过期逻辑</p><p>询问了下如何处理宽屏分辨率问题(答得不是很好,因为这块代码是AI写的(doge))</p><h3 id="Kotlin相关知识">Kotlin相关知识</h3><p>Kotlin中的suspend是怎么挂起的,它是线程安全的吗?</p><p>这个前半段有点问道我盲点了,后面问了下Gemini,Gemini是这样说的:</p><details class="toggle" style="border: 1px solid bg"><summary class="toggle-button" style="background-color: bg;color: color">Gemini回答</summary><div class="toggle-content"><p>简单来说:<strong><code>suspend</code> 的挂起是通过“状态机(State Machine)”和“续体传递风格(CPS 变换)”实现的;而 <code>suspend</code> 关键字本身绝对不是线程安全的。</strong></p><p>一、 <code>suspend</code> 是怎么挂起的?(底层原理)</p><p><code>suspend</code> 实际上是一个<strong>编译器魔法</strong>。当你在 Kotlin 中写下一个 <code>suspend</code> 函数时,编译器会在后台对代码进行大幅度的重写。它并不会真正去“阻塞”或“休眠”底层的操作系统线程,而是将函数切分成了多个片段。</p><p>具体来说,编译器做了以下三件事:</p><ol><li>CPS 变换 (Continuation-Passing Style)</li></ol><p>编译器会在你的 <code>suspend</code> 函数签名中,默默追加一个隐藏的参数:<code>Continuation</code>(续体)。<br><code>Continuation</code> 可以理解为“后续的代码”或“一个书签”,它保存了函数恢复执行时需要的所有上下文。</p><ul><li><strong>你的代码:</strong></li></ul><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">suspend</span> <span class="function"><span class="keyword">fun</span> <span class="title">getUserInfo</span><span class="params">(id: <span class="type">String</span>)</span></span>: User</span><br><span class="line"></span><br></pre></td></tr></table></figure><ul><li><strong>编译器眼里的代码(伪代码):</strong></li></ul><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Object <span class="title function_">getUserInfo</span><span class="params">(String id, Continuation<User> cont)</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><em>(注:返回值变成了 <code>Object</code>,因为它可能返回真实结果,也可能返回一个特殊的挂起标志。)</em></p><ol start="2"><li>生成状态机 (State Machine)</li></ol><p>编译器会把你函数内部的代码,以其他的 <code>suspend</code> 函数调用为“分界点”,切分成多个状态(label)。</p><p>假设你有这样一段代码:</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">suspend</span> <span class="function"><span class="keyword">fun</span> <span class="title">fetchData</span><span class="params">()</span></span> {</span><br><span class="line"> println(<span class="string">"Start"</span>)</span><br><span class="line"> <span class="keyword">val</span> token = requestToken() <span class="comment">// 挂起点 1</span></span><br><span class="line"> <span class="keyword">val</span> <span class="keyword">data</span> = requestData(token) <span class="comment">// 挂起点 2</span></span><br><span class="line"> println(<span class="string">"Result: <span class="variable">$data</span>"</span>)</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>编译器会把它变成类似下面这样的<strong>状态机(伪代码)</strong>:</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">Object <span class="title function_">fetchData</span><span class="params">(Continuation cont)</span> {</span><br><span class="line"> <span class="comment">// 提取状态机和局部变量</span></span><br><span class="line"> <span class="type">StateMachine</span> <span class="variable">sm</span> <span class="operator">=</span> cont; </span><br><span class="line"> </span><br><span class="line"> <span class="keyword">switch</span> (sm.label) {</span><br><span class="line"> <span class="keyword">case</span> <span class="number">0</span>:</span><br><span class="line"> println(<span class="string">"Start"</span>);</span><br><span class="line"> sm.label = <span class="number">1</span>; <span class="comment">// 准备进入下一个状态</span></span><br><span class="line"> <span class="comment">// 调用挂起函数,如果它真挂起了,立刻 return 释放当前线程</span></span><br><span class="line"> <span class="keyword">if</span> (requestToken(sm) == COROUTINE_SUSPENDED) <span class="keyword">return</span> COROUTINE_SUSPENDED;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">case</span> <span class="number">1</span>:</span><br><span class="line"> <span class="comment">// 恢复执行时,提取上一步的结果</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">token</span> <span class="operator">=</span> (String) sm.result; </span><br><span class="line"> sm.label = <span class="number">2</span>;</span><br><span class="line"> <span class="keyword">if</span> (requestData(token, sm) == COROUTINE_SUSPENDED) <span class="keyword">return</span> COROUTINE_SUSPENDED;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">case</span> <span class="number">2</span>:</span><br><span class="line"> <span class="type">String</span> <span class="variable">data</span> <span class="operator">=</span> (String) sm.result;</span><br><span class="line"> println(<span class="string">"Result: "</span> + data);</span><br><span class="line"> <span class="keyword">return</span> Unit;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><ol start="3"><li>挂起与恢复 (Suspend & Resume)</li></ol><ul><li><strong>挂起(Suspend):</strong> 当代码执行到 <code>requestToken()</code> 并真正需要等待(比如网络 IO)时,它会向上一层返回一个特殊的标志 <code>COROUTINE_SUSPENDED</code>。这个标志会一路 <code>return</code> 到最外层,<strong>从而把当前的 CPU 线程释放出来</strong>,让线程可以去干别的事情(比如更新 UI 或处理其他协程)。</li><li><strong>恢复(Resume):</strong> 当网络请求完成时,底层系统(比如回调机制)会调用 <code>Continuation.resumeWith(result)</code>。这会重新触发 <code>fetchData</code> 函数,由于 <code>sm.label</code> 已经变成了 1,代码会直接 <code>switch</code> 到 <code>case 1</code> 继续执行,并带入了网络请求的结果。</li></ul><p><strong>生活中的比喻:</strong><br>就像你看书时遇到了一个不懂的词(<strong>挂起点</strong>),你夹入一个书签(<strong>保存 Continuation 状态</strong>),然后合上书去查字典。在这个期间,你的大脑(<strong>线程</strong>)可以去喝水、听歌(<strong>执行其他任务</strong>)。查到意思后,你翻开书签那一页(<strong>Resume 恢复</strong>),继续往下读。</p></div></details><p>后半段我有点没懂面试官意思,以为面试官是说协程本身是不是线程安全的。</p><p>这就让我有点懵,这就好比你问线程本身是不是线程安全的这种问题</p><p>后面我知道了面试官是问用协程去操作一个变量是不是线程安全的,那当然是非线程安全的啦,这和线程并发出现竞争是一个道理。不过感觉答得不是很好</p><p>然后就是问Kotlin中和UI实现状态的同步是怎么做的。</p><p>我的回答就是用Kotlin的StateFlow,Compose会collect ViewModel中的StateFlow,根据StateFlow传来的变化而变化之类的,感觉答的不是很好。</p><p>接着就是问是否有用过传统Android XML UI。答:有用过,不过后来转Kotlin+Compose了。</p><h3 id="AI相关知识">AI相关知识</h3><p>根据我的项目提问,询问在使用AI编程的时候如何节省Token。</p><p><a href="http://xn--AIAGENT-xm9kn51bc8qnzkga718kz34c6opk0em9som7c.md">我回答是让AI编程工具生成AGENT.md</a>,GEMINI.md等文件,提前读取项目整个架构,避免AI无意义的搜索整个项目,然后每次给出清晰的指令,避免给出模糊的指令,以及模块化编程,避免AI大范围搜索和改动。</p><p>然后面试官询问Skill和MCP哪个用的token较少。</p><p>这当然是Skill啦,Skill当初提出就是为了解决MCP占用上下文过多的问题</p><p>最后问我用过哪些Agent,Agent是什么。</p><p>我目前接触的Agent就Copilot、Codex里面这些自带的Plan、Build这些Agent,没自己做过Agent,所以后半段答得不是很好。</p><h3 id="反问环节">反问环节</h3><p>依旧是询问团队是用Java用的比较多还是Kotlin比较多</p><p>回答不出意外,已有代码用Java,新代码用Kotlin(咳特灵还是太好用了,有效治疗Java带来的偏头痛,以至于我完全不想用Java(逃))</p><h2 id="面试小插曲">面试小插曲</h2><p>因为实验室刚搬迁,网络设施还没弄好,于是只能用手机热点给电脑共享网络。结果面试到一半时突然网络卡顿,立马查了用腾讯会议自带的网络检查功能检查,发现网络有问题,看了下手机,结果是逆天中信(为什么逆天之后说)打来的电话,把我网络顶掉了(有电话时移动数据会被顶掉),想都没想直接挂掉😡</p>]]></content>
<summary type="html"><h2 id="前言">前言</h2>
<p>相较于搜狗输入法那场面试的面试官,这次的面试官明显就对我感兴趣很多了,和面试官互动得很深入。</p>
<p>依旧是深度定制DIY面试,无八股盛宴</p>
<h2 id="正文">正文</h2>
<h3 id="手撕环节">手撕环节</</summary>
<category term="笔记" scheme="https://blog.goodboyboy.top/categories/%E7%AC%94%E8%AE%B0/"/>
<category term="面试" scheme="https://blog.goodboyboy.top/categories/%E7%AC%94%E8%AE%B0/%E9%9D%A2%E8%AF%95/"/>
<category term="面试" scheme="https://blog.goodboyboy.top/tags/%E9%9D%A2%E8%AF%95/"/>
<category term="腾讯" scheme="https://blog.goodboyboy.top/tags/%E8%85%BE%E8%AE%AF/"/>
</entry>
<entry>
<title>对越来越多AI博文的看法</title>
<link href="https://blog.goodboyboy.top/posts/983973987.html"/>
<id>https://blog.goodboyboy.top/posts/983973987.html</id>
<published>2026-05-05T04:23:58.000Z</published>
<updated>2026-05-05T04:23:58.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2><p>自今年年初小龙虾火了之后,我发现各个平台上有着越来越多的AI文章,最后我甚至在部分博客上也看到AI文章</p><p>所以我想借此机会谈一谈我对AI文章的看法</p><h2 id="看法">看法</h2><p>首先,我并不是抵制AI,AI确实是可以很大程度提升我们的工作效率,对于日常的一些知识问题,我也都会去找AI询问。</p><p>但是,有些人却只是用几句提示词,甚至只是一个想法,就利用AI生产一篇AI文,然后不加思考,不加总结的就把AI的产出内容完全的照搬到文章上,把AI的“思考”作为自己的思考展现给大家。</p><p>我觉得,作为读者阅读一篇文章,本质是和作者的思维进行碰撞,通过文章与作者进行交流。</p><p>如果一篇文章通篇都是AI写的,没有作者的思考,没有作者的总结,这难道不就是我和AI进行交流吗?既然是我和AI进行交流,那我为什么不自己去问AI呢?如果我自己去问AI,我得到的答案可能还更细致,更符合我自己的需求。</p><p>就像和一个人辩论,对方拿着AI和你辩论,他把AI不是当作工具,检查自己和对方的述说有什么漏洞,而是直接让AI代替自己思考,AI说什么他就说什么,那本质上我不就是和AI进行辩论?这样的话我也拿AI,让AI和AI去辩论,那这还有什么意思呢。</p><p>当然,如果是商业化文章,只为满足甲方的快速产出,AI确实是一个很好的提效工具。但是,有些博客博主也这样做,我就有些疑问,写博文难道不是沉下心来慢慢写吗,好像也没有商业化的效率需求吧?</p><p>如果说,写博文是一种任务,是一种需要提效的负担,我觉得还不如不写,停更一段时间更好。</p><p>另外,有些作者可能文笔不是很好,想要借AI来优化一下自己文章,出发点上这当然是没有问题的。但是有些时候,AI优化出来的遣词造句,我觉得反而更没有让我阅读的兴趣。例如什么<code>不是……也不是……而是……</code>、分点加粗、文章格式千篇一律等等问题,都需要作者用心去做提示词调整,如果只是单纯的让AI“优化一下我的文章”,产出的文章大概率是AI味很浓的文章。</p><h2 id="做法">做法</h2><p>对于社交平台上的AI文章,我大抵是没有什么兴趣的。通知类的,有效信息差不多也就是标题和文章末尾了。科普类的,有兴趣的就大抵看一下,然后自己问AI。商单类的,我是看都懒得看。</p><p>对于博客上的AI文章,我的要求会更严格。毕竟,我来这里不是来看AI同质化文章的,不然我为何不去社交平台上看。</p><h2 id="最后">最后</h2><p>最后,我想说的是,不要忘记自己建博客,写博文的初衷。如果任由没有一点自己思考的AI文章充斥自己的博客,那这还是你自己的博客吗?</p><h2 id="后记">后记</h2><p>这篇文章读下来,有些人可能会觉得我傲慢。</p><p>但至少,通过这篇文章传递的,是我的思考。</p><p>但至少,通过这篇文章交流的,是我而不是“它”。</p>]]></content>
<summary type="html"><h2 id="前言">前言</h2>
<p>自今年年初小龙虾火了之后,我发现各个平台上有着越来越多的AI文章,最后我甚至在部分博客上也看到AI文章</p>
<p>所以我想借此机会谈一谈我对AI文章的看法</p>
<h2 id="看法">看法</h2>
<p>首先,我并不是抵制A</summary>
<category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
<category term="说说" scheme="https://blog.goodboyboy.top/tags/%E8%AF%B4%E8%AF%B4/"/>
<category term="博客" scheme="https://blog.goodboyboy.top/tags/%E5%8D%9A%E5%AE%A2/"/>
<category term="AI" scheme="https://blog.goodboyboy.top/tags/AI/"/>
</entry>
<entry>
<title>GoodBoyboy Blog、Talk联动成功</title>
<link href="https://blog.goodboyboy.top/posts/1749152833.html"/>
<id>https://blog.goodboyboy.top/posts/1749152833.html</id>
<published>2026-05-01T14:28:04.000Z</published>
<updated>2026-05-01T14:28:04.000Z</updated>
<content type="html"><![CDATA[<p>博客现已接入 <a href="https://talk.furwolf.com/">GoodBoyboy Talk</a> 说说功能,将会在右侧侧边栏实时同步说说内容</p>]]></content>
<summary type="html"><p>博客现已接入 <a href="https://talk.furwolf.com/">GoodBoyboy Talk</a> 说说功能,将会在右侧侧边栏实时同步说说内容</p>
</summary>
<category term="公告" scheme="https://blog.goodboyboy.top/categories/%E5%85%AC%E5%91%8A/"/>
<category term="公告" scheme="https://blog.goodboyboy.top/tags/%E5%85%AC%E5%91%8A/"/>
</entry>
<entry>
<title>只有失去了才会懂得珍惜,但幸好我还没有失去</title>
<link href="https://blog.goodboyboy.top/posts/4025561226.html"/>
<id>https://blog.goodboyboy.top/posts/4025561226.html</id>
<published>2026-04-30T12:20:48.000Z</published>
<updated>2026-04-30T12:20:48.000Z</updated>
<content type="html"><![CDATA[<h2 id="NULL">NULL</h2><p>曾几何时,我彷徨过,也悲伤过</p><p>胡思乱想,郁郁寡欢</p><p>想要证明自己,想要一个完美的自己</p><p>为此不断舍弃,只为尽快实现目标</p><p>它很光鲜亮丽,让我无比向往</p><p>它很遥远,让我望不可及</p><p>它带给我的不再是希望,满足,而是欲望,焦虑</p><p>迷茫之际,那个曾被我遗忘在角落的,接纳了我</p><p>让我放下了执念,看清了自己</p><p>让我明白,我不是一个人在前进</p><p>让我学会,接纳不完美的自己</p><p>正如只有失去了才会懂得珍惜</p><p>但幸好我还没有失去</p>]]></content>
<summary type="html"><h2 id="NULL">NULL</h2>
<p>曾几何时,我彷徨过,也悲伤过</p>
<p>胡思乱想,郁郁寡欢</p>
<p>想要证明自己,想要一个完美的自己</p>
<p>为此不断舍弃,只为尽快实现目标</p>
<p>它很光鲜亮丽,让我无比向往</p>
<p>它很遥远,让</summary>
<category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
<category term="说说" scheme="https://blog.goodboyboy.top/tags/%E8%AF%B4%E8%AF%B4/"/>
</entry>
<entry>
<title>滴滴Android客户端一面凉经</title>
<link href="https://blog.goodboyboy.top/posts/3466962992.html"/>
<id>https://blog.goodboyboy.top/posts/3466962992.html</id>
<published>2026-04-29T07:34:49.000Z</published>
<updated>2026-04-29T07:34:49.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2><p>终于是更新了,但是是凉经😢</p><h2 id="正文">正文</h2><p>首先是自我介绍,介绍一下自己。</p><p>然后是项目盘点:</p><ul><li>项目介绍</li><li>询问项目细节</li></ul><p>接着是八股盛宴</p><ul><li>有用过Handler吗,介绍一下Handler,Handler和Looper之间的关系</li><li>为什么Looper不会造成阻塞</li><li>epoll底层机制是怎么样的</li><li>Android XML和Compose的区别</li><li>Compose 声明式UI和XML命令式UI有什么区别</li><li>有了解过跨端吗</li><li>你用过哪些架构,了解过MVC、MVP吗?介绍一下MVC、MVP、MVVM</li><li>Android四大件是什么,分别是干什么的</li><li>如何和Service交互,正常启动Service和bindService启动有什么区别</li><li>有了解过哪些设计模式(这里没答上来,面试官后面继续问)</li><li>什么是单例模式,单例模式有哪几种(依旧是脑抽没答上来)</li><li>知道什么是懒汉式?(这里想到有懒汉式和饿汉式,但是还是紧张忘记了,一顿乱答(悲))</li><li>了解过建造者模式吗?(意识到是Builder之类的,答对了一半吧,后面又是一顿乱答)</li><li>知道工厂模式吗?(依旧是忘记了然后胡言乱语😢)</li><li>了解过HashMap吗?他是线程安全的吗?(这里HashMap有点忘记了,不过大部分答对了,引出ConcurrentHashMap,但其实这里面试官想问的是HashTable)</li><li>那你说的ConcurrentHashMap和HashTable有什么区别吗?(属于给自己挖坑了)</li><li>有用过哪些布局(这里答的不是很好,因为很久没写XML了,基本上都是Compose)</li><li>说一下RecycleView缓存机制(依旧是给自己挖坑,答得一坨)</li><li>说一下什么是线程死锁,产生死锁的条件</li><li>说一下View的渲染流程(还是答得一坨,答到activity生命周期去了)</li></ul><p>最后一道算法题,面试官手出,可能是当时面试官也没准备什么特别难的题目,就leecode的一个两数之和,直接秒了。</p><p>最后反问</p><h2 id="结局">结局</h2><p>成功进入人才储备库(垃圾桶),原因是岗位不匹配</p><p>其实当时反问环节就差不多知道结局了,他们团队大部分用的还是Kotlin+XML,而且之后打算向跨端flutter方向发展,迁移成Compose的化工程量太大</p><h2 id="后记">后记</h2><p>人生的第一次面试,感觉体验不错(至于为什么等这几天更新腾讯一面面经就知道了),至少一场面试下来能很好的发现自己有哪些八股还掌握不牢,和面试官互动还是很深入的。</p>]]></content>
<summary type="html"><h2 id="前言">前言</h2>
<p>终于是更新了,但是是凉经😢</p>
<h2 id="正文">正文</h2>
<p>首先是自我介绍,介绍一下自己。</p>
<p>然后是项目盘点:</p>
<ul>
<li>项目介绍</li>
<li>询问项目细节</li>
</ul</summary>
<category term="笔记" scheme="https://blog.goodboyboy.top/categories/%E7%AC%94%E8%AE%B0/"/>
<category term="面试" scheme="https://blog.goodboyboy.top/categories/%E7%AC%94%E8%AE%B0/%E9%9D%A2%E8%AF%95/"/>
<category term="面试" scheme="https://blog.goodboyboy.top/tags/%E9%9D%A2%E8%AF%95/"/>
<category term="滴滴" scheme="https://blog.goodboyboy.top/tags/%E6%BB%B4%E6%BB%B4/"/>
<category term="Android客户端" scheme="https://blog.goodboyboy.top/tags/Android%E5%AE%A2%E6%88%B7%E7%AB%AF/"/>
</entry>
<entry>
<title>GoodBoyboy 's Talk上线!</title>
<link href="https://blog.goodboyboy.top/posts/3509156966.html"/>
<id>https://blog.goodboyboy.top/posts/3509156966.html</id>
<published>2026-04-23T14:16:08.000Z</published>
<updated>2026-04-23T14:16:08.000Z</updated>
<content type="html"><![CDATA[<h2 id="正文">正文</h2><p>采用 <a href="https://github.com/GoodBoyboy666">EasyDrop</a> 搭建的 <a href="https://talk.furwolf.com/">GoodBoyboy 's Talk</a> 正式上线!</p><p>后续我将会在GoodBoyboy 's Talk上更新说说相关内容,欢迎大家来玩😄</p>]]></content>
<summary type="html"><h2 id="正文">正文</h2>
<p>采用 <a href="https://github.com/GoodBoyboy666">EasyDrop</a> 搭建的 <a href="https://talk.furwolf.com/">GoodBoyboy 's Talk</summary>
<category term="公告" scheme="https://blog.goodboyboy.top/categories/%E5%85%AC%E5%91%8A/"/>
<category term="公告" scheme="https://blog.goodboyboy.top/tags/%E5%85%AC%E5%91%8A/"/>
<category term="说说" scheme="https://blog.goodboyboy.top/tags/%E8%AF%B4%E8%AF%B4/"/>
<category term="EasyDrop" scheme="https://blog.goodboyboy.top/tags/EasyDrop/"/>
</entry>
<entry>
<title>Easy Drop——一个基于Gin开发的高性能、轻量级说说平台</title>
<link href="https://blog.goodboyboy.top/posts/1249150699.html"/>
<id>https://blog.goodboyboy.top/posts/1249150699.html</id>
<published>2026-04-20T11:50:52.000Z</published>
<updated>2026-04-20T11:50:52.000Z</updated>
<content type="html"><![CDATA[<blockquote><p>是的没错,又开新坑了(老坑仍然在更哈</p></blockquote><h2 id="项目背景">项目背景</h2><p>用hexo这种静态博客平台不怎么方便发布零星的内容,特别是时间很碎片化的时候,基本上没什么心情更博客,就容易给人一种“假死”的状态。虽然有memos,但是感觉还是不是我喜欢的类型,所以打算自己搓一个。</p><h2 id="项目地址">项目地址</h2><p><a href="https://github.com/GoodBoyboy666/easydrop">https://github.com/GoodBoyboy666/easydrop</a></p><h2 id="项目进度">项目进度</h2><p>目前项目还在开发中,变动会比较频繁,如果想要尝鲜的朋友可以先部署玩玩</p>]]></content>
<summary type="html"><blockquote>
<p>是的没错,又开新坑了(老坑仍然在更哈</p>
</blockquote>
<h2 id="项目背景">项目背景</h2>
<p>用hexo这种静态博客平台不怎么方便发布零星的内容,特别是时间很碎片化的时候,基本上没什么心情更博客,就容易给人一种“假</summary>
<category term="应用" scheme="https://blog.goodboyboy.top/categories/%E5%BA%94%E7%94%A8/"/>
<category term="说说" scheme="https://blog.goodboyboy.top/tags/%E8%AF%B4%E8%AF%B4/"/>
<category term="Gin" scheme="https://blog.goodboyboy.top/tags/Gin/"/>
</entry>
<entry>
<title>Perfect Pic —— 一个基于 Gin 开发的高性能、轻量级图床</title>
<link href="https://blog.goodboyboy.top/posts/3951141653.html"/>
<id>https://blog.goodboyboy.top/posts/3951141653.html</id>
<published>2026-02-13T04:39:03.000Z</published>
<updated>2026-02-13T04:39:03.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2><p>假期在家无聊,和AI一起用Go搓了一个图床,边搓边学Go(doge)</p><blockquote><p>其实很久之前就想搓了awa</p></blockquote><h2 id="Perfect-Pic-是什么?">Perfect Pic 是什么?</h2><p>Perfect Pic 是一个基于 Go (Gin) 开发的高性能、轻量级图床。采用前后端分离架构,为个人或小型团队设计,提供安全可靠的图片存储、管理和分发功能。</p><h2 id="Perfect-Pic-相较于其他图床有哪些优势?">Perfect Pic 相较于其他图床有哪些优势?</h2><ul><li>采用 MIT License 开源,可以自行托管,数据完全由自己掌控。</li><li>采用Go语言开发,相较于传统PHP图床性能好,对服务器压力小。</li><li>支持SQLite、MySQL、PostgreSQL数据库,可根据实际业务场景选择。</li><li>内置内存缓存、Redis支持,提高响应速度。</li><li>前后端分离架构,可以自行编写前端,DIY可玩性高。</li><li>支持Docker部署。</li></ul><h2 id="为什么要开发-Perfect-Pic">为什么要开发 Perfect Pic</h2><p>因为自己博客需要托管图片,商业图床数据不在自己手里不放心,试了好几个开源图床,许多都是用PHP开发,对于我这种垃圾服务器来说压力不小</p><p>特别是当开启图片转换时,我的垃圾服务器可以CPU堵塞好几秒,有时候甚至图片上传失败。有些开源图床又过于臃肿,有些功能根本用不上。</p><p>最后打算自己做一个高性能图床,想吃什么自己做😋</p><h2 id="项目仓库">项目仓库</h2><p>Perfect Pic有两个仓库:</p><ul><li><a href="https://github.com/GoodBoyboy666/perfect-pic-server">perfect-pic-server</a>(后端仓库)</li><li><a href="https://github.com/GoodBoyboy666/perfect-pic-web">perfect-pic-web</a>(前端仓库)</li></ul><p>开发以后端为主,构建均在后端仓库 <a href="https://github.com/GoodBoyboy666/perfect-pic-server/releases">Releases</a> , Releases 构建分为 embed 和非 embed 版,embed版会内嵌前端,便于需求小的用户快速启动,无需额外部署前端。</p><h2 id="开发进度">开发进度</h2><p>目前大部分功能已完成设计并测试,等待系统性功能测试,感兴趣的友友可以去体验体验😄</p><p>喜欢的话麻烦顺手点个免费Star吧(小声)</p><p>仓库目前由我一人维护,开发速度可能不会很快,不过会尽快推出1.0版</p>]]></content>
<summary type="html"><h2 id="前言">前言</h2>
<p>假期在家无聊,和AI一起用Go搓了一个图床,边搓边学Go(doge)</p>
<blockquote>
<p>其实很久之前就想搓了awa</p>
</blockquote>
<h2 id="Perfect-Pic-是什么?">Perf</summary>
<category term="应用" scheme="https://blog.goodboyboy.top/categories/%E5%BA%94%E7%94%A8/"/>
<category term="图床" scheme="https://blog.goodboyboy.top/tags/%E5%9B%BE%E5%BA%8A/"/>
<category term="Perfect Pic" scheme="https://blog.goodboyboy.top/tags/Perfect-Pic/"/>
</entry>
<entry>
<title>尘封了八年的祝福</title>
<link href="https://blog.goodboyboy.top/posts/2205649303.html"/>
<id>https://blog.goodboyboy.top/posts/2205649303.html</id>
<published>2026-01-25T08:31:01.000Z</published>
<updated>2026-01-25T08:31:01.000Z</updated>
<content type="html"><![CDATA[<h2 id="正文">正文</h2><p>无意间在老妹的房间里看到了一个装满五角星折纸的小罐子。</p><p>那是我初三时一个喜欢我的女生在我生日时送给我的</p><p>那时候的我对谈恋爱并没有什么想法,收下了礼物后也没多想,就一直放在了柜子里。</p><p>拿起罐子,不知为何脑海里浮现出“这种东西很适合藏悄悄话”的念头。</p><p>仔细观察了下罐子,发现里面有一颗与众不同的星星,那是一颗画上了小太阳的星星。</p><p>我打开罐子,把那颗星星拿了出来。</p><p>打开星星,上面是一句生日祝福,以及一句</p><blockquote><p>不要忘记我哦~</p></blockquote><p>我放下纸条,心里默念了一下她的名字</p><p>嗯,没有忘记。</p><p>只是不知你现在过的如何,应该已经找到了属于自己的另一半吧。</p><p>我把纸条放回小罐子。</p><p>祝福我收到了,谢谢。</p>]]></content>
<summary type="html"><h2 id="正文">正文</h2>
<p>无意间在老妹的房间里看到了一个装满五角星折纸的小罐子。</p>
<p>那是我初三时一个喜欢我的女生在我生日时送给我的</p>
<p>那时候的我对谈恋爱并没有什么想法,收下了礼物后也没多想,就一直放在了柜子里。</p>
<p>拿起罐子,</summary>
<category term="生活" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/"/>
<category term="回忆" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/%E5%9B%9E%E5%BF%86/"/>
<category term="回忆" scheme="https://blog.goodboyboy.top/tags/%E5%9B%9E%E5%BF%86/"/>
</entry>
<entry>
<title>欢迎OPPO Pad 4 Pro加入设备大家庭</title>
<link href="https://blog.goodboyboy.top/posts/381855102.html"/>
<id>https://blog.goodboyboy.top/posts/381855102.html</id>
<published>2026-01-23T13:56:02.000Z</published>
<updated>2026-01-23T13:56:02.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2><p>终于是拼齐了我的设备拼图😄</p><h2 id="实机照片">实机照片</h2><p><img src="https://pic.goodboyboy.top/imgs/2026/01/23/f90c1db5a0ba3b02e0b457084a6dee84.webp" alt="OPPO Pad 4 Pro"></p><h2 id="购买">购买</h2><p>本来是打算去年双十一买的,但是被国补整红温了就没买。今年国补继续,开年国补资金充足,完全不用抢国补。而且要过年了,恰逢京东发券,3000减300,优惠力度比双十一大,不枉费我等这么几个月😭。最关键的是,又开始送笔了!!!</p><p>天时地利人和,直接下单😆</p><p>12+512的配置+笔一起3099,如果去掉399的笔那裸板就是2700!2700能买到骁龙8至尊版性价比还是蛮不错的,12140mAh的电池更是爽上加爽,完全没有续航焦虑,轻度使用一天下来才用一半的电,可能是因为环境温度较低的原因,温度正常一点的话续航应该更高。</p><p>京东物流确实没得黑,十八线小县城晚上下单第二天下午就送到了,直接爽用。</p><h2 id="贴膜">贴膜</h2><p>贴膜折腾死我了,13寸是真的难贴,最后贴膜失败,钢化膜因为静电吸了一堆毛毛,网上找了下教程,发现可以用胶带处理钢化膜上的毛毛。结果在处理毛毛的时候胶带砸在钢化膜上直接给钢化膜干破了😭</p><p>没办法,只好小声询问客服能不能补发一个,没想到还真的能补发,只要补个3块运费就行😄</p><h2 id="保护壳">保护壳</h2><p>pdd上找了一圈,稍微花里胡哨一点的贵的要命,直接就是40+,最后还是选了个朴素一点的,花了我21大洋(心痛),不过亚克力透明背板确实好看,但我其实更想要来图定制(doge</p><h2 id="领取权益">领取权益</h2><p>有些预装的应用,比如画世界Pro,云记什么的,基本上都有购机权益可以领取。领取画世界Pro的设备专属权益时,发现有个是“画兽头”课程😂,原来Furry画师都喜欢用画世界Pro(doge)。只可惜自己画功稀烂,什么都不会画,还没我妹画的好😭</p><h2 id="使(tiao)用(jiao)">使(tiao)用(jiao)</h2><p>首先当然是开启Google服务!</p><p>Color OS系统没有阉割Google服务,所以安装起来特别方便。只需要在设置里启用Google服务,再在应用商店里下载个Play商店即可。</p><p>然后就是把出厂的Color OS 15更新到Color OS 16,感受宣传的“机圈德芙”😆</p><p>最后就是安装各种应用,游戏就装了一个Phigros(平板必装好吧(迫真))</p><h2 id="后记">后记</h2><p>这下终于不用每天晚上背着4斤的游戏本去实验室学习了,带个1斤的pad轻松多了🥰</p><p>不得不说13寸的屏幕用来 <s>看网课</s>(打斗地主)是真的爽(迫真)</p>]]></content>
<summary type="html"><h2 id="前言">前言</h2>
<p>终于是拼齐了我的设备拼图😄</p>
<h2 id="实机照片">实机照片</h2>
<p><img src="https://pic.goodboyboy.top/imgs/2026/01/23/f90c1db5a0ba3b02e0</summary>
<category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
<category term="OPPO Pad 4 Pro" scheme="https://blog.goodboyboy.top/tags/OPPO-Pad-4-Pro/"/>
</entry>
<entry>
<title>官方Android11 Box系统的OrangePi 3B新增红外模块教程</title>
<link href="https://blog.goodboyboy.top/posts/4210987115.html"/>
<id>https://blog.goodboyboy.top/posts/4210987115.html</id>
<published>2026-01-18T07:04:16.000Z</published>
<updated>2026-01-23T07:10:00.000Z</updated>
<content type="html"><![CDATA[<blockquote><p>教程已更新,更新日期:2026-01-23</p></blockquote><h2 id="前言">前言</h2><p>打算把手上的OrangePi 3B刷成电视盒子给家里用,但是OrangePi 3B没有板载红外模块,于是从官方店铺下单了外置红外模块和遥控器,结果到手发现官方并没有进行适配,没办法只能自己适配了</p><blockquote><p>Tips:本篇教程有点长,并且不适合小白使用</p></blockquote><h2 id="准备环节">准备环节</h2><blockquote><p>Tips:不要买OrangePi官方店铺的那个红外传感器,那是<code>红外光电二极管 (IR Photodiode)</code>,不是<code>集成红外接收头 (Integrated IR Receiver)</code>!!!</p></blockquote><h3 id="下载工具">下载工具</h3><p>进入OrangePi官网 <a href="http://www.orangepi.cn/">http://www.orangepi.cn/</a></p><p>进入OrangePi 3B的下载页面 <a href="http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-3B.html">http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-3B.html</a></p><blockquote><p>Tips:OrangePi官方发布的各种资料目前基本上都在百度网盘上,建议提前准备一个SVIP账户</p></blockquote><p>找到“官方工具”,打开链接,需要下载的有:</p><ul><li>Android和Linux镜像烧录工具-RKDevTool和驱动程序</li></ul><p>下载该文件夹内所有内容。</p><p>下载 Android Image Kitchen 用于打包和解包镜像:<a href="https://xdaforums.com/t/tool-android-image-kitchen-unpack-repack-kernel-ramdisk-win-android-linux-mac.2073775/">https://xdaforums.com/t/tool-android-image-kitchen-unpack-repack-kernel-ramdisk-win-android-linux-mac.2073775/</a></p><h3 id="下载文档">下载文档</h3><p>下载最新的用户手册</p><h3 id="下载镜像">下载镜像</h3><p>下载最新带有“Android11-box”字样的镜像</p><h3 id="下载并解压Android源码">下载并解压Android源码</h3><p>下载总共25G+的Android源码分卷压缩包</p><p>校验文件md5:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">md5sum</span> -c RK356X_Android11.tar.gz.md5sum</span><br></pre></td></tr></table></figure><p>解压压缩包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> RK356X_Android11.tar.gz0* | <span class="built_in">sudo</span> tar -xvzf - -C /目标/目录</span><br></pre></td></tr></table></figure><h3 id="准备编译环境">准备编译环境</h3><p>准备一个空余硬盘空间至少有200G+的硬盘</p><p>准备Linux编译环境,建议Ubuntu22.04,当然也可以是更新的系统,只是编译脚本会用到python2之类的,到时候也能改脚本</p><p>按照用户手册中“Android11 源码的编译方法”这节,配置好编译依赖</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt-get update</span><br><span class="line"><span class="built_in">sudo</span> apt-get install -y git gnupg flex bison gperf build-essential \</span><br><span class="line">zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 \</span><br><span class="line">lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache \</span><br><span class="line">libgl1-mesa-dev libxml2-utils xsltproc unzip liblz4-tool</span><br></pre></td></tr></table></figure><p>如果系统较新,可能有些软件包已失效,我使用Debian13编译,替换了部分软件包:</p><p>liblz4-tool -> lz4<br>libncurses5 -> libncurses6 (或 libncurses-dev)<br>python -> python3 + python-is-python3</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> dpkg --add-architecture i386</span><br><span class="line"><span class="built_in">sudo</span> apt-get update</span><br><span class="line"><span class="built_in">sudo</span> apt-get install -y git gnupg flex bison gperf build-essential \</span><br><span class="line">zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \</span><br><span class="line">libncurses-dev lib32ncurses-dev x11proto-dev libx11-dev lib32z1-dev ccache \</span><br><span class="line">libgl1-mesa-dev libxml2-utils xsltproc unzip lz4 python3 python-is-python3 libssl-dev</span><br></pre></td></tr></table></figure><h2 id="开始">开始</h2><p>OrangePi官方并没有对红外模块进行适配,因此需要自行编译,不过仅用编译内核,不用编译Android本体,单次编译时间压缩至2~3分钟。</p><h3 id="安装系统">安装系统</h3><p>这里我们采用修补boot的方式,所以首先需要安装完整系统。</p><p>按照用户手册中“烧录 Android 镜像到 TF 卡中的方法”这节方法,安装对应驱动,使用RKDevTool将官方原版镜像烧录OrangePi 3B中。</p><p>烧录完成后启动OrangePi 3B,插入显示器,确保系统已经能正常启动。</p><h3 id="开启开发者模式">开启开发者模式</h3><p>像普通手机那样,在设置里找到版本号多次快速点击开启开发者模式,进入开发者模式菜单,为了方便起见,这里使用网络ADB而不是USB ADB</p><h3 id="解包官方镜像">解包官方镜像</h3><p>使用RKDevTool中“高级功能”内的“解包”功能,将boot.img从官方镜像中分离,重命名为boot-official.img备用</p><h3 id="准备红外模块">准备红外模块</h3><p>红外模块一般是三个引脚,分别是VCC,GND和Signal</p><blockquote><p>官方店铺的红外模块是<code>红外光电二极管 (IR Photodiode)</code>,不是<code>集成红外接收头 (Integrated IR Receiver)</code>,请勿购买!!!请自行在淘宝上购买TSOP38238等集成红外接收头元件。</p></blockquote><p>我使用的OrangePi官方的红外模块描述写的是VCC接3.3V,但是实测下来3.3V貌似有问题无法正常工作,需要接到5V</p><p>Signal则是按照描述接在PIN37,也就是引脚图上的GPIOO3_D3脚(后面的教程均按该引脚来写)</p><p>GND引脚随便找个GND PIN就行</p><h3 id="修改前准备">修改前准备</h3><p>处理环境变量</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> BOARD=orangepi3b</span><br><span class="line"><span class="built_in">source</span> build/envsetup.sh</span><br><span class="line">lunch rk356x_box-userdebug</span><br></pre></td></tr></table></figure><h3 id="修改内核设备树-DTS">修改内核设备树 (DTS)</h3><blockquote><p>如果你使用的OrangePi官方的遥控器,可以尝试直接使用我给出的键值,避免重新编译,具体内容在<code>制作Keymap</code>一节</p></blockquote><p>在<code>kernel/arch/arm64/boot/dts/rockchip/</code>中找到<code>rk3566-orangepi-3b.dts</code>打开</p><p>在<code>/ {...}</code>内部新增下面配置:</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">ir: ir-receiver {</span><br><span class="line"> compatible = "gpio-ir-receiver";</span><br><span class="line"> gpios = <&gpio3 RK_PD3 GPIO_ACTIVE_LOW>;</span><br><span class="line"> pinctrl-names = "default", "sleep";</span><br><span class="line"> pinctrl-0 = <&ir_int>;</span><br><span class="line"> pinctrl-1 = <&ir_int>;</span><br><span class="line"> wakeup-source;</span><br><span class="line"> status = "okay";</span><br><span class="line">};</span><br></pre></td></tr></table></figure><p>在<code>&pinctrl{...}</code>中新增下面配置:</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">ir {</span><br><span class="line"> ir_int: ir-int {</span><br><span class="line"> rockchip,pins = <3 RK_PD3 RK_FUNC_GPIO &pcfg_pull_up>;</span><br><span class="line"> };</span><br><span class="line">};</span><br></pre></td></tr></table></figure><h3 id="修改菜单配置">修改菜单配置</h3><p>加载默认配置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> kernel</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">make ARCH=arm64 rockchip_defconfig</span><br></pre></td></tr></table></figure><p>进入菜单配置页面</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">make ARCH=arm64 menuconfig</span><br></pre></td></tr></table></figure><p>进入<code>Device Drivers</code></p><p>进入<code>Remote Controller support</code>(这一项本身需要打星 *)</p><p>进入<code>Remote controller decoders</code></p><p>建议全部勾选(或者至少勾选 Enable IR raw decoder, NEC protocol, RC-6 protocol)或者你知道你的遥控器是什么协议,官方的遥控器经测试是NEC</p><p>进入<code>Remote Controller devices</code></p><p>找到<code>GPIO IR remote control</code>打星 *</p><p>按右方向键选择<code><Save></code>,回车保存为.config(默认名即可)</p><p>按<code><Exit></code>一路退出。</p><h3 id="编译">编译</h3><p>因为官方build.sh会使用默认编译config覆盖,因此我们这里覆盖默认的config</p><p>首先备份默认配置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mv</span> <span class="built_in">arch</span>/arm64/configs/rockchip_defconfig <span class="built_in">arch</span>/arm64/configs/rockchip_defconfig.bak</span><br></pre></td></tr></table></figure><p>覆盖配置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cp</span> .config <span class="built_in">arch</span>/arm64/configs/rockchip_defconfig</span><br></pre></td></tr></table></figure><p>开始编译</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> ..</span><br><span class="line">./build.sh -K</span><br></pre></td></tr></table></figure><p>编译完成后,找到如下文件:</p><ul><li><code>Image</code> 位于<code>kernel/arch/arm64/boot/</code></li><li><code>resource.img</code> 位于<code>kernel/</code></li></ul><h3 id="关闭AVB校验">关闭AVB校验</h3><p>首先在源码里找到avbtool</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">find . -name <span class="string">"avbtool"</span></span><br></pre></td></tr></table></figure><p>通常是<code>external/avb/avbtool</code></p><p>然后生成禁用AVB校验的img</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">chmod</span> +x external/avb/avbtool</span><br><span class="line">python3 external/avb/avbtool make_vbmeta_image --flag 2 --padding_size 4096 --output vbmeta_disabled.img</span><br></pre></td></tr></table></figure><p>不过这个源码里带的avbtool是用python2写的,如果你的编译环境是python2没什么问题,如果是python3则会出现一些错误,可以将报错信息询问AI修改脚本解决</p><p>最后会在当前目录下生成一个几KB大小的<code>vbmeta_disabled.img</code>文件</p><h3 id="制作boot镜像">制作boot镜像</h3><p>回到Windows,将<code>boot-official.img</code>拖到<code>Android Image Kitchen</code>的<code>unpackimg.bat</code>文件上进行解包</p><p>解包完成后当前目录会多出<code>ramdisk</code>和<code>split_img</code>两个文件夹</p><p>进入<code>split_img</code>文件夹,按照下面对应表进行重命名后替换</p><ul><li>Image -> boot-official.img-kernel</li><li>resource.img -> boot-official.img-second</li></ul><p>然后用记事本打开<code>boot-official.img-board</code>文件,填入<code>orangepi3b</code>保存</p><p>最后双击<code>repackimg.bat</code>进行打包,得到<code>image-new.img</code>新boot镜像</p><h3 id="制作Misc镜像(可选)">制作Misc镜像(可选)</h3><p>如果进入Android Recovery模式次数过多,可能会导致直接进入Android Recovery模式,可以通过擦除Misc分区解决</p><p>生成空白misc_wipe.img:</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">fsutil file createnew misc_wipe.img <span class="number">49152</span></span><br></pre></td></tr></table></figure><h3 id="刷入boot-img镜像">刷入boot.img镜像</h3><p>启动RKDevTool,和之前一样,跟着用户手册让OrangePi 3B进入MaskRom模式</p><p>将MiniLoaderAll烧录至SPINOR,然后切换存储至SD卡</p><p>进入“下载镜像”标签页,勾选“Boot”分区,并点击一下最右边方框,选择之前制作的<code>image-new.img</code>,然后右键空白处,选择<code>添加项</code>,在名字一栏写<code>Vbmeta</code>并勾选,同样的选择<code>vbmeta_disabled.img</code></p><p>如果制作了<code>misc_wipe.img</code>想要擦除Misc分区,同样的右键<code>新建项</code>,名字一栏写<code>Misc</code>并勾选,选择<code>misc_wipe.img</code>即可</p><p>接着点击“设备分区表”按钮,读取设备分区地址信息,这里会有几个分区没有匹配到地址,例如<code>Resource</code>,<code>Kernel</code>,<code>System</code>分区,这是正常现象,只要Boot分区和Vbmeta分区(Misc分区可选)的地址能正常读出即可</p><p>最后点击“执行”按钮刷入镜像</p><h3 id="调试">调试</h3><p>如果系统顺利启动,就已经成功一半了</p><p>确保开启了开发者模式并打开了网络ADB</p><p>如果电脑没有安装ADB,源码里的RKTool文件夹里也有ADB工具</p><p>和OrangePi 3B处于同一局域网下,连接ADB设备</p><p>不用进行配对,直接连接就行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb connect <OrangePi 3B的IP地址></span><br></pre></td></tr></table></figure><p>连接上后进入shell</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb shell</span><br></pre></td></tr></table></figure><p>切换至root</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">su</span><br></pre></td></tr></table></figure><p>首先检查内核配置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">zcat /proc/config.gz | grep -i <span class="string">"CONFIG_IR_GPIO_CIR"</span></span><br></pre></td></tr></table></figure><p>正确情况下会输出<code>CONFIG_IR_GPIO_CIR=y</code>,代表内核已经启用</p><p>然后查看设备节点是否有红外设备</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">ls</span> -d /sys/firmware/devicetree/base/ir*</span><br></pre></td></tr></table></figure><p>正确情况下会输出<code>ir-receiver</code>之类的设备文件夹</p><p>进入该文件夹,读取<code>compatible</code>和<code>status</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> compatible</span><br><span class="line"><span class="comment"># 输出应该是 gpio-ir-receiver</span></span><br><span class="line"><span class="built_in">cat</span> status</span><br><span class="line"><span class="comment"># 输出应该是 okay</span></span><br></pre></td></tr></table></figure><p>如果满足上方两个条件,查看ir事件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">getevent -l</span><br></pre></td></tr></table></figure><p>一般会有类似下面的输出,包含<code>gpio_ir_recv</code>输入</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"> rk356x_box:/ $ getevent -l</span><br><span class="line"></span><br><span class="line">add device 1: /dev/input/event1</span><br><span class="line"></span><br><span class="line"> name: <span class="string">"gpio_ir_recv"</span></span><br><span class="line"></span><br><span class="line">add device 2: /dev/input/event2</span><br><span class="line"></span><br><span class="line"> name: <span class="string">"rk-headset"</span></span><br><span class="line"></span><br><span class="line">add device 3: /dev/input/event0</span><br><span class="line"></span><br><span class="line"> name: <span class="string">"rk805 pwrkey"</span> </span><br></pre></td></tr></table></figure><p>执行<code>cat /sys/kernel/debug/gpio | grep "gpio-123"</code>也会有下面输出,表示正在使用的GPIO是哪个驱动</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gpio-123 ( |ir-receiver ) <span class="keyword">in</span> hi </span><br></pre></td></tr></table></figure><blockquote><p>如果你已经事先配置好了Keymap一节,那就可以不用手动启用协议了</p></blockquote><p>然后开始选择ir协议</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /sys/class/rc/rc0/protocols</span><br></pre></td></tr></table></figure><p>会看到当前支持的所有协议,选择要监听的协议</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">"+nec"</span> > /sys/class/rc/rc0/protocols</span><br></pre></td></tr></table></figure><p>当然也可以开启一堆协议</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">"+rc-5 +rc-6 +jvc +sony +sanyo +sharp +mce_kbd +xmp +imon"</span> > /sys/class/rc/rc0/protocols</span><br></pre></td></tr></table></figure><p>开启的协议会用<code>[]</code>包围。</p><p>执行<code>getevent -l</code>用遥控器对着红外设备按下键,正常情况下会有类似下面的输出:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">/dev/input/event1: EV_MSC MSC_SCAN 0000045c</span><br><span class="line">/dev/input/event1: EV_SYN SYN_REPORT 00000000</span><br><span class="line">/dev/input/event1: EV_MSC MSC_SCAN 0000045c</span><br><span class="line">/dev/input/event1: EV_SYN SYN_REPORT 00000000</span><br></pre></td></tr></table></figure><p>如果满足上面所有情况,则代表硬件已经设置正确并且系统能正常读取解析来自遥控器的信号</p><blockquote><p>Tips:这里建议明确出遥控器使用的是哪种协议,因为后面会使用到</p></blockquote><h3 id="制作Keymap">制作Keymap</h3><p>最后,需要制作Keymap用于将遥控器信号解析出来的十六进制的键值码映射到对应的按键上</p><p>同样是执行<code>getevent -l</code>,然后将遥控器上所有的按键按一遍,并记录对应的键值码,只用记录后三位,例如<code>45c</code></p><p>经测试,OrangePi官方的遥控器键值码如下:</p><table><thead><tr><th>按键</th><th>键值码</th></tr></thead><tbody><tr><td>电源键</td><td>41a</td></tr><tr><td>TV</td><td>44d</td></tr><tr><td>VOD</td><td>443</td></tr><tr><td>音量-</td><td>419</td></tr><tr><td>音量+</td><td>445</td></tr><tr><td>menu</td><td>45d</td></tr><tr><td>mouse</td><td>41b</td></tr><tr><td>上</td><td>444</td></tr><tr><td>左</td><td>41c</td></tr><tr><td>OK</td><td>45c</td></tr><tr><td>右</td><td>448</td></tr><tr><td>下</td><td>41d</td></tr><tr><td>home</td><td>41f</td></tr><tr><td>return</td><td>40a</td></tr><tr><td>1</td><td>413</td></tr><tr><td>2</td><td>410</td></tr><tr><td>3</td><td>411</td></tr><tr><td>4</td><td>40f</td></tr><tr><td>5</td><td>40c</td></tr><tr><td>6</td><td>40d</td></tr><tr><td>7</td><td>40b</td></tr><tr><td>8</td><td>408</td></tr><tr><td>9</td><td>409</td></tr><tr><td>TV-SYS</td><td>458</td></tr><tr><td>0</td><td>447</td></tr><tr><td>SETUP</td><td>453</td></tr></tbody></table><p>拿到对应的键值码后,开始编写keymap文件</p><p>回到Linux编译环境,在<code>kernel/drivers/media/rc/keymaps/</code>下新建一个文件叫<code>rc-orangepi-ir.c</code></p><p>写入下方内容:</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 文件路径: kernel/drivers/media/rc/keymaps/rc-orangepi-ir.c</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><media/rc-map.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><linux/module.h></span></span></span><br><span class="line"></span><br><span class="line"><span class="type">static</span> <span class="class"><span class="keyword">struct</span> <span class="title">rc_map_table</span> <span class="title">orangepi_ir_table</span>[] =</span> {</span><br><span class="line"> { <span class="number">0x41a</span>, KEY_POWER }, <span class="comment">// 电源键</span></span><br><span class="line"> { <span class="number">0x445</span>, KEY_VOLUMEUP }, <span class="comment">// 音量+</span></span><br><span class="line"></span><br><span class="line"> { <span class="number">0x44d</span>, KEY_TV }, <span class="comment">// TV</span></span><br><span class="line"> { <span class="number">0x443</span>, KEY_VIDEO }, <span class="comment">// VOD (映射为 VIDEO)</span></span><br><span class="line"> { <span class="number">0x419</span>, KEY_VOLUMEDOWN }, <span class="comment">// 音量-</span></span><br><span class="line"></span><br><span class="line"> { <span class="number">0x45d</span>, KEY_MENU }, <span class="comment">// menu</span></span><br><span class="line"> { <span class="number">0x41b</span>, KEY_SWITCHVIDEOMODE }, <span class="comment">// mouse (通常映射为切换鼠标模式,或 KEY_FN)</span></span><br><span class="line"></span><br><span class="line"> { <span class="number">0x444</span>, KEY_UP }, <span class="comment">// 上</span></span><br><span class="line"> { <span class="number">0x41c</span>, KEY_LEFT }, <span class="comment">// 左</span></span><br><span class="line"> { <span class="number">0x45c</span>, KEY_ENTER }, <span class="comment">// OK (Android 确定键通常用 ENTER)</span></span><br><span class="line"> { <span class="number">0x448</span>, KEY_RIGHT }, <span class="comment">// 右</span></span><br><span class="line"> { <span class="number">0x41d</span>, KEY_DOWN }, <span class="comment">// 下</span></span><br><span class="line"></span><br><span class="line"> { <span class="number">0x41f</span>, KEY_HOME }, <span class="comment">// home</span></span><br><span class="line"> { <span class="number">0x40a</span>, KEY_BACK }, <span class="comment">// return</span></span><br><span class="line"></span><br><span class="line"> { <span class="number">0x413</span>, KEY_1 }, <span class="comment">// 1</span></span><br><span class="line"> { <span class="number">0x410</span>, KEY_2 }, <span class="comment">// 2</span></span><br><span class="line"> { <span class="number">0x411</span>, KEY_3 }, <span class="comment">// 3</span></span><br><span class="line"> { <span class="number">0x40f</span>, KEY_4 }, <span class="comment">// 4</span></span><br><span class="line"> { <span class="number">0x40c</span>, KEY_5 }, <span class="comment">// 5</span></span><br><span class="line"> { <span class="number">0x40d</span>, KEY_6 }, <span class="comment">// 6</span></span><br><span class="line"> { <span class="number">0x40b</span>, KEY_7 }, <span class="comment">// 7</span></span><br><span class="line"> { <span class="number">0x408</span>, KEY_8 }, <span class="comment">// 8</span></span><br><span class="line"> { <span class="number">0x409</span>, KEY_9 }, <span class="comment">// 9</span></span><br><span class="line"> { <span class="number">0x447</span>, KEY_0 }, <span class="comment">// 0</span></span><br><span class="line"></span><br><span class="line"> { <span class="number">0x458</span>, KEY_TV2 }, <span class="comment">// TV-SYS (映射为 TV2 或其他功能键)</span></span><br><span class="line"> { <span class="number">0x453</span>, KEY_SETUP }, <span class="comment">// SETUP</span></span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="type">static</span> <span class="class"><span class="keyword">struct</span> <span class="title">rc_map_list</span> <span class="title">orangepi_ir_map</span> =</span> {</span><br><span class="line"> .<span class="built_in">map</span> = {</span><br><span class="line"> .scan = orangepi_ir_table,</span><br><span class="line"> .size = ARRAY_SIZE(orangepi_ir_table),</span><br><span class="line"> .rc_proto = RC_PROTO_NEC, <span class="comment">// 这里指定协议为 NEC</span></span><br><span class="line"> .name = <span class="string">"rc-orangepi-ir"</span>, <span class="comment">// 名字必须和 DTS 里的 linux,rc-map-name 一致</span></span><br><span class="line"> }</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="type">static</span> <span class="type">int</span> __init <span class="title function_">init_rc_map_orangepi</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">return</span> rc_map_register(&orangepi_ir_map);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="type">static</span> <span class="type">void</span> __exit <span class="title function_">exit_rc_map_orangepi</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">{</span><br><span class="line"> rc_map_unregister(&orangepi_ir_map);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">module_init(init_rc_map_orangepi)</span><br><span class="line">module_exit(exit_rc_map_orangepi)</span><br><span class="line"></span><br><span class="line">MODULE_LICENSE(<span class="string">"GPL"</span>);</span><br><span class="line">MODULE_AUTHOR(<span class="string">"OrangePiUser"</span>);</span><br></pre></td></tr></table></figure><p>接着在<code>kernel/drivers/media/rc/keymaps/Makefile</code>中按照格式接上<code>rc-orangepi-ir.o</code></p><p>然后修改设备树 (DTS)</p><p>回到<code>kernel/arch/arm64/boot/dts/rockchip/rk3566-orangepi-3b.dts</code>,在<code>ir-receiver{...}</code>内添加一条:</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">linux,rc-map-name = "rc-orangepi-ir";</span><br></pre></td></tr></table></figure><p>保险起见,完全重新生成boot</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> kernel</span><br><span class="line">make distclean</span><br></pre></td></tr></table></figure><p>最后从<code>修改前准备</code>这节重新编译内核和制作boot.img</p><h3 id="测试">测试</h3><p>重新刷入boot.img等镜像后,开机测试红外功能,这会应该能正常使用遥控器遥控了</p><p>同样的使用<code>getevent -l</code>查看ir事件</p><p>这会可以看到有下面之类的事件出现:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/dev/input/event1: EV_KEY KEY_DOWN DOWN </span><br><span class="line">/dev/input/event1: EV_KEY KEY_DOWN UP</span><br></pre></td></tr></table></figure><h3 id="禁止深睡">禁止深睡</h3><p>因为官方固件深睡模式好像有问题,深睡下无法用红外唤醒,并且唤醒后系统会出现,因此需要禁止系统深睡。</p><p>首先准备一个叫<code>wake_lock.rc</code>的脚本文件,内容为:</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">on property:sys.boot_completed=1</span><br><span class="line"> write /sys/power/wake_lock stay_awake</span><br></pre></td></tr></table></figure><p>打开终端连接adb,准备推送文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">adb root</span><br><span class="line">adb remount</span><br><span class="line">adb push wake_lock.rc /vendor/etc/init/</span><br><span class="line">adb shell <span class="built_in">chmod</span> 644 /vendor/etc/init/wake_lock.rc</span><br><span class="line">adb reboot</span><br></pre></td></tr></table></figure><h2 id="后记">后记</h2><p>OrangePi官方的红外模块貌似有点不好用,遥控器稍微远一点信号质量就急剧下降,S脚点位拉不下来,识别不到,这会手上没电阻电容,不方便处理,只能等之后再玩了。</p><p>更新:继续和Gemini聊了一会,才知道tmd那玩意是<code>红外光电二极管 (IR Photodiode)</code>,不是用来接收遥控器信号的“接收头”🤣,虽然也是被我用来当信号接收器了,我说怎么tm那么难用,遥控器离30cm以上就收不到信号了。。。应该是买<code>集成红外接收头 (Integrated IR Receiver)</code>。。。不过教程没问题,有问题的是那个逆天硬件🤣</p>]]></content>
<summary type="html"><blockquote>
<p>教程已更新,更新日期:2026-01-23</p>
</blockquote>
<h2 id="前言">前言</h2>
<p>打算把手上的OrangePi 3B刷成电视盒子给家里用,但是OrangePi 3B没有板载红外模块,于是从官方店铺下单了外</summary>
<category term="教程" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/"/>
<category term="Hardware" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/Hardware/"/>
<category term="OrangePi" scheme="https://blog.goodboyboy.top/tags/OrangePi/"/>
<category term="OrangePi 3B" scheme="https://blog.goodboyboy.top/tags/OrangePi-3B/"/>
<category term="Android Box" scheme="https://blog.goodboyboy.top/tags/Android-Box/"/>
<category term="红外模块" scheme="https://blog.goodboyboy.top/tags/%E7%BA%A2%E5%A4%96%E6%A8%A1%E5%9D%97/"/>
</entry>
<entry>
<title>家里也换成光纤了qwq</title>
<link href="https://blog.goodboyboy.top/posts/1070030594.html"/>
<id>https://blog.goodboyboy.top/posts/1070030594.html</id>
<published>2026-01-16T03:32:28.000Z</published>
<updated>2026-01-16T03:32:28.000Z</updated>
<content type="html"><![CDATA[<p>之前还没放假回家时,就听我妈说家里有阵突然上不了网,叫了宽带师傅,换成了光纤,然后我就感觉大事不妙</p><p>众所周知,运营商的光猫垃圾的要死,还默认是路由模式,并且普通账户还改不了桥接</p><p>回家登录光猫后台一看,果然是路由模式。。。</p><p>拿itdog ping了一下ipv6,直接全红😭</p><p>而且那个装修师傅搞的网络一言难尽</p><p>你说他不懂吧,他知道把路由器接在了几个Lan口中唯一一个千兆口上,你说他懂吧,他把光猫WiFi开着,我家原来的路由器也开着,而且让我爸妈手机连接的是原来的路由器,最难蚌的是,善后做的一坨,我问我爸妈WiFi密码是多少,他们居然不知道,看来是根本没给我爸妈讲WiFi密码。。。最后还是我通过手机WiFi密码分享功能才调出来WiFi密码。。。</p><p>之前还叫过一次宽带师傅,那个宽带师傅明显就做的好很多,弄了个不干胶贴纸把WiFi密码,宽带账号密码写了贴在路由器上,我回家一看一目了然。</p><p>哦对,还把我路由器管理员密码改了,幸好管理员密码是和WiFi密码一样的,不然真的就变成宽带师傅的路由器了。。。</p><h2 id="后记">后记</h2><p>后面我又试了很多网上的教程,尝试拿到光猫管理员密码,结果都不行。。。看来只能找客服扯皮让他们远程改成桥接了😭</p>]]></content>
<summary type="html"><p>之前还没放假回家时,就听我妈说家里有阵突然上不了网,叫了宽带师傅,换成了光纤,然后我就感觉大事不妙</p>
<p>众所周知,运营商的光猫垃圾的要死,还默认是路由模式,并且普通账户还改不了桥接</p>
<p>回家登录光猫后台一看,果然是路由模式。。。</p>
<p>拿itdo</summary>
<category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
<category term="网络" scheme="https://blog.goodboyboy.top/tags/%E7%BD%91%E7%BB%9C/"/>
<category term="光纤" scheme="https://blog.goodboyboy.top/tags/%E5%85%89%E7%BA%A4/"/>
</entry>
<entry>
<title>姜还是老的辣</title>
<link href="https://blog.goodboyboy.top/posts/2421446382.html"/>
<id>https://blog.goodboyboy.top/posts/2421446382.html</id>
<published>2026-01-16T03:19:04.000Z</published>
<updated>2026-01-16T03:19:04.000Z</updated>
<content type="html"><![CDATA[<p>放假回家,我妈带我去开点喉炎药,回家路上,看到有老板在卖牛肉,于是把我拉过去。</p><p>一开始问,老板是说买的多35一斤,普通的就37一斤。</p><p>然后我妈就开始讲价,老板边切牛肉边讲价,我从来也没自己买过牛肉,不知道行情是怎样,就站在旁边不打扰我妈输出。</p><p>就当我无聊准备看手机时,我妈给老板说“我孩子现在也放假回家,之后经常又会来这边买”之类的。</p><p>站在旁边当装饰的我:?</p><p>我妈还诈老板一下,说“我记得之前都是30一斤的”</p><p>最后老板还是按35卖了。</p><p>要是我买菜,没被缺斤少两坑就不错了,完全讲不来价😂</p><p>不过在小县城也明显感受到经济下行带来的通缩影响了。</p><p>往年牛肉基本都是40-50一斤,今年直接跌倒35一斤。</p><p>和我爸去办点事回来路上买点水果,车厘子居然掉到19.9一斤了,虽然不是高档的那种,但是19.9还是很离谱了。</p>]]></content>
<summary type="html"><p>放假回家,我妈带我去开点喉炎药,回家路上,看到有老板在卖牛肉,于是把我拉过去。</p>
<p>一开始问,老板是说买的多35一斤,普通的就37一斤。</p>
<p>然后我妈就开始讲价,老板边切牛肉边讲价,我从来也没自己买过牛肉,不知道行情是怎样,就站在旁边不打扰我妈输出。</</summary>
<category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
<category term="买菜" scheme="https://blog.goodboyboy.top/tags/%E4%B9%B0%E8%8F%9C/"/>
</entry>
<entry>
<title>布洛芬效果真不错</title>
<link href="https://blog.goodboyboy.top/posts/882397341.html"/>
<id>https://blog.goodboyboy.top/posts/882397341.html</id>
<published>2026-01-04T10:58:58.000Z</published>
<updated>2026-01-04T10:58:58.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2><p>多亏了湖南这逆天气温,又又又感冒了。。。</p><h2 id="头痛">头痛</h2><p>这次感冒给我折腾的够呛,又是头痛又是胸闷,但又没发烧,没嗓子痛,看起来不像流感,奥司他韦就没用了</p><p>不止白天不舒服,晚上又是咳嗽又是失眠,连续失眠两个晚上。。。</p><p>刚好这几天又要准备剩下的几门期末考试,这个状态完全复习不进去</p><h2 id="买药">买药</h2><p>这下倒是不知道该买啥药了,不过校医院肯定是不用去了,这种只会开一堆没啥用的药</p><p>我一开始打算罗红霉素或者999感冒灵,找Gemini聊了聊,Gemini说罗红霉素适合细菌引起的感冒,对病毒引起的感冒没用。毕竟罗红霉素也是抗生素,能不吃就不吃吧,我懒得试了,买了999感冒灵和一个枇杷膏用来止咳。</p><p>用了一天,发现没啥效果,想起这玩意主要成分是对乙酰氨基酚,还不如直接吃类似药物,999里面还有咖啡因,本来就睡眠不好</p><p>又和Gemini聊了会,给我推了有布洛芬,我才想起还有布洛芬可以用。</p><p>纯乙酰氨基酚暂时不考虑,因为之前服用过999,我怕药物过量造成肝损伤</p><p>布洛芬的话疫情那会用过,感觉效果还不错,而且没有咖啡因</p><p>拿到布洛芬后,看了下说明书的禁忌和注意事项,确保可以安全服用</p><p>发现注意事项中还有不得饮酒和食用含有酒精的饮料,这几天吃东西都小心翼翼的😂,虽然应该不会像头孢配酒那样直接炸缸,但还是小命要紧(doge</p><p>还有就是这玩意不宜长期或者大量使用,用于止痛不得超过5天,用于解热不得超过3天</p><p>看了一下,一盒药一板12粒,有两板,总共24粒,一天两次一次一粒,可以吃12天,一盒20多块,还是蛮良心的</p><p>吃了两天,除了仍然鼻塞,基本没有头痛和胸闷的情况,昨晚也终于没失眠了😭</p><h2 id="后记">后记</h2><p>乙酰氨基酚和布洛芬的药物原理好像都是通过抑制前列腺素的合成,来减少疼痛和发热</p><p>另外还是不想复习怎么办(doge</p>]]></content>
<summary type="html"><h2 id="前言">前言</h2>
<p>多亏了湖南这逆天气温,又又又感冒了。。。</p>
<h2 id="头痛">头痛</h2>
<p>这次感冒给我折腾的够呛,又是头痛又是胸闷,但又没发烧,没嗓子痛,看起来不像流感,奥司他韦就没用了</p>
<p>不止白天不舒服,晚上又是咳</summary>
<category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
<category term="布洛芬" scheme="https://blog.goodboyboy.top/tags/%E5%B8%83%E6%B4%9B%E8%8A%AC/"/>
<category term="感冒" scheme="https://blog.goodboyboy.top/tags/%E6%84%9F%E5%86%92/"/>
</entry>
<entry>
<title>再见2025,你好2026</title>
<link href="https://blog.goodboyboy.top/posts/2138059444.html"/>
<id>https://blog.goodboyboy.top/posts/2138059444.html</id>
<published>2026-01-01T06:00:30.000Z</published>
<updated>2026-01-01T06:00:30.000Z</updated>
<content type="html"><![CDATA[<h2 id="正文">正文</h2><h3 id="1月">1月</h3><p>2024年12月16日,DeepSeek-V3发布<br>2025年1月15日,DeepSeek APP发布<br>2025年1月20日,DeepSeek-R1发布</p><p>至此,AI正式走入了我的生活</p><h3 id="2月">2月</h3><p>由于DeepSeek的火热,官方服务器一时无法承载大量流量</p><p>也是这段时间,各大云厂商纷纷部署DeepSeek,我也在硅基流动白嫖了一大堆邀请奖励,开始了API自由。(<a href="/posts/2942945809.html">《DeepSeek API挂了?SiliconFlow来救!》</a>)</p><p>不过好景不长,大家都发现了硅基流动,于是没过几天硅基流动也卡成狗了,于是转战字节的火山引擎,继续白嫖doge。(<a href="/posts/1550451800.html">《DeepSeek服务器繁忙?SiliconFlow卡成狗?快来火山引擎!》</a>)</p><p>中间受 <a href="https://ab2cd.com/">奇甲安全</a> 邀请,测试他们加的主流产品 <a href="https://ab2cd.com/product/138.html">一指灵通</a> ,产品还蛮好用的,作为安全产品价格也不贵。(<a href="/posts/3512270884.html">《一指灵通安全硬件体验》</a>)</p><p>然后就是我人生中第一张软件著作权登记下来了,也是我第一次正式写的一款APP(虽然后面很快就用jetpack compose重构了😂)</p><h3 id="3月">3月</h3><p>我开始学习Jetpack Compose,主要还是因为传统的Android View的material 2没3好看,但是Android View 的material3老是出问题,便转向了风格更统一的Jetpack Compose,而且我也更喜欢Jetpack Compose的设计理念,这也是我第一次接触MVVM设计架构。</p><p>然后就是开了我的第二张万事达卡(<a href="/posts/2366358045.html">《欢迎中信万事达双币借记卡加入卡包大家庭!》</a>),有人民币和美元账户,可以往里面存人民币了,也可以用这张卡购汇,不用像中行万事达那样还要一张一类卡用于购汇。</p><p>最后就是受晚夜的BLOG QSL卡启发,做了个博客明信片。(<a href="/posts/243612221.html">《设计了一张博客明信片》</a>)</p><h3 id="4月-5月">4月-5月</h3><p>四月主要还是在折腾OAuth2和OIDC,然后做了第二版的博客明信片😁(<a href="/posts/1630314981.html">《博客明信片v2版发布啦,喜欢就快来申请一张吧!》</a>)</p><p>五月则是折腾了一会土区Apple Music,顺便还办了张邮储万事达卡(变卡王了😂),还注册了个喜欢的域名(<a href="/posts/2975776194.html">《新注册furwolf.com域名》</a>)</p><p>五月最后加入了Postcrossing,开启了 <a href="/posts/3994121440.html">送你一张明信片</a> 活动(欢迎大家来参加),开始正式投递博客明信片。</p><h3 id="6月-7月">6月-7月</h3><p>整个六月差不多都是在折腾Debian,折腾Debian桌面、指纹、游戏、显示器、输入法、字体等等(什么时候能统一一下啊😭)</p><p>然后就是白嫖了一个一年的Gemini Pro,让我的学习速度更加迅猛,再也不用去CSDN屎里淘金了。。。</p><p>七月大部分时间呆在实验室,留校没有回家</p><p>不得不说,湖南七月那真的是热炸了,打个伞出门转一圈都可以浑身大汗,宛如蒸桑拿,而实验室里的空调制冷效果也一般般,开16度结果面板上显示还是28度。。。</p><p>七月折腾完后赶紧跑路回家了,太热了待不了一点。</p><h3 id="8月">8月</h3><p>八月在家就舒服很多,开始折腾上了ESP32</p><p>本来买ESP32是打算刷个Picokey固件玩,结果折腾半天刷好了效果还一般般,完全比不上Canokey,遂放弃折腾Picokey,而是玩起了最基础的电路以及ESP32编程</p><p>ESP32太好玩了,基本上整个月我都在玩ESP32,买各种硬件,显示屏、按钮、LED、电阻、万用表等等</p><p>而且当时我买的是ESP32 S3顶配版,8M的RAM和16M的存储,怎么玩都行。</p><h3 id="9月">9月</h3><p>九月当然是开卡的一个月,招行万事达卡普卡发布,迫不及待跑去分行开卡,我的国内万事达卡有它就够了,没有继续开万事达卡的欲望了(doge</p><p>然后就是买了新音响,原来的那个在暑假的时候坏了</p><p>G1500bar这段时间体验下来感觉还不错,不过默认参数就有点拉了,建议装官方的软件调一下参数,这样低音和人声效果会好很多。</p><h3 id="10月-12月">10月-12月</h3><p>这段时间倒没有折腾什么,每天课多得爆炸,大三也要准备就业相关的事情,时间少了很多qwq</p><p>十一月底的时候疯狂动物城2上映,立马就去看了😆</p><h2 id="小结">小结</h2> <div id="aplayer-QAIoAfrJ" class="aplayer aplayer-tag-marker" style="margin-bottom: 20px;"></div> <script> var options = {"narrow":false,"autoplay":false,"showlrc":3,"mode":"random","mutex":true,"preload":"metadata","listmaxheight":"513px","music":[{"name":"Zoo (From Zootopia 2)","url":"https://www.goodboyboy.top/uploads/music/Disney _ Shakira - Zoo (From _Zootopia 2_)/Disney _ Shakira - Zoo (From _Zootopia 2_).flac","artist":"Disney/Shakira","cover":"https://www.goodboyboy.top/uploads/music/Disney _ Shakira - Zoo (From _Zootopia 2_)/Disney _ Shakira - Zoo (From _Zootopia 2_).jpg","lrc":"https://www.goodboyboy.top/uploads/music/Disney _ Shakira - Zoo (From _Zootopia 2_)/Disney _ Shakira - Zoo (From _Zootopia 2_).lrc","theme":"#7767c6ff","pic":""}]}; options.element = document.getElementById("aplayer-QAIoAfrJ"); var ap = new APlayer(options); window.aplayers || (window.aplayers = []); window.aplayers.push(ap); </script><p>祝大家2026新的一年里幸福安康、财源滚滚、心想事成!😄</p>]]></content>
<summary type="html"><h2 id="正文">正文</h2>
<h3 id="1月">1月</h3>
<p>2024年12月16日,DeepSeek-V3发布<br>
2025年1月15日,DeepSeek APP发布<br>
2025年1月20日,DeepSeek-R1发布</p>
<p>至此,AI</summary>
<category term="生活" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/"/>
<category term="回忆" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/%E5%9B%9E%E5%BF%86/"/>
<category term="年度总结" scheme="https://blog.goodboyboy.top/tags/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/"/>
</entry>
<entry>
<title>Canokey导入S/MIME邮箱证书并使用Thunderbird发送邮件</title>
<link href="https://blog.goodboyboy.top/posts/3174411847.html"/>
<id>https://blog.goodboyboy.top/posts/3174411847.html</id>
<published>2025-12-24T15:33:55.000Z</published>
<updated>2025-12-24T15:33:55.000Z</updated>
<content type="html"><![CDATA[<h2 id="前期准备">前期准备</h2><blockquote><p>Tips: 需要安装1.2.4以及以下的版本,高版本不支持Canokey(或者使用Canokey自家的ckman也行)</p></blockquote><ul><li>安装ykman:<a href="https://developers.yubico.com/yubikey-manager-qt/Releases/">https://developers.yubico.com/yubikey-manager-qt/Releases/</a></li></ul><blockquote><p>S/MIME邮箱证书可以看我上一篇文章(<a href="/posts/2880062507.html">1.90$申请 WISeID S/MIME 邮箱证书</a>)</p></blockquote><ul><li><p>S/MIME邮箱证书</p></li><li><p>安装OpenSC:<a href="https://github.com/OpenSC/OpenSC">https://github.com/OpenSC/OpenSC</a></p></li></ul><h2 id="导入证书">导入证书</h2><p>目前Canokey支持以下几种算法的证书</p><ul><li>RSA2048</li><li>NIST P-256</li><li>NIST P-384</li></ul><p>对于固件版本3.0.0以上的Canokey(CanoKey Canary),还支持以下算法的证书</p><ul><li>RSA3072</li><li>RSA4096</li><li>secp256k1</li><li>Ed25519</li><li>X25519</li><li>SM2</li></ul><blockquote><p>Tips: CanoKey 固件版本 3.0.0 仅支持使用 Ed25519 算法对 32 字节数据做签名,仅支持使用内部生成的 X25519 密钥。</p></blockquote><p>安装好ykman后,连接Canokey,进入终端</p><p>输入命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ykman -r canokey info</span><br></pre></td></tr></table></figure><p>应该能够看到智能卡的相关信息</p><p>输入命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ykman -r canokey piv info</span><br></pre></td></tr></table></figure><p>应该能看到PIV的相关信息</p><p>然后CanoKey一般有4个可用的插槽:</p><ul><li>9A:PIV Authentication</li><li>9E:Card Authentication</li><li>9C:Digital Signature</li><li>9D:Key Management</li></ul><p>从固件版本 2.0.0 开始,CanoKey 还支持82、83插槽</p><p>固件版本 3.0.0 开始,好像还支持<code>Card Capability Container</code>、<code>Card Holder Unique Identifier</code>、<code>Printed Information</code>,有邪修玩法用来存VeraCrypt的密钥</p><p>需要注意的是,9E插槽的默认PIN策略是不验证</p><p>不过这都无所谓,可以通过<code>--pin-policy</code>来设置,具体可以看ykman的命令帮助来使用</p><p>这里使用的是9c插槽</p><p>首先是导入私钥</p><blockquote><p>Tips: Canokey默认的管理密钥是:010203040506070801020304050607080102030405060708,如果修改了管理密钥需要加上<code>-m</code>参数传入管理密钥</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ykman -r canokey piv keys import 9c <私钥文件路径></span><br></pre></td></tr></table></figure><p>然后是导入公钥证书</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ykman -r canokey piv certificates import -v 9c <公钥文件路径></span><br></pre></td></tr></table></figure><p>这里会提示输入PIN,输入PIV的PIN即可,这里的<code>-v</code>参数用于验证证书是否匹配导入的私钥,可有可无</p><h2 id="导入Thunderbird">导入Thunderbird</h2><p>启动Thunderbird,找到端到端加密,点击<code>S/MIME安全设备</code>按钮,然后点击<code>加载</code>按钮,选择<code>浏览</code>按钮</p><p><img src="https://pic.goodboyboy.top/imgs/2025/12/25/kgtxq.webp" alt="1"></p><p>找到你安装OpenSC的地方,<code>OpenSC/pkcs11/</code>该目录下有个<code>opensc-pkcs11.dll</code>,选择即可。</p><p>正常加载模块后,点击刚刚添加的模块,模块下面有个canokey设备,选择后点击登录,会要求输入PIN</p><p><img src="https://pic.goodboyboy.top/imgs/2025/12/25/kvn71.webp" alt="2"></p><p>登录完成返回到端到端加密页面,点击个人数字签名证书旁边的<code>选择</code>按钮,一般来说会自动找到符合条件的证书,选择后可以点击旁边的<code>测试</code>按钮</p><p>如果测试提示颁发者无效,说明可能是缺少中间证书,点击<code>管理S/MIME证书</code>按钮,选择证书颁发机构,导入你的颁发机构的中间证书即可。</p><h2 id="参考">参考</h2><p><a href="https://docs.canokeys.org/zh-hans/userguide/piv/">https://docs.canokeys.org/zh-hans/userguide/piv/</a></p><p><a href="https://thinkalone.win/canokey-canary.html">https://thinkalone.win/canokey-canary.html</a></p><p><a href="https://www.liups.net/2025/10/s-mime-%E8%AF%81%E4%B9%A6%E7%AD%BE%E5%90%8D%E5%8A%A0%E5%AF%86%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6/">https://www.liups.net/2025/10/s-mime-证书签名加密电子邮件/</a></p>]]></content>
<summary type="html"><h2 id="前期准备">前期准备</h2>
<blockquote>
<p>Tips: 需要安装1.2.4以及以下的版本,高版本不支持Canokey(或者使用Canokey自家的ckman也行)</p>
</blockquote>
<ul>
<li>安装ykman:<a hr</summary>
<category term="教程" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/"/>