-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlocal-search.xml
1357 lines (651 loc) · 349 KB
/
local-search.xml
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"?>
<search>
<entry>
<title>我再也不能不假思索</title>
<link href="/archives/2c54052d.html"/>
<url>/archives/2c54052d.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><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><p>看到这里,悬在空中的石头落地,你便也随着大流走下了阶梯。只不过,在那之后,在等候地铁时、坐在地铁中、或是淋浴、发呆之际,你都会回忆起过去的你,那个会毫不犹豫拾起地板上的垃圾、主动让出座位、扶起摔倒的人、给予他人帮助的你。你会不由自主地问自己:</p><p>我从什么时候开始,再也不能不假思索地做一件事情?</p>]]></content>
<tags>
<tag>随笔</tag>
</tags>
</entry>
<entry>
<title>Soundcore C30i 耳机</title>
<link href="/archives/95479b1f.html"/>
<url>/archives/95479b1f.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>我目前在使用的耳机是 Sony LinkBuds,就是那款中间带了个孔的奇怪耳机。</p><p>它本是为了商务人士在办公场所使用而设计,收听耳机中声音的同时不会影响听取他人的谈话。它却被我这个耳道经常发炎的人看上了。</p><p>我想,中间带了个孔,那耳道内外的空气就是完全流通的,那耳道内肯定不会闷了吧!为了验证这一点,我特地去 Sony 的线下店体验这款耳机。佩戴上 LinkBuds,确实完全没有耳道被封闭的感觉,我便在网上欣然下单了。</p><p>然而,经过一段时间的佩戴,才发现我的想法过于天真:看似畅通无阻的气流,在直径不够大的圆环处有阻塞。内部产生的水蒸气无法排出,导致耳道仍然会有潮湿感。佩戴20分钟以上,摘下耳机放入耳机舱,一段时间后取出,会发现耳机舱内有冷凝水。</p><p>Sony LinkBuds 仍然不能解决我耳朵发炎的困扰。我便又踏上了寻找新耳机的旅途。</p><p>今天便是要介绍我找到的其中一款,有望成为最终解决方案的耳机 —— SoundCore C30i。</p><p><img src="/images/2024-06-13/01.jpeg" alt="外包装"></p><h2 id="设计"><a href="#设计" class="headerlink" title="设计"></a>设计</h2><p><img src="/images/2024-06-13/02.jpeg" alt="充电盒外观"></p><p><img src="/images/2024-06-13/03.jpeg" alt="充电盒开盖"></p><p>耳机充电盒的外观,以及开盖后的样子如上图所示,就不多介绍了。</p><p>开放式耳机相对于入耳式、半入耳式耳机,设计上花样多了不少。我看到的所有款式中,大致可以分为两类:</p><ul><li>使用挂钩悬挂在耳朵之后,将扬声器覆盖于耳道口,通过空气传导声音进入耳道的;</li><li>夹在耳垂上,耳机本身不覆盖或仅部分覆盖耳道口,通过侧向开口将声音导向耳道的。</li></ul><p>SoundCore C30i 属于后者。</p><p><img src="/images/2024-06-13/04.jpeg" alt="耳机本体"></p><p>我选择的是透明外壳的款式,耳机内部结构清晰可见。</p><p>左边耳机的扬声器处有一个开口,这便是朝向耳道的声音出口。</p><p>右耳朝上的是耳机背面,金色的圆片是触控传感器。</p><h2 id="佩戴感"><a href="#佩戴感" class="headerlink" title="佩戴感"></a>佩戴感</h2><p>夹耳的耳机其实还可以再分类。一种是本体柔软、有弹力,有点像悬挂在耳朵上的,将扬声器更多地覆盖于耳道口,以提升传音效率的耳机。</p><p>C30i 本体则不可以弯曲,采用虎口般的结构卡在耳垂上。在佩戴时需要找到耳垂比较薄的部分,将耳机从那里套入耳垂,再将耳机推向耳垂较厚的地方,就能牢固固定。看似还是有些松松垮垮,但因为耳机足够轻,不容易被甩掉。</p><p>我的感觉是,佩戴上没有什么异物感,但难以做到所谓“戴久了会忘记它的存在”这么夸张。</p><p>我尝试连续佩戴了两个多小时,期间耳朵没有任何被堵塞的感觉,且取下后耳朵没有丝毫的潮湿感。确实是完全的开放了!</p><h2 id="音质"><a href="#音质" class="headerlink" title="音质"></a>音质</h2><p>我的评价是:出奇的好。</p><p>因为是一种妥协,我对耳机的音质便不抱任何希望。实际听起来,虽然也有这非封闭式耳机缺乏低音等问题,其实音质相当不错。</p><p><img src="/images/2024-06-13/05.jpeg" alt="EQ 方案"></p><p>通过调整 EQ 配置,将高低频都拉高(经典两头高调法),效果更是好了许多!</p><p>我也听了一段博客,听清说话人的语音也没有任何困难。</p><h2 id="多设备连接"><a href="#多设备连接" class="headerlink" title="多设备连接"></a>多设备连接</h2><p>我原本买的是飞利浦的一款开放式耳机,到手之后才发现耳机没有双设备连接的功能。我平常有在手机和电脑之间切换使用的需求,少了这个功能实在不能接受。</p><p>C30i 支持同时连接两台设备,可以在两台设备间无缝切换。</p><h2 id="续航"><a href="#续航" class="headerlink" title="续航"></a>续航</h2><p>商品说明上标明了耳机单次续航是 10 个小时,这应该是相当厉害的了。加上充电盒,总共可以提供 30 个小时的续航。</p><p>实际用下来,在 2 小时的使用后,耳机的电量没有明显的减少。续航应当是很强劲的。</p><h2 id="缺点"><a href="#缺点" class="headerlink" title="缺点"></a>缺点</h2><p>目前我看到的一个缺点是,耳机缺少自动休眠功能。将充电盒打开,耳机便会连接所有设备,摘下后仍保持着连接。直到耳机放回充电盒,并盖上盖子后,耳机才会关机。</p><p>且耳机缺少佩戴检测,摘下后不会停止音乐播放。似乎耳夹式耳机比较少有这个功能。</p><p>这可能会抢占了一些设备的音频输出,不过不算是很大的缺点。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>SoundCore C30i 有效解决了我耳道容易发炎的痛点,音质不错,且有多设备连接的功能,满足了作为我主力使用的耳机的所有需求。</p>]]></content>
<categories>
<category>随笔</category>
</categories>
<tags>
<tag>随笔</tag>
</tags>
</entry>
<entry>
<title>日本之行-第二站-奈良</title>
<link href="/archives/adc5a61e.html"/>
<url>/archives/adc5a61e.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h2 id="写在前面"><a href="#写在前面" class="headerlink" title="写在前面"></a>写在前面</h2><p>23年12月底,我踏上了前往日本的旅途。这是我第一次去日本,是我第一次出国旅行,且只身一人。</p><p>本次旅行为14天,我将分多个章节完成所有的游记,记录下我旅行中的点点滴滴、各种感想。这是第二章节,奈良之旅。</p><h2 id="近铁、巴士与鹿"><a href="#近铁、巴士与鹿" class="headerlink" title="近铁、巴士与鹿"></a>近铁、巴士与鹿</h2><p><img src="/images/2024-03-11/00.jpeg" alt="使用 Suica 乘坐近铁"></p><p>奈良距离大阪仅有 30km,乘坐近铁奈良线,摇摇晃晃一个多小时便能到达奈良。</p><p>这条线路有分区间准急、准急、急行、快速急行四个速度,每个速度停靠的站点数量不同,票价都相同的。如果想尽快到达奈良,乘坐快速急性是最好的选择。</p><p>这天,我纯凭心情来到近铁难波站,坐上了最近一班开往奈良的近铁,似乎是急行。</p><p>近铁的运行速度不是很快,叮叮当当地在楼房间穿行着。</p><p>在近铁奈良站,奈良线的终点站下了车,距离旅馆所在的奈良公园还有一段距离。由于拖着行李,我选择搭乘公交车。</p><p>公交车到站后会向站台一侧倾斜车身,方便乘客上下;上车的门并不固定,可以看车身的贴纸判断;司机会很耐心地等待所有人上车、落座之后才摆正车身、继续前进。</p><p>有一些线路是分段计费的,就需要在上车的时候领取一张整理卷,或者先刷一下卡,在下车的时候将钱和整理券一起投入投币机,或者刷一下公交卡就可以了。</p><p>在每一个座位的旁边都有一个按钮,如果下一站要下车,按一下就会提醒司机,并且在车头的显示屏上也会显示,车上的所有按钮都会亮起。在公交车到站停稳之前无需先起身,车子停稳后司机也会很耐心地等大家付钱、下车,还会一个一个道谢哦。</p><p>相比于地铁,公交的到站时间显得没有那么准确,但不会差太多。在地面运行的公交会受到交通的影响,等候乘客上下车、付钱有时候也会用掉不少的时间,能做到按照时间表运行已经相当厉害了。</p><p><img src="/images/2024-03-11/01.jpeg" alt="路边的鹿"></p><p>虽然在车上就有看到,果然很多啊 —— 奈良的鹿。</p><p>奈良的鹿是散养的,主要集中在奈良公园和春日大社。在奈良设有鹿苑,将受伤或者发情的鹿收养,待它们恢复正常再放回乡中散养。</p><p>从车站走到旅馆,一路上都有鹿儿好奇地打量着来自异国他乡的我。</p><p>每走一段距离,能看到提示观光客不要“挑逗”鹿儿的提示牌,有些鹿的性格比较差,会用头顶你,追着你不放的。好在大部分鹿都去掉了角,不至于顶伤人。</p><p><img src="/images/2024-03-11/02.jpeg" alt="鹿园宾馆"></p><p>今天的旅馆确实有些简陋 —— 私人活动空间仅有这么一小间,洗浴和方便都是公用的。不过旅店的氛围很好,有一个共用的客厅,客人们可以在这里吹暖气(冬天还是挺冷的)、喝饮料、聊天。</p><p>旅店的工作人员非常热情,替我办理好入住手续后,立刻拿出一张奈良公园的地图,用简单的中文(很厉害哦!)告诉我这附近有哪些好玩的地方。奈良一天的行程就是参考着这张地图安排的。</p><p>整理好行装,已是傍晚五点多。按照旅店工作人员以及 Google Maps 的说法,奈良公园里的大部分饮食店都要下班了!遂立刻出门,寻找晚饭的地点。</p><p>因为今天是周五吗,明明还有一些旅客在此游玩的,旅店对面的旅游纪念品店已经关门了!沿街打量了几家店铺,也都在收拾着大堂,准备打烊了,完全不像是会接客的样子。大危机,要没晚饭吃了,得走个几公里处了奈良公园,到达奈良市区才有便利店。</p><p>路过了一家同样是卖纪念品的商店,发现店内的空间还挺宽敞,也摆着一些桌椅,便问了一下老板还有没有饭吃。运气很好,这家店还没有打烊。</p><p><img src="/images/2024-03-11/03.jpeg" alt="親子丼"></p><p>可以选择的菜品并不是很多,大多数都是日本的家常菜。我选择了这道绝大部分和食餐馆都会有的家常菜 —— 親子丼。</p><p>从厨房门帘的缝隙向里望去,可以隐约看见老板在烹饪着饭菜。明明用得都是同样的工具和食材,有技艺的人做出来的东西就能端上桌卖钱呢。</p><p>蛋是我们所谓“半熟”的柔滑状态,鸡肉有一些小烧焦,主要的风味是自古以来人们就离不开的味道 —— 咸味。风味不能说突出,却很平和。它就是一碗很普通、很平常,此时此刻会出现在任意一张餐桌上的饭。</p><p>饱饭后,我根据地图的指引,前往东大寺的二月台,观赏日落之景。</p><p><img src="/images/2024-03-11/04.jpeg" alt="二月台的日落1"></p><p><img src="/images/2024-03-11/05.jpeg" alt="二月台的日落2"></p><p><img src="/images/2024-03-11/06.jpeg" alt="二月台的日落3"></p><p><img src="/images/2024-03-11/07.jpeg" alt="二月台的日落4"></p><p>只用手机相机无法捕捉暗光下的美景。</p><p>夕阳柔和而昏暗地照着二月台,四周一片静寂,只能听见洗手亭的潺潺水声。在日落后还停留在奈良公园的游客寥寥,大家都保持着绝对的安静,共享这片难得的静谧。</p><p>在台上驻足数分钟,我轻轻踏着脚步走下楼梯,沿着寺院的小路漫步着,离开了东大寺。</p><p>此时天已完全黑了,不论是寺院还是神社都已关门,我就这么在奈良公园里漫步着。时不时碰见一群鹿,便从口袋中掏出一块鹿仙贝,掰给鹿儿吃。</p><p><img src="/images/2024-03-11/08.jpeg" alt="果汁"></p><p>会旅店前在路边的售货机买了一瓶果汁饮料,是不二家的。日本的饮料会标注果汁含量,我觉得很神奇。</p><p><img src="/images/2024-03-11/09.jpeg" alt="春日大社"></p><p>第二天,去参观了十分出名的春日大社。不过不恰巧,主殿正在维修,将赛钱箱设置在了原处,只能眺望主殿。</p><p>在巫女那儿买了点纪念商品,是两只鹿型的小玩偶。一只是木质的,一只是陶制的,鹿儿的嘴中叼着签。忘记留下照片了。</p><p><img src="/images/2024-03-11/10.jpeg" alt="林间小道"></p><p>离开主殿,走上铺着碎石的小道。</p><p><img src="/images/2024-03-11/11.jpeg" alt="路旁的神社"></p><p>每走几步,便会出现一间迷你神社,感觉十分奇妙。在这片林海中不知道供奉着多少的神明。</p><p>有些人也许是提前来做新年参拜,途中遇到的神社都会十分虔诚地参拜。</p><p>在林间漫步了将近一个小时,吸饱了新鲜的空气,我振奋精神,回旅馆取了行李,准备离开奈良。</p><p><img src="/images/2024-03-11/12.jpeg" alt="若草山"></p><p>拖着行李箱漫步在奈良公园里,我又一次路过了若草山。</p><p>若草山也不高,在满是丘陵的福建甚至都算不上山,只是个小土坡。山上的草长得格外整齐,是一座越看越顺眼的山呢。</p><p>若草山每年12月初开始封山,直到第二年三月举行烧山仪式后才重新开放。没能上去走走真是可惜。</p><p><img src="/images/2024-03-11/13.jpeg" alt="柿叶寿司 set"></p><p>在前往近铁奈良站离开奈良前,我路过了一家在网上有着不少讨论的柿叶寿司店,便决定在这里解决午饭。</p><p>柿叶寿司其实就是用柿子叶将寿司包起来烹饪。据说柿子叶不仅可以杀菌消毒,还能给寿司提升风味。</p><p>想着,既然是奈良的特色菜,肯定要好好品尝一下。我点了一份 2500円 的大套餐,奢侈一下~</p><p>左下角的五枚寿司,上方两枚便是柿叶寿司了。下方三角形的寿司也是用不能吃的叶子包着,但好像不是柿子叶;右侧是用腌制过的紫苏叶包的寿司,紫苏叶是可以吃的,风味很独特,我很喜欢;左侧是茶味的卷寿司,也是第一次吃。</p><p>柿叶寿司用的是腌制过的鱼,确实带有叶子的香味,很有特色!</p><p>除此之外,套餐内还有精致的小菜、一份天妇罗拼盘和一碗素面。吃的我好饱~</p><p><img src="/images/2024-03-11/14.jpeg" alt="线上买的特急卷"></p><p>乘坐上前往京都的特急电车时还发生了一些小插曲。</p><p>坐上车后我才意识到自己坐的是特急的电车,进站时我只刷了基本票,没有购买特急卷。</p><p>好在列车上有通过扫描二维码购买特急卷的渠道,也支持借记卡付款。在等待列车发车时,我赶紧买了特急卷,带着行李移动到了指定座位,正式踏上前往京都的旅途。</p>]]></content>
<categories>
<category>随笔</category>
</categories>
<tags>
<tag>随笔</tag>
</tags>
</entry>
<entry>
<title>23 年对我影响最大的硬件与软件</title>
<link href="/archives/a7050149.html"/>
<url>/archives/a7050149.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>原文投稿在自留地频道的新年活动里。</p><p>对于我来说,23 年给我带来影响最大的莫过于 Meta Quest 3 与 VRChat 了。</p><h2 id="Quest-3"><a href="#Quest-3" class="headerlink" title="Quest 3"></a>Quest 3</h2><p><img src="/images/2024-03-01/01.png" alt="订单截图"></p><p>Quest 3 在 23 年 6 月面世,于 9 月 28 日开放预购。我早在数年前就有了尝试 VR 的念头,在经过一天的调查研究后确定了 Quest 3 不会踩坑,便在日亚下了单,直邮回国。日亚上标价为 78k 円,日本商品出口不收税,再加上直邮的运费和中国的关税,最后到手的价格和标价差不多。(顺便一提,现在日亚也可以以相同的价格直邮国内)</p><p>外观我就不展示了,网上的图很多。到手第一件事,便是尝试它对于上一代产品相比提升最大的地方——显示与穿透(Pass Through)。</p><h3 id="显示效果"><a href="#显示效果" class="headerlink" title="显示效果"></a>显示效果</h3><p>显示效果上,Quest 3 采用了 Pancake 棱镜,甜点位置(Sweet Spot)相对于上一代更大,也就是说仅需简单调整头戴的位置,便能找到画面最为清晰的位置,我的使用体验上感觉也是如此,每次佩戴上头显很快就能调整好画面。</p><h3 id="穿透-Pass-Through"><a href="#穿透-Pass-Through" class="headerlink" title="穿透 (Pass Through)"></a>穿透 (Pass Through)</h3><p><img src="/images/2024-03-01/02.jpeg" alt="穿透效果"></p><p>穿透方面,由于我没有用过 Quest 2、Quest Pro 等拥有穿透功能的 VR 头显,无法进行比较。图片中看起来比较糊,是因为我用了 Quest 自带的截图功能,分辨率很低。实际观感上,在光线充足的环境中可以毫无压力地辨认各种物体,但细小的字是看不清楚的。戴着 Quest 使用手机并不是很舒服,因为物体距离头显过近会因摄像头视角的问题产生扭曲,看字会很吃力。将手机拿远,又会因为显示清晰度不够而看不清字。不过听说 Quest 2 的穿透是黑白且十分模糊,Quest Pro 也好不了很多,Quest 3 在这个方面应是有十足的进步。(似乎离 avp 还有很大的差距)</p><hr><p>相比于头显中不带有处理芯片的 VR 眼镜,Quest 可以使用无线串流软件将 PCVR 的画面投影至头显中显示,再也不用担心玩游戏时绊倒数据线了。</p><p>总而言之,Quest 3 是一副功能完善,各方面实力均不弱的“六边形战士”,但毕竟定位是廉价头显,也就缺少了 Quest Pro 的自定位手柄、眼部追踪,Valve Index 的基站定位、手部追踪,更没有 Apple Vision Pro 的高 ppi 显示屏、低延迟的穿透与精准的手势识别。但综合来看,Quest 3 的性价比高,适合刚刚步入虚拟世界,想要体验各式各样 VR 游戏的人购买。</p><h2 id="VRChat"><a href="#VRChat" class="headerlink" title="VRChat"></a>VRChat</h2><p>谈到 VR 游戏,有人会想到 Half-Life:Alyx,有人会说起(已经凉掉的) Beat Saber。根据 SteamDB 的数据,此刻在线数量最多的 VR 端游戏还得是 VRChat(主要为 PC 端的战争雷霆不算)。</p><p>在我看来,VRChat 里有大概有四类人。</p><h3 id="第一类人:虚拟世界的旅行家"><a href="#第一类人:虚拟世界的旅行家" class="headerlink" title="第一类人:虚拟世界的旅行家"></a>第一类人:虚拟世界的旅行家</h3><p><img src="/images/2024-03-01/03.jpg" alt="风景大好"></p><p>有些人想“逃避现实”,来到虚拟世界欣赏美景、转换心情。在 VRChat 里有各种各样风格的地图:有些风景大好、音乐舒缓,适合在快节奏的生活之余找到一个宁静之地放松紧绷的精神;有的地图灯红酒绿,如果在夜晚你还是激情满满,不妨来这里听听虚拟 DJ 的表演,大家一起蹦迪、饮酒;甚至还有环境昏暗、一片寂静,十分适合睡眠休息的卧室地图,虽然深处异地,也能在虚拟世界里与好友共眠,在清晨醒来的那刻发现自己的眼前并不是早已习惯了的天花板,耳边是仍在熟睡的友人的呼吸声,将会是一种全新的体验。</p><h3 id="第二类人:虚拟世界的摄影师"><a href="#第二类人:虚拟世界的摄影师" class="headerlink" title="第二类人:虚拟世界的摄影师"></a>第二类人:虚拟世界的摄影师</h3><p><img src="/images/2024-03-01/04.jpg" alt="人也很美"></p><p>也有些人想在虚拟世界里做一个摄影师。美景的照片中怎么能少了美人,如果现实中找不到美人,那就自己来扮吧(心死)。VRChat 中使用的人物模型可以由玩家自行上传,如果你恰巧会使用 Unity 与 Blender,便可以为自己量身定制一个人物模型;如果不会也没有关系,在 Booth 上有许多预制好的人物模型与衣服,只要按照教程将其组合,便可打造出你心目中的理想形象(不管男女)。为了拍出满意的照片,你会主动去学习各种各样的新技能:为了调整照片的后期效果,我就学习了 Lightroom 的使用。</p><h3 id="第三类人:人,不过是在虚拟世界里"><a href="#第三类人:人,不过是在虚拟世界里" class="headerlink" title="第三类人:人,不过是在虚拟世界里"></a>第三类人:人,不过是在虚拟世界里</h3><p><img src="/images/2024-03-01/05.png" alt="和朋友聊天"></p><p>这或许才是 VRChat 的核心内容 —— 当然是和朋友聊天啦。在 VRChat 中有一些专门用于聊天、交友的地图,例如以中文为主的“中文吧”;也有一些比较热门的地图会聚集起各个语言的人群一起聊天,例如“Japan Shrine[spring]”,一张风景优美的日本神社地图;更有各种各样以个人或小团体主办的咖啡厅、运动吧、跳舞房、游戏房等着你来加入。也许你和我一样有些小“社恐”,在现实生活中不大善于和陌生人交际,不妨试试在 VRChat 中,与素未谋面但已经熟络的朋友,或是围坐在篝火旁闲聊,或是在电闪雷鸣、乌云滚滚的夜空中乘坐飞机探险,相信这对你一定会给你带来从所未有的新鲜感。</p><h3 id="第四类人:OOOO"><a href="#第四类人:OOOO" class="headerlink" title="第四类人:OOOO"></a>第四类人:OOOO</h3><p>还有一类是搞色色的,就不多说了。</p><p>以上只是从我的眼中看到的 VRChat。一千个人的心中有一千个哈姆雷特,你的 VRChat 又将会是什么样的呢?</p><hr><p>自从 23 年 10 月 3 日加入 VRChat 以来,我学会了怎么修改模型、如何使用全身追踪让自己在游戏中灵活运动;尝试在跳舞房里学习舞蹈,在 KTV 房里与朋友唱歌,与来自全球的人使用中、英、日闲聊;在 VRChat 中结交了新的朋友,在 X 上发布了拍摄的照片。VRChat 确确实实已经融入了我的生活,仿佛在另一个世界塑造了另一个不同的我。</p>]]></content>
<categories>
<category>随笔</category>
</categories>
<tags>
<tag>随笔</tag>
</tags>
</entry>
<entry>
<title>旅行与军粮</title>
<link href="/archives/a534d51a.html"/>
<url>/archives/a534d51a.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h2 id="军粮的特点"><a href="#军粮的特点" class="headerlink" title="军粮的特点"></a>军粮的特点</h2><h3 id="1-便携"><a href="#1-便携" class="headerlink" title="1. 便携"></a>1. 便携</h3><p>一般来说,军粮都会被较为紧凑地包装,以便于大批量运输与随身携带。如确认将有一餐饭需要在外解决,可以在出发时往包里塞上一份军粮。</p><h3 id="2-分量足"><a href="#2-分量足" class="headerlink" title="2. 分量足"></a>2. 分量足</h3><p>军粮的营养构成一般都是按照一个运动量中上的成年男性一餐所需要的卡路里来设计的。因此,即使不能完全饱腹,其所含的营养足够填补在外游玩半天空空的肚子了。</p><h3 id="3-便于烹饪"><a href="#3-便于烹饪" class="headerlink" title="3. 便于烹饪"></a>3. 便于烹饪</h3><p>相比于需要加入开水的方便食品、甚至是冻干食品,军粮一般自带加热设备,仅需冷水,甚至不需要水都可以加热食物。若是去荒郊野岭的地方露营,除非有携带便携式汽炉,想获取到热水是比较难的,这时候有自加热的军粮会很方便。</p><h2 id="俄罗斯单兵口粮普餐"><a href="#俄罗斯单兵口粮普餐" class="headerlink" title="俄罗斯单兵口粮普餐"></a>俄罗斯单兵口粮普餐</h2><p><img src="/images/2024-02-12/01.jpg" alt="外包装"></p><p>这次买到的6号餐谱,包含五包干粮、牛肉丸、牛肉荞麦饭、牛肉炖豆角、牛肝酱、午餐肉、蔬菜丁罐头以及饮料、果酱、零食等散件,还有一套由三个燃料药丸、一个铝制支架和几支防风火柴组成的明火加热套装。</p><p><img src="/images/2024-02-12/02.jpg" alt="塞满的盒子"></p><p>旅行的第一天是登山,午餐便携带了部分的食物作为午餐。</p><p>有些小雨,便找了一处有雨遮的地方开始准备午饭。</p><p><img src="/images/2024-02-12/03.jpg" alt="加热装置"></p><p>将铝板弯曲成炉子的形状,在炉子的中央放上燃料药丸,再用防风火柴点燃,便是一个功能完备的加热装置。</p><p>小贴士,我试着用火柴从上方点燃药丸,尝试了两次都失败了。将火柴放在炉子里,然后将药丸放在火柴上,便能很轻易地将其点燃。</p><p><img src="/images/2024-02-12/04.jpg" alt="正在加热的蔬菜丁罐头"></p><p>点燃固体燃料后,将盛有食物的铝制罐子放在火上直接加热即可。如果有带铝或者钛制的杯子,也可以直接放在火上烧水,泡些饮料喝。</p><p><img src="/images/2024-02-12/05.jpg" alt="干粮、芝士与肝酱"></p><p>在等待罐头加热时,我先掏出了干粮与蘸酱。除了照片里的芝士与肝酱,还有一包苹果果酱。</p><p>芝士的味道与常见的芝士片如出一辙,在我看来稍微淡了些,因此也比较适合直接吃。</p><p>牛肝酱则是特别的腥,单独吃我有些吃不来,和着芝士与果酱吃味道倒是还不错。</p><p>拿出一片干粮(其实就是苏打饼干),涂上果酱,挖一勺芝士,再放上一点点牛肝酱,一口塞进嘴里,味道还算不错。</p><p>饼干有些干硬,嚼起来有些费劲儿,需要配水。</p><p>最后,完吃完了一份饼干、一盒芝士和一包果酱,牛肝酱剩下了一大半。</p><p><img src="/images/2024-02-12/06.jpg" alt="牛肉丸"></p><p>接下来是牛肉丸。看到红色的外表就能猜到是罗宋汤风味的。</p><p>应该是罐藏的缘故吧,牛肉已经泡得很软了,吸收了罗宋汤酸酸甜甜的风味,味道还算不错。就是牛肉味已经不是很浓,能吃得出来是肉,但没有什么特殊的肉的风味。</p><p>顺便一提,用这种炉子加热,铝盒子受热举起不均匀,中间已经滚烫,但四周还是冰的,需要多多翻搅。</p><p><img src="/images/2024-02-12/07.jpg" alt="蔬菜丁罐头"></p><p>从外表看不出来里面有啥,红红的肯定也是罗宋汤的味道。里头的蔬菜主要是胡萝卜,也有青椒、青豆等蔬菜。但这一碗的味道就不好了,青椒的味道和西红柿(或者是甜菜)的酸甜并不搭。</p><p>把饼干蘸着牛肉丸的汤汁吃,味道也不错。涂涂果酱、涂涂芝士,饼干便吃完了一包。</p><p>又吃了点麻麻那边的自热口粮,便已饱腹,我的食量确实不大啊。</p><p><img src="/images/2024-02-12/08.jpg" alt="蔬菜丁罐头上的うさこ"></p><p>这一餐其实只吃了整套餐的 1/3 左右,剩下的量再吃两次正餐不成问题。</p><p>回到家后,又拿出了些零食品尝了一下。</p><p><img src="/images/2024-02-12/09.jpg" alt="巧克力棒"></p><p>来自俄罗斯的巧克力棒,偏甜,一股代可可脂的廉价感,属于不大好吃的巧克力。</p><p><img src="/images/2024-02-12/10.jpg" alt="速溶咖啡、奶与糖"></p><p>右上角是速溶咖啡,右下角是奶粉,左边的一大包是糖。糖的量很大,明显不止是一次饮料的量,也可以放在茶里喝。</p><p>咖啡很苦,一股烧焦味,不好喝。奶粉大概也是植脂末吧,没什么奶味。</p><p>剩下的食品我分成了两餐解决。</p><p><img src="/images/2024-02-12/12.jpg" alt="第一餐"></p><p>第一餐的搭配是:牛肉荞麦饭、肥肉罐头和干粮(饼干)。</p><p><img src="/images/2024-02-12/13.jpg" alt="第一餐的内容"></p><p>也许我加热的还不够,但考虑到在野地里使用便携式炉子加热的能力,士兵们能加热到中间完全热乎,周围有些凉是平均水平了。荞麦饭很硬,风味也不是很好,除了咸味和一点牛肉味,尝不出别的滋味了。加了一些套餐内的黑胡椒粉,才改善了一些风味。</p><p>不过这一大碗饭确实很能填饱肚子,适合放在午餐食用。</p><p>肥肉罐头里自然是盐腌风味的很肥的肉啦。味道我还挺喜欢的,肥肥的肉很好吃,十分下饭。</p><p><img src="/images/2024-02-12/14.jpg" alt="第二餐"></p><p>第二餐的搭配是:牛肉煮豆子、午餐肉、苹果泥、酱牛肉(来自国产 MRE)和干粮(饼干)。</p><p><img src="/images/2024-02-12/15.jpg" alt="第二餐的内容"></p><p>牛肉煮豆子用的会是什么豆呢,豌豆吗?啊,原来是黄豆。</p><p>并没有延续牛肉丸、蔬菜罐头的罗宋汤风味,只是单纯的咸味,不过味道我还挺喜欢的。</p><p>牛肉其实不多,就一大块带筋、软烂的牛肉,剩下都是碎块。除了黄豆外还有一些胡萝卜。</p><p>午餐肉很小一罐,但确实是肉泥,淀粉含量并不多,味道也不错。</p><p>苹果泥是我整个套餐中最喜欢的一样食物了。口感绵密,酸甜度适中,汁水十足。配合干粮一起吃,很大地改善了干粮过干、过硬的缺点。而且好大一罐,吃得很满足。使得这一餐中我干掉了两袋干粮。</p><h2 id="国内的军粮-——-以北戴河的自热口粮为例"><a href="#国内的军粮-——-以北戴河的自热口粮为例" class="headerlink" title="国内的军粮 —— 以北戴河的自热口粮为例"></a>国内的军粮 —— 以北戴河的自热口粮为例</h2><p>09式单兵自热口粮我吃过几份,13式这种两餐包装在一起的也吃过一次。</p><p>这次选购的是北戴河生产的自热口粮。虽然不是军品,但北戴河前身是军工厂,产品会比较接近军品吧。包装风格与09式也很相像。</p><p><img src="/images/2024-02-12/11.jpg" alt="酒店里的自热口粮"></p><p>那天感冒的发烧刚退,人还比较虚弱。住的度假酒店位置比较偏,不想跑太远去吃晚饭,便取了车上的自热口粮回房间吃。</p><p>我吃过太多次了,便没有拍照片,下面就口述一下感受。</p><p>相比于09式单兵自热口粮,北戴河出品的民用口粮内容少了很多 —— 没有了耐贮蛋糕、糖水黄桃/菠萝、调味辣椒酱和固体饮料,只有一份主食,一份配菜(酱牛肉和午餐肉二选一)和一份小菜(榨菜)。</p><p>09式的餐谱相当多样,有 12 个餐谱,有炒面也有炒饭,也有一些主食是素食的,满足部分人群的需求。</p><p>北戴河的仅有三种餐谱,且都是荤食的炒饭。</p><p>主食包外套着加热袋,用注水袋取对应量的水(生水、脏水皆可)倒入加热包即可完成主食的加热。</p><p>味道上,我认为北戴河做得是不如当年的09式的。饭总体都偏咸,但肉给的十分足。</p><p>但相对于俄罗斯的军粮,不知道是口味上有着主场的优势,还是俄罗斯人烹饪技术真的不佳,还是中国的军粮更胜一筹。</p>]]></content>
<categories>
<category>随笔</category>
</categories>
<tags>
<tag>随笔</tag>
</tags>
</entry>
<entry>
<title>被我整坏的路由器和服务器</title>
<link href="/archives/7777583b.html"/>
<url>/archives/7777583b.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>为了搭建 PalWorld 的私服,我又一次踏上了折腾之旅,并成功将路由器和家里的服务器都搞崩了。</p><p>好在最后两台设备都恢复如初。我就想来做一下这次“事故”的复盘。</p><h2 id="我的设备"><a href="#我的设备" class="headerlink" title="我的设备"></a>我的设备</h2><p>本次操作的有两台设备,一台是 x86 软路由,运行 Openwrt;一台是配置比较奇怪的 x86 服务器,运行 PVE。</p><h2 id="Openwrt-的网络隔离配置"><a href="#Openwrt-的网络隔离配置" class="headerlink" title="Openwrt 的网络隔离配置"></a>Openwrt 的网络隔离配置</h2><p>说在前头,我对 Openwrt 的操作真的是一窍不通。网络相关的知识兴许懂一些,但一到实操环境就纰漏百出了。</p><p>由于 PalWorld 服务端启动后便会在游戏的服务器列表公开自己的 IP,且无法关闭这个功能,有比较大的安全隐患。在配置好 PalWorld 服务端所运行的虚拟机后,我决定将这台虚拟机的网络与局域网内其他设备隔离。这也是所有折腾的起源。</p><h3 id="配置-VLAN-导致的失联"><a href="#配置-VLAN-导致的失联" class="headerlink" title="配置 VLAN 导致的失联"></a>配置 VLAN 导致的失联</h3><p>我能想到的第一个方案便是,给这台虚拟机分配一个与当前局域网不同的网段,并将两个网段隔离。</p><p>VLAN 我还是知道的,便着手开始创建新的 VLAN,并保存…连不上路由器了。</p><p>急了啊,创建了 VLAN 就代表开启网桥的 VLAN 过滤。目前这个 VLAN 没有分配给任何一个接口,自然是啥都连不上了。好在 Openwrt 有自动回滚的功能,90 秒若设备连不上路由器,便会将刚刚的更改回滚…但不是每次都能成功。</p><p>有反复折腾了几次:创建 VLAN、创建接口、创建防火墙的 Zone,分配来分配去,中途也搞砸了几次,配置也都回滚了,直到最后一次尝试,luci 弹出了令人感到安心的“正在回滚配置”的提示,然后就…卡住了。</p><p>考虑到 Openwrt 使用的是 squashfs,怀疑是设备上的设置确实回滚了,但内存中的配置没能正确地回去,我将设备断电重启。果不其然,配置回到了应用前的样子。</p><p>在尝试配置 VLAN 数次后,我放弃了。即使给虚拟机分配了新网段,也设置好了防火墙规则,虚拟机依旧可以访问到内网网段的设备。</p><p>目前我还没有闲心思慢慢研究 Openwrt 的种种配置,便打算换一个方式实现。</p><h2 id="配置-PVE-防火墙"><a href="#配置-PVE-防火墙" class="headerlink" title="配置 PVE 防火墙"></a>配置 PVE 防火墙</h2><p>第二个方案便是,在 PVE 的防火墙中禁止虚拟机连接内部网段的其他设备了。</p><h3 id="启动-Datacenter-防火墙但没有添加允许规则导致的失联"><a href="#启动-Datacenter-防火墙但没有添加允许规则导致的失联" class="headerlink" title="启动 Datacenter 防火墙但没有添加允许规则导致的失联"></a>启动 Datacenter 防火墙但没有添加允许规则导致的失联</h3><p>我启用了虚拟机的防火墙,发现配置并没有生效。简单查询后发现,需要将 Datacenter 的防火墙启用,VM 防火墙才有效果。我便看也没看地就开启了 Datacenter 防火墙,发现管理后台页面无法刷新了。此时我才看到屏幕上 Datacenter 防火墙的默认配置 —— IN: DROP.</p><p>这下好了,外部连接统统被阻断,也就无谈通过控制面板将防火墙再关闭。</p><p>这台服务器是无头的,安装有一张 P100 显卡,但没有显示输出。所以在不动硬件的情况下,我没法通过显示器访问终端的。</p><p>通过检索,我了解到了好几种奇技淫巧来关闭 PVE 的防火墙。</p><h3 id="挂载并修改-crontab"><a href="#挂载并修改-crontab" class="headerlink" title="挂载并修改 crontab"></a>挂载并修改 crontab</h3><p>正好手上有一个硬盘盒,我就将系统盘取下,通过硬盘盒连接到了软路由,尝试修改系统盘里的文件。</p><p>使用 <code>fdisk</code> 查看这块系统盘的分区情况,但没有看到熟悉的 <code>ext4</code> 字样。取而代之的是 <code>Linux LVM</code>。LVM 相当于是 Linux 对磁盘进行了再一次的分区,因此挂载就不能是简单的 <code>mount</code>,得用 <code>lvm2</code> 工具。</p><p>再敲了几个命令后,我成功将 PVE 分区的 <code>root</code> 文件夹挂载,并在 crontab 中添加了关闭 PVE 防火墙相关的命令。</p><p><code>umount</code>,取下系统盘并装回服务器,开机…没有任何反应,依旧打不开管理面板。是教程给的方法有误吗?</p><p>遂又取下盘,挂载到软路由上,却提示该分区忙…我是相当忌惮挂载并修改分区的,生怕损坏了分区,服务器的数据可就全丢了。不敢再继续操作,我得另想出路。</p><h3 id="连接显示器,但还是个瞎子"><a href="#连接显示器,但还是个瞎子" class="headerlink" title="连接显示器,但还是个瞎子"></a>连接显示器,但还是个瞎子</h3><p>现在能做的就是在服务器上通过 PVE 的 rescue terminal,来修改防火墙的配置了。</p><p>我关闭了服务器,取下 P100,换上了 R7 240 这张十年老兵,插上了便携显示器…</p><blockquote><p>error: No suitable video mode found. Booting in blind mode.</p></blockquote><p>你这不是输出字了吗,怎么就进瞎子模式了???</p><p>经过查询,我了解到系统正在寻找到显示模式,正是古早电脑终端使用的 <code>80-Column</code> 这样的显示模式。</p><p>至于什么是 Blind Mode,我尝试在 GRUB 和 Linux 源码中搜索,都没有结果;为什么 PVE 系统找不到我的 R7 240,可能是缺少驱动吧,现在也无处知晓。</p><p>按照网上的教程尝试在 GRUB 引导系统启动时添加显示模式的支持,并没有效果;当我尝试打印支持的显示模式时,发现根本不存在正常的显示模式,故只能放弃直接启动 PVE 的 rescue terminal.</p><h3 id="还是得靠救援盘"><a href="#还是得靠救援盘" class="headerlink" title="还是得靠救援盘"></a>还是得靠救援盘</h3><p>给服务器插上救援盘,我先是打开了基于 Windows 的 PE 系统,发现显卡是有输出的,但分辨率非常低,且只有黑白画面。看来这张老显卡与这块寨板的相性真的不大好。</p><p>在确认 Windows PE 系统下什么都做不了,操作还及其不便,我便退出了 PE 系统,打开了 Ubuntu LiveCD。</p><p>这回,显卡倒是可以正常运行。以 <code>80-Column</code> 模式输出文字还是可以轻松办到的。有了命令行,操作也简单了不少。</p><p>同为 Linux,操作 LVM 就简单了许多。使用 <code>lvm2</code> 挂载 PVE 的系统分区,并用 <code>chroot</code> 将用户空间切换至 PVE 系统,直接用 <code>systemctl disable pve-firewall</code> 把防火墙关了。</p><p>再次进入 PVE,这下开机防火墙就不会启动,赶紧进 Datacenter 防火墙设置里还原误操作的配置。</p><h2 id="事后的反思"><a href="#事后的反思" class="headerlink" title="事后的反思"></a>事后的反思</h2><h3 id="VLAN-配置的失误"><a href="#VLAN-配置的失误" class="headerlink" title="VLAN 配置的失误"></a>VLAN 配置的失误</h3><p>我对 VLAN 配置没有经验,便想着参考网上其他人的配置方法来做。但我查到的都是创建访客 Wi-Fi 这类的配置教程。与我的网络环境的差异在于,访客 Wi-Fi 用的 Interface 与 LAN 不一样,而我需要在 LAN 下配置两个 VLAN,配置方法就有些不同,不能直接搬配置。</p><p>我应当要找的是较为通用的,同一个 Interface 下 VLAN 的配置教程(可能单臂路由配置和这个就有些像),再迁移到 Openwrt 上进行配置。</p><p>由于软路由只有两个网口,也没法像有四五个网口的路由器一样留下一个作为”不死“的管理口,以降低把路由器配置挂掉的风险。</p><h3 id="PVE-原本可以修得更快"><a href="#PVE-原本可以修得更快" class="headerlink" title="PVE 原本可以修得更快"></a>PVE 原本可以修得更快</h3><p>原本在将 PVE 系统盘挂载到软路由时,便可以用 <code>systemd</code> 停掉 <code>pve-firewall</code> 但当时我看到 PVE 论坛里有人说在 crontab 里加上 PVE 关闭防火墙的指令便能访问控制面板了,也有人附和说可以用。但我实际操作后发现并没有效果。</p><p>而再次尝试挂载 LVM 时,提示分区忙让我不敢继续操作。虽然在服务器上用 LiveCD 直接挂载并没有出现分区忙的情况。</p>]]></content>
<categories>
<category>随笔</category>
</categories>
<tags>
<tag>随笔</tag>
</tags>
</entry>
<entry>
<title>日本之行-第一站-大阪</title>
<link href="/archives/aca48136.html"/>
<url>/archives/aca48136.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h2 id="写在前面"><a href="#写在前面" class="headerlink" title="写在前面"></a>写在前面</h2><p>23年12月底,我踏上了前往日本的旅途。这是我第一次去日本,是我第一次出国旅行,且只身一人。</p><p>本次旅行为14天,我将分多个章节完成所有的游记,记录下我旅行中的点点滴滴、各种感想。这是第一章节,出境与大阪之旅。</p><h2 id="第一次出境"><a href="#第一次出境" class="headerlink" title="第一次出境"></a>第一次出境</h2><p>我从上海浦东机场出境。</p><p>航班预计上午 9:40 起飞,根据网上的经验教训,国际航班建议提早三个小时到达机场办理值机手续。我早早地起了床,搭上了第一班磁浮列车,在六点五十分左右到达了机场。</p><p>拖着行李箱直奔值机柜台,发现队伍已经很长。排了一个多小时的队才轮到我。</p><p>我提前在网上进行了值机选座,现场只需要将行李箱托运,打印一下登机牌。工作人员会确认护照和日本 eVisa(电子签证)。</p><p>我提前将电子产品和需要独立安检的物品取出,安检也十分顺利。</p><p>不过在过海关的时候,工作人员看到我护照崭新,又是独自一人,不免有些担心,向我索取了酒店预订记录和行程单。酒店预订记录只要出示订购软件的订单界面即可;我没有做行程单,就将记事本里的旅行计划给工作人员看,第一天在哪里啊,过两天又跑去哪里玩…得知我全程的酒店都已订好,行程也安排清楚,便允许我出境了。</p><p>在候机厅的长椅上坐下时,距离飞机的预定起飞时间只有半个小时了。看来国际航班确实需要早点来机场办手续(虽然最后延误了两个小时)。</p><p>这是我第二次坐飞机。上一次是我还在读小学的时候,不明不白地上了飞机、又下了飞机,除了耳朵有些不舒服。没有其他的感想。</p><p>这次,我特地选择了靠窗的位置,仔细观察着飞机的起降与飞行时的动作。看到了起飞和降落时襟翼的展开,看到了遇到乱流时机翼“夸张”的摆动,感叹着这种看似“简易”的机器是如何将一机人送上天。</p><p><img src="/images/2024-01-21/01.jpeg" alt="日本上空"></p><p>飞机餐的话…上一次坐飞机是国内航线,没有在饭点所以没有供餐,这是我第一次体验飞机餐。</p><p><img src="/images/2024-01-21/02.jpeg" alt="鱼肉米饭套餐"></p><p>没有选择的余地,大家统一都是鱼肉米饭套餐。和我能想象到的飞机餐没有太多区别 —— 一般咸味的鱼肉,煮得软烂的米饭(也可能是再加热的缘故)与味道平平的配菜。坐的毕竟是经济舱,不能期待太高~</p><p><img src="/images/2024-01-21/03.jpeg" alt="鱼肉米饭的特写"></p><p>经过两个半小时的飞行,飞机平稳降落在了关西国际机场。飞机缓慢驶向空桥的途中,我更换了日本的流量卡,给手表切换了时区。</p><p>入境相对出境更加简单。出发前我就在网页中预先填写好了入境信息表与海关申报表,在对应的窗口或机器扫码即可完成申报。在入境窗口只需出示一下 eVisa,录入一下人脸和指纹就可以了。</p><p>工作人员会用英语引导你操作,录入机器上也有中文提示。机场的指示牌都是四语的(日语、英文、中文和韩文),按照指示牌走就没有问题。</p><h2 id="大阪之行"><a href="#大阪之行" class="headerlink" title="大阪之行"></a>大阪之行</h2><h3 id="Day-1-舒适的酒店与海游馆之旅"><a href="#Day-1-舒适的酒店与海游馆之旅" class="headerlink" title="Day 1 - 舒适的酒店与海游馆之旅"></a>Day 1 - 舒适的酒店与海游馆之旅</h3><h4 id="APA-酒店"><a href="#APA-酒店" class="headerlink" title="APA 酒店"></a>APA 酒店</h4><p>起飞延迟了两个小时,降落也迟了一个多小时。达到关西国际机场已是下午 3:30(这之后都是 UTC+9 时间)。我乘坐南海机场线前往难波站附近的 APA 酒店。</p><p>插一嘴,在日本用 Google Maps 相当方便,交通工具的规划和信息展示都做得很棒。“通勤案内”这款官方推荐的交通软件我也有下载,不过用的最多的还是 Google Maps。</p><p>等地铁、电车、新干线时,只要看 Google Maps 上的到站时间,到了哪辆车就上哪辆车。除非两个方向的车同时到站,否则是绝对不会坐错方向的。</p><p><img src="/images/2024-01-21/04.jpeg" alt="APA酒店大楼"></p><p>APA 酒店大楼的装修很有特色,在远处就能看到橙色的屋顶和 APA 的标志,而且在全国的风格都是统一的。</p><p><img src="/images/2024-01-21/05.jpeg" alt="APA酒店房间"></p><p>内部的装横令我十分惊喜:房间不是很大,但各种设施一应俱全,在床铺正对的墙上甚至有一台大屏电视。浴室毫不意外地配备了浴缸,还有定量放水系统,不用盯着浴缸有没有水漫金山了。寝具也相当的舒服,那两晚都睡得很好。</p><p>对于一间一晚 300CNY 左右的旅馆,能有这样的体验我十分满意。</p><h4 id="咖喱与牛排"><a href="#咖喱与牛排" class="headerlink" title="咖喱与牛排"></a>咖喱与牛排</h4><p>办好入住手续,放下行李,已是五点多。飞机餐的显然填不饱我的肚子,我早已饥肠辘辘,是时候出门觅食了。</p><p>大阪海游馆是我计划中必去的一站,但它位于海港村,和其他景点在相反的方向,便安排在今晚游玩了。</p><p>日本人很奇特的一个习惯出现了:有些店铺傍晚 6:00 到 6:30 就收摊了,最晚的会开到七点八点左右,再迟就只剩下营业到深夜的家庭餐厅与居酒屋。</p><p>用“食べログ (tabelog)”这款软件在海游馆附近搜索评价比较高的店铺。</p><p>在海游馆隔壁有一个小小的综合体,里面有一些店铺还有在营业。我选择了这家评价很高的牛排咖喱餐馆。</p><p><img src="/images/2024-01-21/06.jpeg" alt="牛排咖喱"></p><p>一份牛排咖喱饭、一碟酱菜、一碗味增汤。价格有些忘记了,在 1500円 左右。</p><p>日本人很喜欢吃这种细长的青椒,不会辣,在天妇罗中也会出现。</p><p>咖喱的甜口的,味道自然比百梦多咖喱块要好上数倍。牛肉很嫩,没有怎么调味,展现的是肉本身的鲜味。总之,相当的美味。</p><p>对了,需要使用现金哦~ 商家没有准备 POS 机。</p><h4 id="大阪海游馆"><a href="#大阪海游馆" class="headerlink" title="大阪海游馆"></a>大阪海游馆</h4><p>已经记不清上一次去水族馆是多少年前。听说大阪海游馆的设施很棒,场馆也很大,我就来体验一下。</p><p>门票的价格是 2600 円,入场有分时段,我就在售票处购买了当前时段的票。</p><p>海游馆很大,步行参观的总距离在 1km 左右,按照地理位置划分成了好几个区域。</p><p><img src="/images/2024-01-21/07.jpeg" alt="趴在水箱顶的鳐鱼"></p><p>进入场馆便是一个巨大的拱形水箱。是玻璃比较薄吗,还是用了什么技术,几乎看不见玻璃带来的重影,鱼仿佛真的在空中悬浮。</p><p><img src="/images/2024-01-21/08.jpeg" alt="正在睡觉的海狮"></p><p>一群正在睡觉的海狮。抬着头睡觉不会落枕么。</p><p>![巨型水箱]/images/2024-01-21/(9.jpeg)</p><p>在场馆的中央有一个巨大的水箱,有两头鲸鲨、几头锤头鲨和许多小鱼生活在其中。</p><p><img src="/images/2024-01-21/10.jpeg" alt="花园鳗~"></p><p>还有好多可爱的花园鳗,黄色的尤其可爱~</p><p>除此之外,还有来自各个大洲的鱼、南极的企鹅,在地下还有水母馆。</p><p>总共逛了一个多小时,可以说大饱眼福了。</p><p><img src="/images/2024-01-21/11.jpeg" alt="天保山摩天轮"></p><p>在海游馆的隔壁是天保山摩天轮,夜晚被彩色的灯光照亮特别好看。</p><p>此时已是 19:30,经历了一天奔波的我有些劳累,便回到酒店养精蓄然,计划第二天的行程。</p><h3 id="Day-2-天守阁、天满宫、天筋桥与大阪烧"><a href="#Day-2-天守阁、天满宫、天筋桥与大阪烧" class="headerlink" title="Day 2 - 天守阁、天满宫、天筋桥与大阪烧"></a>Day 2 - 天守阁、天满宫、天筋桥与大阪烧</h3><p><img src="/images/2024-01-21/12.jpeg" alt="酒店的自助早餐"></p><p>在日本的第一顿早餐,在酒店隔壁的参观享用了自助餐。</p><p>炒蛋和上次去香港在澳洲牛奶公司吃到的有点像,并没有完全做熟,非常的软嫩~</p><p>茶泡饭就很有日本的特色了。</p><p>饭后,我就前往难波站附近的旅游中心,购买大阪周游卡。我选择的是二日卡,价格是 3600 円。在两天内,可以免费乘坐大阪地铁与巴士(相较于一日卡,不能乘坐私铁),以及免费参观好多景点。</p><p>大阪地铁网络十分发达,基本覆盖了所有想去的地方,这两天我没有搭乘过私铁或者巴士,因此不用担心是否要选择一日卡。</p><p>买到卡之后,第一站便是天守阁。</p><p><img src="/images/2024-01-21/13.jpeg" alt="天守阁外围"></p><p>从外边看,与只狼里的苇名城有几分相像。</p><p><img src="/images/2024-01-21/14.jpeg" alt="天守阁下"></p><p>天守阁内陈列着许多颇有历史的物件,只可惜我对日本的历史并不熟悉,也看不太懂书法家的笔墨,只是走马观花感受一下文化的氛围。</p><p><img src="/images/2024-01-21/15.jpeg" alt="天守阁顶"></p><p>最后在楼顶吹了吹风,便离开了天守阁。</p><p><img src="/1/images/2024-01-21/6,.jpeg" alt="一轮彩虹"></p><p>虽然有些冷,但天气真的很好,万里无云。下一站是天神筋桥,一个商业街。</p><p><img src="/images/2024-01-21/17.jpeg" alt="天神筋桥商业街"></p><p>日本有很多 OOばし(桥)这样的地名呢。也有很多像天神筋桥这样,上方覆盖着遮雨棚的商业街,天神筋桥是其中最长的一条,从一丁目延伸到七丁目,光是主干就有 2.6 km,更有密密麻麻的小巷。</p><p>乘坐堺筋线,在天神筋桥三丁目下了车。我先是去拜访了天满宫。</p><p><img src="/images/2024-01-21/18.jpeg" alt="大阪天满宫"></p><p>似乎内部在翻修,将赛钱箱放到了外边供大家参拜。</p><p>在这里,我给身边参加考研的人做了参拜,希望他们可以拿到好成绩。</p><p>接着,我便从二丁目开始,一路边逛边思考着午饭的去处,寻找着吃饭的店铺。</p><p>沿途,看到了大排长龙的可乐饼摊子,转了一圈再想回来买,发现已经卖完收摊了。有一家天妇罗的店门口也站着好多人,大排长龙。肚子好饿,肯定排不了这么长的队。</p><p>边走边用 食べログ 搜索着。来大阪就得吃些有大阪特色的,那就是大阪烧了。</p><p><img src="/images/2024-01-21/19.jpeg" alt="千草大阪烧"></p><p>并不在主街,而是藏在小巷子里的千草大阪烧,似乎是 食べログ 23年的百大名店呢。</p><p>我选择了以店铺名字所称的招牌菜 —— 千草大阪烧。</p><p>核心是一大片厚切的猪肉,在上下两面都倒上面粉与卷心菜混合的泥,便开始煎烤。</p><p>接待我的服务员会一些简单的英语,告诉我等着他们来翻面就好了。当地人也许会选择以自己的喜好来摊大阪烧,我作为门外汉只要静静欣赏就好。</p><p>当两面都煎至金黄,便会涂上大阪烧酱、沙拉酱和黄芥末酱,撒上不知道是什么的籽,就可以享用。</p><p>大阪烧整体的口感是软糯的,夹心的猪肉排很嫩,肉汁十足。</p><p>唯一可惜的是,量实在有些少,填不饱我的肚子啊~</p><p><img src="/images/2024-01-21/20.jpeg" alt="鲷鱼烧"></p><p>饭后继续在天神筋桥闲逛,发现了一家鲷鱼烧店。我还以为鲷鱼烧是软软的,但实际外壳是偏脆的,甜甜的红豆馅十分美味。</p><p>今天真的走了好久的路,对于第一次来到异国他乡的人可以说是有些得意忘形。从天神筋桥二丁目逛到六丁目,又折返了回来。中途还去 melonbooks 看了一圈,又跑到周游卡可以免门票的天王寺动物园里逛了逛…还没逛完,人就开始有些不舒服了。</p><p>在动物园里稍微休息了一下,我还是决定吃完晚饭就回酒店休息。</p><p><img src="/images/2024-01-21/21.jpeg" alt="大起水产回转寿司"></p><p>一次比较“失败”的体验。不要误会,寿司还是很好吃的,鱼类十分新鲜,但我一不小心就在 iPad 上点了太多的寿司,都吃进肚子之后已经很饱了,完全没有在回转的转盘上取过寿司!这和普通的寿司店不就没差别了吗!</p><p><img src="/images/2024-01-21/22.jpeg" alt="道顿堀"></p><p>回转寿司店出门便是热闹的道顿堀,然而我不是喜好这一口的人。路过蟹道乐,周围停着好几台旅游大巴,店门口密密麻麻的全部都是在等待的游客,大约有数百人。真是疯狂呐。</p><p>受不住喧嚣,我在附近的药店买了一支体温计和一盒退烧药,便回了酒店。</p><p>躺床休息了一阵子再测体温已经正常,看来真的是疲劳导致的体温失调。之后的旅途安排就宽松一些吧。</p><h3 id="Day-3-梅田蓝天大厦、天空美术馆与一兰拉面"><a href="#Day-3-梅田蓝天大厦、天空美术馆与一兰拉面" class="headerlink" title="Day 3 - 梅田蓝天大厦、天空美术馆与一兰拉面"></a>Day 3 - 梅田蓝天大厦、天空美术馆与一兰拉面</h3><p>睡了一个好觉,但人还是有些疲劳。前往异国他乡果然不能过于放肆,得做好身体的管理。今天就悠闲地度过吧!</p><p><img src="/images/2024-01-21/23.jpeg" alt="通往观景台的扶梯"></p><p>在酒店寄存行李后,搭乘地铁来到了梅田蓝天大厦。从三楼有快速电梯可以通往顶楼,然后乘坐扶梯来到屋顶的圆形观景台。</p><p>对了,有周游卡门票免费哦~</p><p><img src="/images/2024-01-21/24.jpeg" alt="梅田蓝天大厦楼顶观景台1"></p><p><img src="/images/2024-01-21/25.jpeg" alt="梅田蓝天大厦楼顶观景台2"></p><p>相比于其他观景塔,梅田蓝天大厦不算很高,但好在有开放式的观景台,视野特别棒。今天风有些大,在楼顶不是很站得住,欣赏了几分钟美景便回到了室内,点了一杯咖啡,坐在窗边静静欣赏着窗外景色。</p><p>梅田蓝天大厦外侧是镜面玻璃,倒映着天空、与天空融为一体,因此称作蓝天大厦。尼尔:机械纪元的开发公司白金工作室的总部就在这栋大楼里。</p><p><img src="/images/2024-01-21/26.jpeg" alt="天空美术馆1"></p><p><img src="/images/2024-01-21/27.jpeg" alt="天空美术馆2"></p><p>我还顺道参观了另一座楼的天空美术馆,虽然不怎么懂艺术,但画作依旧能感染我。</p><p>参观美术馆后,已是正午。该去找吃的了~</p><p><img src="/images/2024-01-21/28.jpeg" alt="一兰拉面的“考试”"></p><p>百闻不如一见,我来品尝一兰了。</p><p>每个人第一次来吃日式拉面都要面临一场“大考” —— 单应该怎么点。(背面有中文,我填完了才发现)</p><p>除了在点餐机器上确认要吃东西,在排位时服务员会给你一张纸片,让你选择拉面的喜好。</p><p>浓郁度我选择了加浓,确实有些过浓过咸了。吃着相当地过瘾,豚骨的香味充满嘴巴,真的很幸福。如果平常吃得比较清淡,正常的浓郁度可能就有些偏咸了,可以考虑减少一些浓郁度。</p><p>油脂的丰富度我也加了一档,但感觉不是特别明显。可能是看到日本有一种表面铺满油渣的拉面,一兰的面在油脂的方面反而显得“寡淡”了吧。</p><p>其余的选项便是看个人喜好。一兰的辣椒粉不会很辣,加 1/2 倍感受不出辣味,但可以提升香味。</p><p><img src="/images/2024-01-21/29.jpeg" alt="一兰拉面"></p><p>交卷后,一碗一兰拉面,四片叉烧和一颗盐味溏心蛋上桌啦。</p><p>一兰号称在面出锅后15秒内就会传递到食客的面前,以体验拉面最新鲜的味道。我赶忙用手机拍了张照,便开始享用。</p><p>拉面和我之前吃过的感觉都不大一样,特别有筋道,麦香味也很浓。在浓厚的汤汁里蘸一下就有了豚骨的鲜味,没几口就把拉面吃完了,便又加了半份面。</p><p>上溏心蛋的时候同时给了个小碟子,如果蛋不好剥或者咸味不合适,可以让服务员帮忙换一个。</p><p>一口拉面,配上一口汤汁。再咬一口叉烧、一口糖心蛋,至福啊。</p><h3 id="前往奈良"><a href="#前往奈良" class="headerlink" title="前往奈良"></a>前往奈良</h3><p>饭后,回酒店取了行李,便是去难波站坐近铁奈良线,前往奈良了。</p><h2 id="一点感想"><a href="#一点感想" class="headerlink" title="一点感想"></a>一点感想</h2><p>语言不是问题,打招呼、点菜这种比较简单的对话就用手势与塑料日语,更复杂的对话用英语就好了。碰到的酒店前台经理、便利店员工、车站管理员都是会英语的。再不济,就用翻译软件吧,能达意就行~</p><p>至于习惯问题,按照当地人的做法来做就好了。在公共场合,例如楼梯应该走哪个方向,等地铁的时候应当怎么站,在地铁上有哪些地方不能使用手机,都有明确的标识和多语言的提示。多留意,照着做,就不会有事儿啦。</p>]]></content>
<categories>
<category>随笔</category>
</categories>
<tags>
<tag>随笔</tag>
</tags>
</entry>
<entry>
<title>深圳-香港三日行</title>
<link href="/archives/2ef8bd61.html"/>
<url>/archives/2ef8bd61.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h2 id="出行原因"><a href="#出行原因" class="headerlink" title="出行原因"></a>出行原因</h2><p>其实我很早就有去香港看看的念头,但有时间出游的机会并不多(机会很多,是我比较懒,更喜欢宅家),一直没去成。</p><p>前一段时间,在朋友的帮助下我注册了英国 Wise 账户,拿到了两张漂亮的实体卡,但后期如何入金成了个问题。了解到可以通过香港账户低损耗入金 Wise,我便有了前往香港开户的念头。</p><p>12 月底我将独自前往日本游玩,但这将是我第一次独自一人出去旅游。第一次单人旅行还是出国旅行,不禁让我有点担心。</p><p>在这两个背景的驱使下,我迅速定下了这次深圳-香港的旅行,既可以前去开户,也可以作为出国旅行的预演,提前暴露一些问题。</p><h2 id="流水账"><a href="#流水账" class="headerlink" title="流水账"></a>流水账</h2><h3 id="Day-1-Thu-深圳"><a href="#Day-1-Thu-深圳" class="headerlink" title="Day 1 - Thu - 深圳"></a>Day 1 - Thu - 深圳</h3><p>第一天中午到的深圳。我在前往酒店的半路上下了地铁,前往名为“臻品鲜粿·粿条世家”的店铺吃午餐。</p><p><img src="/images/2023-12-19/01.jpg" alt="潮汕粿条"></p><p>粿条本身没有很特殊,有点细河粉的感觉。不过八成熟的牛肉非常非常的嫩,味道很棒。</p><p><img src="/images/2023-12-19/02.jpg" alt="炸豆腐"></p><p>炸豆腐是赠送的,第一眼并太高的期望。但一口咬下,十分软绵的里芯呼之欲出,佐以略微有些咸的沾汁,味道很棒。</p><p><img src="/images/2023-12-19/03.jpg" alt="像海蛎煎一样的东西"></p><p>我还点了一份长得有点像海蛎煎的东西,记不得名字了。应该是用油炸的,比海蛎煎更加酥脆。</p><p>美美地享用午饭后,我继续登上地铁,前往酒店。</p><p>下榻酒店后,我前去参观深圳世界之窗景区…总之就是很后悔。</p><p>比起人造景观,我还是更喜欢自然景观一些。世界之窗没有给我带来惊喜,只有满满的失望。今天是周四,许多游乐设施都没有开放,可以参观的仅有一个个微缩复原的建筑物。</p><p>在世界之窗转了约两个小时,我悻悻离去,前往凤凰楼食茶点晚餐。</p><p><img src="/images/2023-12-19/04.jpg" alt="香煎多春鱼"></p><p>多春鱼的鱼籽很多,非常鲜美。</p><p>一个人出来吃饭确实有些不便。有些菜品一次只能点这么一大盘,不过还是美美的享用了。</p><p><img src="/images/2023-12-19/05.jpg" alt="鲜虾烧麦"></p><p>鲜虾烧麦就是吃鲜,特别的鲜甜。</p><p><img src="/images/2023-12-19/06.jpg" alt="牛杂炒肠粉?"></p><p>菜单上的字看得不是很懂,大概写的是炒肠粉吧,没想到上了这么大一盆长得也不像肠粉的东西。</p><p>吃了一下,似乎确实是切成一节一节的肠粉。味道不错,但量好大最后没吃完。</p><p><img src="/images/2023-12-19/07.jpg" alt="华强电子世界"></p><p>饭后,我顶着吃撑的肚子徒步前往华强北,这片传说之地。可惜的是,大部分店铺八点就关门了,简单逛了几栋电子市场后我便回酒店计划第二天的行程。</p><h3 id="Day-2-Fri-HK-开户"><a href="#Day-2-Fri-HK-开户" class="headerlink" title="Day 2 - Fri - HK 开户"></a>Day 2 - Fri - HK 开户</h3><p>一大早我便乘上了前往福田口岸的地铁。</p><p>7:30 左右的口岸没有什么人,大部分是赴港上学的学生,通关很快。</p><p>我在落马洲站选择乘坐 B1 双层巴士前往元朗区,开始了开户之旅。</p><p>沿途…说实话没有什么风光,元朗算是比较偏僻的地方,好风景还要等到第二天的香港岛之行。</p><p>8:00 我到达了中行门口,发现只有前来上班的员工,还没有来排队的人。如果希望第一个办理业务的朋友可以选择这个点就来等候。时间还早,我就去吃了个早餐,回来发现已经有两个人在排队,便加入了队伍。</p><p>9:00 准时进入了银行,取到了号。在我之前有提前预约的人,我排在了第 5 号。</p><p>在工作人员的引导下使用手机填写了信息,然后等待柜员办理剩下的手续。共有三个柜台在同时办理开户,一个人需要 30 - 60 分钟的时间。</p><p>11:00 左右,我完成了中行的开户。</p><p>我现场就拿到了银行卡,便在 ATM 存入了 500 元人民币,并兑换成了港币。</p><p>顺便在同一条路上的南洋商业银行和汇丰银行也完成了开户手续。这两家银行皆需要几个工作日审核信息,审核成功后会将卡片寄至通讯地址。</p><p>穿行于各家银行网点的途中,我发现了一家在他人游记上看到过的店铺——胜利牛丸,便暗自定下了午饭的去处。</p><p><img src="/images/2023-12-19/08.jpg" alt="牛丸、牛筋、牛腩三合一河粉"></p><p>三个愿望,一次满足。</p><p>面汤的颜色相当的“可怕”——仿佛是直接将卤水呈上来一般。但实际入口并没有很咸。牛肉们就不一样了,比较重口味的我也觉得有一点点咸。不过风味很棒,牛肉吃透了各种香辛料。</p><p>河粉藏在了对得满满的牛丸和牛肉之下,不是我常吃的宽河粉,比较窄。</p><p>虽然店名以牛丸冠名,我却没觉得牛丸有多么的美味,反倒是牛筋更胜一筹。</p><p>饭后,我在坐满老者的公园里稍稍歇息,并且计划着下午的行程……</p><p>此次香港之行除了开户,其实还有另一个目标——碧蓝档案与香港吃茶三千的联动~</p><p>在出发前的几天得知了联动的消息,运气真的很好。</p><p><img src="/images/2023-12-19/09.jpg" alt="电车"></p><p>虽然有更优的路线,我还是选择了体验一下地面上的有轨电车。有轨电车有点像巴士,也是由司机驾驶,也会受到其他车辆与行人的干扰,但行驶路线是沿着铁轨固定的。</p><p>随后乘坐地铁,前往金紫荆广场…的对面,星光大道。在这里陈列了许多明星的手印和画像。海港边上的风景大好。</p><p>在此稍停,开户还没有结束。大概是因为元朗距离内地太近,许多虚拟银行都需要前往更靠近香港中心一些的地方才可以开户。我在一家星巴克坐下,开通了 ZA Bank 和 livi Bank 的账户。</p><p>随后,便是前往海港城的吃茶三千点了一杯联动奶茶,从中心一步步移动回福田口岸——晚上要和群友面基。</p><p>我们俩聊得非常尽兴,聊到了十一点才分手,回到了酒店,速速洗漱完毕,预定了第二天早上从福田站前往香港西九龙的火车,便沉沉睡去。</p><h3 id="Day-3-Sta-HK-游玩"><a href="#Day-3-Sta-HK-游玩" class="headerlink" title="Day 3 - Sta - HK 游玩"></a>Day 3 - Sta - HK 游玩</h3><p>昨晚火车票订得比较迟,最迟的火车也是 7:45 的,更迟的都被人订光了。我又被迫起了个大早(这三天都是 6:30 之前起床的)坐地铁前往福田火车站,搭上前往香港西九龙站的火车。可能是比较早乘火车的人并不对,这一趟通关流程比较顺利,再迟一点可就不好说了……</p><p>到达九龙,我空着肚子在街上漫步,寻找可以填饱肚子的早餐店。打开地图,“澳洲牛奶公司”几个字印入眼帘,这不是前几天看到的网红店吗?我记得这家店只收现金,便前往沿途的便利店,在 ATM 用中银香港的卡取了 100 港币现金。没有注意到我用的是汇丰的 ATM,与银联网络并不互通,被收取了 15 港币的手续费 QAQ。(众安银行的卡在全港 ATM 可以免手续费取现,经常到港玩的话可以办一张实体卡)</p><p><img src="/images/2023-12-19/10.jpg" alt="九龙街头漫步"></p><p>带着现金,我来到澳洲牛奶公司的门口,果不其然,排起了长队。好在我是一个人,这家店是强制拼桌的,顺利超过了大团的游客,来到了店内。</p><p>给我的第一印象嘛…很拥挤,人挤着人,甚至是背贴着背。小小的一张圆桌围坐着四个人,各自享用着早餐。穿着白大褂的服务员在人群缝隙间穿梭着,高效地记录着到店客人的订单,飞速地将菜品传递到桌前。</p><p>落座,菜单压在桌子的玻璃之下,写满了粤语,说实话我看不大懂。纠结了几十秒,发现菜单上还写着“早餐”、“下午茶”等套餐,我便对服务员说:“早餐套餐来一份吧。”</p><p>话音未落,餐具和一杯茶便着陆在我的桌上。剩下的菜品也并我让我久等。</p><p><img src="/images/2023-12-19/11.jpg" alt="火腿通心粉"></p><p>首先呈上的是一碗火腿通心粉。味道比较清淡,喝不出黄色的汤底是什么熬制的,不过比较鲜。</p><p><img src="/images/2023-12-19/12.jpg" alt="牛油吐司与炒双蛋"></p><p>接着呈上的是一个盘子,两片吐司和炒鸡蛋各占半壁江山。牛油烘烤的吐司暖暖的,软软的;这份炒双蛋则是套餐的点睛之笔——调味微咸的鸡蛋并没有炒得很熟,在生与全熟之间掌握了平衡,做到了入口软绵,回味无穷,堪称是绝品。</p><p>如果有路过,一定要来尝一下这份炒鸡蛋~</p><p>一顿饱餐之后,我继续踏上旅途,前往太平山顶的观景台。</p><p><img src="/images/2023-12-19/13.jpg" alt="山顶缆车"></p><p>上山的路可以选择用脚走完,不过,还是要体验一下富有特色的山顶缆车~</p><p>缆车的斜度估摸着有三四十度,是我见过最陡的。缆车是建在山坡边上的,方便沿路欣赏香港的风景。</p><p><img src="/images/2023-12-19/14.jpg" alt="摩天台观景台"></p><p>缆车的终点站是太平山的山顶,下车后直接来到了凌霄阁摩天台的二层。沿着盘旋向上的电动扶梯,海拔逐渐升高,走着走着,最终到达了海拔428米的摩天台观景台。</p><p>在这里可以俯览香港的景色,听说夜景更美,不过我晚上并不住在香港,也就没有机会亲眼目睹,实在可惜。</p><p>摩天台上的风很大,吹着十分舒服。待了大约四十分钟,我便沿着原路返回,坐着缆车回到了山下。</p><p><img src="/images/2023-12-19/15.jpg" alt="漫步中环"></p><p>早餐吃得有够饱,到了饭点我还不是很饿,便在街道与小巷间漫步,寻找着午饭的好地点。我想找家正宗点的茶餐厅。</p><p>跟随地图,我来到了就近的广芳园…可等候的队伍早已排出店外,目测有三四十人在队伍中。因为下午就要坐动车回去了,我无心加入他们,便继续游荡着,寻找着。</p><p><img src="/images/2023-12-19/16.jpg" alt="菠萝包与阿华田"></p><p>附近的茶餐厅真的不多,跟随地图的指引,我来到了一家街边的小店。店内只收现金,而我身上只剩下不到五十港币,便选择了菠萝油和冰阿华田作为午餐,反正肚子不是特别饿。(冰的阿华田比热的还要贵上几块钱哦)</p><p><img src="/images/2023-12-19/17.jpg" alt="City Walk"></p><p>饭后,我一时兴起决定走路去西九龙火车站,而非乘坐地铁,便开始一趟 City Walk…差点把我 Walk 没了。</p><p>街上好多地方都在施工,地图的数据并没有新到可以帮我绕开因为施工而禁止通行的路段…再加上出海关也需要一些时间,我差点以为要赶不上车。</p><p>好在我还是在开始检票前就赶到了,算是有惊无险,顺利踏上了返乡的路,结束了此次旅程。</p><h2 id="我都带了些什么"><a href="#我都带了些什么" class="headerlink" title="我都带了些什么"></a>我都带了些什么</h2><p>此次我轻装上阵,只带了一个双肩包。</p><p>这次旅行我尝试了内衣、袜子和洗澡用具(浴巾与毛巾)都使用一次性的,省去了携带大量衣物且需要带回大量脏衣物的麻烦,也可以保证洗澡用具足够干净(对酒店不是很信任)。浴巾和毛巾都是压缩的,体积非常小。</p><p>其余的,便是两晚更换的衣服和电子产品的充电器了。</p><h2 id="开户的那些事"><a href="#开户的那些事" class="headerlink" title="开户的那些事"></a>开户的那些事</h2><p>我挺担心中银香港会开不下来,因为我还是学生也没有带地址证明。在大堂接待客户的小姐姐也询问了我有没有带上地址证明,没有的话只能碰碰运气,弄得我更慌了。</p><p>不过真正坐进柜台和柜员大哥开始走流程,直到大堂经理过来刷卡完成审核、将卡递到我手中,都没有向我索取地址证明。不知道是因为得知我是学生,还是因为我身份证上写的是具体住址,反正过了这关,顺利拿到了卡。</p><p>而汇丰之行则运气不佳,提交的资料被送至总行审核,当天拿不到账户也无法完成所有流程,只能等卡寄到居住地址,并且等下一次到港签字完成所有开户流程了。</p><p>P.S. 在跨境转账到时候一定要填清楚收款人的名字,要与中银香港的账户名称相同。我填反了名字被收了一笔手续费 QAQ</p><h2 id="尾声"><a href="#尾声" class="headerlink" title="尾声"></a>尾声</h2><p>这次旅行顺利得可怕(除了差点没赶上返程的火车),在深圳与香港复杂的地铁网中也没有坐错一趟列车,似乎没能暴露出什么问题。希望 12 月底的日本之旅也能一样顺利。</p><p>一个人出来玩真的很自由,在出发前先查好可以去哪里玩、去哪里吃,到达之后就随心安排,不用迁就其他人,走累了随时可以停下休息,在咖啡店坐上一两个钟头也不会有人抱怨。</p><p>我也许爱上了一个人旅行的感觉,之后也会继续尝试这种旅行的方法。</p>]]></content>
<categories>
<category>随笔</category>
</categories>
<tags>
<tag>随笔</tag>
</tags>
</entry>
<entry>
<title>My Second Attempt To ARM Servers</title>
<link href="/archives/42ec6146.html"/>
<url>/archives/42ec6146.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>Last weekend, a full month without my Telegram account, I thought I had to do something. I believe I got banned because someone clicked the “spam” button on my messages, but I have nowhere to appeal.</p><p>I lost the faith in centralization. This time, I made up my mind to dive into decentralization.</p><p>First, I need a server.</p><h2 id="Where-To-Purchase"><a href="#Where-To-Purchase" class="headerlink" title="Where To Purchase"></a>Where To Purchase</h2><p>I used to buy servers from distributors of the DC for lower prices, but it always ended up with disappointment. The servers are just not stable and I can not upgrade the hardware configuration on demand.</p><p>So this time, I chose Hetzner for my server. Hetzner is a huge IDC in Germany, I must have to pay a fairly high price for the server, am I right?</p><p>The following images show the price of Hetzner’s traditional CX series - with x86 CPU.</p><p><img src="/images/2023-09-24/01.jpg" alt="Hetzner CX Series"></p><p>A 2 CPU and 4GB RAM CX21 can fit my needs, it costs 5.35 EUR per month. By the way, the 40GB disk is far less than my requirement.</p><p>The CX series are using Intel Xeon CPU. The GB6 benchmark score of an Intel core is around 850, which is significantly lower than AMD EPYC of around 1200.</p><p>However, when I switch to the CAX series…</p><p><img src="/images/2023-09-24/02.jpg" alt="Hetzner CAX Series"></p><p>I can get the same number of CPU cores and RAM with only 3.79 EUR per month, 30% lower than the x86 one.</p><p>The GB6 benchmark score of ARM CPU is around 1050, even higher than the Intel ones.</p><p>The disk space is still 40GB, but I can purchase a 3.2EUR/month 1TB Storage Box to solve this problem.</p><p>With a total of 6.99 EUR per month, I can get a server with 2 CPU cores, 4GB RAM, and 1TB disk. That is a great deal.</p><h2 id="Wait-ARM"><a href="#Wait-ARM" class="headerlink" title="Wait, ARM?"></a>Wait, ARM?</h2><p>About a year ago, when Hetzner first released the ARM series, I was interested in it and evaluated its compatibility.</p><p>I always use Docker containers to host my ~25 services. It turned out that more than half of the Docker images I was using were only compiled for the x86 CPU.</p><p>That means you have to build the image by yourself if you want to run it on an ARM CPU. The time and effort were not worth it, so I gave it up.</p><p>However, this time, I found all of the Docker images already supporting the ARM CPU. It is time to give it a try.</p><h2 id="The-Experience"><a href="#The-Experience" class="headerlink" title="The Experience"></a>The Experience</h2><p>Here is my final hardware configuration:</p><p>I chose the CAX11 server, which has 2 Ampere ARM CPU cores, 4GB RAM, and 40GB disk. I added 2GB swap space to store cached files and reduce the load of the RAM.</p><p>I also purchased a 1TB Storage Box to store my data. Mounted to the server with NFS, just like a local disk.</p><p>I am using the latest Debian 12 Bookworm and I can’t feel any difference between x86 and ARM. My daily use software from APT source is all compiled for ARM. The installation speed is as fast as x86.</p><p>As to the Docker images, I am using Portainer to manage them. What I need to do is just click the “Recover” button on the settings page, Portianer will automatically recover the configuration from CloudFlare R2 storage and all the containers just work as before, with no need to change any settings.</p><p>Today, when I am writing this article, My services are running for a week without any problem.</p><p><img src="/images/2023-09-24/03.jpg" alt="Portainer"></p><h2 id="Well-Still-Not-Perfect"><a href="#Well-Still-Not-Perfect" class="headerlink" title="Well, Still Not Perfect"></a>Well, Still Not Perfect</h2><p>The ARM server just works fine, but I want to share some problems I encountered when building the ARM Docker images.</p><p>The official software repositories of Linux distributions can offer full support for ARM CPU, but the repositories of other sources such as PyPi can not.</p><p><img src="/images/2023-09-24/04.jpg" alt="Build time difference"></p><p>There are still some packages that don’t have prebuilt ARM wheels, and the building process can take a long time on the 2-core ARM machine.</p><p>That is not a huge problem, but it makes the experience of ARM arch different from x86.</p><p>If you are a developer, try to include ARM in your build pipeline next time, that will be a great help for the ARM community.</p><h2 id="Final-Conclusion"><a href="#Final-Conclusion" class="headerlink" title="Final Conclusion"></a>Final Conclusion</h2><p>In my opinion, the ARM server is ready for daily use today. They offer a high quality-price ratio. I didn’t come across any compatibility problems.</p><p>Next time when you want to purchase a server, you can consider the ARM ones.</p>]]></content>
<categories>
<category>随笔</category>
</categories>
<tags>
<tag>随笔</tag>
</tags>
</entry>
<entry>
<title>修复 UEFI 引导的 GRUB</title>
<link href="/archives/8b68ddd6.html"/>
<url>/archives/8b68ddd6.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h2 id="问题与解决方法"><a href="#问题与解决方法" class="headerlink" title="问题与解决方法"></a>问题与解决方法</h2><h3 id="环境"><a href="#环境" class="headerlink" title="环境"></a>环境</h3><p>Manjaro Linux x86_64</p><p>Kernel: 6.2.10-1-MANJARO</p><p>使用 UEFI 引导</p><h3 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h3><p>在 GRUB 尝试引导 Linux 内核时,出现如下错误:</p><figure class="highlight smali"><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><code class="hljs smali">error:<span class="hljs-built_in"> sparse </span>file<span class="hljs-built_in"> not </span>allowed.<br><br>452: out of range pointer: xxxxxxxxxx<br><br>Aborted. Press any key to exit.<br></code></pre></td></tr></table></figure><p>用户将无法进入系统。</p><h3 id="解决方法"><a href="#解决方法" class="headerlink" title="解决方法"></a>解决方法</h3><h4 id="进入恢复系统"><a href="#进入恢复系统" class="headerlink" title="进入恢复系统"></a>进入恢复系统</h4><p>插入 Manjaro LiveCD, 启动 Live 系统。</p><h4 id="确定磁盘分区"><a href="#确定磁盘分区" class="headerlink" title="确定磁盘分区"></a>确定磁盘分区</h4><p>在 Live 系统中,使用 <code>fdisk -l</code> 查看磁盘分区情况,找到安装 Manjaro 的磁盘,假设为 <code>/dev/sda</code>。</p><p>我的磁盘分区如下:</p><figure class="highlight tap"><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><code class="hljs tap">设备 起点 末尾 扇区 大小 类型<br>/dev/sda1 <span class="hljs-number"> 2048 </span> <span class="hljs-number"> 821247 </span> <span class="hljs-number"> 819200 </span> 400M EFI 系统<br>/dev/sda2 <span class="hljs-number"> 821248 </span><span class="hljs-number"> 723390463 </span>722569216 344.5G Linux 文件系统<br>/dev/sda3 <span class="hljs-number"> 723390464 </span><span class="hljs-number"> 983437311 </span>260046848 124G Linux 文件系统<br>/dev/sda4 <span class="hljs-number"> 983437312 </span>1000214527 <span class="hljs-number"> 16777216 </span> 8G Linux 文件系统<br></code></pre></td></tr></table></figure><p>可以确定,<code>/dev/sda1</code> 是 EFI 系统分区,<code>/dev/sda2</code> 是系统所在分区。</p><h4 id="挂载分区"><a href="#挂载分区" class="headerlink" title="挂载分区"></a>挂载分区</h4><p>挂载系统分区:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">mount /dev/sda2 /mnt<br></code></pre></td></tr></table></figure><p>将当前系统的工具分区挂载到 <code>/mnt</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></pre></td><td class="code"><pre><code class="hljs bash">mount --<span class="hljs-built_in">bind</span> /dev /mnt/dev<br>mount --<span class="hljs-built_in">bind</span> /proc /mnt/proc<br>mount --<span class="hljs-built_in">bind</span> /sys /mnt/sys<br></code></pre></td></tr></table></figure><p>将 EFI 分区挂载到 <code>/mnt/boot/efi</code> 下:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">mount /dev/sda1 /mnt/boot/efi<br></code></pre></td></tr></table></figure><h4 id="进入系统"><a href="#进入系统" class="headerlink" title="进入系统"></a>进入系统</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">chroot</span> /mnt<br></code></pre></td></tr></table></figure><h4 id="重新安装-GRUB"><a href="#重新安装-GRUB" class="headerlink" title="重新安装 GRUB"></a>重新安装 GRUB</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">grub-install --target=x86_64-efi --efi-directory=/boot/efi --removable<br></code></pre></td></tr></table></figure><p>具体参数需要根据实际情况进行修改。</p><h4 id="在这之后"><a href="#在这之后" class="headerlink" title="在这之后"></a>在这之后</h4><p>重启,进入通过 GRUB 引导系统。</p><p>在系统中使用 <code>sudo grub-install --recheck /dev/sda</code> 命令再次安装 GRUB,确保系统能够正常启动。</p><h2 id="一些思考"><a href="#一些思考" class="headerlink" title="一些思考"></a>一些思考</h2><p>接下来的内容是我的整个修复流程,包含了如何在搜索引擎查找问题、根据文章内容调整目标等杂碎的内容,和我在修复过程中的一些感想。</p><h3 id="为什么会出现这个问题"><a href="#为什么会出现这个问题" class="headerlink" title="为什么会出现这个问题"></a>为什么会出现这个问题</h3><p>不是很清楚。</p><p>在启动 Manjaro 前我不小心打开了电脑里的 Windows 系统,但没有连接移动硬盘。</p><p>按照以往的经验,这最多只会导致找不到 GRUB 的位置,手动指定 GRUB 所在分区就可以启动系统。</p><p>但这次不大一样。</p><p>在打开 GRUB 之后,尝试引导内核,就发现了这个问题。</p><h3 id="初步解决思路"><a href="#初步解决思路" class="headerlink" title="初步解决思路"></a>初步解决思路</h3><p><del>立刻格式化磁盘,重新安装 Manjaro。</del></p><p>我已经不是曾经那个只会重装的我了,这次我希望可以解决问题,而不是简单地重装。</p><p>首先,我 Google 了这个错误,发现了几篇内容相关的文章。</p><p><a href="https://forum.artixlinux.org/index.php/topic,4668.0.html">报错与我一致的文章</a>,但没有给出解决方案。</p><p><a href="https://www.reddit.com/r/archlinux/comments/x2qb4w/grub_aborts_loading_linux_because_of_an_out_of/">要我删除 GRUB 和 UEFI 所在分区所有内容的文章</a>,有点可怕,不敢这么干。</p><p><a href="https://bbs.archlinux.org/viewtopic.php?id=280230">提到应该重新安装 GRUB 的文章</a>,这还有点道理。</p><p>于是,我的目标转变为重新安装 GRUB。</p><h3 id="重新安装-GRUB-1"><a href="#重新安装-GRUB-1" class="headerlink" title="重新安装 GRUB"></a>重新安装 GRUB</h3><p>在之前遇到找不到 GRUB 分区的问题时,在手动引导然后进入系统后,我会执行 <code>sudo grub-install --recheck /dev/sda</code> 重新安装 GRUB,解决这个问题。</p><p>那这次的觉得方案应该是差不多的……吧?</p><p>不对啊,这次是在 LiveCD 的系统里操作,怎么能直接安装 GRUB 呢?</p><p>这个问题比较难描述。</p><p>我先是 Google <code>grub-install 修复 GRUB</code>,中文网站的内容都是关于在可以启动的系统下修复 GRUB 的,没有我需要的内容。</p><p>然后我开始求助于 ChatGPT,输入的 Prompts 是:</p><figure class="highlight livecodeserver"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs livecodeserver">I am <span class="hljs-keyword">using</span> Manjaro <span class="hljs-keyword">with</span> GRUB.<br>When I booted <span class="hljs-keyword">into</span> <span class="hljs-keyword">the</span> <span class="hljs-keyword">system</span>, <span class="hljs-keyword">it</span> says <span class="hljs-string">"sparse file not allowed 452 out of range pointer"</span>. How <span class="hljs-built_in">to</span> fix <span class="hljs-keyword">it</span>?<br></code></pre></td></tr></table></figure><p>不难发现,我并没有说明我使用的是 UEFI 引导,这直接影响到了 ChatGPT 回复的准确性。</p><p>ChatGPT 给出的修复步骤与上述的相差不大,只是在挂载系统分区和工具分区后,直接尝试执行 <code>grub-install</code> 命令,尝试修复。</p><p><code>grub-install</code> 返回错误 <code>this gpt partition label contains no bios boot partition</code> 把我弄得更懵了。</p><p>再次 Google 这个问题,发现了 <a href="https://superuser.com/questions/903112/grub2-install-this-gpt-partition-label-contains-no-bios-boot-partition">这篇在长篇大论讲 GRUB 的文章</a>,虽然没有给出解决方案,但它让我意识到 UEFI 和 Legacy BIOS 两种启动方式的区别。</p><h3 id="UEFI-和-Legacy-BIOS"><a href="#UEFI-和-Legacy-BIOS" class="headerlink" title="UEFI 和 Legacy BIOS"></a>UEFI 和 Legacy BIOS</h3><p>UEFI 和 Legacy BIOS 是两种启动方式,它们的区别在于,Legacy BIOS 是在 BIOS 中直接加载内核,而 UEFI 是在 BIOS 中加载 EFI 系统,然后由 EFI 系统加载内核。</p><p>使用 UEFI 引导的系统一般都有一个 200MB 到 400MB 的 EFI 系统分区,用于存放 EFI 系统。在上述的,我的硬盘分区中可以看到。</p><p>使用 <code>findmnt</code> 命令可以查看当前系统的挂载情况,其中 <code>TARGET</code> 列就是挂载点,<code>SOURCE</code> 列就是挂载的分区。</p><p>EFI 分区的挂载情况为:</p><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs gradle">TARGET <span class="hljs-keyword">SOURCE</span> FSTYPE <span class="hljs-keyword">OPTIONS</span><br><span class="hljs-regexp">/boot/</span>efi <span class="hljs-regexp">/dev/</span>sda1 vfat rw,relatime,fm<br></code></pre></td></tr></table></figure><p>可以看到,<code>/boot/efi</code> 里的内容正是 EFI 系统分区的内容。(我也是刚学到这个知识的)</p><h3 id="解决-UEFI-相关问题"><a href="#解决-UEFI-相关问题" class="headerlink" title="解决 UEFI 相关问题"></a>解决 UEFI 相关问题</h3><p>在修复过程中,我是通过 Google 发现上述的问题。</p><p><a href="https://superuser.com/questions/1390428/grub-install-warning-this-gpt-partition-label-contains-no-bios-boot-partition">这篇文章</a> 给了我莫大的帮助。</p><p>其中提到了 EFI 分区,也提到了如何正确安装 UEFI 引导的 GRUB:</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><code class="hljs bash"><span class="hljs-built_in">sudo</span> grub-install --target=x86_64-efi --efi-directory=/boot/efi<br><span class="hljs-built_in">sudo</span> grub-install --target=x86_64-efi --efi-directory=/boot/efi --removable<br></code></pre></td></tr></table></figure><p>在补充挂载 EFI 分区、切换 Root 目录后,执行第一条命令,发现有错误。尝试执行第二条命令,发现没有错误,代表 GRUB 已经重新安装成功。</p><p>此时我想起来,在之前安装 GRUB 时,会提示 <code>正在为 x86_64-efi 平台进行安装</code>,我才意识到前面的修复过程并没有去指定平台。</p><h3 id="总结一下"><a href="#总结一下" class="headerlink" title="总结一下"></a>总结一下</h3><p>总之,这就是我此次修复的心路历程。我没有研究过 UEFI 和 Legacy BIOS 的区别,也没有研究过 GRUB 的安装过程,所以在修复过程中,我是通过 Google 和 ChatGPT 的帮助才解决了这个问题。</p><p>希望这个探索过程能给你一些启发吧。</p><hr><p>此文章以 <em>我无所谓 By 不 By 什么 AI,对我有帮助的文章就是好文章</em> 标识发布。</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>教程</tag>
</tags>
</entry>
<entry>
<title>使用 Docker Compose 部署音乐服务器 Navidrome</title>
<link href="/archives/8b115688.html"/>
<url>/archives/8b115688.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h2 id="服务介绍"><a href="#服务介绍" class="headerlink" title="服务介绍"></a>服务介绍</h2><p>Navidrome 是一款兼容 Subsonic API 的开源音乐服务器软件,它提供了一个不错的 WebUI,也可以将支持 Subsonic API 的客户端接入。</p><p>目前项目正处在活跃开发中,各种各样的新功能正在陆续加入。</p><h2 id="我的客户端选择"><a href="#我的客户端选择" class="headerlink" title="我的客户端选择"></a>我的客户端选择</h2><h3 id="电脑端"><a href="#电脑端" class="headerlink" title="电脑端"></a>电脑端</h3><p>自带 WebUI, <a href="https://github.com/jeffvli/sonixd">Sonixd</a> 【跨平台】</p><h3 id="iOS"><a href="#iOS" class="headerlink" title="iOS"></a>iOS</h3><p><a href="https://apps.apple.com/us/app/play-sub-music-streamer/id955329386">play:sub</a> 【付费软件 4.99$】</p><h2 id="部署方式"><a href="#部署方式" class="headerlink" title="部署方式"></a>部署方式</h2><p>采用 Docker Compose 部署 Navidrome,使用 Nginx 作为反向代理。</p><h2 id="Docker-Compose-配置文件"><a href="#Docker-Compose-配置文件" class="headerlink" title="Docker Compose 配置文件"></a>Docker Compose 配置文件</h2><figure class="highlight yaml"><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></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">version:</span> <span class="hljs-string">"3"</span><br><span class="hljs-attr">services:</span><br> <span class="hljs-attr">navidrome:</span><br> <span class="hljs-attr">image:</span> <span class="hljs-string">deluan/navidrome:latest</span><br> <span class="hljs-attr">container_name:</span> <span class="hljs-string">navidrome</span><br> <span class="hljs-attr">user:</span> <span class="hljs-number">1000</span><span class="hljs-string">:1000</span> <span class="hljs-comment"># should be owner of volumes</span><br> <span class="hljs-attr">ports:</span><br> <span class="hljs-bullet">-</span> <span class="hljs-string">"127.0.0.1:4533:4533"</span><br> <span class="hljs-attr">restart:</span> <span class="hljs-string">unless-stopped</span><br> <span class="hljs-attr">environment:</span><br> <span class="hljs-attr">ND_SCANSCHEDULE:</span> <span class="hljs-string">1h</span><br> <span class="hljs-attr">ND_LOGLEVEL:</span> <span class="hljs-string">info</span> <br> <span class="hljs-attr">ND_SESSIONTIMEOUT:</span> <span class="hljs-string">24h</span><br> <span class="hljs-attr">ND_BASEURL:</span> <span class="hljs-string">""</span><br> <span class="hljs-attr">ND_SEARCHFULLSTRING:</span> <span class="hljs-literal">true</span><br> <span class="hljs-comment"># Optional: fetch artist images from spotify</span><br> <span class="hljs-attr">ND_SPOTIFY_ID:</span><br> <span class="hljs-attr">ND_SPOTIFY_SECRET:</span><br> <span class="hljs-comment"># Optional: fetch artist information from last.fm</span><br> <span class="hljs-attr">ND_LASTFM_APIKEY:</span><br> <span class="hljs-attr">ND_LASTFM_SECRET:</span><br> <span class="hljs-attr">ND_LASTFM_LANGUAGE:</span> <span class="hljs-string">en</span><br> <span class="hljs-attr">volumes:</span><br> <span class="hljs-bullet">-</span> <span class="hljs-string">"./data:/data"</span> <span class="hljs-comment"># Navidrome data</span><br> <span class="hljs-bullet">-</span> <span class="hljs-string">"/APTH-TO/navidrome-music:/music:ro"</span> <span class="hljs-comment"># Music folder</span><br></code></pre></td></tr></table></figure><p>使用命令 <code>docker compose up -d</code> 启动服务。</p><h2 id="Nginx-配置文件"><a href="#Nginx-配置文件" class="headerlink" title="Nginx 配置文件"></a>Nginx 配置文件</h2><p>我建议使用 DigitalOcean 的 Nginx 配置生产工具,示例配置如下:</p><p><a href="https://www.digitalocean.com/community/tools/nginx?domains.0.server.domain=music.example.com&domains.0.php.php=false&domains.0.reverseProxy.reverseProxy=true&domains.0.reverseProxy.proxyPass=http://127.0.0.1:4533&domains.0.routing.root=false&domains.0.routing.index=index.html&domains.0.routing.fallbackHtml=true&global.app.lang=zhCN%5C">示例配置</a></p><p>也可参考下述配置,此为 DigitalOcean 生成配置的简化版:</p><figure class="highlight nginx"><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></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-section">server</span> {<br> <span class="hljs-attribute">listen</span> <span class="hljs-number">443</span> ssl http2;<br> <span class="hljs-attribute">listen</span> [::]:<span class="hljs-number">443</span> ssl http2;<br> <span class="hljs-attribute">server_name</span> music.example.com;<br><br> <span class="hljs-comment"># SSL</span><br> <span class="hljs-attribute">ssl_certificate</span> /etc/letsencrypt/live/music.example.com/fullchain.pem;<br> <span class="hljs-attribute">ssl_certificate_key</span> /etc/letsencrypt/live/music.example.com/privkey.pem;<br> <span class="hljs-attribute">ssl_trusted_certificate</span> /etc/letsencrypt/live/music.example.com/chain.pem;<br><br> <span class="hljs-comment"># logging</span><br> <span class="hljs-attribute">access_log</span> /var/log/nginx/access.log combined buffer=<span class="hljs-number">512k</span> flush=<span class="hljs-number">1m</span>;<br> <span class="hljs-attribute">error_log</span> /var/log/nginx/<span class="hljs-literal">error</span>.log <span class="hljs-literal">warn</span>;<br><br> <span class="hljs-comment"># reverse proxy</span><br> <span class="hljs-section">location</span> / {<br> <span class="hljs-attribute">proxy_set_header</span> Host <span class="hljs-variable">$host</span>;<br> <span class="hljs-attribute">proxy_pass</span> http://127.0.0.1:4533;<br> }<br>}<br><br><span class="hljs-comment"># subdomains redirect</span><br><span class="hljs-section">server</span> {<br> <span class="hljs-attribute">listen</span> <span class="hljs-number">443</span> ssl http2;<br> <span class="hljs-attribute">listen</span> [::]:<span class="hljs-number">443</span> ssl http2;<br> <span class="hljs-attribute">server_name</span> <span class="hljs-regexp">*.music.example.com</span>;<br><br> <span class="hljs-comment"># SSL</span><br> <span class="hljs-attribute">ssl_certificate</span> /etc/letsencrypt/live/music.example.com/fullchain.pem;<br> <span class="hljs-attribute">ssl_certificate_key</span> /etc/letsencrypt/live/music.example.com/privkey.pem;<br> <span class="hljs-attribute">ssl_trusted_certificate</span> /etc/letsencrypt/live/music.example.com/chain.pem;<br> <span class="hljs-attribute">return</span> <span class="hljs-number">301</span> https://music.example.com<span class="hljs-variable">$request_uri</span>;<br>}<br></code></pre></td></tr></table></figure><h2 id="音乐管理"><a href="#音乐管理" class="headerlink" title="音乐管理"></a>音乐管理</h2><p>我一直以文件夹分类的方式管理音乐,但 Navidrome 并不支持文件夹分类。它是根据音乐标签来分类的,例如按照歌手、专辑等依据分类歌曲。</p><p>因此,若想使用 Navidrome,需要对音乐进行标签管理。</p><p>大约两年前,我写了 <a href="https://blog.udon.eu.org/archives/6b40e5ad.html">一篇文章</a> 介绍使用 Music Tag 和 Foobar2000 两款软件来管理音乐。</p><p>Music Tag 的标签源是网易云音乐、豆瓣音乐、QQ 音乐等国内音乐平台,说实话,这些平台的音乐标签质量都不是很好,所以我一直在寻找更好的音乐标签源。</p><p>直到我发现了 <a href="https://musicbrainz.org/">MusicBrainz</a>,这是一个开源的音乐标签数据库,任何人都可以为它贡献标签。在体验之后,我发现 MusicBrainz 的音乐标签质量要比国内音乐平台的标签质量好很多,所以我决定将 MusicBrainz 作为我的音乐标签源。</p><p>我使用 <a href="https://picard.musicbrainz.org/">Picard</a> 这款软件来从 MusicBrainz 获取音乐标签。</p><p>将音乐导入 Picard 后,它会自动从 MusicBrainz 获取音乐标签,然后将标签写入音乐文件,十分方便。</p><h2 id="开始使用"><a href="#开始使用" class="headerlink" title="开始使用"></a>开始使用</h2><p>不论是使用 Navidrome 自带的 Web 界面,还是使用兼容 Subsonic API 的客户端,只要连接到 Navidrome,便可开始享受你的私人音乐库。</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>教程</tag>
</tags>
</entry>
<entry>
<title>使用 Docker Compose 部署 Keycloak 20</title>
<link href="/archives/f9bfe16a.html"/>
<url>/archives/f9bfe16a.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h2 id="部署方式"><a href="#部署方式" class="headerlink" title="部署方式"></a>部署方式</h2><p>采用 Docker Compose 部署,使用 Postgres 作为数据库,使用 Nginx 作为反向代理。</p><h2 id="Docker-Compose-配置文件"><a href="#Docker-Compose-配置文件" class="headerlink" title="Docker Compose 配置文件"></a>Docker Compose 配置文件</h2><figure class="highlight yaml"><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></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">version:</span> <span class="hljs-string">'3'</span><br><br><span class="hljs-attr">services:</span><br> <span class="hljs-attr">keycloak:</span><br> <span class="hljs-attr">image:</span> <span class="hljs-string">quay.io/keycloak/keycloak:latest</span><br> <span class="hljs-attr">environment:</span><br> <span class="hljs-attr">KC_DB:</span> <span class="hljs-string">postgres</span><br> <span class="hljs-attr">KC_DB_URL:</span> <span class="hljs-string">jdbc:postgresql://db:5432/keycloak</span><br> <span class="hljs-attr">KC_DB_USERNAME:</span> <span class="hljs-string">keycloak</span><br> <span class="hljs-attr">KC_DB_PASSWORD:</span> <span class="hljs-string">keycloak</span><br> <span class="hljs-attr">KC_HTTP_ENABLED:</span> <span class="hljs-literal">true</span> <span class="hljs-comment"># 开启 HTTP</span><br> <span class="hljs-attr">KC_HOSTNAME_STRICT:</span> <span class="hljs-literal">false</span><br> <span class="hljs-attr">KC_HOSTNAME_STRICT_HTTPS:</span> <span class="hljs-literal">false</span><br> <span class="hljs-attr">KC_HTTP_RELATIVE_PATH:</span> <span class="hljs-string">'/'</span> <span class="hljs-comment"># Keycloak 应用的相对路径</span><br> <span class="hljs-attr">KC_HTTP_PORT:</span> <span class="hljs-number">8080</span> <span class="hljs-comment"># HTTP 端口</span><br> <span class="hljs-attr">KEYCLOAK_ADMIN:</span> <span class="hljs-string">MY_USERNAME</span> <span class="hljs-comment"># 管理员账号,仅初始化时使用</span><br> <span class="hljs-attr">KEYCLOAK_ADMIN_PASSWORD:</span> <span class="hljs-string">MY_PASSWORD</span> <span class="hljs-comment"># 管理员密码,仅初始化时使用</span><br> <span class="hljs-attr">PROXY_ADDRESS_FORWARDING:</span> <span class="hljs-literal">true</span> <span class="hljs-comment"># 使用反向代理必须开启</span><br> <span class="hljs-attr">KC_PROXY:</span> <span class="hljs-string">edge</span> <span class="hljs-comment"># 反向代理模式,详见文档</span><br> <span class="hljs-attr">entrypoint:</span> <span class="hljs-string">/opt/keycloak/bin/kc.sh</span> <span class="hljs-string">start</span> <span class="hljs-comment"># 第一次运行后可以加上 --optimized 参数,加快二次启动速度</span><br> <span class="hljs-attr">ports:</span><br> <span class="hljs-bullet">-</span> <span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span><span class="hljs-string">:18080:8080</span> <span class="hljs-comment"># Keycloak 应用端口</span><br> <span class="hljs-attr">restart:</span> <span class="hljs-string">unless-stopped</span><br> <span class="hljs-attr">db:</span><br> <span class="hljs-attr">image:</span> <span class="hljs-string">postgres:14</span><br> <span class="hljs-attr">restart:</span> <span class="hljs-string">unless-stopped</span><br> <span class="hljs-attr">environment:</span><br> <span class="hljs-bullet">-</span> <span class="hljs-string">POSTGRES_USER=keycloak</span><br> <span class="hljs-bullet">-</span> <span class="hljs-string">POSTGRES_PASSWORD=keycloak</span><br> <span class="hljs-bullet">-</span> <span class="hljs-string">POSTGRES_DB=keycloak</span><br> <span class="hljs-attr">volumes:</span><br> <span class="hljs-bullet">-</span> <span class="hljs-string">./postgres-data:/var/lib/postgresql/data</span> <span class="hljs-comment"># 数据库数据保存位置</span><br></code></pre></td></tr></table></figure><p>使用命令 <code>docker compose up -d</code> 启动服务。</p><h2 id="Nginx-配置"><a href="#Nginx-配置" class="headerlink" title="Nginx 配置"></a>Nginx 配置</h2><p>我建议使用 DigitalOcean 的 Nginx 配置生产工具,示例配置如下:</p><p><a href="https://www.digitalocean.com/community/tools/nginx?domains.0.server.domain=auth.example.com&domains.0.php.php=false&domains.0.reverseProxy.reverseProxy=true&domains.0.reverseProxy.proxyPass=http://127.0.0.1:18080&domains.0.routing.root=false&global.app.lang=zhCN">示例配置</a></p><p>也可参考下述配置,此为 DigitalOcean 生成配置的简化版:</p><figure class="highlight nginx"><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><code class="hljs nginx"><span class="hljs-section">server</span> {<br> <span class="hljs-attribute">listen</span> <span class="hljs-number">443</span> ssl http2;<br> <span class="hljs-attribute">listen</span> [::]:<span class="hljs-number">443</span> ssl http2;<br> <span class="hljs-attribute">server_name</span> auth.example.com;<br><br> <span class="hljs-comment"># SSL</span><br> <span class="hljs-attribute">ssl_certificate</span> /etc/letsencrypt/live/auth.example.com/fullchain.pem;<br> <span class="hljs-attribute">ssl_certificate_key</span> /etc/letsencrypt/live/auth.example.com/privkey.pem;<br> <span class="hljs-attribute">ssl_trusted_certificate</span> /etc/letsencrypt/live/auth.example.com/chain.pem;<br><br> <span class="hljs-comment"># logging</span><br> <span class="hljs-attribute">access_log</span> /var/log/nginx/access.log combined buffer=<span class="hljs-number">512k</span> flush=<span class="hljs-number">1m</span>;<br> <span class="hljs-attribute">error_log</span> /var/log/nginx/<span class="hljs-literal">error</span>.log <span class="hljs-literal">warn</span>;<br><br> <span class="hljs-comment"># reverse proxy</span><br> <span class="hljs-section">location</span> / {<br> <span class="hljs-attribute">proxy_set_header</span> Host <span class="hljs-variable">$host</span>;<br> <span class="hljs-attribute">proxy_set_header</span> X-Real-IP <span class="hljs-variable">$remote_addr</span>;<br> <span class="hljs-attribute">proxy_set_header</span> X-Forwarded-Proto <span class="hljs-variable">$scheme</span>;<br> <span class="hljs-attribute">proxy_set_header</span> X-Auth-Request-Redirect <span class="hljs-variable">$request_uri</span>;<br> <span class="hljs-attribute">proxy_buffer_size</span> <span class="hljs-number">128k</span>;<br> <span class="hljs-attribute">proxy_buffers</span> <span class="hljs-number">4</span> <span class="hljs-number">256k</span>;<br> <span class="hljs-attribute">proxy_busy_buffers_size</span> <span class="hljs-number">256k</span>;<br> <span class="hljs-attribute">proxy_pass</span> http://127.0.0.1:18080;<br> }<br><br> <span class="hljs-section">location</span> /auth/realms {<br> <span class="hljs-attribute">proxy_set_header</span> Host <span class="hljs-variable">$host</span>;<br> <span class="hljs-attribute">proxy_set_header</span> X-Real-IP <span class="hljs-variable">$remote_addr</span>;<br> <span class="hljs-attribute">proxy_set_header</span> X-Forwarded-Proto <span class="hljs-variable">$scheme</span>;<br> <span class="hljs-attribute">proxy_set_header</span> X-Auth-Request-Redirect <span class="hljs-variable">$request_uri</span>;<br> <span class="hljs-attribute">proxy_pass</span> http://127.0.0.1:18080;<br> }<br><br> <span class="hljs-section">location</span> /auth/resources {<br> <span class="hljs-attribute">proxy_set_header</span> Host <span class="hljs-variable">$host</span>;<br> <span class="hljs-attribute">proxy_set_header</span> X-Real-IP <span class="hljs-variable">$remote_addr</span>;<br> <span class="hljs-attribute">proxy_set_header</span> X-Forwarded-Proto <span class="hljs-variable">$scheme</span>;<br> <span class="hljs-attribute">proxy_set_header</span> X-Auth-Request-Redirect <span class="hljs-variable">$request_uri</span>;<br> <span class="hljs-attribute">proxy_pass</span> http://127.0.0.1:18080;<br> }<br><br> <span class="hljs-section">location</span> /auth/js {<br> <span class="hljs-attribute">proxy_set_header</span> Host <span class="hljs-variable">$host</span>;<br> <span class="hljs-attribute">proxy_set_header</span> X-Real-IP <span class="hljs-variable">$remote_addr</span>;<br> <span class="hljs-attribute">proxy_set_header</span> X-Forwarded-Proto <span class="hljs-variable">$scheme</span>;<br> <span class="hljs-attribute">proxy_set_header</span> X-Auth-Request-Redirect <span class="hljs-variable">$request_uri</span>;<br> <span class="hljs-attribute">proxy_pass</span> http://127.0.0.1:18080;<br> }<br>}<br><br><span class="hljs-comment"># subdomains redirect</span><br><span class="hljs-section">server</span> {<br> <span class="hljs-attribute">listen</span> <span class="hljs-number">443</span> ssl http2;<br> <span class="hljs-attribute">listen</span> [::]:<span class="hljs-number">443</span> ssl http2;<br> <span class="hljs-attribute">server_name</span> <span class="hljs-regexp">*.auth.example.com</span>;<br><br> <span class="hljs-comment"># SSL</span><br> <span class="hljs-attribute">ssl_certificate</span> /etc/letsencrypt/live/auth.example.com/fullchain.pem;<br> <span class="hljs-attribute">ssl_certificate_key</span> /etc/letsencrypt/live/auth.example.com/privkey.pem;<br> <span class="hljs-attribute">ssl_trusted_certificate</span> /etc/letsencrypt/live/auth.example.com/chain.pem;<br> <span class="hljs-attribute">return</span> <span class="hljs-number">301</span> https://auth.example.com<span class="hljs-variable">$request_uri</span>;<br>}<br></code></pre></td></tr></table></figure><h2 id="配置-Keycloak"><a href="#配置-Keycloak" class="headerlink" title="配置 Keycloak"></a>配置 Keycloak</h2><h3 id="创建-Realm"><a href="#创建-Realm" class="headerlink" title="创建 Realm"></a>创建 Realm</h3><p>打开 <a href="http://127.0.0.1:18080/">Keycloak 地址</a>,界面如下。</p><p><img src="/images/2023-01-22/01.jpg" alt="Keycloak 界面"></p><p>选择 <code>Administration Console</code>,进入管理界面。</p><p><img src="/images/2023-01-22/02.jpg" alt="管理界面"></p><p>选择箭头指向的下拉菜单,选择 <code>Add realm</code>,创建一个新的 Realm。</p><p><img src="/images/2023-01-22/03.jpg" alt="创建 Realm"></p><p>填写 Realm 名称,点击 <code>Create</code>。</p><h3 id="创建-Client"><a href="#创建-Client" class="headerlink" title="创建 Client"></a>创建 Client</h3><p><img src="/images/2023-01-22/04.jpg" alt="管理界面"></p><p>选择 <code>Clients</code>。</p><p><img src="/images/2023-01-22/05.jpg" alt="Client 管理界面"></p><p>点击 <code>Create client</code>。</p><p><img src="/images/2023-01-22/06.jpg" alt="创建 Client"></p><p>填写 Client 相关信息,点击 <code>Next</code>。</p><p><img src="/images/2023-01-22/07.jpg" alt="配置 Client"></p><p>按需求选择 Client 的配置,点击 <code>Save</code>。</p><p><img src="/images/2023-01-22/08.jpg" alt="Client 创建完成"></p><p>至此,Keycloak 配置完成,且创建了第一个测试用 Client。</p><h3 id="测试-Client"><a href="#测试-Client" class="headerlink" title="测试 Client"></a>测试 Client</h3><p>可根据 <a href="https://www.keycloak.org/getting-started/getting-started-docker#_secure_your_first_app">官方教程</a> 测试该 Client。</p><h2 id="尾声"><a href="#尾声" class="headerlink" title="尾声"></a>尾声</h2><p>上述便是使用 Docker Compose 部署 Keycloak 20 的方法,我们顺利创建了第一个测试用 Client,接下来可以根据自己的需求进行配置。</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>教程</tag>
</tags>
</entry>
<entry>
<title>寻梦穿越机 - 入门浅谈</title>
<link href="/archives/9b78ad2a.html"/>
<url>/archives/9b78ad2a.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>暑假开始之前,我就朦朦胧胧有购入一台穿越机的想法。起因为何?我也不是很清楚。是看到了<a href="https://www.youtube.com/watch?v=b0JZxm7ajcs">酷炫的穿越机航拍视频</a>?还是童年时期的航模魂蠢蠢欲动,将要苏醒?</p><p>兴趣,倘若不立刻抓住,很快就会被抛至脑后。为了不让自己后悔,那就立刻开始筹备吧!攥紧并不是特别充盈的钱包,我踏上了寻梦之路。</p><h2 id="什么是穿越机"><a href="#什么是穿越机" class="headerlink" title="什么是穿越机"></a>什么是穿越机</h2><p>FPV (First-Person View),是指通过第一人称视角远程控制无人飞行设备 (UAV) 的控制方式,也是一项运动,也指代了一类设备。</p><p>FPV 设备包含固定翼 (Fixed Wing) 与多轴 (Multi-rotor) 两种。穿越机多指多轴 FPV (常见为四轴)。</p><p><img src="/images/2022-09-05/%E5%9B%BA%E5%AE%9A%E7%BF%BC%E4%B8%8E%E5%A4%9A%E8%BD%B4.jpg" alt="四轴 FPV (上) 与固定翼 FPV (下)"></p><h2 id="一盆冷水"><a href="#一盆冷水" class="headerlink" title="一盆冷水"></a>一盆冷水</h2><p>在详细介绍穿越机构成之前,请允许我泼一盆冷水。</p><p>穿越机与一些航拍无人机,例如大疆 (DJI) 的四轴航拍机与航拍 FPV 相比,颇有原始人见到现代人的感觉。</p><p>大疆无人机上搭载了各种各样的传感器,各系列大都配备了二向 (前后)、四向 (前后左右) 或五向 (增加一个上方) 的视觉避障功能、红外定高悬停功能,以及低电量 GPS 自动返航功能。</p><p>上述这些看似是无人机应当“标配”的功能,追求轻量化的穿越机时常一个也没有。一台最小安装的穿越机全机的传感器仅有集成于飞控的陀螺仪和地磁传感器 (电调的电流传感器一般不算在内),飞控仅知道当前机身的朝向、倾斜角度与加速度,无法感知周围的环境,没有实现避障、悬停与自动返航的能力。飞机的运动状态完全取决于飞手的操控,电池的剩余电量甚至需要飞手根据电芯电压来推断。</p><p><img src="/images/2022-09-05/%E7%A9%BF%E8%B6%8A%E6%9C%BA%E4%BC%A0%E6%84%9F%E5%99%A8.jpg" alt="穿越机少得可怜的传感器"></p><p>再者,为了能获得更大的速度与更高的机动性,穿越机飞行过程一般处于手动模式,对飞机四向的倾斜没有限制,飞行过程中出现危险操作的概率大,事故概率也大。而大疆无人机对飞行速度、角度有严格的限制,能有效地降低炸机的概率。</p><p>因此,飞行穿越机的难度将是飞行大疆等航拍无人机的十倍、甚至百倍。请务必不要抱着随便玩一玩、随心飞的态度入坑穿越机,发生事故后轻则炸机提 (遥) 控回家,重则伤到自己或他人。对于喜欢日常随心飞行的玩家,大疆或类似牌子的无人机 (包括航拍机和穿越机) 更为合适。</p><hr><p>下文将详细介绍入门穿越机所需要的技术知识与穿越机的重要模块。在明白风险之后仍打算入坑穿越机,或对穿越机有兴趣的你,欢迎继续往下阅读。</p><h2 id="技术储备"><a href="#技术储备" class="headerlink" title="技术储备"></a>技术储备</h2><p>上文提到了我童年时期的航模魂。我在小学就跟着老师学习无线电和航模知识,练习了焊接技巧和单旋翼的航模直升机的飞行技巧。曾参加某个航模比赛并拿到了铜牌的好成绩 (我好自豪)。</p><p>因此,我对我的焊接技术和遥控操控能力比较有信心。而这两个能力恰好是入门穿越机不可或缺的。下面我列举一些入门穿越机需要掌握的技能。</p><h3 id="锡焊"><a href="#锡焊" class="headerlink" title="锡焊"></a>锡焊</h3><p> 除了购买真·到手飞套餐 (机子已组装完成,接收机已与遥控器完成配对),其余情况大概率需要焊接一些导线。</p><p> 大部分组装机套餐都不包含接收机,因为接收机与遥控器一一对应,一般是和遥控一起购买的。就需要用户自行焊接至飞控上。</p><p> 锡焊所用到的工具有电烙铁和焊锡丝,最好能佐以松香,增加焊接成功率。电烙铁推荐购买 T12 或更好的,因为飞控散热设计,很多焊盘为通孔的形式,热量会非常快地传到到全板,导致焊锡较难达到融化的温度。若使用功率太低的电烙铁,可能无法融化焊锡。</p><p><img src="/images/2022-09-05/T12%E7%84%8A%E5%8F%B0.jpg" alt="T12 焊台"></p><p> 由于飞控比较小巧,焊盘也十分迷你,对焊接技术要求较高。</p><h3 id="使用搜索引擎"><a href="#使用搜索引擎" class="headerlink" title="使用搜索引擎"></a>使用搜索引擎</h3><p> 不懂不可怕,不懂得学习才可怕。</p><p> 穿越机有关的零碎知识犹如满天星,散布于互联网的每一个角落,需要一定的搜索技巧才能挖掘到有用的知识。</p><p> 国内有关穿越机的网站数量比较少,建议使用英文搜索。</p><h3 id="编译"><a href="#编译" class="headerlink" title="编译"></a>编译</h3><p> 若想要更新 ELRS 接收机和高频头的固件,需要从源码编译 ELRS 固件。虽然 ELRS 团队提供了一套图形化的编译工具,但难免会遇到一些疑难杂症 (博客中就有 ELRS 固件编译的踩坑记录)。需要对编译有一定的知识,能自行解决简单的问题。或者选择使用出厂固件,不自行升级。</p><h3 id="操控能力-协调性"><a href="#操控能力-协调性" class="headerlink" title="操控能力 (协调性)"></a>操控能力 (协调性)</h3><p> 像音游 (音乐游戏) 一样,微操遥控器并不是所有人都能很好地做到。穿越机对遥控指令的反应极为灵敏,需要你能精细地操控遥控器。</p><p> 但这项技能可以通过电脑模拟飞行来习得。建议在正式开始飞行前,先在电脑上使用模拟器熟悉飞机的控制。</p><h3 id="一颗勇敢的心"><a href="#一颗勇敢的心" class="headerlink" title="一颗勇敢的心"></a>一颗勇敢的心</h3><p> 在飞行穿越机的过程中,不可能不出现炸机 (飞机以异常姿态落地) 的情况,难免会留下一点阴影。</p><p> 我在小学时飞过固定翼飞机,曾不慎撞到电线,导致飞机起落架损坏脱落,最后只能由老师操控迫降。此事给我留下了不小的心理阴影,有好几个月我都不敢再飞行固定翼。不过最后还是克服了恐惧,再次拾起了遥控。</p><p> 炸机并不可怕,每一次炸机都记录着你的成长。</p><h2 id="深入了解"><a href="#深入了解" class="headerlink" title="深入了解"></a>深入了解</h2><p>类似 Linux (比较奇怪的类比),穿越机也分为最小安装和额外拓展两部分。</p><p><img src="/images/2022-09-05/%E7%A9%BF%E8%B6%8A%E6%9C%BA%E6%9E%B6%E6%9E%84.jpg" alt="穿越机架构"></p><p>最小安装:</p><ul><li>机架 - 硬连接其他组件,保护脆弱的电路板;</li><li>电机 (和桨叶) - 提供飞行动力;</li><li>飞控 - 控制飞行状态,是穿越机的大脑;</li><li>电调 (电子调速器) - 驱动电机、分隔电路 (防止电机减速时产生的反向电流烧坏其他电子设备);</li><li>接收机 - 接受遥控器控制信号 (有 2.4GHz、915MHz、 868MHz 等频段,互不兼容);</li><li>图传 - 发送图像信号 (多为 5.8GHz 频段);</li><li>摄像头 - 提供第一人称视角;</li></ul><p>额外拓展:</p><ul><li>GPS 模块;</li><li>BB 响 (蜂鸣器 Beeper,用于寻找飞机);</li><li>LED 灯珠、灯带 (好看 XD);</li><li>红外避障模块;</li><li>运动摄像机 (拍摄更清晰、帧率更高的视频);</li></ul><p>挑几个比较重要的模块介绍一下:</p><h3 id="机架"><a href="#机架" class="headerlink" title="机架"></a>机架</h3><p>穿越机机架一般由碳纤维板制成,质地轻盈且强度极高,可以物理连接不同的模块,并保护脆弱的电子设备 (飞控、图传等裸板)。</p><p>挑选时,机架有几个要主要关注的核心参数:</p><ul><li><p>外形:</p><p>机架分为普通式与涵道式 (Duct Propeller) 两种。</p><p>普通式机架的螺旋桨桨叶裸露在外,而涵道式机架的螺旋桨外侧有涵道 (类圆筒) 包裹。</p><p>有一些普通式机架可以通过额外安装涵道,变身成为涵道机架。</p></li></ul><p><img src="/images/2022-09-05/%E6%9C%BA%E6%9E%B6%E7%A7%8D%E7%B1%BB.jpg" alt="普通机架 (左) 与涵道机架 (右)"></p><p> 普通式机架采用开放式的设计,尽可能少地使用材料以减轻重量。由于螺旋桨暴露在外,危险性较大。普通机架可被用于任何竞速与花飞机型。</p><p> 涵道式机架通过涵道结构可以提供更好的升力、稳定性和安全性,但额外增添了重量和封阻,一般被用于小型机与花飞机型。</p><p><img src="/images/2022-09-05/%E6%9C%BA%E6%9E%B6%E5%A4%96%E5%BD%A2.jpg" alt="机架外形"></p><p> 此外,机架还可以再细分为 X 型、H 型等,在此就不多展开,有兴趣的读者可以自行查阅。</p><ul><li><p>大小:</p><p>穿越机大小各异,从最小的一寸机,到体型较大的五寸、六寸机。</p><p>二寸以下的机子防风能力较差,但体型轻盈且常使用涵道机架,适合在室内飞行,且不易伤人。</p><p>三寸以上的机子动力充沛,飞行速度快,但体型大、螺旋桨裸露,无法在室内飞行。适合在场地广阔的室外进行竞速或花飞 (花样飞行)。</p></li></ul><h3 id="飞控与电调"><a href="#飞控与电调" class="headerlink" title="飞控与电调"></a>飞控与电调</h3><p>飞控与电调 (有时还有图传) 几块板子大小相当,时常纵向堆叠安装,称为飞塔。在多块 PCB 间有硅胶柱减震。</p><p><img src="/images/2022-09-05/%E9%A3%9E%E5%A1%94.jpg" alt="双层飞塔"></p><p>飞控需要注意的参数不多:</p><ul><li><p>飞控 SoC:</p><p>常见飞控 SoC 的型号有 F405 和 F722,他们的全称应为 STM32F405 和 STM32F722. 差别主要在主频和内存大小上。</p></li></ul><p><img src="/images/2022-09-05/%E9%A3%9E%E6%8E%A7SoC.jpg" alt="飞控 SoC"></p><p> 由于穿越机飞行对计算性能不是很敏感 (类似 3D 打印机),一般选择搭载 F405 SoC 的飞控性能就足够使用了。</p><ul><li><p>串口数量:</p><p>新手会用到的串口数量不会超过两个 (外接部分型号的图传和接收机),绝大部分飞控都能满足这个要求。若有需要安装 GPS 和其他传感器,则要注意查看飞控支持的串口数量了。</p></li></ul><p>电调最重要的参数就是最大放电电流了。</p><p>电调的电流选择需要根据机身大小、电机和桨叶大小、形状进行估计,通常电机厂家会给出推荐值,按照推荐选购即可。</p><h3 id="接收机与图传"><a href="#接收机与图传" class="headerlink" title="接收机与图传"></a>接收机与图传</h3><p><img src="/images/2022-09-05/%E6%8E%A5%E6%94%B6%E6%9C%BA%E4%B8%8E%E5%9B%BE%E4%BC%A0.jpg" alt="接收机 (左) 与图传 (右)"></p><p>接收机与图传共享一个重要的特性,协议:</p><p>常见的接收机有 ELRS (ExpressLRS) 和黑羊 TBS 两类。应该注意的是,<strong>不同种类的接收机使用的通信协议和频段不同,能与其配对的遥控器和高频头也不同</strong>,因此在挑选接收机的时候一定要看清楚协议和频段。</p><p>接收机和飞控的串口通讯协议也各异,有 UART、SBUS 等数种,再购买接收机前需确认飞控有相对应的串口。</p><p>图传分数字图传和模拟图传两种。</p><p>数字图传以大疆的最为出名,需要使用配套的飞行眼镜;模拟图传大多使用 5.8G 频段通讯,和大部分接收模拟信号的飞行眼镜通用。</p><p>图传连接至飞控的串口通讯协议也很多,购买的时候请多加留意。</p><p>除此之外,接收机有遥测功率、内/外置天线、天线接口等参数,在挑选时都需要多加留意。</p><p>图传的另一主要参数则是发射功率。发射功率越大,能稳定接受图传信号的距离一般就越大。小型穿越机一般选择发射功率在 200mW 到 500mW 的图传即可 (部分图传发射功率可调);若有远航要求,也可选择发射功率大于 1W 的图传 (价格较高、发热也较大,一般带有主动散热)。</p><h3 id="机子之外的配件"><a href="#机子之外的配件" class="headerlink" title="机子之外的配件"></a>机子之外的配件</h3><p>除了穿越机本体之外,想要拥有完整的飞性体验,还需要遥控器、高频头、电池、平衡充电器、飞行眼镜等配件。</p><p>上述的每一种配件都可以写作一篇介绍文章。由于篇幅有限,本文就不再介绍上述的外围配件,请善用搜索引擎,学习相关知识。</p><h3 id="配套软件"><a href="#配套软件" class="headerlink" title="配套软件"></a>配套软件</h3><p>除了硬件,穿越机配套的控制软件也尤为重要。目前主流的控制软件是开源的 Betaflight。</p><p><img src="/images/2022-09-05/Betaflight.jpg" alt="Betaflight 地面站界面"></p><p>Betaflight 分为嵌入端 (安装在飞控中嵌入式系统) 和地面站 (安装在电脑里的软件)。将飞控通过线缆连接至电脑,并打开 Betaflight 地面站软件,即可对飞控参数进行调整。</p><p>Betaflight 调参也是一门大课,新手不建议自定义太多的参数。待熟悉飞机之后,才建议调整 PID 等高级控制参数。</p><h2 id="新手的第一台飞机"><a href="#新手的第一台飞机" class="headerlink" title="新手的第一台飞机"></a>新手的第一台飞机</h2><p>说了这么多,要上某宝挑选、下单穿越机的种种配件了吗?</p><p>我的建议是否定的。</p><p>我咨询了一些老玩家,他们建议新手购买他人已完成调参的二手机器,或者购买商家大部分已组装完成套机,以绕过纷繁复杂且状况百出的 DIY 过程,降低还未入坑就弃坑的风险。</p><p>此外,自行购买散件的总价常常会高于购买整机的价格。对于钱包不是特别充盈的我,购买整机也是一个省钱的选择。</p><p>待熟悉了穿越机的飞行与调试之后,再学习他人经验,设计并组装一台自己心目中的机器也不迟,这才是 DIY 的浪漫。</p><h2 id="我的成果"><a href="#我的成果" class="headerlink" title="我的成果"></a>我的成果</h2><p><img src="/images/2022-09-05/%E6%88%91%E7%9A%84%E6%88%90%E6%9E%9C.jpg" alt="我的成果"></p><p>我选择购买一位老玩家完成大部分组装工作的“半”整机——包含了机架、电机、飞控和电调。图传、摄像头和接收机则是我自行购买和焊接安装的。</p><p>飞机到手、外围装备齐全,只待一飞冲天。</p>]]></content>
<categories>
<category>随笔</category>
</categories>
<tags>
<tag>随笔</tag>
</tags>
</entry>
<entry>
<title>使用再生龙 Clonezilla 备份操作系统</title>
<link href="/archives/e74a90f2.html"/>
<url>/archives/e74a90f2.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>近日购入了一只闪迪的 CZ880 Extreme PRO 固态U盘来装 Manjaro。</p><p>虽然U盘本体是终身质保的,但数据无价,配置一遍系统就要花大把的时间。遂有了备份U盘内整个系统的念头。</p><p>下面跟着我使用再生龙 Clonezilla 把U盘里的系统备份一下吧!</p><h3 id="事先准备"><a href="#事先准备" class="headerlink" title="事先准备"></a>事先准备</h3><p>再生龙是运行在独立操作系统 (Debian/Ubuntu) 上的一套软件,因此需要制作启动盘,或使用 Ventoy 等多系统启动方案。(实测 YUMI 无法启动再生龙,故建议使用 Ventoy)</p><h4 id="制作启动盘"><a href="#制作启动盘" class="headerlink" title="制作启动盘"></a>制作启动盘</h4><p>前往 <a href="https://rufus.ie/zh/">Rufus 官网</a> 下载 Rufus 启动盘制作工具。</p><p>前往 <a href="https://clonezilla.org/downloads/download.php?branch=stable">Clonezilla 官网</a> 下载再生龙映像。</p><p>使用 Rufus 将再生龙映像烧写进另一个U盘即可。</p><p><strong>U盘内数据将丢失,请做好备份!</strong></p><h4 id="使用多系统启动"><a href="#使用多系统启动" class="headerlink" title="使用多系统启动"></a>使用多系统启动</h4><p>前往 <a href="https://www.ventoy.net/">Ventoy 官网</a> 下载安装包(兼容 Windows 与 Linux),将你的另一个U盘制作为 Ventoy 多启动盘。</p><p>前往 <a href="https://clonezilla.org/downloads/download.php?branch=stable">Clonezilla 官网</a> 下载再生龙映像。</p><p>将再生龙映像拷贝至 Ventoy 多启动盘中。</p><p>选择你想存放备份数据的目的地,创建一个存放备份映像的文件夹(注意目录名称中不能带有空格)。</p><p>剧透一下,40G 的系统盘备份之后大约占了 16-17G. 请留出足够的空间(建议和待备份的数据等大小)。</p><h3 id="开始备份"><a href="#开始备份" class="headerlink" title="开始备份"></a>开始备份</h3><p>瞎眼警告:由于没有合适的截屏方式,我很不愿意地采取了 拍 屏 的方式,敬请谅解。</p><h4 id="启动再生龙系统"><a href="#启动再生龙系统" class="headerlink" title="启动再生龙系统"></a>启动再生龙系统</h4><p>确保你的电脑关闭了安全启动,若还打开着,需要在 BIOS 中将其关闭。</p><p>插入刚刚制作好的启动盘/Ventoy 多启动盘,在电脑启动时猛敲键盘的…某个键,这因电脑型号而异,打开启动菜单。</p><p>选择插入的启动盘/多启动盘。</p><p>启动盘用户若没有太大的兼容性问题,就能看到再生龙的启动菜单。</p><p>多启动盘用户还要再多一步,在 Ventoy 菜单内选中再生龙的映像,如下图所示,即可打开再生龙的启动菜单。</p><p><img src="/images/2022-08-12/1.jpeg" alt="Ventoy 多启动菜单"></p><p>P.S. 我的笔记本兴许和 Ventoy 的 UEFI 模式相性不大好,在 BIOS 中开启了 Lagacy 兼容模式后,使用 Legacy 模式才能开启 Ventoy。</p><h4 id="选择再生龙启动方式"><a href="#选择再生龙启动方式" class="headerlink" title="选择再生龙启动方式"></a>选择再生龙启动方式</h4><p><img src="/images/2022-08-12/2.jpeg" alt="再生龙启动菜单"></p><p>经典的 GRUB 启动菜单,一般来说选择默认的第一项启动方式即可。</p><h5 id="VGA-启动花屏"><a href="#VGA-启动花屏" class="headerlink" title="VGA 启动花屏"></a>VGA 启动花屏</h5><p>我的电脑遇到了在 VGA 800x600 模式下花屏的问题。</p><p>最终进入 <code>Other mods of Clonezilla live</code> 菜单,</p><p><img src="/images/2022-08-12/3.jpeg" alt="其他启动模式"></p><p>选择了上图中的 KVM & To RAM 模式,可以正常启动了。</p><h5 id="USB-口不够用的用户"><a href="#USB-口不够用的用户" class="headerlink" title="USB 口不够用的用户"></a>USB 口不够用的用户</h5><p>我这台笔记本只有两个 USB 口,其中一个要给备份源头 CZ880,另一个则要给移动硬盘,故选择了 <code>To RAM</code> 模式,将再生龙载入内存,就可以拔掉多启动U盘,空出 USB 口给移动硬盘了。</p><h4 id="语言配置"><a href="#语言配置" class="headerlink" title="语言配置"></a>语言配置</h4><p><img src="/images/2022-08-12/4.jpeg" alt="语言配置"></p><p>选择自己想用的语言即可。</p><p><img src="/images/2022-08-12/5.jpeg" alt="键盘配置"></p><p>保持默认配置即可。</p><h4 id="备份配置"><a href="#备份配置" class="headerlink" title="备份配置"></a>备份配置</h4><p><img src="/images/2022-08-12/6.jpeg" alt="功能选择"></p><p>我们选 <code>Start Clonezilla 使用再生龙</code>。</p><p>命令行可以在熟悉了配置之后使用。</p><p><img src="/images/2022-08-12/7.jpeg" alt="备份模式选择"></p><p>此处我们选择第一项 <code>device-image 硬盘/分区[存到/来自]镜像文件</code>。</p><p>若想进行两盘对拷,可以选择第二项。我还没有尝试过。</p><h4 id="挂载存储目录"><a href="#挂载存储目录" class="headerlink" title="挂载存储目录"></a>挂载存储目录</h4><p><img src="/images/2022-08-12/8.jpeg" alt="存储目录选择"></p><p>这次我打算使用移动硬盘备份系统,故选择第一项 <code>local dev 使用本机的分区</code>。</p><p><img src="/images/2022-08-12/10.jpeg" alt="插入 USB 设备提示"></p><p>随后,再生龙会提示插入想要挂载的 USB 设备,按照提示做即可。</p><p><img src="/images/2022-08-12/11.jpeg" alt="检测到的存储设备"></p><p>此时画面会动态显示系统识别到的存储设备。看到期望的目标设备时,按下 <code>Ctrl-C</code> 停止搜索。</p><p><img src="/images/2022-08-12/12.jpeg" alt="分区选择"></p><p>在扫描完电脑当前安装的所有硬盘的分区后,你需要选择备份镜像文件存放的那个分区。</p><p>如图,我希望备份到大小为 1.8T 的移动硬盘上,故选择最后一项 <code>sdc2</code>。</p><p><img src="/images/2022-08-12/13.jpeg" alt="是否检查并修复文件系统"></p><p>随后,再生龙询问你是否需要检查并修复挂载的文件系统,我们选第一项否就好了。</p><p><img src="/images/2022-08-12/14.jpeg" alt="备份位置选择"></p><p>接着,就是选择备份镜像存放的位置。</p><p>使用键盘的方向键选择目录,使用 <code>Tab</code> 跳转到下方的选项,选择 <code>Browse</code> 并敲击回车就可以进入到此目录。</p><p>若希望在选中目录下存放备份镜像文件(是一个文件夹),就可以选择 <code>Done</code> 选项,回车确认。</p><p><img src="/images/2022-08-12/15.jpeg" alt="是否检查镜像可还原性"></p><p>系统询问是否检查生成的备份镜像的可还原性,这里我们选是,多花一点时间能确保备份的完整性。</p><p><img src="/images/2022-08-12/16.jpeg" alt="是否对镜像加密"></p><p>镜像加密,依个人喜好选择。</p><p><img src="/images/2022-08-12/18.jpeg" alt="备份模式确认"></p><p>待上述配置完成后,系统会向你再次确认备份的内容与目的地。</p><p>确认无误后输入 <code>y</code> 并敲击回车继续。</p><h4 id="简单模式-高级模式"><a href="#简单模式-高级模式" class="headerlink" title="简单模式/高级模式"></a>简单模式/高级模式</h4><p>此时应该有一个模式选择,问你想要使用简单模式还是专家模式。</p><p>我建议选择 专家模式,简单模式能选择的参数较少。</p><p><img src="/images/2022-08-12/20.jpeg" alt="模式选择"></p><p>接下来的三个选项,全部保持默认配置即可。</p><p><img src="/images/2022-08-12/21.jpeg" alt="高级设置1"></p><p><img src="/images/2022-08-12/22.jpeg" alt="高级设置2"></p><p><img src="/images/2022-08-12/23.jpeg" alt="高级设置3"></p><h4 id="压缩方式选择"><a href="#压缩方式选择" class="headerlink" title="压缩方式选择"></a>压缩方式选择</h4><p><img src="/images/2022-08-12/24.jpeg" alt="压缩方式选择"></p><p>此处选择第三项 <code>-z2p 使用并行 bzip2 压缩</code>。</p><p>实测 bzip2 压缩速度比较快,产生的备份镜像的体积也不算大。</p><p>下图为选择了第一项 <code>-z1p 使用并行的 gzip 压缩</code> 的速度:</p><p><img src="/images/2022-08-12/19.jpeg" alt="并行 gzip 压缩速度"></p><p>下图为选择了第三项 <code>-z2p 使用并行 bzip2 压缩</code> 的速度:</p><p><img src="/images/2022-08-12/26.jpeg" alt="并行 bzip2 压缩速度"></p><p>可以看出 bzip2 压缩速度比 gzip 快了8倍。</p><p>其他压缩方式的速度,待我测试之后更新文章。</p><p><img src="/images/2022-08-12/25.jpeg" alt="分卷大小配置"></p><p>分卷大小配置保持默认即可。</p><h4 id="备份镜像检查"><a href="#备份镜像检查" class="headerlink" title="备份镜像检查"></a>备份镜像检查</h4><p>待备份完成后,再生龙还会进行一次备份镜像的可还原性检查,如下图:</p><p><img src="/images/2022-08-12/27.jpeg" alt="可还原性检查"></p><p>若得到下图的提示,则备份镜像生成成功了。</p><p><img src="/images/2022-08-12/28.jpeg" alt="可还原性检查完成"></p><p>随后,选择按照意愿选择备份结束后的操作即可。</p><p><img src="/images/2022-08-12/29.jpeg" alt="备份结束后操作选择"></p><p>至此,再生龙 CLonezilla 的基础教学就结束了,你已经学会了如何使用再生龙的图形界面进行备份。</p><p>下面是一些再生龙的高阶(大概很高级)使用方法。</p><h3 id="高级操作"><a href="#高级操作" class="headerlink" title="高级操作"></a>高级操作</h3><h4 id="使用无线网络备份"><a href="#使用无线网络备份" class="headerlink" title="使用无线网络备份"></a>使用无线网络备份</h4><p>上文中,我的电脑仅有两个 USB 口,为备份的流程增添了不必要的麻烦。</p><p>能否使用 Wi-Fi 将备份镜像推送至家中的 NAS 呢?</p><p>再生龙内置了许多通过无线/有线网络备份的方法,如下图:</p><p><img src="/images/2022-08-12/30.jpeg" alt="备份选项"></p><p>我们尝试使用 Webdav 来远程备份吧!</p><h5 id="利与弊"><a href="#利与弊" class="headerlink" title="利与弊"></a>利与弊</h5><p>使用 Wi-Fi 备份可以摆脱线缆,更加轻松而优雅地进行备份。</p><p>然而,由于通过 Wi-Fi 或者一切网络传输数据的速度仍然无法比肩有线传输,备份所消耗的时间将是备份至本地磁盘的 3-4 倍。</p><p>备份我U盘中的 40G 的 Manjaro 系统用时 30min 左右。</p><p>倘若你有大把的时间,或家中的内网速度足够快,大可使用无线备份。品着咖啡,看着数据上云(笑)。</p><h5 id="预先准备"><a href="#预先准备" class="headerlink" title="预先准备"></a>预先准备</h5><p>上文中我们选择了基于 Debian 的 Clonezilla Stable 版本,遗憾的是 Debian 系统中并未携带太多驱动程序,因此识别不到我的 Intel AX200 无线网卡。</p><p>经过测试,基于 Ubuntu 的 <a href="https://clonezilla.org/downloads/download.php?branch=alternative">Clonezilla Alternative Stable</a> 版本可以识别到 AX200 网卡。</p><p>点击上方链接即可下载 Clonezilla Alternative Stable 版本的映像。</p><p>重新烧写启动U盘/拷贝映像至多启动U盘即可。</p><h6 id="又遇到了启动问题"><a href="#又遇到了启动问题" class="headerlink" title="又遇到了启动问题"></a>又遇到了启动问题</h6><p>使用基于 Ubuntu 的再生龙,上文中使用的 <code>KVM</code> 模式变得无法打开了,且 <code>VGA 800x600</code> 模式是一样的花屏。</p><p>在一番尝试之后,我发现藏在更多启动选项菜单里的 <code>VGA 1024x768</code> 模式可以正常显示。看来基于 Debian 的再生龙也可以使用这个模式。</p><h5 id="开始备份-1"><a href="#开始备份-1" class="headerlink" title="开始备份"></a>开始备份</h5><p><img src="/images/2022-08-12/31.jpeg" alt="网络管理"></p><p>选择了非本地的镜像存储位置后,系统将开启上图的网络管理菜单。</p><p>选择第一项 <code>Edit a connection</code>。</p><p><img src="/images/2022-08-12/32.jpeg" alt="连接管理"></p><p>选择 <code>Add</code> 选项,在弹出菜单中 <code>Wi-Fi</code>。</p><p><img src="/images/2022-08-12/33.jpeg" alt="添加 Wi-Fi"></p><p><code>Profile name</code> 随意填写;</p><p><code>Device</code> 一般填写 <code>wlan0</code>,系统的第一块无线网卡;</p><p>接着,按照自己的情况填写图中划线的三个配置即可。</p><p><img src="/images/2022-08-12/34.jpeg" alt="连接状态"></p><p>保存 Wi-Fi 配置后,就能看到当前配置的连接状态。</p><p>若当前配置名前带 <code>*</code>,且右侧选项为 <code>Deactivate</code>,则 Wi-Fi 已连接成功。</p><p><img src="/images/2022-08-12/35.jpeg" alt="填写 Webdav 服务器地址"></p><p>接着,系统要求填写 Webdav 地址。</p><p><img src="/images/2022-08-12/36.jpeg" alt="确认 Webdav 配置"></p><p>最后,系统会向你确认 Webdav 是否正确。</p><p>若确认无误,即可敲击回车继续。</p><p>接下来的步骤和上述初级教程硬盘挂载之后的流程是完全一样的,请参考上文继续配置。</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>教程</tag>
</tags>
</entry>
<entry>
<title>BETAFPV 高频头固件编译 AttributeError</title>
<link href="/archives/f82a3103.html"/>
<url>/archives/f82a3103.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h2 id="错误原因"><a href="#错误原因" class="headerlink" title="错误原因"></a>错误原因</h2><p>Python 模块 <code>pypandoc</code> 版本过新,1.8.0 及更高版本已移除了 BETAFPV 高频头固件中仍在使用的 <code>convert</code> 函数。</p><h2 id="解决方法"><a href="#解决方法" class="headerlink" title="解决方法"></a>解决方法</h2><p>安装旧版的 <code>pypandoc</code> 模块。</p><p><code>pip install pypandoc==1.7.0</code></p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>教程</tag>
<tag>DIY</tag>
</tags>
</entry>
<entry>
<title>DIY 显示器音箱</title>
<link href="/archives/38942a16.html"/>
<url>/archives/38942a16.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>新买的显示器(LG 27UL500,虽然因为屏幕问题已经退货了)没有内置音箱,虽然大部分时间都在用耳机,但别人有的东西我不能没有嘛,就买了些材料,DIY 一个外接音箱。</p><p>写作此文章分享一下制作的过程~</p><h3 id="物料清单"><a href="#物料清单" class="headerlink" title="物料清单"></a>物料清单</h3><p><img src="/images/2022-06-03/01.JPG" alt="物料清单"></p><ul><li>PAM8403 数字功放板 5RMB</li></ul><p>接受 5V 电压,可以驱动两个 3W 的喇叭。商品详情页面吹的很厉害,确实底噪很小,而且输出的音量非常高。相当 OK 的功放板。</p><ul><li>8Ω 3W 喇叭两只(带音腔) 2*4RMB + 运费</li></ul><p>音质很不错,声音很大也不会破音,因为是广告机用的喇叭么?</p><ul><li>3.5MM 公头 0.5RMB</li></ul><p>我选的型号是 PJ392,只要是 3.5MM 双声道的公头就行了。</p><ul><li>Type C 母座 0.4RMB</li></ul><p>这个随意选。</p><ul><li>屏蔽线缆 2RMB/m</li></ul><p>我买的是4芯的屏蔽线,可供 Type C 头使用(2 power 2 data),音频线只需要三芯(2 data 1 GND),屏蔽线是为了更小的干扰、更好的音质。</p><h3 id="开始组装"><a href="#开始组装" class="headerlink" title="开始组装"></a>开始组装</h3><h4 id="3-5MM-线缆"><a href="#3-5MM-线缆" class="headerlink" title="3.5MM 线缆"></a>3.5MM 线缆</h4><p>剥除一段屏蔽线的外皮,做工还是很不错的,有金属丝和铝箔的屏蔽,塑料膜防水,还有一根抗拉扯的填充芯。</p><p>我选择使用红绿蓝三根线,黄线悬空。线色对应如下:</p><p>红 - 左声道;绿 - 右声道;蓝 - 接地。</p><p><img src="/images/2022-06-03/02.JPG" alt="屏蔽线"></p><p>可以预先套上一段热缩管。</p><p><img src="/images/2022-06-03/03.JPG" alt="热缩管"></p><p>取一枚 3.5mm 公头,旋下插头。</p><p>最长的一段一般是接地。若将接地朝下,我这款公头左侧为左声道,右侧为右声道。具体的接线方式可以用万用表测量接头和接口得知。</p><p>将线穿入孔中,上一坨焊锡即可。</p><p><img src="/images/2022-06-03/04.JPG" alt="公头焊接"></p><p>再使用万用表测量接头与线末端的连通性,注意不能与其他线短路了。</p><p>确认无误后可以打上热熔胶固定。</p><p><img src="/images/2022-06-03/05.JPG" alt="热熔胶固定"></p><p>再打点热熔胶,旋回外壳,将热缩管套好,加热热缩管使其收缩。</p><p>3.5mm 线缆就制作完成了。</p><h4 id="驱动板焊接"><a href="#驱动板焊接" class="headerlink" title="驱动板焊接"></a>驱动板焊接</h4><p>驱动板上有三组线需要焊接:</p><ul><li>音频输入线(3.5mm 线缆)</li><li>电源输入线(Type C 线)</li><li>音频输出线(喇叭线)</li></ul><p>Type C 线我没有再用屏蔽线,用两根导线连接 Type C 母头和驱动板即可。</p><p>焊接方法就不多说了,线穿过孔,上锡即可。</p><p><img src="/images/2022-06-03/06.JPG" alt="焊接中的驱动板"></p><p>全部线缆焊接完成如下:</p><p><img src="/images/2022-06-03/07.JPG" alt="焊接完的驱动板"></p><h4 id="热熔胶填充"><a href="#热熔胶填充" class="headerlink" title="热熔胶填充"></a>热熔胶填充</h4><p>完成接线后,确认无短路,即可连接电脑测试音箱。</p><p>若没有问题,考虑到需要长期使用,就可以用热熔胶覆盖焊接处,防止焊点脱落。</p><p>用热熔胶覆盖之后的驱动板:</p><p><img src="/images/2022-06-03/08.JPG" alt="热熔胶覆盖的驱动板"></p><p>嘛…手艺不是很行。</p><hr><p>就此,外接音箱组装完成啦!</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>教程</tag>
<tag>DIY</tag>
</tags>
</entry>
<entry>
<title>迁移 Hexo 渲染环境至 GitHub Actions</title>
<link href="/archives/2e528779.html"/>
<url>/archives/2e528779.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>本博客使用的是 Hexo 静态博客框架,我将渲染环境搭建在家中 NAS 之上,部署了一个 Ubuntu Docker 并安装好了 Node.js 环境,正常使用了一两年。</p><p>上周末,写完新文章的我心血来潮,打算在更新博客的时候顺便更新一下老旧的 Node 和 Hexo(Node 12, Hexo 5.2)。</p><p>一番折腾之后,以 npm 和 hexo 环境全部被破坏(事后想想也许只是环境变量掉了)的下场结束。</p><p>鉴于 NAS 性能低下,更新一次 node module 都需要 30 分钟,我放弃了在 NAS 上重新部署渲染环境的念头,转而使用 GitHub Actions 渲染,并同时部署于 GitHub Pages 与 CloudFlare Pages。</p><h2 id="将渲染环境迁至-GitHub-Actions"><a href="#将渲染环境迁至-GitHub-Actions" class="headerlink" title="将渲染环境迁至 GitHub Actions"></a>将渲染环境迁至 GitHub Actions</h2><p>不久之前,CloudFlare Pages 悄悄下架了 Hexo 框架的部署功能,只能用 GitHub Actions 渲染,然后再部署至 CloudFlare Pages 了。</p><h3 id="项目结构的修改"><a href="#项目结构的修改" class="headerlink" title="项目结构的修改"></a>项目结构的修改</h3><p>若想使用 GitHub Actions,需要将博客的源码上传至 GitHub。考虑到隐私和安全的问题,建议创建一个私有仓库管理源码。</p><p>对于项目没有什么需要修改的,因为 Actions 渲染的流程和本地渲染的流程没有区别。</p><p>唯一需要改动的,是引入的主题。由于两个 Git 仓库不能嵌套,我们需要以 Git submodule 的形式引入主题仓库。</p><p>我使用的是 Fluid 主题。采用 <a href="https://hexo.fluid-dev.com/docs/guide/#%E8%A6%86%E7%9B%96%E9%85%8D%E7%BD%AE">覆盖配置</a> 的方法,即在根目录之下有一份配置会覆盖主题内的配置文件,便于在 Actions 中渲染。</p><p>以下也将以 Fluid 为例,请根据你使用的主题修改命令或代码。</p><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><code class="hljs bash">git submodule add https://github.com/fluid-dev/hexo-theme-fluid.git themes/fluid<br></code></pre></td></tr></table></figure><p>末尾的 <code>themes/fluid</code> 为此 submodule 在项目中的位置与名字,与先前本地渲染时的配置相同即可。</p><p>删除子模块的过程较为繁琐,请参考网上的文章进行操作。</p><p>在 Clone 此项目时,submodule 默认不会被下载,需要使用指令:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">git submodule update --init --recursive<br></code></pre></td></tr></table></figure><p>下载 submodule。在下面会提到的 Actions 配置文件中会出现这条指令。</p><p>接着,就可以将博客源码上传至 GitHub。</p><h3 id="GitHub-Actions-相关文件"><a href="#GitHub-Actions-相关文件" class="headerlink" title="GitHub Actions 相关文件"></a>GitHub Actions 相关文件</h3><p>在博客源码根目录创建 <code>.github/workflows/submit.yml</code> 和 <code>.github/script/blog-update.sh</code> 两个文件,填入下列代码。</p><p>以下代码参考文章 <a href="https://blog.kukmoon.com/f8bb4ee.html#23-%E7%BC%96%E5%86%99-workflow">GitHub Actions 自动部署 Hexo 博客到 cPanel 虚拟主机 - 谷中望月</a>,有所修改。</p><p><code>submit.yml</code>:</p><figure class="highlight yaml"><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><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">name:</span> <span class="hljs-string">CI</span><br><br><span class="hljs-comment"># 监听 main 分支的改动与 Release 的发布</span><br><span class="hljs-attr">on:</span><br> <span class="hljs-attr">push:</span><br> <span class="hljs-attr">branches:</span><br> <span class="hljs-bullet">-</span> <span class="hljs-string">main</span><br> <span class="hljs-attr">release:</span><br> <span class="hljs-attr">types:</span> [<span class="hljs-string">published</span>]<br><br><span class="hljs-comment"># 自定义环境变量</span><br><span class="hljs-attr">env:</span><br> <span class="hljs-attr">GIT_USER:</span> <span class="hljs-string">Lao-Liu233</span> <span class="hljs-comment"># 改成你自己的 GitHub 用户名</span><br> <span class="hljs-attr">GIT_EMAIL:</span> <span class="hljs-string">[email protected]</span> <span class="hljs-comment"># 改成你自己的 GitHub 注册邮箱</span><br><br><span class="hljs-attr">jobs:</span><br> <span class="hljs-attr">build:</span><br> <span class="hljs-attr">name:</span> <span class="hljs-string">Build</span> <span class="hljs-string">on</span> <span class="hljs-string">node</span> <span class="hljs-string">${{</span> <span class="hljs-string">matrix.node_version</span> <span class="hljs-string">}}</span> <span class="hljs-string">and</span> <span class="hljs-string">${{</span> <span class="hljs-string">matrix.os</span> <span class="hljs-string">}}</span><br> <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span><br> <span class="hljs-attr">strategy:</span><br> <span class="hljs-attr">matrix:</span><br> <span class="hljs-attr">os:</span> [<span class="hljs-string">ubuntu-latest</span>]<br> <span class="hljs-attr">node_version:</span> [<span class="hljs-number">16.15</span>] <span class="hljs-comment"># 改成你本地的 Node.js 版本,可以用 `node --version` 命令查询</span><br><br> <span class="hljs-attr">steps:</span><br> <span class="hljs-comment"># 获取博客源码</span><br> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Checkout</span><br> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v2</span><br> <br> <span class="hljs-comment"># 用 Node.js 渲染</span><br> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Use</span> <span class="hljs-string">Node.js</span> <span class="hljs-string">${{</span> <span class="hljs-string">matrix.node_version</span> <span class="hljs-string">}}</span><br> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/setup-node@v1</span><br> <span class="hljs-attr">with:</span><br> <span class="hljs-attr">node-version:</span> <span class="hljs-string">${{</span> <span class="hljs-string">matrix.node_version</span> <span class="hljs-string">}}</span><br><br> <span class="hljs-comment"># 安装 Hexo-cli </span><br> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Install</span> <span class="hljs-string">hexo</span><br> <span class="hljs-attr">run:</span> <span class="hljs-string">|</span><br><span class="hljs-string"> npm install -g hexo-cli</span><br><span class="hljs-string"></span><br> <span class="hljs-comment"># 安装依赖</span><br> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Install</span> <span class="hljs-string">dependencies</span> <br> <span class="hljs-attr">run:</span> <span class="hljs-string">|</span><br><span class="hljs-string"> npm install</span><br><span class="hljs-string"></span><br> <span class="hljs-comment"># 导入 submodule</span><br> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Clone</span> <span class="hljs-string">submodule</span><br> <span class="hljs-attr">run:</span> <span class="hljs-string">|</span><br><span class="hljs-string"> git submodule update --init --recursive</span><br><span class="hljs-string"></span><br> <span class="hljs-comment"># 配置环境</span><br> <span class="hljs-comment"># ssh-kenscan github.com >> ~/.ssh/known_hosts # 从 GitHub 获取公钥并保存到 known_hosts 文件</span><br> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Configuration</span> <span class="hljs-string">environment</span><br> <span class="hljs-attr">run:</span> <span class="hljs-string">|</span><br><span class="hljs-string"> sudo timedatectl set-timezone "Asia/Shanghai"</span><br><span class="hljs-string"> mkdir -p ~/.ssh/</span><br><span class="hljs-string"> echo "$HEXO_DEPLOY_PRI" > ~/.ssh/id_rsa</span><br><span class="hljs-string"> chmod 600 ~/.ssh/id_rsa</span><br><span class="hljs-string"> ssh-keyscan github.com >> ~/.ssh/known_hosts</span><br><span class="hljs-string"> git config --global user.name $GIT_USER</span><br><span class="hljs-string"> git config --global user.email $GIT_EMAIL</span><br><span class="hljs-string"></span><br> <span class="hljs-comment"># 生成并部署</span><br> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Deploy</span> <span class="hljs-string">hexo</span><br> <span class="hljs-attr">run:</span> <span class="hljs-string">|</span><br><span class="hljs-string"> hexo clean</span><br><span class="hljs-string"> hexo g -d</span><br><span class="hljs-string"></span><br> <span class="hljs-comment"># 部署后更新博客源码,用于添加 abbrlink,如果不用 abbrlink,需要删除</span><br> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Update</span> <span class="hljs-string">Blog</span><br> <span class="hljs-attr">run:</span> <span class="hljs-string">|</span><br> <span class="hljs-string">sh</span> <span class="hljs-string">"${GITHUB_WORKSPACE}/.github/script/blog-update.sh"</span><br></code></pre></td></tr></table></figure><p><code>.github/script/blog-update.sh</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></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/sh</span><br><br><span class="hljs-keyword">if</span> [ -z <span class="hljs-string">"<span class="hljs-subst">$(git status --porcelain)</span>"</span> ]; <span class="hljs-keyword">then</span><br> <span class="hljs-built_in">echo</span> <span class="hljs-string">"nothing to update."</span><br><span class="hljs-keyword">else</span><br> git add <span class="hljs-built_in">source</span>/_posts/<span class="hljs-comment">#仅对文章源码所在文件夹进行修改</span><br> git commit -m <span class="hljs-string">"triggle by commit <span class="hljs-variable">${GITHUB_SHA}</span>"</span> -a<br> git push origin main<br><span class="hljs-keyword">fi</span><br></code></pre></td></tr></table></figure><p>Commit + Push,打开 Actions 界面,就能看到正在运行的 Action 啦。</p><p>不出意外,Action 成功执行,1分钟内博客就能渲染成功、部署至 GitHub Pages。</p><h2 id="同时部署至-CloudFlare-Pages"><a href="#同时部署至-CloudFlare-Pages" class="headerlink" title="同时部署至 CloudFlare Pages"></a>同时部署至 CloudFlare Pages</h2><p>步骤较为简单,我简述一下。</p><p>打开 CloudFlare Pages, 连接至存放 <strong>渲染后</strong> 的静态文件的仓库,渲染的框架选择 <strong>None</strong>,执行的指令填写 <code>exit 0;</code> 就可以了。</p><p>执行部署后,渲染后的静态文件就被部署至 CloudFlare Pages 啦。</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>教程</tag>
<tag>GitHub Actions</tag>
<tag>Hexo</tag>
</tags>
</entry>
<entry>
<title>DELL 灵越 15 5547 拆解与更换硅脂</title>
<link href="/archives/9d319c54.html"/>
<url>/archives/9d319c54.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>DELL 灵越 15 5547,Intel i5-6200U,Nvidia Geforce 630M,8G DDR3-1600 + 256G SATA SSD(后期改装),是我的第一台笔记本。这台笔记本的拆机过程比较繁琐,是我目前遇见的最难拆解的电脑,故作此文章,分享一下如何拆解一台笔记本,并为其更换硅脂。</p><p><img src="/images/2022-05-22/01.JPG" alt="A面"></p><h2 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h2><p>本次拆机共耗时 1H 30Min,是拆解正常机器所花费时间的两到三倍。</p><p>拆解步骤包括:卸下后盖、拆除电池、拆除硬盘、拆除风扇、拆除键盘、卸下基座、卸下散热器、更换硅脂,然后是逆序执行上述拆解步骤,组装电脑。</p><h2 id="拆解准备"><a href="#拆解准备" class="headerlink" title="拆解准备"></a>拆解准备</h2><p>拆机少不了一套好工具。</p><p>为了无伤拆机,需要准备一套好用的螺丝刀防止螺丝滑牙;还需要一套塑料拆机工具,用于撬开后盖。</p><p>笔记本的硅脂,我选择了霍尼韦尔 7950 相变硅脂,不容易挥发,不需要经常更换。</p><h2 id="开始拆机"><a href="#开始拆机" class="headerlink" title="开始拆机"></a>开始拆机</h2><h3 id="怎么拆呢"><a href="#怎么拆呢" class="headerlink" title="怎么拆呢"></a>怎么拆呢</h3><p>其实几个月前我就有给这台设备清灰、换硅脂的念头,但拆开机器之后我发现主板被塑料框架罩住了,无法拆下散热器。我研究了半天也没找到拆下框架的方法,便只清理了风扇的灰尘,没有更换硅脂。</p><p>而这次,我有备而来:我查到了 <a href="https://downloads.dell.com/manuals/all-products/esuprt_laptop/esuprt_inspiron_laptop/inspiron-15-5547-laptop_owner%27s%20manual_zh-cn.pdf">DELL 官方的用户手册</a> ,其中详细记载了拆解这台机器的方法。接下来的拆解步骤就严格按照官方的教程啦。</p><h3 id="第一步:卸下后盖"><a href="#第一步:卸下后盖" class="headerlink" title="第一步:卸下后盖"></a>第一步:卸下后盖</h3><p>翻到 D 面,拧下两颗固定螺丝,就能将后盖拆下,可以触及无线网卡、内存条、2.5 寸硬盘、电池和散热风扇,日常需要维护的部件都能轻松触及,好评。散热器和主板则在塑料框架之下。</p><p><img src="/images/2022-05-22/03.JPG" alt="D面后盖之下"></p><h3 id="第二步:拆除电池"><a href="#第二步:拆除电池" class="headerlink" title="第二步:拆除电池"></a>第二步:拆除电池</h3><p>释放主板电荷是电脑拆机中至关重要的一步!</p><p>在主板带电的情况下拔插任何端子都是不明智的做法,很可能会将主板上的高电压线路误接入低电压线路(例如拔插屏线时没有正对接口),烧坏一片元件。</p><p>这台机子的电池没有排线,直接接入主板。卸下围绕电池的四颗螺丝,手提塑料片,就可将电池卸下。</p><p>翻到 C 面,长按电源键 10s,可重复两到三次,确保主板中的电荷完全释放。</p><p><img src="/images/2022-05-22/04.JPG" alt="电池模块"></p><p>第一次见这种电池模块,比起长条状的电池可以更好地利用机身空间。</p><h3 id="第三到五步:拆除硬盘、散热风扇和键盘"><a href="#第三到五步:拆除硬盘、散热风扇和键盘" class="headerlink" title="第三到五步:拆除硬盘、散热风扇和键盘"></a>第三到五步:拆除硬盘、散热风扇和键盘</h3><p>卸下固定硬盘座的螺丝,抽出硬盘,再断开 SATA 与供电二合一的线缆,即可取下硬盘。</p><p>拔下主板上散热风扇的端子(位于风扇左侧),卸下固定螺丝,即可取下散热风扇。</p><p>翻到 C 面,用手或塑料工具扣出键盘模块,注意不要大力提起键盘!小心地提起一段距离,断开机身上的排线,键盘就取下来了。裸 C 面上还有两条排线,都需要断开。竖直方向排线需从孔洞中穿回 D 面。</p><p><img src="/images/2022-05-22/02.JPG" alt="裸C面"></p><h3 id="第六步:卸下基座"><a href="#第六步:卸下基座" class="headerlink" title="第六步:卸下基座"></a>第六步:卸下基座</h3><p>这是我第一次见笔记本中的基座,没有手册的指导很难拆下。</p><p>首先,确保 C 面两根排线已断开。</p><p>翻到 D 面,小心地断开屏幕排线(位于散热风扇左侧)。</p><p>再翻到 C 面,按手册图示卸下所有螺丝。</p><p>翻回 D 面,同样地卸下一堆螺丝,注意这两面的螺丝都是 M2.5x7 规格,长于主板用螺丝,混用可能会戳穿主板。</p><p>DELL 在机身和框架上都有标注螺丝孔对应螺丝的规格,非常好评!</p><p>确认卸下所有螺丝后,用塑料工具插入基座与机身的缝隙,划开卡口。</p><p>待大部分卡口都解开时,小心提起基座,注意将基座上的线缆和排线取下,基座就彻底与机身分离了。</p><p><img src="/images/2022-05-22/05.JPG" alt="基座背面"></p><p>基座的背面,可以看到是 PC + ABS 材料,分量很足。</p><p><img src="/images/2022-05-22/06.JPG" alt="拆下基座后的机身"></p><p>拆下基座之后的机身,暴露出了主板和子板。散热器是梦幻单热管,不过压这两个破芯片足够了。</p><h3 id="第七步:卸下散热器"><a href="#第七步:卸下散热器" class="headerlink" title="第七步:卸下散热器"></a>第七步:卸下散热器</h3><p>散热器共有六颗螺丝,四颗在 CPU 上,两颗在显卡上。</p><p>为了使散热器均匀受力,不能一次性直接拧下一颗螺丝,而是平均为每颗螺丝卸力,可以每个螺丝一次转两圈,直到所有螺丝都被卸下。裸晶脆弱,有必要好好保护一下。</p><p><img src="/images/2022-05-22/07.JPG" alt="CPU的旧硅脂"></p><p>不难看出,CPU 上的硅脂全部凝固,且裸晶上的硅脂基本流失殆尽(散热器上也没剩多少)。</p><p>去除大部分凝固的硅脂,再用酒精片擦拭、用布擦干。</p><p>更换硅脂的步骤我就不在此赘述,商家一般会提供详细的视频介绍,按着教程做就可以了。</p><p><img src="/images/2022-05-22/08.JPG" alt="干净的CPU"></p><p>i5-6200U 的全貌,右侧长条状的裸晶应该是集成显卡吧。</p><p><img src="/images/2022-05-22/09.JPG" alt="擦干净的GPU"></p><p>Geforce 930M 显卡,非常小个。</p><p><img src="/images/2022-05-22/10.JPG" alt="显存芯片"></p><p>DDR3 显存,封装方式和 DDR4 不一样,更扁一些。</p><h3 id="后续步骤"><a href="#后续步骤" class="headerlink" title="后续步骤"></a>后续步骤</h3><p>接下来就是逆序刚刚的拆解步骤,我就不再赘述。</p><p>注意几点:</p><ul><li>安装散热器时也需保证受力均匀,且不能过分用力,可能会压碎裸晶。</li><li>安装基座时注意将线缆与排线置于合适的位置,不要被基座压到了。</li></ul><p>拼装完成后,插电,开机,轻松点亮。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>拆解一台电脑并没有想象中的那么困难,拆解不同电脑的方式也都大同小异,上述的步骤一般都能适用。</p><p>我已拆解了不下 10 台/次 笔记本,目前还未翻过车。</p><p>下次清灰、更换硅脂,试着自己动手吧!</p>]]></content>
<categories>
<category>随笔</category>
</categories>
<tags>
<tag>随笔</tag>
</tags>
</entry>
<entry>
<title>Virmach Japan</title>
<link href="/archives/28fa0729.html"/>
<url>/archives/28fa0729.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>老朋友 Virmach 最近搞了场日本的预售。上游是 XTom,线路走的 IIJ。配置从 1C 384M 到 2C 2.5G 都有,价格则是 11.11刀/年 起(预售打 8 折, 8.89刀/年起)。</p><p>我买的这台是折后 9.7刀/年,1C 768M 20G NVME 2T 双向流量的配置。</p><span id="more"></span><hr><p>直观感受:性能强劲,白天网络不错。晚高峰也能用,不爆炸。</p><p>下面放测试数据:</p><h3 id="综合测试"><a href="#综合测试" class="headerlink" title="综合测试"></a>综合测试</h3><p><img src="/images/2022-04-06/Bench.png"></p><p>CPU 很幸运地抽中了 5900X,可以看到硬盘速度非常 OK。</p><p>早上的网络情况很不错,没指望能跑满 G 口,毕竟这么多人分 10G 的口子。</p><h3 id="性能测试"><a href="#性能测试" class="headerlink" title="性能测试"></a>性能测试</h3><p><img src="/images/2022-04-06/UNIXBench.jpg"></p><p>不愧是 5900X,单核跑出了部分志强将近3倍的成绩!AMD, YES!</p><p>开一台 2C 2G 的机子完全可以当作开发服务器使了。</p><h3 id="国内网络测试"><a href="#国内网络测试" class="headerlink" title="国内网络测试"></a>国内网络测试</h3><h4 id="白天"><a href="#白天" class="headerlink" title="白天"></a>白天</h4><p><img src="/images/2022-04-06/SuperSpeed-Morning.png"></p><p>三网表现均不错呢。</p><h4 id="晚高峰"><a href="#晚高峰" class="headerlink" title="晚高峰"></a>晚高峰</h4><p><img src="/images/2022-04-06/SuperSpeed-Night.png"></p><p>惊了,晚高峰表现很不错耶。</p><h3 id="流媒体解锁"><a href="#流媒体解锁" class="headerlink" title="流媒体解锁"></a>流媒体解锁</h3><p><img src="/images/2022-04-06/Streaming.png"></p><p>Virmach 只字没提流媒体,就别报多大希望。</p><p>不过作为日本的 VPS 自家游戏都不能解锁……这 IP 优化的不大行。</p><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>网络不错,性能强劲,如此便宜的价格可以说性价超高。</p>]]></content>
<categories>
<category>小鸡测评</category>
</categories>
<tags>
<tag>小鸡测评</tag>
</tags>
</entry>
<entry>
<title>玩一玩 DN42</title>
<link href="/archives/dbf21067.html"/>
<url>/archives/dbf21067.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>两个月前,我向 DN42 提交了申请,并于4个小时后通过了审核,获得了自己的 AS 和 IP。</p><p>作此文分享一下把玩 DN42 的心得,也作为我的备忘录。</p><h2 id="我的信息"><a href="#我的信息" class="headerlink" title="我的信息"></a>我的信息</h2><figure class="highlight maxima"><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><code class="hljs maxima">AS4242423490<br>IPv4: <span class="hljs-number">172.23</span><span class="hljs-number">.13</span><span class="hljs-number">.64</span>/<span class="hljs-number">28</span><br>IPv6: fd44:<span class="hljs-number">6b93</span>:4eaa::/<span class="hljs-number">48</span><br></code></pre></td></tr></table></figure><p>目前仅一个洛杉矶节点开放 Peer,后期还将添加韩国和日本的节点。</p><h2 id="如何把玩"><a href="#如何把玩" class="headerlink" title="如何把玩"></a>如何把玩</h2><h3 id="注册"><a href="#注册" class="headerlink" title="注册"></a>注册</h3><p>有关注册的文章很多,推荐这两篇:</p><p><a href="https://lantian.pub/article/modify-website/dn42-experimental-network-2020.lantian/">DN42 实验网络介绍及注册教程(2022-02 更新) | Lan Tian @ Blog</a></p><p><a href="https://blog.baoshuo.ren/post/dn42-network/#">初探 DN42 网络 - 宝硕博客 (baoshuo.ren)</a></p><p>需要使用 Git 和 PGP,在 DN42 的 Git 仓库提交你的个人信息即可完成注册。</p><h3 id="搭建内网"><a href="#搭建内网" class="headerlink" title="搭建内网"></a>搭建内网</h3><p>在和其他 AS 建立对等连接之前,我们先要把内网整理好:</p><p>各台服务器的地理位置和网络位置各不相同,需要使用 VPN 创建虚拟局域网。</p><p>课堂上讲了两种内网路由协议:</p><ul><li><p>RIP 是“真”内网用的,不适用于这种物理位置距离较远(路由跳数多)的虚拟内网;</p></li><li><p>可以使用 OSPF,但我在配置的时候遇到了不少问题,因此也不建议你使用。</p></li></ul><p>有一位老朋友可以轻松解决以上两个问题:<strong>Zerotier</strong>。</p><p>Zerotier 的虚拟网络可以使用自己的 IP,只需在 <strong>Managed Routes</strong> 中设置你在 DN42 申请的 IPv4 和 IPv6,即可为每台加入虚拟网络的主机自动或手动配置 DN42 IP。</p><p>在机器之间使用 DN42 IP 互 ping 测试连通性。</p><h3 id="准备-BGP-相关软件"><a href="#准备-BGP-相关软件" class="headerlink" title="准备 BGP 相关软件"></a>准备 BGP 相关软件</h3><p>搭建好内网之后,就可以开始配置 BGP 发言人啦。</p><p>选择一台或多台服务器,作为自治域向外宣告路由的发言人。</p><p>在每台服务器上都需要配置 BGP 相关的软件,以及和其他 BGP 发言人建立连接(一般是 VPN 连接)的软件。</p><p>目前在 DN42 网络用的比较多的 VPN 软件是 Wireguard,BGP 软件则可以从 bird 2、bird 1、quagga 等软件中选择。</p><p>我使用的是 bird 2。</p><h4 id="安装与配置-BIRD-2"><a href="#安装与配置-BIRD-2" class="headerlink" title="安装与配置 BIRD 2"></a>安装与配置 BIRD 2</h4><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><code class="hljs bash">apt update<br>apt install bird2 -y<br></code></pre></td></tr></table></figure><p>bird 2 的配置文件位于 <code>/etc/bird</code>,名为 <code>bird.conf</code>。</p><p>配置文件可以参考(<del>照抄</del>)DN42 官方给出的配置:<a href="https://dn42.dev/howto/Bird2#example-configuration">howto/Bird2 (dn42.dev)</a></p><p>喂到嘴边的配置方法:</p><ul><li>将官方配置填入 <code>/etc/bird/bird.conf</code></li><li>在 <code>/etc/bird</code> 目录下新建名为 <code>peers</code> 的文件夹</li><li>下载 ROA 配置(命令来自<a href="https://blog.baoshuo.ren/">宝硕的博客</a>)</li></ul><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><code class="hljs bash">wget -4 -O /tmp/dn42_roa.conf https://dn42.burble.com/roa/dn42_roa_bird2_4.conf && <span class="hljs-built_in">mv</span> -f /tmp/dn42_roa.conf /etc/bird/dn42_roa.conf<br>wget -4 -O /tmp/dn42_roa_v6.conf https://dn42.burble.com/roa/dn42_roa_bird2_6.conf && <span class="hljs-built_in">mv</span> -f /tmp/dn42_roa_v6.conf /etc/bird/dn42_roa_v6.conf<br></code></pre></td></tr></table></figure><p>并配置 crontab,每小时自动下载并重载新配置:</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><code class="hljs bash">0 */1 * * * wget -4 -O /tmp/dn42_roa.conf https://dn42.burble.com/roa/dn42_roa_bird2_4.conf && <span class="hljs-built_in">mv</span> -f /tmp/dn42_roa.conf /etc/bird/dn42_roa.conf<br>0 */1 * * * wget -4 -O /tmp/dn42_roa_v6.conf https://dn42.burble.com/roa/dn42_roa_bird2_6.conf && <span class="hljs-built_in">mv</span> -f /tmp/dn42_roa_v6.conf /etc/bird/dn42_roa_v6.conf<br>0 */1 * * * birdc configure<br></code></pre></td></tr></table></figure><h4 id="安装并配置-Wireguard"><a href="#安装并配置-Wireguard" class="headerlink" title="安装并配置 Wireguard"></a>安装并配置 Wireguard</h4><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><code class="hljs bash">apt update<br>apt install wireguard -y<br></code></pre></td></tr></table></figure><p>这样就安装了 <code>Wireguard</code> 和名为 <code>wg-quick</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><code class="hljs bash">wg genkey | <span class="hljs-built_in">tee</span> privatekey | wg pubkey > publickey<br></code></pre></td></tr></table></figure><p>在当前目录下创建 Wireguard 建立连接所用的密钥对(公钥和私钥)。</p><p>就此 Wireguard 安装完成。</p><h4 id="配置系统内核"><a href="#配置系统内核" class="headerlink" title="配置系统内核"></a>配置系统内核</h4><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></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">echo</span> <span class="hljs-string">"net.ipv4.ip_forward=1"</span> >> /etc/sysctl.conf<br><span class="hljs-built_in">echo</span> <span class="hljs-string">"net.ipv6.conf.default.forwarding=1"</span> >> /etc/sysctl.conf<br><span class="hljs-built_in">echo</span> <span class="hljs-string">"net.ipv6.conf.all.forwarding=1"</span> >> /etc/sysctl.conf<br>sysctl -p<br></code></pre></td></tr></table></figure><p>关闭内核 <code>rp_filter</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></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">echo</span> <span class="hljs-string">"net.ipv4.conf.default.rp_filter=0"</span> >> /etc/sysctl.conf<br><span class="hljs-built_in">echo</span> <span class="hljs-string">"net.ipv4.conf.all.rp_filter=0"</span> >> /etc/sysctl.conf<br>sysctl -p<br></code></pre></td></tr></table></figure><p>如果有 ufw 等防火墙自动配置工具,务必关闭。</p><p>p.s. 我拿到任何机器后会立刻执行的指令是:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">sudo</span> ufw <span class="hljs-built_in">disable</span><br></code></pre></td></tr></table></figure><h4 id="创建-Dummy-网卡"><a href="#创建-Dummy-网卡" class="headerlink" title="创建 Dummy 网卡"></a>创建 Dummy 网卡</h4><p>dummy 网卡具体的作用我不是很清楚…</p><p>只知道如果要用链路本地地址进行通讯,要把 DN42 的 IP 地址绑定到 dummy 网卡上。</p><p>dummy 网卡配置指令如下:([ ] 中为需要你填写的内容)</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><code class="hljs bash">ip <span class="hljs-built_in">link</span> del dummy<br>ip <span class="hljs-built_in">link</span> add dummy <span class="hljs-built_in">type</span> dummy<br>ip addr add [你的 DN42 IPv4 地址]/32 dev dummy<br>ip addr add [你的 DN42 IPv6 地址]/128 dev dummy<br>ip <span class="hljs-built_in">link</span> <span class="hljs-built_in">set</span> dummy up<br></code></pre></td></tr></table></figure><h3 id="和小伙伴建立对等连接(peer)"><a href="#和小伙伴建立对等连接(peer)" class="headerlink" title="和小伙伴建立对等连接(peer)"></a>和小伙伴建立对等连接(peer)</h3><h4 id="需要和对方分享的"><a href="#需要和对方分享的" class="headerlink" title="需要和对方分享的"></a>需要和对方分享的</h4><ul><li>你的 DN42 信息,包括 AS 号和发言人的 DN42 IPv4(IPv6)地址;</li><li>若使用链路本地地址,还需提供这东西,一般为一个本地 IPv6 地址,常取 <code>fe80::[你的 AS 号后4位]</code>;</li><li>发言人的外网 IPv4 地址(或域名)和 Wireguard 隧道的通讯端口;</li><li>Wireguard 公钥。</li></ul><p>有一些信息会在以下的配置中获得。</p><h4 id="Wireguard-相关的"><a href="#Wireguard-相关的" class="headerlink" title="Wireguard 相关的"></a>Wireguard 相关的</h4><p>在 <code>/etc/wireguard</code> 目录下创建 Wireguard 配置文件,每一个配置文件对应着一个 Wireguard 隧道。</p><p>例如你要和 AS114514 <del>臭</del> 建立对等连接,可以在 <code>peers</code> 文件夹下新建一个名为 <code>wg_114514.conf</code> (文件名即为 wireguard 隧道名)的配置文件。</p><p>配置的模板如下:([ ] 中为需要你填写的内容)</p><figure class="highlight ini"><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></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-section">[Interface]</span><br><span class="hljs-attr">Table</span> = <span class="hljs-literal">off</span><br><span class="hljs-attr">ListenPort</span> = [我们的监听端口,可以用对方 AS 号的后五位]<br><span class="hljs-attr">PrivateKey</span> = [刚刚生成的 Wireguard 私钥]<br><span class="hljs-attr">PostUp</span> = ip addr add [本机的 DN42 IPv4 地址]/<span class="hljs-number">32</span> peer [对方机器的 DN42 IPv4 地址]/<span class="hljs-number">32</span> dev %i<br><span class="hljs-attr">PostUp</span> = ip addr add [本机的链路本地地址(见 BIRD 相关配置)]/<span class="hljs-number">64</span> dev %i<br><br><span class="hljs-section">[Peer]</span><br><span class="hljs-attr">PublicKey</span> = [对方的 Wireguard 公钥]<br><span class="hljs-attr">AllowedIPs</span> = <span class="hljs-number">10.0</span>.<span class="hljs-number">0.0</span>/<span class="hljs-number">8</span>, <span class="hljs-number">172.20</span>.<span class="hljs-number">0.0</span>/<span class="hljs-number">14</span>, <span class="hljs-number">172.31</span>.<span class="hljs-number">0.0</span>/<span class="hljs-number">16</span>, fd00::/<span class="hljs-number">8</span>, fe80::/<span class="hljs-number">64</span><br><span class="hljs-attr">Endpoint</span> = [对方机器的公网 IP 地址或域名 : 端口号]<br></code></pre></td></tr></table></figure><p>然后使用 <code>wg-quick up [wireguard 隧道名(刚刚的配置文件名)]</code> 启动 Wireguard 隧道。</p><p>可以 ping 一下对方的 DN42 IP 看看 Wireguard 隧道是否连接成功。</p><p>使用 <code>wg</code> 命令查看各隧道的连接情况。若有显示 <code>last handshake</code>,一般情况下隧道就已成功建立。</p><h4 id="BIRD-相关的"><a href="#BIRD-相关的" class="headerlink" title="BIRD 相关的"></a>BIRD 相关的</h4><p>在先前导入的 bird 2 配置中定义了一个 <code>peers</code> 文件夹,就是用来存放 peer 相关的配置。</p><p>例如你要和 AS114514 <del>又臭</del> 建立对等连接,可以在 <code>peers</code> 文件夹下新建一个名为 <code>114514.conf</code> (文件名可自定义)的配置文件。</p><p>我采用的是<a href="https://zh.wikipedia.org/wiki/%E9%93%BE%E8%B7%AF%E6%9C%AC%E5%9C%B0%E5%9C%B0%E5%9D%80">链路本地地址(Link-Local)</a>的配置方法。配置的模板如下:([ ] 中为需要你填写的内容)</p><figure class="highlight inform7"><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><code class="hljs inform7">protocol bgp <span class="hljs-comment">[peer的名字]</span> from dnpeers {<br> neighbor <span class="hljs-comment">[对方的链路本地地址]</span> % '<span class="hljs-comment">[通向对方的 Wiregurad 隧道名]</span>' as <span class="hljs-comment">[对方的 AS 号]</span>;<br>}<br></code></pre></td></tr></table></figure><p>添加完配置之后别忘了用 <code>birdc configure</code> 重载 bird 2 配置。</p><p>使用命令 <code>birdc s p</code> 可以查看 BIRD 2 软件下所有协议的通信情况。</p><p>若显示为:</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">dn42_xxxx</span> BGP --- up <span class="hljs-number">20</span>:<span class="hljs-number">36</span>:<span class="hljs-number">30</span>.<span class="hljs-number">984</span> Established<br></code></pre></td></tr></table></figure><p>则表示 BGP 连接已建立。</p><h2 id="尾声"><a href="#尾声" class="headerlink" title="尾声"></a>尾声</h2><p>我还在写 DN42 相关的站点,在上面分享节点信息,方便大家 peer。</p><p>但目前进度缓慢(悲)。</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>教程</tag>
</tags>
</entry>
<entry>
<title>合宙 EPS32-C3 把玩记录(二):WiFi 与一个 Web 程序</title>
<link href="/archives/9b58c98e.html"/>
<url>/archives/9b58c98e.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h2 id="了解一下相关的库"><a href="#了解一下相关的库" class="headerlink" title="了解一下相关的库"></a>了解一下相关的库</h2><ul><li><h3 id="串口通信"><a href="#串口通信" class="headerlink" title="串口通信"></a>串口通信</h3></li></ul><p>这个库是自带的,不需要引入。</p><p>据我的理解,单片机的串口就是控制台程序的控制台,可以返回一些信息给上位机。</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></pre></td><td class="code"><pre><code class="hljs c">Serial.begin(Baudrate);<span class="hljs-comment">//参数为串口通信的波特率</span><br>Serial.end();<br>Serial.read();<span class="hljs-comment">//读取串口收到数据的第一个字节</span><br>Serial.peek();<span class="hljs-comment">//读取串口数据中下一字节的内容</span><br>Serial.flush();<span class="hljs-comment">//清空缓冲区</span><br>Serial.print/println();<span class="hljs-comment">//不用多说</span><br>Serial.write();<span class="hljs-comment">//写二进制数据</span><br></code></pre></td></tr></table></figure><ul><li><h3 id="WiFi-h"><a href="#WiFi-h" class="headerlink" title="WiFi.h"></a>WiFi.h</h3></li></ul><p><code>#include <WiFi.h></code></p><h4 id="AP(接入点)-Mode"><a href="#AP(接入点)-Mode" class="headerlink" title="AP(接入点) Mode"></a>AP(接入点) Mode</h4><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></pre></td><td class="code"><pre><code class="hljs c">WiFi.mode(WiFi_AP);<span class="hljs-comment">//设置工作在 AP 模式</span><br>WiFi.softAPConfig(local_IP, gateway, subnet);<br><span class="hljs-comment">//定义本机 IP(这个不大确定)、网关 IP 和子网掩码</span><br><span class="hljs-comment">//IPAddress 数据类型格式:IPAddress local_IP(192,168,4,22);</span><br>WiFi.softAP(SSID,PASSWD);<span class="hljs-comment">//启动 AP,参数不多解释,返回 bool </span><br></code></pre></td></tr></table></figure><p>更多函数见 <a href="https://blog.csdn.net/Naisu_kun/article/details/86165403#_28">WiFi.h AP 常用方法说明</a></p><h4 id="STA(站点)-Mode"><a href="#STA(站点)-Mode" class="headerlink" title="STA(站点) Mode"></a>STA(站点) Mode</h4><p>接入一个 AP。</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></pre></td><td class="code"><pre><code class="hljs c">WiFi.mode(WIFI_STA); <span class="hljs-comment">//设置工作在 STA 模式</span><br>WiFi.start(SSID,PASSWD)<span class="hljs-comment">//连接至 AP,参数不多解释</span><br>Serial.println(WiFi.localIP());<span class="hljs-comment">//打印本机 IP,省的去路由器管理界面看</span><br></code></pre></td></tr></table></figure><p>更多函数见 <a href="https://blog.csdn.net/Naisu_kun/article/details/86165403#_130">WiFi.h STA 常用方法说明</a></p><ul><li><h2 id="WebServer-h"><a href="#WebServer-h" class="headerlink" title="WebServer.h"></a>WebServer.h</h2></li></ul><p><code>#include <WebServer.h></code></p><p>创建一个简单的网站服务器。真的很简单。</p><p>一个个函数讲有点难理解,我放在这节的例程里面说明。</p><h2 id="写一个测试程序吧"><a href="#写一个测试程序吧" class="headerlink" title="写一个测试程序吧"></a>写一个测试程序吧</h2><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></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><WiFi.h></span></span><br><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><WebServer.h></span></span><br><span class="hljs-comment">//引入所需要的两个库</span><br><br><span class="hljs-type">const</span> <span class="hljs-type">char</span> *SSID = <span class="hljs-string">"YOUR_SSID"</span>;<br><span class="hljs-type">const</span> <span class="hljs-type">char</span> *PASSWORD = <span class="hljs-string">"YOUR_PASSWORD"</span>;<br><br>WebServer <span class="hljs-title function_">server</span><span class="hljs-params">(<span class="hljs-number">80</span>)</span>;<span class="hljs-comment">//网站服务器将运行在 80 端口</span><br><br><span class="hljs-type">void</span> <span class="hljs-title function_">handleIndex</span><span class="hljs-params">()</span><span class="hljs-comment">//收到 HTTP 请求的回调函数</span><br>{<br> server.send(<span class="hljs-number">200</span>, <span class="hljs-string">"text/plain"</span>, <span class="hljs-string">"Hello from ESP32!"</span>);<br> <span class="hljs-comment">//发送 HTTP 相应,内容分别为:状态码,Content-Type,响应体</span><br>}<br><br><span class="hljs-type">void</span> <span class="hljs-title function_">setup</span><span class="hljs-params">()</span><br>{<br> Serial.begin(<span class="hljs-number">9600</span>);<span class="hljs-comment">//开启串口,波特率设置为 9600</span><br> Serial.println();<br><br> WiFi.mode(WIFI_STA);<span class="hljs-comment">//设置工作在 STA 模式</span><br> WiFi.begin(SSID, PASSWORD);<span class="hljs-comment">//连接至指定 AP</span><br> <span class="hljs-keyword">while</span> (WiFi.status() != WL_CONNECTED) <span class="hljs-comment">//等待网络连接成功</span><br> {<br> delay(<span class="hljs-number">500</span>);<br> Serial.print(<span class="hljs-string">"."</span>);<span class="hljs-comment">//将连接信息输出至串口</span><br> }<br> Serial.println(<span class="hljs-string">"WiFi connected!"</span>);<br><br> Serial.println(<span class="hljs-string">"IP address: "</span>);<br> Serial.println(WiFi.localIP()); <span class="hljs-comment">//打印本机 IP</span><br><br> server.on(<span class="hljs-string">"/"</span>, handleIndex);<span class="hljs-comment">//注册链接(类似与注册一个路由),并选择回调函数</span><br> <span class="hljs-comment">//同样的,还可以注册别的链接,如</span><br> <span class="hljs-comment">//server.on("/test", handleIndexTest);</span><br> <br> server.begin();<span class="hljs-comment">//开启 HTTP 服务器</span><br> Serial.println(<span class="hljs-string">"WebServer begin!"</span>);<br>}<br><br><span class="hljs-type">void</span> <span class="hljs-title function_">loop</span><span class="hljs-params">()</span><br>{<br> server.handleClient();<span class="hljs-comment">//不断相应 HTTP 请求</span><br>}<br></code></pre></td></tr></table></figure><p>访问串口返回的 IP,即可看到 <code>Hello from ESP32!</code> 这句话啦。</p><h2 id="还有个-Web-Server-叫-ESPAsyncWebServer"><a href="#还有个-Web-Server-叫-ESPAsyncWebServer" class="headerlink" title="还有个 Web Server 叫 ESPAsyncWebServer"></a>还有个 Web Server 叫 ESPAsyncWebServer</h2><p>自带的 WebServer 是同步的,只支持处理一个连接。对于这种体量的机器其实足够了。</p><p>顺便学习一下一个第三方库吧。</p><h3 id="添加库"><a href="#添加库" class="headerlink" title="添加库"></a>添加库</h3><p>对于这款 ESP32,需要下载并导入两个库(源码 ZIP 即可):</p><p><a href="https://github.com/me-no-dev/AsyncTCP">me-no-dev/AsyncTCP: Async TCP Library for ESP32</a></p><p><a href="https://github.com/me-no-dev/ESPAsyncWebServer">me-no-dev/ESPAsyncWebServer: Async Web Server for ESP8266 and ESP32</a></p><p>在 Arduino 的<code>项目 > 加载库 > 添加 .ZIP 库</code>中导入这两个库。</p><h3 id="用-ESPAsyncWebServer-重写刚刚的例程吧"><a href="#用-ESPAsyncWebServer-重写刚刚的例程吧" class="headerlink" title="用 ESPAsyncWebServer 重写刚刚的例程吧"></a>用 ESPAsyncWebServer 重写刚刚的例程吧</h3><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></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><WiFi.h></span></span><br><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><ESPAsyncWebServer.h></span></span><br><span class="hljs-comment">//注意替换为新的库</span><br><br><span class="hljs-type">const</span> <span class="hljs-type">char</span> *SSID = <span class="hljs-string">"YOUR_SSID"</span>;<br><span class="hljs-type">const</span> <span class="hljs-type">char</span> *PASSWORD = <span class="hljs-string">"YOUR_PASSWORD"</span>;<br><br>ESPAsyncWebServer <span class="hljs-title function_">server</span><span class="hljs-params">(<span class="hljs-number">80</span>)</span>; <span class="hljs-comment">//同样替换为新的对象</span><br><br><span class="hljs-type">void</span> <span class="hljs-title function_">handleIndex</span><span class="hljs-params">(AsyncWebServerRequest *request)</span> <span class="hljs-comment">//回调函数有更改</span><br>{<br> request->send(<span class="hljs-number">200</span>, <span class="hljs-string">"text/plain"</span>, <span class="hljs-string">"Hello, world!"</span>);<br> <span class="hljs-comment">//发送 HTTP 相应,内容相同</span><br>}<br><br><span class="hljs-type">void</span> <span class="hljs-title function_">setup</span><span class="hljs-params">()</span><br>{<br> Serial.begin(<span class="hljs-number">9600</span>);<span class="hljs-comment">//开启串口,波特率设置为 9600</span><br> Serial.println();<br><br> WiFi.mode(WIFI_STA);<span class="hljs-comment">//设置工作在 STA 模式</span><br> WiFi.begin(SSID, PASSWORD);<span class="hljs-comment">//连接至指定 AP</span><br> <span class="hljs-keyword">while</span> (WiFi.status() != WL_CONNECTED) <span class="hljs-comment">//等待网络连接成功</span><br> {<br> delay(<span class="hljs-number">500</span>);<br> Serial.print(<span class="hljs-string">"."</span>);<span class="hljs-comment">//将连接信息输出至串口</span><br> }<br> Serial.println(<span class="hljs-string">"WiFi connected!"</span>);<br><br> Serial.println(<span class="hljs-string">"IP address: "</span>);<br> Serial.println(WiFi.localIP()); <span class="hljs-comment">//打印本机 IP</span><br><br> server.on(<span class="hljs-string">"/"</span>, handleIndex);<span class="hljs-comment">//注册链接(类似与注册一个路由),并选择回调函数</span><br> <span class="hljs-comment">//同样的,还可以注册别的链接,如</span><br> <span class="hljs-comment">//server.on("/test", handleIndexTest);</span><br> <br> server.begin();<span class="hljs-comment">//开启 HTTP 服务器</span><br> Serial.println(<span class="hljs-string">"WebServer begin!"</span>);<br>}<br><br><span class="hljs-type">void</span> <span class="hljs-title function_">loop</span><span class="hljs-params">()</span><br>{<br><span class="hljs-comment">//不用在这儿监听 HTTP 请求了</span><br>}<br></code></pre></td></tr></table></figure><p>理论上来讲,上面的代码应该是正确的……</p><p>但 Arduino 在编译的时候报错,内容是 ESPAsyncWebServer 库中的某些代码。</p><p>有待我弄清楚出错的原因。</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>教程</tag>
<tag>嵌入式开发</tag>
</tags>
</entry>
<entry>
<title>合宙 EPS32-C3 把玩记录(一):环境搭建与第一个程序</title>
<link href="/archives/7f7bd4a5.html"/>
<url>/archives/7f7bd4a5.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>为了贯彻本博客最重要的关键词:<strong>性价比</strong>,我看到性价如此高的开发板,想都没想就剁手了。</p><p>嘛其实也没有这么冲动,我在购买 3D 打印机之后就一直在计划着做一些网上现成的电子项目,但碍于这段时间 MCU 和大尺寸屏幕价格的飙升,一直没能开始动手。</p><p>正好最近我学习了 iPad 上的 3D 建模软件 Sharp3D,项目的外壳建模变得有可能;又遇到了这块便宜的板子,立即开工!</p><p>因为1.8寸的 TFT 显示屏还没到货,3D 建模就先放一边,先来研究一下这块开发板。</p><h3 id="事先声明"><a href="#事先声明" class="headerlink" title="事先声明"></a>事先声明</h3><p>本教程是我一边从零开始学习嵌入式开发一边作成的,有逻辑混乱、内容浅显和成吨的错误,还请已经熟悉嵌入式开发的大佬多多包涵与斧正)</p><h2 id="问题:什么?开发环境不是按语言分的嘛?"><a href="#问题:什么?开发环境不是按语言分的嘛?" class="headerlink" title="问题:什么?开发环境不是按语言分的嘛?"></a>问题:什么?开发环境不是按语言分的嘛?</h2><p>在开始学习嵌入式开发之前,我简单地认为嵌入式开发因语言而已,分为用 C/Cpp 开发(Arduino)和用 Python 开发(MicroPython)。</p><p>直到我遇见了 ESP-IDF 这个东西。</p><p>啥啊,为啥这家伙用的也是 C,代码我还一点都看不懂。</p><h3 id="解答"><a href="#解答" class="headerlink" title="解答"></a>解答</h3><p>嵌入式开发选用的语言和语法因选择的框架而异。</p><p>ESP-EDF 更靠近底层,因而编写更复杂;Arduino 对底层进行封装,更靠上层且对用户更友好;MicroPython 则是在开发板上还原了一个 Python 的开发环境,继承了 Python 的诸多优点(简单的语法、无需编译就能执行新代码等)。</p><p>此外,还能用 JS、Java、Lua 等等语言进行开发。</p><h3 id="我的选择"><a href="#我的选择" class="headerlink" title="我的选择"></a>我的选择</h3><p>我手上有两块板子,一块被我刷成了 MicroPython,但目前不打算去用它。</p><p>我打算用 Arduino + C 进行开发。</p><h3 id="配置-VSCode-Arduino-开发环境"><a href="#配置-VSCode-Arduino-开发环境" class="headerlink" title="配置 VSCode + Arduino 开发环境"></a>配置 VSCode + Arduino 开发环境</h3><p>Arduino 没有代码补全,太难用。简述一下如何使用 VSCode 进行开发:</p><ul><li>VSC 安装 Arduino 插件;</li><li>在 首选项-设置 中配置 Arduino 的路径 <code>Arduino.path</code></li><li>打开项目后选择 MCU 类型和串口</li></ul><p>就能用啦。</p><h2 id="第一个项目"><a href="#第一个项目" class="headerlink" title="第一个项目"></a>第一个项目</h2><p>第一个项目就不选输出 Hello World 了,一点硬件的感觉都没有。</p><p>据<a href="https://wiki.luatos.com/chips/esp32c3/board.html"> 官方文档 </a>,主板板载的两个 LED 灯对应的 GPIO 为 <code>IO12 IO13</code>,高电平有效。</p><p>就此编写一个<del>无稳态多协振荡电路</del>让 LED 灯交替闪烁的程序:</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></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-type">void</span> <span class="hljs-title function_">setup</span><span class="hljs-params">()</span> <span class="hljs-comment">//初始化函数,只会在开发板上电或复位时被调用一次</span><br>{ <br> pinMode(<span class="hljs-number">12</span>, OUTPUT); <span class="hljs-comment">//初始化 IO12 为输出口</span><br> pinMode(<span class="hljs-number">13</span>, OUTPUT); <span class="hljs-comment">//初始化 IO13 为输出口</span><br> digitalWrite(<span class="hljs-number">12</span>, LOW); <span class="hljs-comment">//初始化设为低电平,则灯灭</span><br> digitalWrite(<span class="hljs-number">13</span>, LOW); <span class="hljs-comment">//初始化设为低电平,则灯灭</span><br>}<br><br><span class="hljs-type">void</span> <span class="hljs-title function_">loop</span><span class="hljs-params">()</span> <span class="hljs-comment">//上电之后一直循环执行的函数</span><br>{ digitalWrite(<span class="hljs-number">12</span>, HIGH); <span class="hljs-comment">//亮左灯</span><br> digitalWrite(<span class="hljs-number">13</span>, LOW); <span class="hljs-comment">//关右灯</span><br> delay(<span class="hljs-number">1000</span>); <span class="hljs-comment">//等待1秒</span><br> digitalWrite(<span class="hljs-number">12</span>, LOW); <span class="hljs-comment">//关左灯</span><br> digitalWrite(<span class="hljs-number">13</span>, HIGH); <span class="hljs-comment">//亮右灯</span><br> delay(<span class="hljs-number">1000</span>); <span class="hljs-comment">//等待1秒</span><br>}<br></code></pre></td></tr></table></figure><p>编译+上传即可。</p><p>结果就不展示了,两个灯在交替闪烁。</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>教程</tag>
<tag>嵌入式开发</tag>
</tags>
</entry>
<entry>
<title>Code-Server 的代理配置</title>
<link href="/archives/d01399e6.html"/>
<url>/archives/d01399e6.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>一年前,我介绍了如何在群晖上使用 Docker 部署 Code-Server,在外也能轻松使用已经配置好的开发环境。<a href="https://blog.udon.eu.org/archives/375e7789.html">群晖搭建 VSCode 服务器与 Syncthing 服务</a></p><p>最近我换了 iPad,琢磨如何发挥她的生产力。除了使用网页版的 IDE(Codepen、Gitpod等),就是自建网页版的 VSCode 了。下面简要介绍一下我是如何给 Code-Server Docker 配置代理,使其成为一个完备的开发平台。</p><span id="more"></span><p>将 Code-Server 部署在国内服务器(例如我家里的 NAS),可以获得稳定的连接,这对于开发平台是尤其重要的,VSCode 遇到连接不顺畅就会要求你刷新界面,很可能会丢失数据。</p><p>但由于众所周知的原因,在国内的网络环境做开发可以说是寸步难行,我便采用 Clash Docker 来给 Code-Server 加上代理。</p><h3 id="Clash-Docker-安装"><a href="#Clash-Docker-安装" class="headerlink" title="Clash Docker 安装"></a>Clash Docker 安装</h3><p>Clash Core 普通版 Image:<a href="https://hub.docker.com/r/dreamacro/clash">dreamacro/clash - Docker Image | Docker Hub</a></p><p>Clash Core Premium Image:<a href="https://hub.docker.com/r/dreamacro/clash-premium">dreamacro/clash-premium - Docker Image | Docker Hub</a></p><p>Clash Core Premium 二进制文件: <a href="https://github.com/Dreamacro/clash/releases/tag/premium">Premium release (github.com)</a></p><p>Clash Core 有普通版和 Premium 版之分,目前我能体验到的二者的区别是普通版的 Clash Core 不支持 RULE-SET 功能。</p><p>我常用的配置文件大量使用了 RULE-SET,所以我必须得用 Clash Core Premium。</p><p>但 Pre Build 的 Image 似乎不支持 X86-64 v3 之下的 CPU(例如我的 J1900),所以我采取了部署普通版 Image,然后 attach 进 Docker 手动更换 Premium 内核的曲线救国方法。(更换 <code>/</code> 根目录下名为 <code>Clash</code>的二进制文件)</p><p>部署 Docker 时注意一下几点:</p><ul><li>开放 7890(或你定义的代理端口)和 9090(Clash Core 管理面板)端口。</li><li>将 <code>/root/.config/clash</code> 文件夹挂载到本地,存放 <code>config.yaml</code> 及其他配置文件。</li></ul><p>请勿将 Clash Core 的管理面板暴露到公网。我选择用 Tailscale 建立 VPN 访问家中的服务器进行配置。</p><h3 id="Code-Server-的配置"><a href="#Code-Server-的配置" class="headerlink" title="Code-Server 的配置"></a>Code-Server 的配置</h3><p>需要在 Code-Server Docker 里添加两个环境变量,实现开机自动连接代理:</p><ul><li><code>http_proxy=http://clash_docker_ip:7890</code></li><li><code>https_proxy=http://clash_docker_ip:7890</code></li></ul><p>可以使用同样的方法给其他 Docker 添加代理。</p><hr><p>在一顿折腾之后,Code-Server 终于可以顺畅访问 Github 等网站了。</p><p>可喜可贺,可喜可贺。</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>教程</tag>
</tags>
</entry>
<entry>
<title>Klipper 的外网访问</title>
<link href="/archives/7263a385.html"/>
<url>/archives/7263a385.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>网络上有关 Klipper 的中文教程少之又少,固作此教程介绍一下如何在外网优雅地访问家中装有 Klipper 的 3D 打印机。</p><h2 id="方法一:端口转发"><a href="#方法一:端口转发" class="headerlink" title="方法一:端口转发"></a>方法一:端口转发</h2><p><strong>此方法仅适用于拥有公网 IP 的用户</strong></p><p>首先,使用 DDNS 将家庭宽带动态变化的 IP 绑定至域名,教程如下:</p><ul><li><a href="https://blog..eu.org/archives/87bacf3f.html">群晖-外网访问一站式教程2 DDNS</a></li><li><a href="https://blog..eu.org/archives/27f2d840.html">iPv6下绝佳的DDNS方法-dynv6</a></li></ul><p>在配置端口映射之前,先介绍一下 Klipper 的网络结构:</p><pre><code class=" mermaid">graph LR;A("你的设备") <--80-->B("前端网页(Fluidd/Mainsail/Octoprint)") <--7125-->C("API 服务器 Moonraker") <-->D("你的 3D 打印机");</code></pre><p>线上的数字便是通讯的端口。</p><p>由上图,我们不难看出,若需要在外网访问家中的 Klipper,就需要映射 <strong>80</strong> 和 <strong>7125</strong> 两个端口。</p><p>于路由器的 <strong>端口转发/端口映射</strong> 界面配置 80 和 7125 的转发即可。家庭宽带的公网 IP 不会开放 80 端口,可将外网端口配置为 8080,对应的内网端口为 80 即可。</p><p>接着,在 Moonraker 配置 <code>moonraker.conf</code> <code>[authorization]</code> 模块的 <code>cors_domains</code> 模块中添加你的域名,格式为 <code>*://你们域名</code></p><p>也可以选择不使用自己搭建的前端网页,而使用 <a href="http://app.fluidd.xyz/">Fluidd</a> 或者 <a href="%5BMainsail%5D(http://my.mainsail.xyz/)">Mainsail</a> 作者搭建的前端网页。在 Moonraker 配置 <code>moonraker.conf</code> <code>[authorization]</code> 模块的 <code>cors_domains</code> 模块中添加 <code>*://my.mainsail.xyz 与 *://app.fluidd.xyz</code></p><h2 id="方法二:内网穿透"><a href="#方法二:内网穿透" class="headerlink" title="方法二:内网穿透"></a>方法二:内网穿透</h2><p><strong>本人不推荐使用这个方法,固仅简述一下</strong></p><p>可以使用花生壳等内网穿透服务,但给的带宽太小,只能使用控制界面,不能使用摄像头。</p><p>也可以选择自建内网穿透,例如 Frp, Ngrok 等服务。但最近越来越多 Frp 服务器遭到攻击,固不建议自建。</p><h2 id="方法三:使用-VPN"><a href="#方法三:使用-VPN" class="headerlink" title="方法三:使用 VPN"></a>方法三:使用 VPN</h2><p>这是本人推荐的方法。</p><p>与 Octoprint + Marlin 仅需要映射 80 端口不同,Klipper 还需要映射 Moonraker 的 7125 端口,配置端口转发与实际使用都不如前者来的方便。</p><p>我个人推荐用诸如 Zerotier, Tailscale 一类的 VPN 软件,搭建自己的小内网,通过内网 IP 直接访问 Klipper,既安全又方便。</p><p>Zerotier 或者 Tailscale 的使用技巧网上一大片,我就不赘述了。</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>教程</tag>
<tag>3D 打印</tag>
</tags>
</entry>
<entry>
<title>我与 3D 打印</title>
<link href="/archives/19f3c1e1.html"/>
<url>/archives/19f3c1e1.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>玩 3D 打印有大半年了,虽然还谈不上资深,但已有了一些自己的想法,作此文分享一下自己的心得。</p><span id="more"></span><h2 id="3D-打印机介绍"><a href="#3D-打印机介绍" class="headerlink" title="3D 打印机介绍"></a>3D 打印机介绍</h2><h3 id="3D-打印机的分类"><a href="#3D-打印机的分类" class="headerlink" title="3D 打印机的分类"></a>3D 打印机的分类</h3><p>民用 3D 打印无非两个流派:熔融沉积成型(FDM)与立体平板印刷(SLA,又称光固化),工业用途的还有金属粉末打印的 SLS。</p><p>光固化就不多提了,其优点是精度高,缺点则是机器与耗材价格昂贵,且打印时有比较大的气味(可能对人体有害),对通风的要求比较高,个人认为不适合在家里玩。</p><p>更适合摆在工作室里的 FDM 则是百花齐放,诞生出了各种各样的架构:从最简单的单臂型,到 I3 龙门架、圆形打印平台的三角洲,再到高速高精度的 CoreXY/XZ/YZ 架构、性能超强但组装价格昂贵的 UM 结构。最出名的开源设计则是 Voron 团队,旗下有小型的 Voron 0.1 和大型的 Voron 2.4,且还在持续更新中。</p><h3 id="3D-打印控制系统"><a href="#3D-打印控制系统" class="headerlink" title="3D 打印控制系统"></a>3D 打印控制系统</h3><p>目前我见到的国内用的最多的 3D 打印机控制板(主板)是 MKS GEN L 系列(1.0/1.2/2.1),其搭载的是 ATmega 2560 芯片,常见的控制系统无非两种:Marlin 与 Klipper</p><h4 id="Marlin-1-0-2-0"><a href="#Marlin-1-0-2-0" class="headerlink" title="Marlin 1.0/2.0"></a>Marlin 1.0/2.0</h4><p>Marlin 是一款片上储存,支持脱机打印、屏幕控制的系统。由 C 语言编写,配置较容易修改,但需要手动编译并烧录至控制板。目前已知的编译方法是 Arduino 编译与 VSCode 插件编译,我使用的是后者,但给我的体验不是很好。</p><p>Marlin 的优点是(若不需要自定义)安装简单,仅需用数据线连接电脑烧录即可。缺点则是对打印机的任何重新配置(除了能在屏幕上直接修改设置,如电机方向等),特别是之后要更换静音驱动,就需要手动编译系统,门槛较高且操作繁琐、坑多。</p><h4 id="Klipper"><a href="#Klipper" class="headerlink" title="Klipper"></a>Klipper</h4><p>Klipper 是一款需要上位机控制的系统,主板上仅烧录了一个接收上位机控制指令的程序,大小大概是 Marlin 系统的 1/5。</p><p>据 Klipper 的开发团队<a href="https://github.com/Klipper3d/klipper/blob/master/docs/Benchmarks.md">描述</a>,大部分单片机的性能比较弱,每秒能处理的指令(打印机控制指令)数不高,固采用上位机的高性能 CPU 来处理更高精度但更多指令数的控制指令可以有效地提高打印质量。</p><p>根据跑分表来看,其实 Mega 2560 的性能没有比树莓派的 CPU 弱很多,但考虑到树莓派还可以安装 API 服务器与 Web 控制界面,可以给打印机拓展更多的功能,连接一台上位机还是很具性价比的。</p><p>Klipper 在我看来就像是 3D 打印界的 Ardupilot (开源无人机控制套件),用户可以接触到很多底层的设置、直接控制主板上的所有输出,且修改任何配置都不用重新烧录系统,非常适合创客使用。</p><p>但高级权限也意味着更大的风险。若配置不当,则可能烧坏硬件。</p><p>目前我正在使用的是 Klipper 固件,在两三天的配置调试之后基本可以不用动配置文件了。配置过程中踩了一些坑,后面会单独发一篇文章分享一下 Klipper 配置过程。</p><h3 id="3D-打印材料"><a href="#3D-打印材料" class="headerlink" title="3D 打印材料"></a>3D 打印材料</h3><p>SLA 打印用的是各种光敏树脂,我没有用过就不评价了。</p><p>FDM 使用的材料更加多种多样:PLA、PETG、ABS 三者为主流,TPE 柔性材料也见过有人在用。PLA 是最好打印的一类材料,PETG 需要较高的打印/热床温度,而 ABS 需要保温打印(需封箱)。剩下的就是一些改进/特种材料。例如在 PLA 中添加少量 PC、ABS 以加强硬度,这些材料名字多样,一般是在 PLA 之后加代号,如 PLA-F/AF/AT/G/Pro 等等;或是在 PLA 中添加少量木屑或杂质,使打印机外观像木制品/大理石制品,这类材料比较容易堵头,不是很推荐使用;甚至还有人打印碳纤维,但价格昂贵。</p><h2 id="购买-3D-打印机的理由"><a href="#购买-3D-打印机的理由" class="headerlink" title="购买 3D 打印机的理由"></a>购买 3D 打印机的理由</h2><p>我不想做一个 “KOL”,把 3D 打印吹得天花乱坠。谈一谈我购买 3D 打印机的理由:</p><ol><li>可以动手</li></ol><p>我是一个酷爱动手的人,看见 DIY 项目就忍不住去尝试。或许这辈子开不上高达,但能亲手组装一台能由我操控的机械(甚至还能打印出高达),也算是一点小小的慰藉。</p><ol start="2"><li>让梦想中的模型成真</li></ol><p>我有购买一台 3D 打印机的念头,来自一张网图,是一个制作精美的太阳时钟 —— 不是日晷,而是通过巧妙设计的结构,能投射出数字形式的大致时间。显然,这个太阳时钟是 3D 打印的。当时我就觉得,如果我能有一台 3D 打印机,我就能做各种各样的小玩意儿,多美妙 :)</p><ol start="3"><li>建模小帮手</li></ol><p>很奇怪的理由,但 3D 打印机确实促使我提升了 3D 建模技术。机器可以创造任何物品,但网上的模型毕竟有限,很多你想要的物品就需要你亲手去建模了。初中时我有学习 3D 建模的念头,当时选择了 C4D,但因为难度太高没多久就放弃了。现在我选择了学习 SolidWorks,自行设计并打印成品,我就能最直观的感受到模型的问题所在,并在软件里修正错误。</p><h2 id="挑选打印机"><a href="#挑选打印机" class="headerlink" title="挑选打印机"></a>挑选打印机</h2><p>于是我就定下了买一台 3D 打印机的计划。这么一计划就是一年多。</p><p>在这一年里我找了很多店家,比对他们的性价比(我的博客里最经常出现的一个词),最后挑中了这家 —— 小树科技。</p><p>我不适合想买成品机,理由很简单:性价比较低,且没有组装的乐趣。这两年国内做开源机器的团队越来越多,小树科技算是比较早的一家。我最看重的莫过于详细的安装文档和一个可靠的社区,毕竟这次我要涉猎的是一个完全陌生的领域。</p><p>逛了逛他们的<a href="(https://www.minitree.fun/)">官网</a>,确定他们有提供安装文档,用户社区也达到数千人规模,我决定了要买这一家的机器。</p><p>新手入门,我选择了 T3 型号的机器。单臂架构,3D 打印机中最简陋、缺点最多的架构,但也是消耗材料最少,价格最便宜的结构。</p><p>DIY 之路必然是坎坷的,如果你决定要自己组装一台 3D 打印机,过程中必然会遇到种种问题。做好心理准备,等待迎接解决问题之后的喜悦吧。</p><p>经过半年的调机与改装之后,这台 T3 已经能稳定地产出质量尚可的打印件,我认为再去改装这台机器所带来的提升已经不大,便决定将其升级为 CoreXY 架构。</p><p>升级 CoreXY 就是这个寒假的事情了,组装花了四五天,调机则还在进行中。目前来看这台机子潜力很大,请期待后续分享调机过程的文章。</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>感觉没什么好结的。</p><p>说句实话,调机真的挺痛苦的,刚装完机打两次很可能就会错一次层;但调完之后,再也不会错层的成就感经久不衰。</p>]]></content>
<categories>
<category>3D 打印</category>
</categories>
<tags>
<tag>3D 打印</tag>
</tags>
</entry>
<entry>
<title>Deepvm 9929</title>
<link href="/archives/6e832212.html"/>
<url>/archives/6e832212.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>本以为不会再购买新的机子了,今天看到有一台挺便宜的 9929 线路的机子,就买了一个月尝尝鲜。</p><span id="more"></span><p>配置:1core 512Mb 20G-SSD 500G@150Mbps</p><p>价格:16元/月</p><p>总结:Something strange.</p><hr><h3 id="网络"><a href="#网络" class="headerlink" title="网络"></a>网络</h3><p><img src="/images/2022-01-10/Deepvm9929.png"></p><p>晚高峰测速全部都能跑满 150Mbps,看起来很不错。</p><p>AS9929 是联通最新的专线,好像比 AS4837 要高级那么一点点,应该体验要比 4837 来得好一点吧,看延迟会比 4837 低十几毫秒。</p><p>但实际体验下来,双向延迟会比 4837 高上 200ms 左右,speed.cloudflare.com 的成绩也不如 4837 来的好,众人迷信的 Youtube 4K 视频(电脑解码带不动 8K)跑分在 56k,和 4837 基本一致。 </p><p>这就是我上述的 something strange 了。Deepvm 家的上游好像是 Spartan,按道理网络是不会差的。我猜测是这家的机子超售的稍微厉害了一点点,导致总体体验不如 Wikihost 家的 4837.</p><h3 id="性能"><a href="#性能" class="headerlink" title="性能"></a>性能</h3><p><img src="/images/2022-01-10/Deepvm9929Bench.png"></p><p>跑分上来看,性能是十分不错的。性能这一块又没有超售太多???把我整懵了。</p><hr><p>综合价格和性能来看,这台机子的性价比还是很能打的。由于商家是去年年初刚成立的,服务器的可靠性还是未知数,也没有赠送自动备份(在折腾坏系统的时候有备份可以还原是很美妙的事情)。因此我建议月付购买这家的机子。</p><p>放上 AFF:<a href="https://www.deepvm.net/aff/HVQAFOVA">https://www.deepvm.net/aff/HVQAFOVA</a></p>]]></content>
<categories>
<category>小鸡测评</category>
</categories>
<tags>
<tag>小鸡测评</tag>
</tags>
</entry>
<entry>
<title>WikiHost CU4837</title>
<link href="/archives/be3776eb.html"/>
<url>/archives/be3776eb.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>今天要介绍的是一台来自 WikiHost 家的机器。</p><span id="more"></span><p>配置:Los Angeles - CU4837 Lite KVM</p><p>1 core (5900X)@30% 基准性能 512Mb 20G-SSD 500G@1Gbps</p><p>价格:月付 18 元(首月附加 5 元初装费)/ 年付 200 元(免初装费)</p><p>总结:性能优异,网络为最大卖点。性价比很高。</p><hr><h3 id="网络"><a href="#网络" class="headerlink" title="网络"></a>网络</h3><p><img src="/images/2021-12-29/WikiHost4837.png"></p><p>G 口没有虚标。</p><p>测试特意挑在晚高峰跑的,与前面测评的 Cloudcone 相比,上海与广州出口三线的表现都很优秀。</p><p><img src="/images/2021-12-29/WikiHostMtr.png"></p><p>这台机子的去程是 163 骨干网,回程是联通专线 AS4837. 图中为回程路由 —— 进入电信的骨干网之前的流量就是 4837 承载的。</p><h3 id="性能"><a href="#性能" class="headerlink" title="性能"></a>性能</h3><p><img src="/images/2021-12-29/WikiHostBench.png"></p><p>听到 30% 基准性能,你会觉得这是一台跑 apt 都嫌卡的机子。</p><p>你错了!这台母鸡配备的可是 AMD R9-5900X。AMD YES!</p><p>即使只有单核的三成性能,跑分依旧十分接近 WebHorizon 的单核成绩,轻松超过了 Cloudcone 的单核成绩。</p><p>所以这台机器在日常使用时不会觉得 CPU 性能太差。主要的瓶颈还是在 512MB 内存上。</p><hr><p>综合性能和网络考虑,这台机子作为远程开发机器,安装 VSCode 跑一些轻量的项目还是很不错的。这台机器最合适的工作还是优化国内连接国外的网络情况,例如加速 GitHub 下载速度等。这个性能建立个人网站也完全足够了,140ms 较低的延迟与晚高峰的超低丢包可以带来很不错的体验。</p><p>你问我推不推荐?那肯定推荐啊!</p><p>鸡总的 WikiHost 是以高质量服务著称的,我在 WikiHost 购买过网站空间和流量转发,使用期间给我的体验很不错,发工单很快就能得到回复或技术人员的直接处理。缺点就是大部分机型价格都比较高(月付 30 元以上),而这台 Lite 机型以超低的价格(还附赠了7天全盘备份,前几天把机子玩炸了就用上了还原功能),一出来就被抢光了。目前还有存货的是直连韩国 VPS(高峰时段三网全炸,平时延迟非常低),有需求的朋友也可以考虑。</p><p>放上 AFF:<a href="https://idc.wiki/aff.php?aff=2182">https://idc.wiki/aff.php?aff=2182</a></p><p>这台机子让我非常满意,再配合 Cloudcone 的高性能、较大硬盘的机器,因此短时间内我应该不会购入新的机子,尽请期待未来的机器测评。</p>]]></content>
<categories>
<category>小鸡测评</category>
</categories>
<tags>
<tag>小鸡测评</tag>
</tags>
</entry>
<entry>
<title>Cloudcone 双十一特价鸡</title>
<link href="/archives/a7b78eea.html"/>
<url>/archives/a7b78eea.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>今天来介绍一下来自(依旧是)高性价比商家 Cloudcone 的机器。</p><span id="more"></span><p>配置:2cores 2GB 70G-SSD(RAID 10)4T@1Gbps</p><p>价格:年付23.8刀</p><p>来个总结:性能优异、硬盘性能尤为突出;网络质量尚可;性价比高。</p><hr><h3 id="网络"><a href="#网络" class="headerlink" title="网络"></a>网络</h3><p><img src="/images/2021-12-24/Cloudcone.jpg"></p><p>测试是在晚高峰做的,只能说炸的很彻底,国内基本没有什么速度。</p><p><img src="/images/2021-12-24/CloudconeMorning.png"></p><p>中午再测一次,白天的网络还是很不错的。</p><p><img src="/images/2021-12-24/CloudconeRoute.png"></p><p>根据路由测试来看,走的是最普通的163骨干网,没有线路可言。</p><p><img src="/images/2021-12-24/CloudconeMtr.png"></p><p>Mtr 显示丢包率在 10-20%,延迟在 160-190ms,中规中矩。</p><h3 id="性能"><a href="#性能" class="headerlink" title="性能"></a>性能</h3><p><img src="/images/2021-12-24/CloudconeBench.jpg"></p><p>单核性能说不上强,甚至打不过 Webhorizon 的 NAT 机子。</p><p>但是有俩核啊~</p><p>在编译一个 Node.js 项目时,其他机子要花将近一分钟,这台机子只要 32s 左右,有效提高了我的工作效率。</p><hr><p>一个月前,手持 Virmach 的我流下了不争气的泪水,发誓要买一台好一点的机子做开发、跑服务。</p><p>于是我就在网上找性价比商家了(笑)。</p><p>有人推荐我买 GreenCloud 的机子,500G 大盘鸡,价格也不贵。我当时就很心动,几欲下单,最后上网一查,发现 GC 家的 IP 段不大好,会被 Google 查岗(验证是否是机器人),遂放弃。</p><p>持币徘徊的我遇见了 Cloudcone。网上一查,没有什么黑历史,我就和同学“拼鸡”下单了。(没错,我只花了一半的钱 XD)</p><p>24刀的价格平常只能买到 1c 1G 的机子,双十一特价可以让性能翻倍,性价比一下子上来了。70G 的硬盘也可以用来挂一些需要存储数据的服务(例如现在正在跑的 H@H)。</p><p>至于网络嘛……因为没有特殊线路,晚上还是挺糟糕的,有时候 SSH 都会断连。</p><p>不得不提的是,就在我开通机器一周后,Cloudcone 貌似出现了部分机器数据丢失的问题……因为范围不大,似乎没有引起什么讨论。因为没有附带异地备份的功能,使用高性价机器要承担一定风险,重要数据就不要存放在此类没有备份的 VPS 中。</p><hr><p>总结来说,如果遇到活动,Cloudcone 的机子还是很值得入手的!</p><p>正好圣诞节促销到了,力度比双十一还大一点点。放上 AFF Link~</p><p><a href="https://app.cloudcone.com/?ref=7447">https://app.cloudcone.com/?ref=7447</a></p>]]></content>
<categories>
<category>小鸡测评</category>
</categories>
<tags>
<tag>小鸡测评</tag>
</tags>
</entry>
<entry>
<title>WebHorizon NAT JP</title>
<link href="/archives/9732665c.html"/>
<url>/archives/9732665c.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>第一篇正式测评:来自印度的性价比商家 WebHorizon 的特价 NAT 小鸡。</p><span id="more"></span><p>配置:1core 256Mb 4G-HDD 500G 1Gbps,机房位于日本,有 IPv6,仅有 NAT IPv4.</p><p>价格:……4刀一年。</p><p>先来个总结:买了吃灰的机器。</p><h3 id="网络"><a href="#网络" class="headerlink" title="网络"></a>网络</h3><p><img src="/images/2021-12-23/WebHorizonJP.png"></p><p>小鸡号称的 G 口是货真价实的。</p><p>没有独立 IPv4 带来的限制很大。WebHorizon 提供了四个 IPv4 地址用于转发 VPS 的端口。但经我的随机(随便)测试,我开不到任何能用的 TCP 转发端口,仅能开到 HTTP/HTTPS 的转发(80/443 端口)。</p><p>因此,想要连接这台机器需要用到 IPv6,能提供的服务也仅限 HTTP。</p><p>NAT 机器还有一点不好:若四个转发地址都被墙了,那这台机器在国内就没得用了。目前四个地址被墙了一个。</p><p><img src="/images/2021-12-23/WebHorizonJPRoute.png"></p><p>从国内访问的线路是双向 NTT。白天效果尚可,晚高峰时间炸得厉害。全天高延迟 160-240ms。网络只是可以用的级别。</p><h3 id="性能"><a href="#性能" class="headerlink" title="性能"></a>性能</h3><p><img src="/images/2021-12-23/WebHorizonBench.png"></p><p>从跑分上来看,这台机子的 CPU 性能出奇的可以。</p><p><del>可能是买来的都吃灰了,没人抢性能</del></p><p>硬盘的表现则是中规中矩,能用级别。</p><hr><p>总结上述来看,这台机子挺不行的。那为什么我买了呢?</p><p>看到4刀一年的价格,我的捡垃圾之魂就按耐不住了啊!</p><p><del>我现在只是非常的后悔。</del></p><p>256Mb 的超迷你内存让这台机器承担不了什么任务。挂一点小脚本大概能吃得消。适合钱包真的很空/垃圾佬购买。</p><p>虽说不推荐购买,我还是厚着脸皮放一个 AFF 连接:</p><p><a href="https://my.webhorizon.in/order/forms/a/MzQ1Nw==">https://my.webhorizon.in/order/forms/a/MzQ1Nw==</a></p><p>P.S. 4刀一年是黑五期间的 50% OFF 优惠。</p><h3 id="附赠"><a href="#附赠" class="headerlink" title="附赠"></a>附赠</h3><p>这台机器的虚拟化技术是 OpenVZ,也带来了一些不足:</p><ol><li>超售严重,高峰期性能可能不如预期。</li><li>与母鸡共用内核,因此无法自行修改内核。有一些服务,例如 BBR、锐速等,需要修改内核才能开启,在 OVZ 的机型上就无法使用。有此类需求可以购买 KVM 虚拟化的 VPS。母鸡内核可能没有开启某些功能,例如我在尝试通过 RClone 挂载虚拟硬盘时,被告知内核未开启 fuse,需要联系服务商开启(我没有去联系,不保证商家会同意开启)。</li></ol>]]></content>
<categories>
<category>小鸡测评</category>
</categories>
<tags>
<tag>小鸡测评</tag>
</tags>
</entry>
<entry>
<title>Virmach 7.5刀年付特价机</title>
<link href="/archives/6f963444.html"/>
<url>/archives/6f963444.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>虽然我在前文的结尾奉劝大家不要买太廉价的机器……</p><p>但是我一介学生是真的穷啊!</p><p>所以今天来谈一谈一家以性价比著称的 VPS 服务商:Virmach。</p><span id="more"></span><hr><p>开门见山,先说直观感受:网络很一般、机器性能差。机器适合穷苦学生党使用。</p><p>我开的机型是 Virmach 黑五特价机型:年付7.5刀,1core 256Mb(免费升级至 384mb)10Gb-SSD 1Gbps。</p><p>这台机器在上个月到期,我又有了新欢就没有续费,因此还是没有跑分截图。</p><p>这机子的性能差到 apt 都嫌慢,网络情况也很是糟糕,应该就是最普通的国际线路 + 国内163,丢包率高,全天 SSH 连接皆不稳定。</p><p>不过一年50块左右的价格也没什么好抱怨的了,用来挂点需要访问世界互联网的服务,例如 Telegram Bot、RSSHub 等;或者建个站,套一层 Cloudflare CDN 之后众生平等,可以说勉强能用。</p><p>较小的内存有时也会带来不便,可能遇到部分应用、组件无法安装/编译的情况。据观察 RSSHub 运行时即占用 300Mb 左右内存,因此我还是建议内存在 512Mb 以上的 VPS,1Gb 为佳。</p><p>多提一嘴,现在不少应用都能以 PaaS 的形式部署在诸如 Heroku 的平台上,完全可以做到免费运行一个服务,没有必要租用 VPS、配置环境。</p><p>VPS 的硬盘也是一个挺重要的指标。按我的经验,VPS 至少要有 20G 的硬盘才够用。Debian 11 系统 + LNMP + NodeJS 环境就占用了 7-8G 的硬盘空间,剩下的 10G 可以用于存储应用数据。至于硬盘性能,只要不是太可怜,影响都不大。</p>]]></content>
<categories>
<category>小鸡测评</category>
</categories>
<tags>
<tag>小鸡测评</tag>
</tags>
</entry>
<entry>
<title>我的第一台 VPS</title>
<link href="/archives/afe45e8a.html"/>
<url>/archives/afe45e8a.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>开一个新坑,测评一下所有我用过的小鸡,<del>如果能赚到点 AFF 就更好了。</del></p><span id="more"></span><p>来谈一谈我的第一台 VPS 吧。</p><p>我的第一台 VPS 购于初中,仅用了一年便没有再续费了。因此没有任何性能、网络方面的测评,仅剩下我的感想了。没有续费的原因很简单:太™垃圾了。</p><p><del>年幼无知</del>,对 VPS 性能、路由线路都一无所知的我被超低的价格蒙骗,入手了一台来自无名国人商家的小鸡。</p><p>印象中,那是一台 1core 512Mb 的小鸡,位于太平洋彼岸、再跨过美国全境的美东海岸。VPS 的网络差到经常连接不上 SSH。</p><p>说了这么多(并不多),就是想奉劝各位:别贪便宜。</p>]]></content>
<categories>
<category>小鸡测评</category>
</categories>
<tags>
<tag>小鸡测评</tag>
</tags>
</entry>
<entry>
<title>厌烦了软件的我上了硬件的车</title>
<link href="/archives/245ab175.html"/>
<url>/archives/245ab175.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>好久不见,回想三个月前的我还在享受暑假。开学后,我将大部分精力转移至学业,折腾的时间便少了。</p><p>机缘巧合,在显卡价格最高的时候坏了显卡的我打算趁双十一打折买个焊台,自己修显卡。</p><p>同时,我有了玩一玩硬件的想法。</p><h2 id="焊台体验"><a href="#焊台体验" class="headerlink" title="焊台体验"></a>焊台体验</h2><p>六七年以来,我一直在用直插 220V 不可调温的电烙铁焊接。当时,无线电老师告诉我这是质量很好的紫铜烙铁。就是这把烙铁陪着我入门了锡焊。</p><p>放在今天,这把烙铁加热慢,且烙铁头非常容易氧化,体验极差。由于加热效果不佳,我还弄坏了一台灵车无人机的主板和一个 IR 摄像头(都是掉焊盘了)。</p><p>新焊台则完美的解决了之前的痛点:新烙铁加热快、温度准确、刀头耐用。热风枪则开启了贴片元件焊接时代。</p><h2 id="第一个项目"><a href="#第一个项目" class="headerlink" title="第一个项目"></a>第一个项目</h2><p>说在前头,选择一个比较复杂的项目来入门是个错误的决定。</p><p>十月中,我选择了一个加热台项目。对,就是可以用来焊接贴片元件的加热台。用工具制造工具,多美妙的事情啊~带着兴奋,我开始采购元件……</p><p>直至今天,这个项目的进度仍然停滞不前:元件全部焊接完毕(见下图),接通电源可以点亮一秒,随即就烧坏了一个电阻。初步判断是 5V 供电区域有短路,具体情况还需继续检测……</p><p><img src="/images/2021-11-07/1.JPG"></p><p>事实证明,第一个项目应该选择简单点的,以防止打击信心🌚</p><h2 id="赶超第一个项目的第二个项目"><a href="#赶超第一个项目的第二个项目" class="headerlink" title="赶超第一个项目的第二个项目"></a>赶超第一个项目的第二个项目</h2><p>转眼到了十一月,又可以在嘉立创愉快地免费打板了~</p><p>这次,我给自己设计了一张 PCB IC 校园卡,只需要焊接一个 CUID 芯片。</p><p>没有比这更加简单的项目了!</p><p>成品如图~</p><p><img src="/images/2021-11-07/2.png"></p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>前几天整了一台性能不错的服务器,小项目又可以整起来;</p><p>DIY PCB 这方面,我还想制作一个带编码器的小键盘,以提高 Premiere 剪辑的效率;</p><p>群星真好玩,铁心灭绝者真不错😇</p><p>真是丰富多彩的课余生活~</p>]]></content>
<categories>
<category>随笔</category>
</categories>
<tags>
<tag>随笔</tag>
</tags>
</entry>
<entry>
<title>LOOPERS 简评</title>
<link href="/archives/67d41c7c.html"/>
<url>/archives/67d41c7c.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>对 LOOPERS 的整体评价:B-</p><hr><p>这一作挺特殊的,没有任何选择支,全程自动播放耗时仅8小时左右。在这样短小的作品里塞下一日无限循环这样富有可能性的世界观,大概是本次剧情质量不尽人意的主要原因。</p><p>中盘倒不觉得冗长,还可以继续细化,加深对人物的刻画;就是后期重复的内容与话语太多了,让想尽快看到结局的我着急。</p><p>音乐方面,我全程用电脑扬声器玩的。说实话,BGM 听得不是很清楚。待我细听之后再作出评价。女二真的很吵,有 SP 那头恶鬼的吵闹级别了。</p><p>制作方面,望月老师的画好看(哧溜)。</p><hr><p>谈一谈一些细节上的感受(可能有点剧透):</p><p>作为已经退坑的老 Ingress 玩家,再度跟随主角一行人踏上寻宝之路,着实让人兴奋。游戏中着力刻画的,寻找到藏匿的宝物时的喜悦我能切身体会到。</p><p>这让我想起了两三年前,我为了拔掉敌方的一个大 菊花 Portal,在旧屋区狭窄的巷子里穿行。找了一两个小时,终于到达 Portal 的中心点,开始狂轰滥炸。当时的兴奋与满足是溢于言表的。或许你要亲身玩过寻宝游戏,才能体会主角一行人的感受吧。</p><p>对于“神经大条”的男主,我最大的感受就是这种人不大可能存在吧。遇到任何事情都能乐观面对、看似大大咧咧但做起事来注重细节、有着强大的领导力和鼓舞力……这种人若真的存在,绝对耀眼。</p><p>最后看作品的主题。在我看来, 龟 龙骑士这回倒不是想写一个很催泪的故事,而是继续宣扬 Key 社所推崇的友谊、团结和爱的主题。我个人是百看不厌,我也想要知心朋友,甚至是一群知心朋友。</p><p>男主全程口边挂着寻宝二字,听了耳朵确实起茧,但这文章放在考试说不定能拿挺高的分数——不断地扣紧中心。人生的意义?寻宝;友情的价值?寻宝;生命的救赎?还是寻宝。</p><p>这寻宝真有意思,只要将寻宝的过程与寻找到宝物稍作改变,就能解释这么多难以用语言表述的东西。倘若能在游戏性上再下点功夫,加个交互型的寻宝游戏,整体效果又会再上一层。但加了这些就不是一款短小精湛的游戏了,对吧。</p><hr><p>最后,这款游戏值得推荐吗?对于没有接触过 Key 社作品的人,可以一玩。</p><p>对于 Key 社老玩家,对这部作品报以极高的期待,希望它能超过正作水准的,还是别玩了。</p>]]></content>
<categories>
<category>随笔</category>
</categories>
<tags>
<tag>随笔</tag>
</tags>
</entry>
<entry>
<title>2021 第二学期总结</title>
<link href="/archives/202ebc76.html"/>
<url>/archives/202ebc76.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>在去厦门的动车上,写一下这个学期的总结。</p><hr><p>刚开始我想形容这个学期是浑浑噩噩的,感觉我想做、想学的东西都没做成;</p><p>但再冷静想一想,这学期在学校的安排下打了很多基础:解决了 C++ 这一心头大恨;还学习了数电,为硬件打了点基础。</p><p>C++ 实在很基础、很枯燥,若不是学校压着要学习,光凭我一人自学是难以解决的。以前也不是没有尝试过自学,最终都败下阵来。</p><p>至于硬件这块的知识,软件工程专业一般是不去接触的。学校大概是觉得下学期要学的 计算机组成原理 需要有数电的预备知识吧。</p><p>至于高数、线代,对编程越是了解,越会知道他们的重要性,知道他们贯穿着整个编程的过程。</p><p>这个学期最满意的还是全科通过,包括让我非常头疼的大学物理和高数。</p><p>下个学期我还是希望能腾出更多的时间给自己喜欢的事物,而不是把全身心都投进学校的课业,感觉亏待了自己的梦想……</p><p>生活方面,■■■■■■■■■,整体闷在学校里把我憋得难受。宿舍环境虽然不错,但整体偏老旧——六人间改四人间,■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</p><p>下个学期又可以搬回主校区,一定要把宿舍和<del>工位</del>书桌好好装修一下,过精致生活~</p><hr><p>至于暑假的安排,挺杂乱的。</p><p>买了不少东西,从小到大,从 IR 摄像头模组到 3D 打印机,打算将折腾二字写满整个假期;</p><p>学习内容则是安排了 JavaScript 和 CTF 相关的内容,如果还有时间还想看看 React。CTF 没有人带,想要入门挺困难的……校队是不打算招新人么 :(</p>]]></content>
<categories>
<category>随笔</category>
</categories>
<tags>
<tag>随笔</tag>
</tags>
</entry>
<entry>
<title>Osprey Commet 简评</title>
<link href="/archives/43a7a15c.html"/>
<url>/archives/43a7a15c.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>我的威戈双肩包——没错,就是烂大街的那个牌子——已经用了四年多了。不得不承认她的质量之好,用了这么久只坏了包前侧的拉链(到裁缝店换了一条拉链),外加水壶网袋破了几个洞。在上个月,她的一条拉链绳(不知道怎么叫那个部件)的脱落让我有了更换通勤背包的念头。</p><span id="more"></span><p>为了挑选一款最称心的通勤背包,我先对前任威戈包进行了评估:</p><p>优点</p><ul><li><p>威戈的分仓做的不错,充电宝、卡包等物件都能找到存放的位置,钥匙有也专门的链子系挂;</p></li><li><p>储存空间大(30L+),主仓有足够的空间放下装在内胆包里的14寸笔记本,也有专门的笔记本仓位;</p></li></ul><p>缺点</p><ul><li><p>背负系统拉垮,光是背电脑(1.4kg)就觉得非常沉,更别说偶尔的电脑+平板组合了(2.2kg);</p></li><li><p>没有太多存放小物件的仓位,所有的小东西(U盘、读卡器、耳机、线材 etc.)都放在包的前仓里,且前仓还是竖向开合,分类与取物皆不便;</p></li><li><p>包身不防水,但送防雨套。下雨时出门要提前戴套,生怕包内电子产品淋湿;</p></li></ul><p>因此,我对下一款背包有如下要求:</p><ul><li><p>自重轻;</p></li><li><p>分仓多且位置合理,能分类存放小物件;</p></li><li><p>包身最好能防水;</p></li><li><p>最好能同时收纳笔记本电脑和平板;</p></li></ul><p>在挑选了不下30款背包后,我选择了这款 Osprey Commet,下面来简要点评一下。</p><h4 id="全局"><a href="#全局" class="headerlink" title="全局"></a>全局</h4><p>包身自重 0.85kg,容积 30L,在这个大小的包中算比较轻的了。包身全部防水,拉链虽然没有做密封处理,但有一些延伸出来的防水面料挡住拉链,可以防止进水。</p><h4 id="分仓"><a href="#分仓" class="headerlink" title="分仓"></a>分仓</h4><p>这款包的分仓可以算是一个亮点。我简要说一下我对每个分仓的使用情况:</p><p>包的最前方是提手(颜值比较一般,偏向实用),因此第一个仓是小主仓。仓内有三个兜袋,用于存放我的卡包、证件、充电宝和 MP3,仓内还装着小记事本和钱包。此外,仓内还有一根红色的钥匙绳,采用的是快挂钩,可以把现有的钥匙串挂上去。</p><p>往里一层是第一个眼镜/小物品收纳仓。仓内使用了特殊面料防止刮花眼镜,在登山/骑行时存放眼镜还是很方便的。我就拿来存放经常取用的小物件了,例如耳机、U盘、Lto3.5mm 转接线等。</p><p>下一层是一号主仓,外加主仓内的第二个眼镜/小物品收纳仓。一号主仓有一个兜袋方便收纳平板和 A4 大小的文件,我便拿来放文件袋和平板。课本、笔盒也都放在这个仓位。小物品收纳仓则收纳比较少取放的小物件,例如订书机、凤尾夹和一些药品(达喜)。</p><p>最后一个仓位是笔记本仓。作为整个包最大的仓位,能轻松容纳 15.6 寸的笔记本。在需要携带笔记本时,这个仓位当然用来装笔记本;平常上课不带笔记本,也可以拿来装外套。这个仓位里还有一个网袋,我用来装线材(一根 0.2m CtoC、一根 MFi AtoL、一根 0.2m AtoB)。</p><h4 id="背负系统"><a href="#背负系统" class="headerlink" title="背负系统"></a>背负系统</h4><p>虽然没能用上 Osprey 专业的空景系统,但 Commet 的背负系统依旧优秀。Osprey 的背板偏硬,可以比较好地贴合后背,以减轻肩带对肩膀的压力。在日常上课背负几本书时,基本没有负重的感觉。若是同时背负笔记本+平板(3.6kg 左右),能感觉到背板压在后背上,分担了部分重量。</p><p>胸带与腰带这种登山包才有的配置出现在了这款通勤包上。在背负比较重的物品时系上腰带可以有效减少包身晃动。</p><h4 id="总评"><a href="#总评" class="headerlink" title="总评"></a>总评</h4><p>相当满意!</p>]]></content>
<categories>
<category>随笔</category>
</categories>
<tags>
<tag>随笔</tag>
</tags>
</entry>
<entry>
<title>近日败家:Chrombook Duet 与 小米手环6</title>
<link href="/archives/4a562e35.html"/>
<url>/archives/4a562e35.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>今天来分享一下最近败家的几样电子产品。</p><h2 id="Chromebook-与-USI-触控笔"><a href="#Chromebook-与-USI-触控笔" class="headerlink" title="Chromebook 与 USI 触控笔"></a>Chromebook 与 USI 触控笔</h2><p>在大学课堂上发现很多人都持有一台 iPad 和 一支 Apple Pencil 在做着笔记,令我很是羡慕。</p><p>在咨询过“业内人士”,并对现有产品及我的钱包进行评估之后,我放弃了购买 iPad 及其昂贵的配件的念头,选择拥抱 Chromebook。</p><p>为了追求极致的性价比,我选择了这款 联想 Chromebook Dute 加上 联想 USI 触控笔,1730 + 330 合计 2060 元。</p><h3 id="购买"><a href="#购买" class="headerlink" title="购买"></a>购买</h3><p>我是在亚马逊海外购下单的,货从美国仓库发出。平板花费了8天来到了我的手上,而触控笔因为海关查验,比平板迟了两天。跨国快递的速度比我想象的要快不少。</p><h3 id="设计与体验"><a href="#设计与体验" class="headerlink" title="设计与体验"></a>设计与体验</h3><p>Duet,意为合二为一。CB Duet 的设计理念和 Surface Book 一致——打造一台既可以当作平板又可以当作电脑使用的设备。</p><p>CB Duet 附赠了磁吸键盘与可以作为支架的保护套,这一点比 iPad 高不少。</p><p>但是,键盘与触控板的体验实在是一言难尽。</p><p>键盘在不平整的环境下偶尔会出现多次触发(按一次键打出两次字母)的情况,不过放在平整桌面就不会了。键程尚可,但按键布局一般——为了在10寸大小的区域容纳全部按键,联想选择了将键盘右侧的按键(大部分是符号键)缩小,这让打出正确的符号变得十分困难。</p><p>触控板的体验更加一言难尽。手感很差,似乎没做过亲肤处理,滑动阻力非常大;定位也很不准确。但 CB Duet 有一块10寸的触摸屏,为何不使用触控操作呢?</p><p>总而言之,CB Duet 附赠的键盘属于“能用”的级别,就像现在的我敲着博客——做一点文字工作完全没问题。Coding ?别想了,我替你试过了,如果只是简单改几行代码,比如 Caddy 的配置文件,完全没问题;如果想跑完整的开发环境,性能可能不够;如果使用 code-server……也不是不行,但10寸的屏幕实在不能施展浑身解数啊。</p><h3 id="续航"><a href="#续航" class="headerlink" title="续航"></a>续航</h3><p>部分比较“卷”的朋友可能比较担心这个问题,是我先倒下还是 CB Duet 先倒下?</p><p>根据我的实际体验——当然这可能很不准确,你大概率撑不过 CB Duet。</p><p>实际测试下来,一个上午,四节课下来,大概使用 15%-20% 电量。</p><p>ARM 的超低功耗让 CB Duet 有官方标称的将近 11 小时的续航;如果你像我一样调低屏幕亮度,并只使用笔记软件,系统提示的理论续航甚至达到 20 小时;倘若是高强度使用,例如使用 ssh、打开 Linux 虚拟机等,续航则在 6-8 小时左右。</p><h3 id="性能"><a href="#性能" class="headerlink" title="性能"></a>性能</h3><p>翻到上面再看一眼价格,还要谈什么性能吗!</p><p>本人不喜欢的 MTK P60T,8c 2.0Ghz。</p><p>不过实际体验来看,这颗小芯片的性能完全能喂饱 ChromeOS 和它的安卓容器,至于 Linux ,只要不跑 GUI 应用(Linux 容器暂无图形硬件加速)也没问题。</p><p>听说联想计划推出搭载高通骁龙 7c 的同款 CB ,性能有略微升级,如果价格依旧能持平,那会是更好的选择。</p><h3 id="系统与体验"><a href="#系统与体验" class="headerlink" title="系统与体验"></a>系统与体验</h3><p>ChromeOS 的操作需要适应一段时间。</p><p>你应该要改变对应用的认知——减少安装实体应用,更多地拥抱 PWA ,可以让这个专门为 Chrome 优化的操作系统发挥全部实力。</p><p>安卓容器的性能真的很棒,可能是安卓和 ARM 相性较好的缘故吧,安卓应用在 CB Duet 上表现极佳,我觉得和一台安卓平板几乎没有差异。这台安卓平板却还能跑完整的 Chrome 浏览器和 Linux 容器。</p><p>系统的其他体验可以在网络上看看其他人的博客。如果我在后续体验中有什么心得体会,会考虑写成博客。</p><h3 id="还有触控笔"><a href="#还有触控笔" class="headerlink" title="还有触控笔"></a>还有触控笔</h3><p>联想这只 USI 触控笔是亚马逊上最便宜的,没有侧边按键、没有笔擦。触控笔没有太多要说的,昨晚用它写了一份作业,体验良好。</p><p>使用一周之后,偶尔会出现笔凌空识别的情况,无法测试出是硬件还是软件的问题,略微影响使用体验。</p><h2 id="小米手环6"><a href="#小米手环6" class="headerlink" title="小米手环6"></a>小米手环6</h2><p>这是我第一次体验手环产品,之前戴的都是智能/半智能手表。</p><p>小米手环6的屏幕在手环产品中是比较大的,且能自定义壁纸,这是它最吸引我的地方。</p><p>至于续航,的确是硬伤。在打开除了全天心率监测以外的所有监测项目,心率检测频率设为1分钟一次后,手环一天消耗 20% 左右电量。</p><p>总体体验还算满意的。</p>]]></content>
<categories>
<category>随笔</category>
</categories>
<tags>
<tag>随笔</tag>
</tags>
</entry>
<entry>
<title>群晖搭建 VSCode 服务器与 Syncthing 服务</title>
<link href="/archives/375e7789.html"/>
<url>/archives/375e7789.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>这次我尝试在群晖上搭建 VSCode 服务器与 Syncthing 服务,实现电脑与 NAS 间的代码同步与网页中的 Coding。</p><span id="more"></span><hr><h2 id="VSCode-网页版的实现"><a href="#VSCode-网页版的实现" class="headerlink" title="VSCode 网页版的实现"></a>VSCode 网页版的实现</h2><h3 id="偶遇服务器软件"><a href="#偶遇服务器软件" class="headerlink" title="偶遇服务器软件"></a>偶遇服务器软件</h3><p>刷 RSS 时我看到 V2EX 上一个帖子分享了一个实用工具:<a href="%22https://github.com/conwnet/github1s%22">github+1s</a></p><p>这个项目可以实现在 <strong>网页版 VSCode</strong> 中打开 GitHhub 上的代码。</p><p>这个项目使用的 <a href="%22https://github.com/cdr/code-server%22">code-server</a> 引起了我的兴趣。</p><h3 id="code-server-的部署"><a href="#code-server-的部署" class="headerlink" title="code-server 的部署"></a>code-server 的部署</h3><p>群晖自带的 Docker 套件简化了部署的过程。</p><p>在注册表中搜索 <a href="https://registry.hub.docker.com/r/codercom/code-server/">code-server</a> 下载 image;</p><p>打开 image 进行配置:</p><ul><li>使用高权限执行容器</li><li>在 <code>高级设置-环境</code> 页面中添加环境变量 <code>PASSWORD</code>,值设定为你的登陆密码(由于在 Docker 页面中以明文保存,请注意密码安全)。</li></ul><p>启动容器,并使用 Docker 内置的 <code>终端机</code> 打开一个新的 <code>bash</code>。换源、更新 apt 、安装常用软件我就不再赘述。</p><h3 id="code-server-的外网访问"><a href="#code-server-的外网访问" class="headerlink" title="code-server 的外网访问"></a>code-server 的外网访问</h3><p>code-server 没有自带 HTTPS 相关的配置,需要使用网站服务器进行反向代理。</p><p>目前比较流行的有 Caddy 和 NGINX 两款。</p><p>鉴于 Caddy 配置简单且 HTTPS 优先,我这次使用 Caddy。</p><p><a href="https://caddyserver.com/docs/install#debian-ubuntu-raspbian">Caddy 官方安装文档</a></p><p>或使用一键安装脚本</p><p><code>curl https://getcaddy.com | bash -s personal</code></p><p>如果有开放的 443 端口,则可使用 Caddy 的自动 HTTPS 功能进行快速配置。</p><p>若像我一样在家中的 NAS 上配置 code-server,则需要自己申请 tls 证书 (如 Let`s Encrypt),并按照 <a href="https://dengxiaolong.com/caddy/zh/tls.html">Caddy-tls</a> 配置。</p><p>反向代理配置可参考 <a href="https://github.com/cdr/code-server/blob/main/docs/guide.md#lets-encrypt">code-server 官方的反代配置教程</a>。</p><h3 id="一些疑难杂症"><a href="#一些疑难杂症" class="headerlink" title="一些疑难杂症"></a>一些疑难杂症</h3><h4 id="一些插件无法安装"><a href="#一些插件无法安装" class="headerlink" title="一些插件无法安装"></a>一些插件无法安装</h4><p>目前 code-server 的 VSCode 版本为 1.51.1, VSCode 官方则为 1.54.3 ,因此某些较新的插件可能无法使用。</p><p>可以前往 <a href="https://marketplace.visualstudio.com/">VS插件市场</a> 下载旧版插件并手动安装。</p><h4 id="Docker-内挂载的目录无写权限"><a href="#Docker-内挂载的目录无写权限" class="headerlink" title="Docker 内挂载的目录无写权限"></a>Docker 内挂载的目录无写权限</h4><p>使用 <code>sudo chmod 777 ./</code> 给 coder 用户赋予读写权力。</p><h4 id="Docker-内-Caddy-无法自启"><a href="#Docker-内-Caddy-无法自启" class="headerlink" title="Docker 内 Caddy 无法自启"></a>Docker 内 Caddy 无法自启</h4><p>这个我也还没有解决。暂且手动启动。</p><h4 id="code-server-的各种性能问题"><a href="#code-server-的各种性能问题" class="headerlink" title="code-server 的各种性能问题"></a>code-server 的各种性能问题</h4><p>等待更多的更新吧,我接下来会尝试在 Docker 里编译原版 VSCode 并开启 Web 模式,对比二者性能。</p><h2 id="Syncthing-服务搭建"><a href="#Syncthing-服务搭建" class="headerlink" title="Syncthing 服务搭建"></a>Syncthing 服务搭建</h2><p><a href="https://syncthing.net/">Syncthing 官网</a> 已经给出了十分详尽的安装教程,也有群晖的安装包,我就不再赘述安装过程。</p><p>Syncthing 的管理页面端口为 <code>8384</code>,若想在外网访问请使用 HTTPS。可以使用群晖内置的反向代理服务器进行反代。</p><p>要注意把 <code>22000</code> 端口的 <code>TCP</code> 与 <code>UDP</code> 全部开放,才可在外网顺利与 NAS 同步。</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>教程</tag>
</tags>
</entry>
<entry>
<title>校色初体验 / 寒假总结</title>
<link href="/archives/2c0bfb1a.html"/>
<url>/archives/2c0bfb1a.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>好久不见,甚是想念。今天来分享一下初次校色的体验以及寒假我都干了些什么。</p><span id="more"></span><hr><h2 id="校色初体验"><a href="#校色初体验" class="headerlink" title="校色初体验"></a>校色初体验</h2><h3 id="为什么要校色"><a href="#为什么要校色" class="headerlink" title="为什么要校色"></a>为什么要校色</h3><p>我的笔记本电脑型号是 联想小新 Air 14 2020,拥有一块 14寸 100% sRGB 色域(实际为 94% sRGB)的屏幕,面板型号是 友达 B140HAN06.8。很幸运,不仅抽中了三星 SSD,还抽中了友达的屏幕。</p><p>为了更舒服地阅读代码,我又淘了一台 17.3寸 的 DIY 便携显示器,同样也是 100% sRGB 色域(实际为 95% sRGB),面板型号是 友达 B173han01.1。</p><p>由于便携屏的驱动板都是通用的,并没有对某块面板有调教,也不可能有屏幕出厂时的调教,因此这块便携屏的色差非常明显。就校色结果来看,光度 (gamma) 值就有 70% 左右的偏差。</p><p>通过校色,两块屏幕色彩更加接近,且更接近真实的颜色,看起来也会更舒服一些。</p><h3 id="关于价格"><a href="#关于价格" class="headerlink" title="关于价格"></a>关于价格</h3><p>我想很多人和我有同样的顾虑,感觉租用校色仪价格不菲。</p><p>这次租用时长为 3天,我仅使用了一天半就归还了。总共支出为 校色仪租金 40元 + 回程运费 18元。押金原本是 750元,和店家商量后爽快地降到了 500元。</p><p>虽然商家划定了许多可能导致押金被扣的规则,但只要你小心一点、爱护一点,完璧归赵、取回押金是很简单的。</p><h3 id="色温选择"><a href="#色温选择" class="headerlink" title="色温选择"></a>色温选择</h3><p>刚开始我选择的目标色温是 6500K,在校色后发现偏黄许多。最后我选择的目标色温是 7500K。当然,两块屏幕 6500K 色温的校色文件我都保存下来了。</p><h3 id="最终校色效果"><a href="#最终校色效果" class="headerlink" title="最终校色效果"></a>最终校色效果</h3><p>按照红蜘蛛给出的报告,联想笔记本的这块屏幕在色准上要优于便携屏,白点与灰度的 △E <= 0.2 ,便携屏则是 △E <= 0.5。</p><p>联想这块屏出厂也比较准,值得表扬~</p><p>下面是校色完的合影:</p><p><img src="/images/2021-2-26/1.jpg"></p><hr><h2 id="寒假我都干了啥"><a href="#寒假我都干了啥" class="headerlink" title="寒假我都干了啥"></a>寒假我都干了啥</h2><p>列举一下:</p><ul><li>学习(重温)了 C语言;</li><li>学习了 PHP 基础;</li><li>学习了 Burp Suite 基础;</li><li>学习了 After Effect;</li><li>学习了 Audition 基本操作;</li><li>完成了一个 5分钟 的视频项目,比较灵活地运用了 PS Pr AE 及 Au;</li><li>当了两个星期的补习老师,挣来的钱买了 飞利浦 X2HR HiFi 耳机和一块 2242 SSD;</li><li>学习了 Solidworks 基本操作(这两天学的);</li></ul><p>感觉还是做了不少事的。</p><p>马上要开学了,下学期总算能学些我想学的了。</p><p>总之,好好干吧!</p>]]></content>
<categories>
<category>随笔</category>
</categories>
<tags>
<tag>随笔</tag>
</tags>
</entry>
<entry>
<title>2020 年终总结</title>
<link href="/archives/cd7dffda.html"/>
<url>/archives/cd7dffda.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>2020 马上就要过去了,我想做一个年终总结。</p><span id="more"></span><hr><p>非常抱歉鸽了博客四个月。</p><p>其实十月我忙中偷闲写了一篇文章打算发上来,却被 Hexo 吞了,我也没了重写的热情,就这么让它消失了。</p><h3 id="2020-我做了什么"><a href="#2020-我做了什么" class="headerlink" title="2020 我做了什么"></a>2020 我做了什么</h3><p>■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</p><p>■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</p><p>■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</p><p>■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</p><p>■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</p><h3 id="2021-我打算做什么"><a href="#2021-我打算做什么" class="headerlink" title="2021 我打算做什么"></a>2021 我打算做什么</h3><p>First, 我打算加入学校的 CTF 战队。自学 CTF 的过程中一定会遇到不少有趣的事情,我会抽空写作博文与大家分享的。</p><p>Second, 我想和同学合作开发一些有趣的小项目乃至小软件,点子已经有几个存在脑子里了。</p><p>Then, 我打算磨练一下业务能力,而不是简单地编写脚本一样存在的代码,CSS 也不能写得歪歪扭扭的了(捂脸)。</p><p>在一切都回归正轨之后,我也会跟上各位的步伐,继续探寻有趣的项目,还请大家多多期待!</p><h3 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h3><p>2020 发生了太多糟糕的事情,祈愿 2021 能遇见更多美好的事情。</p>]]></content>
<categories>
<category>随笔</category>
</categories>
<tags>
<tag>随笔</tag>
</tags>
</entry>
<entry>
<title>逃离国产软件 - 虚拟机计划</title>
<link href="/archives/a455b52c.html"/>
<url>/archives/a455b52c.html</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>使用 Hyper-V 运行 Windows LTSC 虚拟机,以隔离流氓的国产软件们。</p><h3 id="为何大费周章?"><a href="#为何大费周章?" class="headerlink" title="为何大费周章?"></a>为何大费周章?</h3><p>我试过网络上的不少方法来隔离鹅厂的软件 —— 刚开源的 Sandboxie 也好,利用 Windows ACL 机制通过低权账户加以限制也好 —— 都因为权限问题失败了。最后决定用虚拟环境直接隔离这些软件。</p><span id="more"></span><h3 id="为什么是-Hyper-V-和-LTSC?"><a href="#为什么是-Hyper-V-和-LTSC?" class="headerlink" title="为什么是 Hyper-V 和 LTSC?"></a>为什么是 Hyper-V 和 LTSC?</h3><p>我用过 VMWare,觉得还是 Windows 原生的 Hyper-V 启动最快。还不用钱。</p><p>Windows LTSC 是企业定制版,官方精简了系统,性能开销更少。</p><h3 id="事前准备"><a href="#事前准备" class="headerlink" title="事前准备"></a>事前准备</h3><p>拥有 16G 以上内存及 NVME 高速硬盘的用户可以放心采用该方案,虚拟机运行时不会影响其他软件的流畅运行。</p><h4 id="下载-MSDN-上的-Windows-LTSC"><a href="#下载-MSDN-上的-Windows-LTSC" class="headerlink" title="下载 MSDN 上的 Windows LTSC:"></a>下载 <a href="https://msdn.itellyou.cn/">MSDN</a> 上的 Windows LTSC:</h4><p>侧边栏选择 <strong>操作系统</strong> ;选择 <strong>Windows 10 Enterprise LTSC 2019</strong>。</p><h4 id="安装-Hyper-V:"><a href="#安装-Hyper-V:" class="headerlink" title="安装 Hyper-V:"></a>安装 Hyper-V:</h4><p>对于 Windows 专业版 用户,在 控制面板 - 程序与功能 - 启动或关闭Windows功能 中找到 <strong>Hyper-V</strong> 并打开。</p><p>对于 其他版本 Windows 的用户,则稍微有些麻烦:</p><ol><li>在记事本中输入如下代码</li></ol><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></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">pushd</span> <span class="hljs-string">"%~dp0"</span><br><br><span class="hljs-built_in">dir</span> /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt<br><br><span class="hljs-keyword">for</span> /f %%i <span class="hljs-keyword">in</span> (<span class="hljs-string">'findstr /i . hyper-v.txt 2^>nul'</span>) <span class="hljs-keyword">do</span> dism /online /norestart /add-package:<span class="hljs-string">"%SystemRoot%\servicing\Packages\%%i"</span><br><br>del hyper-v.txt<br><br>Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL<br></code></pre></td></tr></table></figure><ol start="2"><li>把文件保存为Hyper-V.cmd</li><li>右键该文件,选择 <strong>以管理员身份运行</strong></li></ol><p>根据提示完成安装。</p><blockquote><p>摘自知乎 <a href="https://zhuanlan.zhihu.com/p/51939654">没人不认识我</a> 的回答</p></blockquote><h3 id="安装虚拟机"><a href="#安装虚拟机" class="headerlink" title="安装虚拟机"></a>安装虚拟机</h3><p>打开 Hyper-V ,选择 <strong>新建 - 虚拟机</strong> ;</p><p>根据向导提示设置虚拟机,选择 <strong>第一代虚拟机</strong> ;</p><p>内存分配我选了 2G (共16G);CPU 分配我选了 4线程 (共12线程)【需要完成配置后在 <strong>设置</strong> 中更改】;</p><p>其余设置默认或自定;</p><p>安装选项选择 <strong>从 CD/DVD-ROM 安装操作系统</strong> ,选择刚刚下载好的 Windows LTSC ISO镜像;</p><p>完成配置后,启动虚拟机,安装 Windows LTSC 到硬盘。</p><h3 id="配置环境"><a href="#配置环境" class="headerlink" title="配置环境"></a>配置环境</h3><p>装好系统后要干什么不用我说了吧。</p><p>把垃圾们倒进去就好啦。</p><p>实测空载消耗 CPU 算力在 0%-3% 浮动;内存占用 2.2G,实际使用 1.2G 。</p>]]></content>
<categories>
<category>教程</category>