-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.xml
More file actions
2609 lines (1815 loc) · 158 KB
/
Copy pathindex.xml
File metadata and controls
2609 lines (1815 loc) · 158 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>About on </title>
<link>https://with9.github.io/</link>
<description>Recent content in About on </description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<lastBuildDate>Thu, 16 Apr 2020 21:38:52 +0800</lastBuildDate>
<atom:link href="https://with9.github.io/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>About</title>
<link>https://with9.github.io/about/</link>
<pubDate>Thu, 16 Apr 2020 21:38:52 +0800</pubDate>
<guid>https://with9.github.io/about/</guid>
<description>
<h1 class="relative group">关于咱
<div id="%E5%85%B3%E4%BA%8E%E5%92%B1" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#%E5%85%B3%E4%BA%8E%E5%92%B1" aria-label="Anchor">#</a>
</span>
</h1>
<ul>
<li>吾辈id:with ∅</li>
<li>Email:dc198424601@outlook.com #杂糅了两本书,大家可以猜猜看是哪两本</li>
<li><span class="spoiler" title="由于安全/剧透原因,此处已隐藏" style="background-color: black; color: black;" onmouseover="this.style.color='white'" onmouseout="this.style.color='black'">
喜欢道家,道德经爱好者,目前背诵进度40%
</span></li>
<li>绝赞学琴中(</li>
<li>Arch邪教成员</li>
<li>喜欢宅系文化</li>
<li>愿优雅而纯粹的活着</li>
</ul>
<h1 class="relative group">关于小站
<div id="%E5%85%B3%E4%BA%8E%E5%B0%8F%E7%AB%99" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#%E5%85%B3%E4%BA%8E%E5%B0%8F%E7%AB%99" aria-label="Anchor">#</a>
</span>
</h1>
<ul>
<li>记录一些杂事</li>
<li>记录一些读后感</li>
<li><del>偶尔翻译一些觉得很有意思的文章,顺便锻炼一下英语</del></li>
<li><a href="post/read/" >
BFA</a></li>
</ul>
<h1 class="relative group">猫兄
<div id="%E7%8C%AB%E5%85%84" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#%E7%8C%AB%E5%85%84" aria-label="Anchor">#</a>
</span>
</h1>
<p>
<figure>
<img class="my-0 rounded-md" loading="lazy" src="https://with9.github.io/img/my_cat.jpg" alt=" " />
</figure>
</p>
</description>
</item>
<item>
<title>scroll实现带缩放的master(一步/台前调度)布局</title>
<link>https://with9.github.io/post/scroll-scale-master/</link>
<pubDate>Fri, 27 Mar 2026 20:33:39 +0800</pubDate>
<guid>https://with9.github.io/post/scroll-scale-master/</guid>
<description><p>Scroll 作者在讨论中提供过一个 <a href="https://github.com/dawsers/scroll/discussions/48#discussioncomment-13803697" target="_blank">
master 布局的示例</a>。所谓的 Master 布局,核心逻辑就是将屏幕划分为两个区域:一边是占据大部分空间的“主窗口(Master)”,另一边是堆叠在一起的“从属窗口(Stack)”。但侧边的 Stack 窗口如果多了,每个窗口只能分到极窄的空间,除了看个标题,几乎感知不到内容。</p>
<p>有一天在折腾配置时突发奇想:之前各大厂商(锤子的“一步”、苹果的台前调度)都在推崇的那种“侧边缩略图”模式,其本质不就是 Master 布局 + 内容缩放 吗?,正好scroll有提供任意缩放内容的命令<code>scale_content</code>。如果能让侧边的 Stack 窗口按比例缩小,既能看清内容预览,又不占用主屏的逻辑空间,这不就很棒?</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-diff" data-lang="diff"><span class="line"><span class="cl"><span class="gu">44c44,45
</span></span></span><span class="line"><span class="cl"><span class="gu"></span><span class="gd">&lt; scroll.command(con, &#34;set_size h 0.5; move right nomode&#34;)
</span></span></span><span class="line"><span class="cl"><span class="gd"></span><span class="gs">---
</span></span></span><span class="line"><span class="cl"><span class="gs"></span><span class="gi">&gt; scroll.command(con, &#34;set_size h 0.3; move right nomode&#34;)
</span></span></span><span class="line"><span class="cl"><span class="gi">&gt; scroll.command(con, &#34;scale_content exact 0.5&#34;)
</span></span></span><span class="line"><span class="cl"><span class="gi"></span><span class="gu">51c52,53
</span></span></span><span class="line"><span class="cl"><span class="gu"></span><span class="gd">&lt; scroll.command(scroll.view_get_container(views[1]), &#34;set_size h 0.5; set_size v 1.0; focus&#34;)
</span></span></span><span class="line"><span class="cl"><span class="gd"></span><span class="gs">---
</span></span></span><span class="line"><span class="cl"><span class="gs"></span><span class="gi">&gt; scroll.command(scroll.view_get_container(views[1]), &#34;set_size h 0.7; set_size v 1.0; focus&#34;)
</span></span></span><span class="line"><span class="cl"><span class="gi">&gt; scroll.command(scroll.view_get_container(views[1]), &#34;scale_content exact 1.0&#34;)
</span></span></span><span class="line"><span class="cl"><span class="gi"></span><span class="gu">70a73,75
</span></span></span><span class="line"><span class="cl"><span class="gu"></span><span class="gi">&gt; local focused_view = scroll.focused_view()
</span></span></span><span class="line"><span class="cl"><span class="gi">&gt; local focused_con = scroll.view_get_container(focused_view)
</span></span></span><span class="line"><span class="cl"><span class="gi">&gt; scroll.command(focused_con, &#34;scale_content exact 1.0&#34;)
</span></span></span><span class="line"><span class="cl"><span class="gi"></span><span class="gu">78a84,85
</span></span></span><span class="line"><span class="cl"><span class="gu"></span><span class="gi">&gt; scroll.command(container, &#34;scale_content exact 0.5&#34;)
</span></span></span><span class="line"><span class="cl"><span class="gi"></span>&gt;
</span></span></code></pre></div><p>折腾完发现咱需要的并不是真的master布局,与其维护复杂的 Master 逻辑,不如直接缩放具体的某一列。这样就可以兼容其他布局啦。以下是建议的配置。为了方便直接变成master布局所以还是保留了原脚本。脚本存储在<a href="https://gitlab.com/dc198424601/dotfiles/-/raw/main/scroll/.config/scroll/scripts/scale_2.lua?ref_type=heads" target="_blank">
配置仓库</a></p>
<pre tabindex="0"><code>mode &#34;master&#34; {
bindsym t exec scrollmsg lua ~/.config/scroll/scripts/master.lua toggle; mode default
bindsym r exec scrollmsg lua ~/.config/scroll/scripts/scale_2.lua run; mode default
bindsym u exec scrollmsg lua ~/.config/scroll/scripts/scale_2.lua undo; mode default
bindsym s exec scrollmsg lua ~/.config/scroll/scripts/scale_2.lua swap; mode default
bindsym Escape mode &#34;default&#34;
}
bindsym $mod+o mode &#34;master&#34;
bindsym --whole-window $mod+button2 exec scrollmsg lua ~/.config/scroll/scripts/scale_2.lua swap
</code></pre><video width=100% controls>
<source src="https://with9.github.io/img/scroll-scale-master/master_scale.mp4" type="video/webm">
</video></description>
</item>
<item>
<title>Linux下用bottles运行悬疑民俗大作 死月妖花~四月八日 汉化版的方法</title>
<link>https://with9.github.io/post/linux_shigatsu/</link>
<pubDate>Thu, 05 Mar 2026 00:33:39 +0800</pubDate>
<guid>https://with9.github.io/post/linux_shigatsu/</guid>
<description>
<h1 class="relative group">运行原版
<div id="%E8%BF%90%E8%A1%8C%E5%8E%9F%E7%89%88" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#%E8%BF%90%E8%A1%8C%E5%8E%9F%E7%89%88" aria-label="Anchor">#</a>
</span>
</h1>
<p>游戏下载: <a href="https://www.freem.ne.jp/dl/win/19917" target="_blank">
死月妖花~四月八日~</a></p>
<p>安装配置bottles,必须用flatpak版本的,非flatpak安装会无法运行游戏,咱目前不清楚具体原因。</p>
<ul>
<li><code>flatpak install com.usebottles.bottles </code></li>
<li><code>flatpak config --set extra-languages ja</code> 与之后配置的LC_ALL环境变量有关</li>
<li><code>flatpak update</code> 会自动安装一些locale相关的包</li>
</ul>
<p>新建bottles</p>
<ul>
<li>选择自定义32位架构,运行器选择 <code>soda-7.0</code></li>
<li>安装<code>cjkfonts</code> 或复制 <code>msgothic.ttc</code> 到环境的 <code>drive_c/windows/Fonts/</code> 下</li>
<li>环境变量: <code>LC_ALL=ja_JP.UTF-8</code></li>
</ul>
<p>
<figure>
<img class="my-0 rounded-md" loading="lazy" src="https://with9.github.io/img/linux_shigatsu/final.png" alt="image-orignal" />
</figure>
</p>
<h1 class="relative group">汉化安装与配置
<div id="%E6%B1%89%E5%8C%96%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#%E6%B1%89%E5%8C%96%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE" aria-label="Anchor">#</a>
</span>
</h1>
<p>汉化补丁下载参考该专栏: <a href="https://www.bilibili.com/opus/974061242350043142" target="_blank">
死月妖花~四月八日~ AI汉化补丁</a>,先将补丁内文件复制到本体游戏文件夹内。</p>
<p>伪装字体</p>
<p>该汉化补丁通过 StringReloads 劫持游戏的 DSOUND.dll 实现字体替换。折腾过程中发现:</p>
<ul>
<li>
<p>Soda 9.0 (32-bit) 环境下,配合 dotnet48 与 quartz,通过配置 dsound (n,b) 可以成功加载汉化补丁并实现字体替换。但由于 quartz 与游戏过场动画存在兼容性问题,导致序章结束时卡死。</p>
</li>
<li>
<p>Soda 7.0 (32-bit) 虽然能绕过卡死,却无法正常加载汉化字体。在尝试注册表替换等多种手段均告失败(表现为加载补丁字体即黑屏)后,发现利用 FontForge 脚本将原版 MS UI Gothic 的元数据注入到补丁字体中就可以正常运行了,下面的代码是gemini帮忙写的。</p>
</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># by gemini</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">fontforge</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">fontTools.ttLib</span> <span class="kn">import</span> <span class="n">TTCollection</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 1. 打开母本</span>
</span></span><span class="line"><span class="cl"><span class="n">collection</span> <span class="o">=</span> <span class="n">TTCollection</span><span class="p">(</span><span class="s2">&#34;msgothic.ttc&#34;</span><span class="p">)</span> <span class="c1">#https://github.com/FSKiller/Microsoft-Fonts/raw/refs/heads/main/msgothic.ttc</span>
</span></span><span class="line"><span class="cl"><span class="n">base_font</span> <span class="o">=</span> <span class="n">collection</span><span class="o">.</span><span class="n">fonts</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="c1">#MS UI Gothic</span>
</span></span><span class="line"><span class="cl"><span class="n">base_font</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="s2">&#34;MSUIGothic.ttf&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">base</span> <span class="o">=</span> <span class="n">fontforge</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s2">&#34;MSUIGothic.ttf&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 打开字形来源</span>
</span></span><span class="line"><span class="cl"><span class="n">source</span> <span class="o">=</span> <span class="n">fontforge</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s2">&#34;MSPGothic.otf&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 劫持基础标识信息</span>
</span></span><span class="line"><span class="cl"><span class="n">source</span><span class="o">.</span><span class="n">fontname</span> <span class="o">=</span> <span class="n">base</span><span class="o">.</span><span class="n">fontname</span>
</span></span><span class="line"><span class="cl"><span class="n">source</span><span class="o">.</span><span class="n">fullname</span> <span class="o">=</span> <span class="n">base</span><span class="o">.</span><span class="n">fullname</span>
</span></span><span class="line"><span class="cl"><span class="n">source</span><span class="o">.</span><span class="n">familyname</span> <span class="o">=</span> <span class="n">base</span><span class="o">.</span><span class="n">familyname</span>
</span></span><span class="line"><span class="cl"><span class="n">source</span><span class="o">.</span><span class="n">version</span> <span class="o">=</span> <span class="n">base</span><span class="o">.</span><span class="n">version</span>
</span></span><span class="line"><span class="cl"><span class="n">source</span><span class="o">.</span><span class="n">copyright</span> <span class="o">=</span> <span class="n">base</span><span class="o">.</span><span class="n">copyright</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 深度劫持 OS/2 表和头信息</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 拷贝 Ascent/Descent 确保排版一致</span>
</span></span><span class="line"><span class="cl"><span class="n">source</span><span class="o">.</span><span class="n">ascent</span> <span class="o">=</span> <span class="n">base</span><span class="o">.</span><span class="n">ascent</span>
</span></span><span class="line"><span class="cl"><span class="n">source</span><span class="o">.</span><span class="n">descent</span> <span class="o">=</span> <span class="n">base</span><span class="o">.</span><span class="n">descent</span>
</span></span><span class="line"><span class="cl"><span class="n">source</span><span class="o">.</span><span class="n">upos</span> <span class="o">=</span> <span class="n">base</span><span class="o">.</span><span class="n">upos</span>
</span></span><span class="line"><span class="cl"><span class="n">source</span><span class="o">.</span><span class="n">uwidth</span> <span class="o">=</span> <span class="n">base</span><span class="o">.</span><span class="n">uwidth</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 劫持所有的 Name Records</span>
</span></span><span class="line"><span class="cl"><span class="n">source</span><span class="o">.</span><span class="n">sfnt_names</span> <span class="o">=</span> <span class="n">base</span><span class="o">.</span><span class="n">sfnt_names</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">source</span><span class="o">.</span><span class="n">generate</span><span class="p">(</span><span class="s2">&#34;msgothic_patched.ttf&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">base</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">source</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span></code></pre></div><p>配置 bottles 环境</p>
<ul>
<li>选择自定义32位架构,运行器选择 <code>soda-7.0</code></li>
<li><code>msgothic_patched.ttf</code> 字体文件复制到环境的 <code>drive_c/windows/Fonts/</code> 下</li>
<li>环境变量: <code>LC_ALL=ja_JP.UTF-8</code></li>
</ul>
<p>点击 bottles 内的浏览,将包含补丁文件在内的游戏目录移动到 bottle 内的 <code>drive_c/Program Files</code> 下,并添加快捷方式,不出意外应该就可以正常运行了。</p>
<p>
<figure>
<img class="my-0 rounded-md" loading="lazy" src="https://with9.github.io/img/linux_shigatsu/image-20260305095452066.png" alt="image-cjk" />
</figure>
</p>
<p>因为是通过伪装字体的形式实现的字体替换,建议本bottles环境只运行此游戏就好。</p>
<h1 class="relative group">已知可能问题
<div id="%E5%B7%B2%E7%9F%A5%E5%8F%AF%E8%83%BD%E9%97%AE%E9%A2%98" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#%E5%B7%B2%E7%9F%A5%E5%8F%AF%E8%83%BD%E9%97%AE%E9%A2%98" aria-label="Anchor">#</a>
</span>
</h1>
<ul>
<li>
<p>咒杀篇前卡死: 可能是用了较高版本的soda或未正确选择32位环境.</p>
</li>
<li>
<p>字体中部分乱码: 字体未伪装成功</p>
<p>
<figure>
<img class="my-0 rounded-md" loading="lazy" src="https://with9.github.io/img/linux_shigatsu/image-20260305095527681.png" alt="image-cjk" />
</figure>
</p>
</li>
</ul>
</description>
</item>
<item>
<title>scroll实现grid布局</title>
<link>https://with9.github.io/post/scroll-grid/</link>
<pubDate>Thu, 22 Jan 2026 20:33:39 +0800</pubDate>
<guid>https://with9.github.io/post/scroll-grid/</guid>
<description>
<h2 class="relative group">scroll介绍
<div id="scroll%E4%BB%8B%E7%BB%8D" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#scroll%E4%BB%8B%E7%BB%8D" aria-label="Anchor">#</a>
</span>
</h2>
<p>由于 Hyprland 最近一次破坏性更新(Break Update)带来的不便,在习惯了 hyprscroller 的操作逻辑后,咱选择了由同一作者维护的新项目:scroll。scroll 提供了更加灵活的“卷轴”体验,支持上下左右全方位的平铺与滚动。体验很舒服,但是grid模式没有了,没法愉快的九宫格刷b站了,幸好作者提供了丰富的Lua接口,实在不行咱们可以自己实现一个。询问作者后得到了个<a href="https://github.com/dawsers/scroll/discussions/48#discussioncomment-15353451" target="_blank">
初步的例子</a>,核心逻辑:将新窗口的插入位置固定在工作区的最后,检查它的前一列容器中的子窗口数量。如果数量小于 3,则执行一次 <code>move left nomode</code>,将新窗口塞进前一列。</p>
<h2 class="relative group">一些小优化
<div id="%E4%B8%80%E4%BA%9B%E5%B0%8F%E4%BC%98%E5%8C%96" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#%E4%B8%80%E4%BA%9B%E5%B0%8F%E4%BC%98%E5%8C%96" aria-label="Anchor">#</a>
</span>
</h2>
<ul>
<li>
<p>不支持“插空”补位</p>
<ul>
<li>手动关闭中间的窗口后,新窗口依然只会在最右侧创建,无法填充留下的空洞。</li>
<li>
<figure>
<img class="my-0 rounded-md" loading="lazy" src="https://with9.github.io/img/scroll-grid/grid_no3.jpg" alt="image-orignal" />
</figure>
</li>
<li>方案:新窗口创建时,遍历所有列,优先寻找子窗口数未达上限(column_limit)的容器并执行 <code>move left nomode</code>填补。</li>
<li>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-lua" data-lang="lua"><span class="line"><span class="cl"><span class="p">...</span>
</span></span><span class="line"><span class="cl"><span class="kr">if</span> <span class="o">#</span><span class="n">tiling</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="kr">then</span>
</span></span><span class="line"><span class="cl"> <span class="kd">local</span> <span class="n">target_tiling</span> <span class="o">=</span> <span class="kc">nil</span>
</span></span><span class="line"><span class="cl"> <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span><span class="o">#</span><span class="n">tiling</span> <span class="o">-</span> <span class="mi">1</span> <span class="kr">do</span>
</span></span><span class="line"><span class="cl"> <span class="kd">local</span> <span class="n">prev_container</span> <span class="o">=</span> <span class="n">tiling</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="kd">local</span> <span class="n">children</span> <span class="o">=</span> <span class="n">scroll.container_get_children</span><span class="p">(</span><span class="n">prev_container</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="kr">if</span> <span class="n">children</span> <span class="ow">and</span> <span class="o">#</span><span class="n">children</span> <span class="o">&lt;</span> <span class="n">ws_config</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="kr">then</span>
</span></span><span class="line"><span class="cl"> <span class="n">target_tiling</span> <span class="o">=</span> <span class="n">i</span>
</span></span><span class="line"><span class="cl"> <span class="kr">break</span>
</span></span><span class="line"><span class="cl"> <span class="kr">end</span>
</span></span><span class="line"><span class="cl"> <span class="kr">end</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="kr">if</span> <span class="n">target_tiling</span> <span class="kr">then</span>
</span></span><span class="line"><span class="cl"> <span class="kd">local</span> <span class="n">steps</span> <span class="o">=</span> <span class="p">(</span><span class="o">#</span><span class="n">tiling</span> <span class="o">-</span> <span class="n">target_tiling</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"> <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">steps</span> <span class="kr">do</span>
</span></span><span class="line"><span class="cl"> <span class="n">scroll.command</span><span class="p">(</span><span class="n">container</span><span class="p">,</span> <span class="s2">&#34;move left nomode&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="kr">end</span>
</span></span><span class="line"><span class="cl"> <span class="kr">end</span>
</span></span><span class="line"><span class="cl"><span class="kr">end</span>
</span></span><span class="line"><span class="cl"><span class="p">...</span>
</span></span></code></pre></div></li>
</ul>
</li>
<li>
<p>缺乏工作区独立性</p>
<ul>
<li>全局开关导致所有工作区被迫同步开启 Grid。</li>
<li>解决方案:将状态存储由布尔值改为以 ws_name 为键的哈希表</li>
</ul>
</li>
<li>
<p>加入 on_destroy 回调。当某个grid工作区只剩下最后一个窗口并被关闭时,代码会自动清理该工作区的配置并切换回默认模式。</p>
</li>
<li>
<p>同时为了减少观看视频时的花销加入了调整窗口大小的逻辑。</p>
</li>
</ul>
<p>完整的脚本存储在<a href="https://gitlab.com/dc198424601/dotfiles/-/raw/main/scroll/.config/scroll/scripts/grid.lua?ref_type=heads" target="_blank">
配置仓库</a>,以下是建议的配置。</p>
<pre tabindex="0"><code>#2345为不调整窗口大小的n宫格模式,wert为调整大小的n宫格模式
mode &#34;grid&#34; {
bindsym 0 exec scrollmsg lua ~/.config/scroll/scripts/grid.lua disable; mode default
bindsym 1 exec scrollmsg lua ~/.config/scroll/scripts/grid.lua toggle; mode default
bindsym 2 exec scrollmsg lua ~/.config/scroll/scripts/grid.lua enable 2; mode default
bindsym 3 exec scrollmsg lua ~/.config/scroll/scripts/grid.lua enable 3; mode default
bindsym 4 exec scrollmsg lua ~/.config/scroll/scripts/grid.lua enable 4; mode default
bindsym 5 exec scrollmsg lua ~/.config/scroll/scripts/grid.lua enable 5; mode default
bindsym q exec scrollmsg lua ~/.config/scroll/scripts/grid.lua toggle; mode default
bindsym w exec scrollmsg lua ~/.config/scroll/scripts/grid.lua enable 2 1; mode default
bindsym e exec scrollmsg lua ~/.config/scroll/scripts/grid.lua enable 3 1; mode default
bindsym r exec scrollmsg lua ~/.config/scroll/scripts/grid.lua enable 4 1; mode default
bindsym t exec scrollmsg lua ~/.config/scroll/scripts/grid.lua enable 5 1; mode default
bindsym Escape mode &#34;default&#34;
}
bindsym $mod+Shift+y mode &#34;grid&#34;
</code></pre><p>又可以愉快的九宫格刷b站了。</p>
<video width=100% controls>
<source src="https://with9.github.io/img/scroll-grid/scroll9.mp4" type="video/webm">
</video></description>
</item>
<item>
<title>用九宫格来刷B站耶</title>
<link>https://with9.github.io/post/9bilibili/</link>
<pubDate>Sun, 30 Nov 2025 00:33:39 +0800</pubDate>
<guid>https://with9.github.io/post/9bilibili/</guid>
<description>
<h2 class="relative group">效果展示
<div id="%E6%95%88%E6%9E%9C%E5%B1%95%E7%A4%BA" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#%E6%95%88%E6%9E%9C%E5%B1%95%E7%A4%BA" aria-label="Anchor">#</a>
</span>
</h2>
<p>设备边播放边录制有点吃力,所以看起来有丝丝卡顿。效果就是可以同时刷n个视频。
<video width=100% controls>
<source src="https://with9.github.io/img/9bilibili/9bilibili.mp4" type="video/webm"><br>
</video></p>
<h2 class="relative group">准备工作
<div id="%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C" aria-label="Anchor">#</a>
</span>
</h2>
<p>要实现“九宫格刷 B 站”,我们需要准备以下工具:</p>
<ul>
<li>视频地址列表</li>
<li>播放器:推荐用 <a href="https://github.com/THMonster/Revda" target="_blank">
revda</a> 的 dmlive,直接用 mpv 的 yt-dlp 也可以,后者看不到弹幕。</li>
<li>并行工具,推荐用 <a href="https://www.gnu.org/software/parallel" target="_blank">
parallel</a>。</li>
<li>mpv 需要配置自动退出脚本,不然会同一个视频循环播放。</li>
</ul>
<h3 class="relative group">获取视频播放列表
<div id="%E8%8E%B7%E5%8F%96%E8%A7%86%E9%A2%91%E6%92%AD%E6%94%BE%E5%88%97%E8%A1%A8" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#%E8%8E%B7%E5%8F%96%E8%A7%86%E9%A2%91%E6%92%AD%E6%94%BE%E5%88%97%E8%A1%A8" aria-label="Anchor">#</a>
</span>
</h3>
<p>推荐使用这个优秀的插件导出收藏夹列表:<br>
👉 <a href="https://github.com/AHCorn/Bilibili-Favlist-Export" target="_blank">
AHCorn / Bilibili-Favlist-Export</a></p>
<p>该插件导出的文件是 CSV,其中第二列就是我们所需的视频 URL。</p>
<p>
<figure>
<img class="my-0 rounded-md" loading="lazy" src="https://with9.github.io/img/9bilibili/bilibiliFavlistExport.png" alt="" />
</figure>
</p>
<h3 class="relative group">hyprscroller配置
<div id="hyprscroller%E9%85%8D%E7%BD%AE" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#hyprscroller%E9%85%8D%E7%BD%AE" aria-label="Anchor">#</a>
</span>
</h3>
<p>我们需要用到该hyprland插件提供的<a href="https://github.com/dawsers/hyprscroller/issues/5" target="_blank">
grid模式</a>,虽然作者已经不再维护该插件,但咱找到了个还在<a href="https://github.com/cpiber/hyprscroller" target="_blank">
活跃的分支</a>,通过以下命令可以设定 grid 模式的行为,使窗口按下图顺序出现,且不会自动抢焦点:<br>
<code>hyprctl dispatch scroller:setmodemodifier end,nofocus,auto:3</code></p>
<p>
<figure>
<img class="my-0 rounded-md" loading="lazy" src="https://with9.github.io/img/9bilibili/hyprgrid.png" alt="" />
</figure>
</p>
<p>同时推荐下两项配置:</p>
<ul>
<li>
<p><code>plugin:scroller:overview_scale_content 0</code></p>
<blockquote>
<p>缩放会带来额外性能消耗,建议临时关闭。</p></blockquote>
</li>
<li>
<p><code>windowrulev2 = plugin:scroller:columnwidth one,workspace:2</code></p>
<blockquote>
<p>让窗口自动填满宽度。可以全局设置,也可以像咱一样为特定工作区单独设置。</p></blockquote>
</li>
</ul>
<h3 class="relative group">mpv自动退出
<div id="mpv%E8%87%AA%E5%8A%A8%E9%80%80%E5%87%BA" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#mpv%E8%87%AA%E5%8A%A8%E9%80%80%E5%87%BA" aria-label="Anchor">#</a>
</span>
</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-lua" data-lang="lua"><span class="line"><span class="cl"><span class="o">~</span> <span class="err">➜</span> <span class="n">cat</span> <span class="o">~/</span><span class="p">.</span><span class="n">config</span><span class="o">/</span><span class="n">mpv</span><span class="o">/</span><span class="n">scripts</span><span class="o">/</span><span class="n">quit_d.lua</span>
</span></span><span class="line"><span class="cl"><span class="n">mp.register_event</span><span class="p">(</span><span class="s2">&#34;end-file&#34;</span><span class="p">,</span> <span class="kr">function</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="kr">if</span> <span class="n">event.reason</span> <span class="o">==</span> <span class="s2">&#34;eof&#34;</span> <span class="kr">then</span>
</span></span><span class="line"><span class="cl"> <span class="kd">local</span> <span class="n">pos</span> <span class="o">=</span> <span class="n">mp.get_property_number</span><span class="p">(</span><span class="s2">&#34;playlist-pos&#34;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="kd">local</span> <span class="n">count</span> <span class="o">=</span> <span class="n">mp.get_property_number</span><span class="p">(</span><span class="s2">&#34;playlist-count&#34;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="kr">if</span> <span class="n">pos</span> <span class="o">==</span> <span class="n">count</span> <span class="o">-</span> <span class="mi">1</span> <span class="kr">then</span>
</span></span><span class="line"><span class="cl"> <span class="n">mp.msg</span><span class="p">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&#34;Last file finished, quitting mpv&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">mp.command</span><span class="p">(</span><span class="s2">&#34;quit&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="kr">end</span>
</span></span><span class="line"><span class="cl"> <span class="kr">end</span>
</span></span><span class="line"><span class="cl"><span class="kr">end</span><span class="p">)</span>
</span></span></code></pre></div>
<h2 class="relative group">Play耶
<div id="play%E8%80%B6" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#play%E8%80%B6" aria-label="Anchor">#</a>
</span>
</h2>
<p>准备完成后,就可以开始一次性刷多个视频啦。<br>
下面是一个简单的流程:先根据 CSV 生成可执行的 fish 脚本,在播放后自动记录已看视频。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fish" data-lang="fish"><span class="line"><span class="cl"><span class="c"># played记录看完的视频, 避免每次重新跑
</span></span></span><span class="line"><span class="cl"><span class="c"></span><span class="k">for</span> <span class="nv">i</span> <span class="k">in</span> <span class="o">(</span><span class="nf">csvtk</span> cut <span class="na">-f</span> <span class="m">2</span> 稍后.csv<span class="o">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">echo</span> dmlive <span class="na">-u</span> <span class="se">\&#34;</span><span class="nv">$i</span><span class="se">\&#34;\;\;</span> <span class="k">echo</span> <span class="se">\&#34;</span><span class="nv">$i</span><span class="se">\&#34;</span> <span class="se">\&gt;\&gt;</span> played <span class="o">&gt;&gt;</span> play.<span class="nb">fish
</span></span></span><span class="line"><span class="cl"><span class="nb"></span><span class="k">end</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> head play.<span class="nb">fish
</span></span></span><span class="line"><span class="cl"><span class="nb"></span><span class="nf">dmlive</span> <span class="na">-u</span> url<span class="p">;;</span> <span class="k">echo</span> url <span class="o">&gt;&gt;</span> played
</span></span><span class="line"><span class="cl"><span class="nf">dmlive</span> <span class="na">-u</span> https://www.bilibili.com/video/BV1am5vzMEtH<span class="p">;;</span> <span class="k">echo</span> https://www.bilibili.com/video/BV1am5vzMEtH <span class="o">&gt;&gt;</span> played
</span></span><span class="line"><span class="cl"><span class="nf">dmlive</span> <span class="na">-u</span> https://www.bilibili.com/video/BV1xQCxBdEUW<span class="p">;;</span> <span class="k">echo</span> https://www.bilibili.com/video/BV1xQCxBdEUW <span class="o">&gt;&gt;</span> played
</span></span><span class="line"><span class="cl"><span class="nf">dmlive</span> <span class="na">-u</span> https://www.bilibili.com/video/BV1XpBgYHE1i<span class="p">;;</span> <span class="k">echo</span> https://www.bilibili.com/video/BV1XpBgYHE1i <span class="o">&gt;&gt;</span> played
</span></span><span class="line"><span class="cl"><span class="nf">dmlive</span> <span class="na">-u</span> https://www.bilibili.com/video/BV1hYWnz9E3u<span class="p">;;</span> <span class="k">echo</span> https://www.bilibili.com/video/BV1hYWnz9E3u <span class="o">&gt;&gt;</span> played
</span></span><span class="line"><span class="cl"><span class="nf">dmlive</span> <span class="na">-u</span> https://www.bilibili.com/video/BV1S7C1BSEmq<span class="p">;;</span> <span class="k">echo</span> https://www.bilibili.com/video/BV1S7C1BSEmq <span class="o">&gt;&gt;</span> played
</span></span><span class="line"><span class="cl"><span class="nf">dmlive</span> <span class="na">-u</span> https://www.bilibili.com/video/BV13kSoYLE8H<span class="p">;;</span> <span class="k">echo</span> https://www.bilibili.com/video/BV13kSoYLE8H <span class="o">&gt;&gt;</span> played
</span></span><span class="line"><span class="cl"><span class="nf">dmlive</span> <span class="na">-u</span> https://www.bilibili.com/video/BV1UEtdzREai<span class="p">;;</span> <span class="k">echo</span> https://www.bilibili.com/video/BV1UEtdzREai <span class="o">&gt;&gt;</span> played
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">#播放
</span></span></span><span class="line"><span class="cl"><span class="c"></span><span class="nf">grep</span> <span class="na">-v</span> <span class="na">-F</span> <span class="na">-f</span> played play.<span class="nb">fish</span><span class="o">|</span><span class="nf">parallel</span> <span class="na">-j</span> <span class="m">8</span>
</span></span></code></pre></div><p>小建议:最好保持聚焦在最上面的窗口,不然新生成的窗口会有点怪,会变成类似这样的情况。</p>
<h2 class="relative group">番外1:获取特定up的所有视频
<div id="%E7%95%AA%E5%A4%961%E8%8E%B7%E5%8F%96%E7%89%B9%E5%AE%9Aup%E7%9A%84%E6%89%80%E6%9C%89%E8%A7%86%E9%A2%91" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#%E7%95%AA%E5%A4%961%E8%8E%B7%E5%8F%96%E7%89%B9%E5%AE%9Aup%E7%9A%84%E6%89%80%E6%9C%89%E8%A7%86%E9%A2%91" aria-label="Anchor">#</a>
</span>
</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fish" data-lang="fish"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">yt-dlp</span> <span class="s2">&#34;https://space.bilibili.com/3546394455443750&#34;</span> <span class="na">--cookies-from-browser</span> firefox <span class="na">--dump-single-json</span><span class="o">|</span><span class="nf">jq</span> <span class="na">-r</span> <span class="s1">&#39;.entries[] | [.title, .webpage_url] | @csv&#39;</span> <span class="o">&gt;</span> out.csv
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> head out.csv
</span></span><span class="line"><span class="cl"><span class="s2">&#34;多多理财 | 我们都渴望一个新的主人,但我们并不承认&#34;</span>,<span class="s2">&#34;https://www.bilibili.com/video/BV1pJ2vBJEEB&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;天鹅之歌 | 缺乏主体性是最恶毒的指责,禁忌享乐隐藏其后&#34;</span>,<span class="s2">&#34;https://www.bilibili.com/video/BV1bcCGBpEMQ&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;八号出口 | 鬼怪、异常、中式怪核与千禧梦核,为什么不可能的才是最真实的?&#34;</span>,<span class="s2">&#34;https://www.bilibili.com/video/BV19z1MBoETW&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;星之梦 | 宏伟计划与世界精神的骗局,你总是不受控制地走向失败&#34;</span>,<span class="s2">&#34;https://www.bilibili.com/video/BV1g5WhzmEoN&#34;</span>
</span></span></code></pre></div><p>
<figure>
<img class="my-0 rounded-md" loading="lazy" src="https://with9.github.io/img/9bilibili/wrongplace.png" alt="" />
</figure>
</p>
</description>
</item>
<item>
<title>Surface laptop3 Linux 使用中的离奇降频问题分析</title>
<link>https://with9.github.io/post/sl3-throttle/</link>
<pubDate>Thu, 27 Nov 2025 20:33:39 +0800</pubDate>
<guid>https://with9.github.io/post/sl3-throttle/</guid>
<description>
<h2 class="relative group">太长不看版本
<div id="%E5%A4%AA%E9%95%BF%E4%B8%8D%E7%9C%8B%E7%89%88%E6%9C%AC" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#%E5%A4%AA%E9%95%BF%E4%B8%8D%E7%9C%8B%E7%89%88%E6%9C%AC" aria-label="Anchor">#</a>
</span>
</h2>
<ul>
<li>
<p>把PL1配置到TDP以下,咱的设备TDP是15w,考虑到续航所以咱调整到了12.5W。</p>
<ul>
<li><code>echo 12500000 &gt; /sys/class/powercap/intel-rapl:0/constraint_0_power_limit_uw</code></li>
</ul>
</li>
<li>
<p>温度过高时自动切换profile。</p>
<ul>
<li>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">~/.c/s/user ➜ cat /home/with9/my_shell/smalltools/toggle_performance.fish
</span></span><span class="line"><span class="cl"><span class="c1">#!/usr/bin/fish</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">set</span> temp <span class="o">(</span>math max <span class="o">(</span>cat /sys/class/thermal/thermal_zon*/temp<span class="p">|</span>string join <span class="s1">&#39;,&#39;</span><span class="o">))</span>
</span></span><span class="line"><span class="cl"><span class="nb">set</span> profile <span class="o">(</span>surface profile get<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">set</span> load <span class="o">(</span>cut -d <span class="s1">&#39; &#39;</span> -f <span class="m">1</span> /proc/loadavg<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">set</span> high_load <span class="o">(</span>math <span class="nv">$load</span> <span class="se">\&gt;</span><span class="o">=</span> 7.6<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="nb">test</span> <span class="nv">$profile</span> <span class="o">=</span> <span class="s1">&#39;performance&#39;</span>
</span></span><span class="line"><span class="cl"> <span class="nb">exit</span>
</span></span><span class="line"><span class="cl">end
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="nb">test</span> <span class="nv">$temp</span> -ge <span class="m">74000</span> <span class="o">||</span> <span class="nb">test</span> <span class="nv">$high_load</span> -eq <span class="m">1</span>
</span></span><span class="line"><span class="cl"> sudo surface profile <span class="nb">set</span> performance <span class="c1">#需要sudo里面配置上nopasswd surface &#39;NOPASSWD: /usr/bin/surface&#39;</span>
</span></span><span class="line"><span class="cl"> notify-send <span class="s2">&#34;performance profile toggled&#34;</span>
</span></span><span class="line"><span class="cl">end
</span></span><span class="line"><span class="cl">----------------------------------------
</span></span><span class="line"><span class="cl">~/.c/s/user ➜ cat auto-profile.service
</span></span><span class="line"><span class="cl"><span class="o">[</span>Unit<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">Description</span><span class="o">=</span>Auto Switch Surface Performance Profile on High Temperature
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>Service<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">Type</span><span class="o">=</span>oneshot
</span></span><span class="line"><span class="cl"><span class="nv">ExecStart</span><span class="o">=</span>fish -c /home/with9/my_shell/smalltools/toggle_performance.fish
</span></span><span class="line"><span class="cl">----------------------------------------
</span></span><span class="line"><span class="cl">~/.c/s/user ➜ cat auto-profile.timer
</span></span><span class="line"><span class="cl"><span class="o">[</span>Unit<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">Description</span><span class="o">=</span>Run auto-profile every <span class="m">5</span> seconds
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>Timer<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">OnBootSec</span><span class="o">=</span>10s
</span></span><span class="line"><span class="cl"><span class="nv">OnUnitActiveSec</span><span class="o">=</span>5s
</span></span><span class="line"><span class="cl"><span class="nv">Unit</span><span class="o">=</span>auto-profile.service
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>Install<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">WantedBy</span><span class="o">=</span>timers.target
</span></span></code></pre></div></li>
</ul>
</li>
</ul>
<hr>
<h2 class="relative group">碎碎念版
<div id="%E7%A2%8E%E7%A2%8E%E5%BF%B5%E7%89%88" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#%E7%A2%8E%E7%A2%8E%E5%BF%B5%E7%89%88" aria-label="Anchor">#</a>
</span>
</h2>
<h3 class="relative group">问题描述及thermald尝试
<div id="%E9%97%AE%E9%A2%98%E6%8F%8F%E8%BF%B0%E5%8F%8Athermald%E5%B0%9D%E8%AF%95" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#%E9%97%AE%E9%A2%98%E6%8F%8F%E8%BF%B0%E5%8F%8Athermald%E5%B0%9D%E8%AF%95" aria-label="Anchor">#</a>
</span>
</h3>
<p>在使用 Surface + Linux 的过程中,有一个问题困扰了咱非常久:看视频、玩游戏玩得好好的,CPU 会突然跌到 200 MHz,同时风扇瞬间飙到最大转速。
第一反应当然是散热问题,但问题是:</p>
<ul>
<li>日常使用负载并不高,不至于看个视频就达到瓶颈吧?</li>
<li>风扇无法直接控制,只能靠切换 <code>surface-profile</code> 来改变风扇敏感度。</li>
<li>切到 <code>performance</code> 虽然能有一定缓解,但仍然会频繁触发这种极端降频。</li>
</ul>
<p>查阅多条相关 issue 后,<a href="https://github.com/linux-surface/linux-surface/issues/221" target="_blank">
发现不少人推荐使用 thermald</a>。于是咱开始调节 thermald 的配置,把控温点设为 65°C,降温设备顺序设置为:<code>intel_pstate</code> -&gt; <code>cpufreq</code> -&gt; <code>rapl_controller</code>,确实改善了些,不再那么容易触发硬件保护了。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl">cat /etc/thermald/thermal-conf.xml
</span></span><span class="line"><span class="cl">----------------------------------------
</span></span><span class="line"><span class="cl"><span class="cp">&lt;?xml version=&#34;1.0&#34;?&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;ThermalConfiguration&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;Platform&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;Name&gt;</span>Override CPU default passive<span class="nt">&lt;/Name&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;ProductName&gt;</span>*<span class="nt">&lt;/ProductName&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;Preference&gt;</span>QUIET<span class="nt">&lt;/Preference&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;ThermalZones&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;ThermalZone&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;Type&gt;</span>cpu<span class="nt">&lt;/Type&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;TripPoints&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;TripPoint&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;Temperature&gt;</span>65000<span class="nt">&lt;/Temperature&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;type&gt;</span>passive<span class="nt">&lt;/type&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;/TripPoint&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;/TripPoints&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;/ThermalZone&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;/ThermalZones&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;/Platform&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/ThermalConfiguration&gt;</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl">cat /etc/thermald/thermal-cpu-cdev-order.xml
</span></span><span class="line"><span class="cl">----------------------------------------
</span></span><span class="line"><span class="cl"><span class="nt">&lt;CoolingDeviceOrder&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;CoolingDevice&gt;</span>intel_pstate<span class="nt">&lt;/CoolingDevice&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;CoolingDevice&gt;</span>cpufreq<span class="nt">&lt;/CoolingDevice&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;CoolingDevice&gt;</span>rapl_controller<span class="nt">&lt;/CoolingDevice&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;CoolingDevice&gt;</span>intel_powerclamp<span class="nt">&lt;/CoolingDevice&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;CoolingDevice&gt;</span>Processor<span class="nt">&lt;/CoolingDevice&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/CoolingDeviceOrder&gt;</span>
</span></span></code></pre></div><p>但新问题出现了:看个视频 / 玩个小游戏就容易掉到 400 MHz,体验依旧难受。如果调高温度又容易触发过保护。thermald 是被动降温,温度设置的过高的话就来不及反应了。尝试过 thermald 的 active 和 max 模式,效果更糟&hellip;</p>
<h3 class="relative group">PL1&amp;TDP
<div id="pl1tdp" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#pl1tdp" aria-label="Anchor">#</a>
</span>
</h3>
<p>直到有一天,在 issues 里看到一个<a href="https://github.com/linux-surface/kernel/issues/117" target="_blank">
讨论</a>,虽然该 issue 和咱的情景关系不是很大, 但是他们提到的 PL1、PL2、TDP 这些值给了咱思路, 经过检索发现 <a href="https://www.intel.com/content/www/us/en/content-details/743844/13th-generation-intel-core-intel-core-14th-generation-intel-core-processor-series-1-and-series-2-and-intel-xeon-e-2400-processor-datasheet-volume-1-of-2.html" target="_blank">
Intel 官方</a>是推荐把PL1(长时功率)设置为 TDP(Thermal Design Power, 长时能稳定散掉的热量) 的, 于是咱去 <del>一年半没有打开的</del> Windows 下查看了下这些值, <code>PL1=11.25W, TDP=15W, PL2=61W</code>, 可能是为了续航, 所以配置上 PL1 比 TDP 要低一点,Linux 下的 PL1 值就有点离谱了,被设置为了 25W 。</p>
<p>
<figure>
<img class="my-0 rounded-md" loading="lazy" src="https://with9.github.io/img/SL3-throttle/intel.png" alt="" />
</figure>
</p>
<p>所以极端降频问题的本质似乎是:设备的默认 PL1 被设置的远高于 CPU 的 TDP。长时功率跑得太高 → 风扇跟不上 → 温度持续高位 → 超过固件“保守阈值” → 触发硬件保护 → 降频到200 MHz,在咱把 PL1 调回 TDP 后,卸载 thermald 后跑 stress 也不会触发保护了。Surface 固件本身似乎非常保守,根据咱的测试估计:温度在 80°C 左右长期不下降,就会触发这类安全机制,并不是要到理论的 100°C 才会触发。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fish" data-lang="fish"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/fish
</span></span></span><span class="line"><span class="cl"><span class="ch"></span><span class="k">echo</span> <span class="m">12500000</span> <span class="o">&gt;</span> /sys/class/powercap/intel-rapl:<span class="m">0</span>/constraint_0_power_limit_uw
</span></span></code></pre></div><p>虽然 PL1 调整后已经非常稳定,但在极端任务下仍会偶尔触发降频。实际观察后发现这种情况在 performance profile 下很少出现。于是咱写了一个小脚本用来实时监控温度,超过 74°C 或者 CPU 负载很高的时候就切换到 performance,自动切回来可能导致短时间的频繁切换, 所以还是任务完成后手动切换比较合适。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fish" data-lang="fish"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/fish
</span></span></span><span class="line"><span class="cl"><span class="ch"></span>
</span></span><span class="line"><span class="cl"><span class="k">set</span> <span class="nv">temp</span> <span class="o">(</span><span class="nb">math </span>max <span class="o">(</span><span class="nf">cat</span> /sys/class/thermal/thermal_zon*/temp<span class="o">|</span><span class="nb">string </span>join <span class="s1">&#39;,&#39;</span><span class="o">))</span>
</span></span><span class="line"><span class="cl"><span class="k">set</span> <span class="nv">profile</span> <span class="o">(</span><span class="nf">surface</span> profile get<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="k">set</span> <span class="nv">load</span> <span class="o">(</span><span class="nf">cut</span> <span class="na">-d</span> <span class="s1">&#39; &#39;</span> <span class="na">-f</span> <span class="m">1</span> /proc/loadavg<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="k">set</span> <span class="nv">high_load</span> <span class="o">(</span><span class="nb">math</span> <span class="nv">$load</span> <span class="se">\&gt;</span><span class="o">=</span> <span class="m">7</span>.<span class="m">6</span><span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="k">test</span> <span class="nv">$profile</span> <span class="o">=</span> <span class="s1">&#39;performance&#39;</span>
</span></span><span class="line"><span class="cl"> <span class="k">exit</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="k">test</span> <span class="nv">$temp</span> <span class="na">-ge</span> <span class="m">74000</span> <span class="o">||</span> <span class="k">test</span> <span class="nv">$high_load</span> <span class="na">-eq</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl"> <span class="nf">sudo</span> <span class="nf">surface</span> profile set <span class="nv">performance</span> <span class="c">#需要sudo里面配置上nopasswd surface &#39;NOPASSWD: /usr/bin/surface&#39;
</span></span></span><span class="line"><span class="cl"><span class="c"></span> <span class="nf">notify-send</span> <span class="s2">&#34;performance profile toggled&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span>
</span></span></code></pre></div><p>把此脚本加入定时器即可。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">~/.c/s/user ➜ cat auto-profile.service
</span></span><span class="line"><span class="cl"><span class="o">[</span>Unit<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">Description</span><span class="o">=</span>Auto Switch Surface Performance Profile on High Temperature
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>Service<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">Type</span><span class="o">=</span>oneshot
</span></span><span class="line"><span class="cl"><span class="nv">ExecStart</span><span class="o">=</span>fish /home/with9/my_shell/smalltools/toggle_performance.fish
</span></span><span class="line"><span class="cl">~/.c/s/user ➜ cat auto-profile.timer
</span></span><span class="line"><span class="cl"><span class="o">[</span>Unit<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">Description</span><span class="o">=</span>Run auto-profile every <span class="m">5</span> seconds
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>Timer<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">OnBootSec</span><span class="o">=</span>10s
</span></span><span class="line"><span class="cl"><span class="nv">OnUnitActiveSec</span><span class="o">=</span>5s
</span></span><span class="line"><span class="cl"><span class="nv">Unit</span><span class="o">=</span>auto-profile.service
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>Install<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">WantedBy</span><span class="o">=</span>timers.target
</span></span></code></pre></div><p>现在的配置情况下终于可以流畅的同时看9个视频了(下次有时间讲一下怎么用<a href="https://github.com/dawsers/hyprscroller/issues/5" target="_blank">
hyprscroller</a>同时切换看n个视频:)
<figure>
<img class="my-0 rounded-md" loading="lazy" src="https://with9.github.io/img/SL3-throttle/nineV.png" alt="" />
</figure>
温度维持在 70°C 以下, CPU 频率在 1GHz 以上,基本感觉不到卡顿。</p>
<p>PS: 各大厂商开始军备竞赛, 疯狂把默认 PL1 调高,以抬高跑分、短时性能,但散热却没有跟上。轻薄本的散热本就偏弱,默认 PL1 又调得很激进,Linux 下缺乏厂商校准,触发诡异降频其实是必然。</p>
<hr>
<h2 class="relative group">参考资料
<div id="%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99" aria-label="Anchor">#</a>
</span>
</h2>
<p>[1]: <a href="https://github.com/linux-surface/linux-surface/issues/221" target="_blank">
https://github.com/linux-surface/linux-surface/issues/221</a> <br>
[2]: <a href="https://github.com/linux-surface/kernel/issues/117#issuecomment-1061504400" target="_blank">
https://github.com/linux-surface/kernel/issues/117#issuecomment-1061504400</a><br>
[3]: <a href="https://community.intel.com/t5/Mobile-and-Desktop-Processors/PL1-and-PL2/m-p/1649216" target="_blank">
https://community.intel.com/t5/Mobile-and-Desktop-Processors/PL1-and-PL2/m-p/1649216</a><br>
[4]: <a href="https://www.techpowerup.com/forums/threads/i5-10300h-default-tpl-values-concern.294327/" target="_blank">
https://www.techpowerup.com/forums/threads/i5-10300h-default-tpl-values-concern.294327/</a></p>
</description>
</item>
<item>
<title>文献阅读: 烟草基因组</title>
<link>https://with9.github.io/post/nicotiana-tabacum/</link>
<pubDate>Mon, 12 May 2025 11:33:39 +0800</pubDate>
<guid>https://with9.github.io/post/nicotiana-tabacum/</guid>
<description><p>论文链接: <a href="https://doi.org/10.1038/s41588-025-02126-0" target="_blank">
Zan, Y.et al.The genome and GeneBank genomics of allotetraploid Nicotiana tabacum provide insights into genome evolution and complex trait regulation.Nat Genet 1–11 (2025) doi:10.1038/s41588-025-02126-0.</a></p>
<h2 class="relative group">背景
<div id="%E8%83%8C%E6%99%AF" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#%E8%83%8C%E6%99%AF" aria-label="Anchor">#</a>
</span>
</h2>
<p>
<figure>
<img class="my-0 rounded-md" loading="lazy" src="https://with9.github.io/img/Nicotiana-tabacum/image-20250415102357069.png" alt="" />
</figure>
</p>
<ul>
<li>
<p>烟草(<em>Nicotiana tabacum</em>)是一种异源四倍体杂交种,由林烟草(<em>Nicotiana sylvestris</em>)和拟绒毛烟草(<em>Nicotiana tomentosiformis</em>)杂交而成. 烟草的不同品种差异非常大,远超祖先种,按照农业用途划分为:烤烟(flue-cured,卷烟)晒烟(sun-cured,烟斗)白肋烟(burley,混合烟)雪茄烟(cigar)东方烟(oriental)</p>
</li>
<li>
<p>多倍化的最常见命运是fractionation和二倍化,可能涉及的机制包括homoeologous<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>染色体交换、转做元件的重新激活、DNA甲基化</p>
</li>
</ul>
<h2 class="relative group">结果与讨论
<div id="%E7%BB%93%E6%9E%9C%E4%B8%8E%E8%AE%A8%E8%AE%BA" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#%E7%BB%93%E6%9E%9C%E4%B8%8E%E8%AE%A8%E8%AE%BA" aria-label="Anchor">#</a>
</span>
</h2>
<h3 class="relative group">Genome evolution highlighted by chromosome-scale assemblies
<div id="genome-evolution-highlighted-by-chromosome-scale-assemblies" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#genome-evolution-highlighted-by-chromosome-scale-assemblies" aria-label="Anchor">#</a>
</span>
</h3>
<p>作者分别对栽培种(ZY300)及两种祖先种进行了高质量的染色体级基因组组装:</p>
<table>
<thead>
<tr>
<th></th>
<th>Nicotiana tabacum L.var ZY300</th>
<th>Nicotiana sylvestris</th>
<th>Nicotiana tomentosiformis</th>
</tr>
</thead>
<tbody>
<tr>
<td>Number of chromosomes</td>
<td>24</td>
<td>12</td>
<td>12</td>
</tr>
<tr>
<td>Size of genome</td>
<td>4174803700</td>
<td>2379017988</td>
<td>2244010975</td>
</tr>
<tr>
<td>GC content (%)</td>
<td>39.01</td>
<td>39.21</td>
<td>39.18</td>
</tr>
<tr>
<td>Number of contigs</td>
<td>2070</td>
<td>18</td>
<td>20</td>
</tr>
<tr>
<td>Contig NG50 (bp)</td>
<td>27168399</td>
<td>190035529</td>
<td>170533715</td>
</tr>
<tr>
<td>Number of scaffolds</td>
<td>1448</td>
<td>15</td>
<td>15</td>
</tr>
<tr>
<td>Scaffolds NG50 (bp)</td>
<td>169642138</td>
<td>192385001</td>
<td>189532187</td>
</tr>
<tr>
<td>Gap number</td>
<td>57.505</td>
<td>3</td>
<td>5</td>
</tr>
<tr>
<td>Gap size (bp)</td>
<td>3423090</td>
<td>300</td>
<td>500</td>
</tr>
<tr>