-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsearch.xml
More file actions
1209 lines (1103 loc) · 126 KB
/
search.xml
File metadata and controls
1209 lines (1103 loc) · 126 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"?>
<search>
<entry>
<title>AnnData数据结构</title>
<url>/2025/04/08/AnnData%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/</url>
<content><![CDATA[<blockquote>
<p>AnnData对象几乎可以匹配R语言中单细胞数据分析的Seurat对象,今天试一下对python中AnnData进行数据提取和回吐操作。</p>
</blockquote>
<p><img src="https://raw.githubusercontent.com/xyuechen/image/main/image-20250408230925682.png" alt="image-20250408230925682"></p>
<p>这个图来源于AnnData的<a href="https://anndata.readthedocs.io/en/stable/index.html">文档</a></p>
<h1 id="数据读取"><a href="#数据读取" class="headerlink" title="数据读取"></a>数据读取</h1><p>这里使用单细胞转录组数据<a href="https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE163558">GSE163558</a></p>
<p>这个数据集共10个样本,我们下载网页中的<code>GSE163558_RAW.tar</code>,解压后将文件夹格式处理成下面这样。</p>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">GSE163558</span><br><span class="line">├── GSM5004180_PT1</span><br><span class="line">│ ├── barcodes.tsv.gz</span><br><span class="line">│ ├── features.tsv.gz</span><br><span class="line">│ └── matrix.mtx.gz</span><br><span class="line">├── GSM5004181_PT2</span><br><span class="line">│ ├── barcodes.tsv.gz</span><br><span class="line">│ ├── features.tsv.gz</span><br><span class="line">│ └── matrix.mtx.gz</span><br><span class="line">├── GSM5004182_PT3</span><br><span class="line">│ ├── barcodes.tsv.gz</span><br><span class="line">│ ├── features.tsv.gz</span><br><span class="line">│ └── matrix.mtx.gz</span><br><span class="line">├── GSM5004183_NT1</span><br><span class="line">│ ├── barcodes.tsv.gz</span><br><span class="line">│ ├── features.tsv.gz</span><br><span class="line">│ └── matrix.mtx.gz</span><br><span class="line">...</span><br></pre></td></tr></table></figure>
<p>使用python读取上述文件夹中的数据</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">import</span> scanpy <span class="keyword">as</span> sc</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"></span><br><span class="line"><span class="comment"># 文件夹名称</span></span><br><span class="line"><span class="built_in">dir</span> = os.listdir(<span class="string">'../data/GSE163558_RAW/'</span>)</span><br><span class="line"><span class="built_in">dir</span></span><br></pre></td></tr></table></figure>
<p>输出结果为一个列表,其中包含所有子文件夹,内容如下</p>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">['GSM5004183_NT1',</span><br><span class="line"> 'GSM5004182_PT3',</span><br><span class="line"> 'GSM5004181_PT2',</span><br><span class="line"> 'GSM5004184_LN1',</span><br><span class="line"> 'GSM5004189_Li2',</span><br><span class="line"> 'GSM5004187_P1',</span><br><span class="line"> 'GSM5004180_PT1',</span><br><span class="line"> 'GSM5004185_LN2',</span><br><span class="line"> 'GSM5004186_O1',</span><br><span class="line"> 'GSM5004188_Li1']</span><br></pre></td></tr></table></figure>
<p>接下来批量读取,并将对象合并在一起</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># for循环读取</span></span><br><span class="line">adata = {}</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(<span class="built_in">dir</span>)):</span><br><span class="line"> data = sc.read_10x_mtx(<span class="string">'../data/GSE163558_RAW/'</span> + <span class="built_in">dir</span>[i], var_names=<span class="string">'gene_symbols'</span>, cache=<span class="literal">True</span>)</span><br><span class="line"> data.var_names_make_unique()</span><br><span class="line"> adata[<span class="built_in">dir</span>[i]] = data</span><br><span class="line"> <span class="built_in">print</span>(<span class="built_in">dir</span>[i])</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line">adata = sc.concat(adata,label=<span class="string">'sampleid'</span>)</span><br><span class="line">adata.obs_names_make_unique()</span><br><span class="line">adata</span><br></pre></td></tr></table></figure>
<p>最后输出的<code>adata</code>是一个只有54687个基因,33538个基因的初始AnnData对象,obs为每一个细胞所属的样本</p>
<p>输出结果为:</p>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">AnnData object with n_obs × n_vars = 54687 × 33538</span><br><span class="line"> obs: 'sampleid'</span><br></pre></td></tr></table></figure>
<p>然后进行一些数据探索</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 每个样本里的细胞数量</span></span><br><span class="line">adata.obs.value_counts()</span><br><span class="line"><span class="comment">## 输出结果为:</span></span><br><span class="line"><span class="comment"># sampleid </span></span><br><span class="line"><span class="comment"># GSM5004189_Li2 11164</span></span><br><span class="line"><span class="comment"># GSM5004181_PT2 9226</span></span><br><span class="line"><span class="comment"># GSM5004185_LN2 7940</span></span><br><span class="line"><span class="comment"># GSM5004186_O1 5937</span></span><br><span class="line"><span class="comment"># GSM5004187_P1 5277</span></span><br><span class="line"><span class="comment"># GSM5004184_LN1 4227</span></span><br><span class="line"><span class="comment"># GSM5004182_PT3 3925</span></span><br><span class="line"><span class="comment"># GSM5004180_PT1 2866</span></span><br><span class="line"><span class="comment"># GSM5004183_NT1 2777</span></span><br><span class="line"><span class="comment"># GSM5004188_Li1 1348</span></span><br><span class="line"><span class="comment"># Name: count, dtype: int64</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 表达矩阵的数值范围</span></span><br><span class="line">np.<span class="built_in">min</span>(adata.X),np.<span class="built_in">max</span>(adata.X)</span><br><span class="line"><span class="comment">## 输出结果为:</span></span><br><span class="line"><span class="comment"># (0.0, 36123.0)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 基本过滤</span></span><br><span class="line"><span class="comment"># 过滤前的细胞数和基因数</span></span><br><span class="line">adata.X.shape</span><br><span class="line"><span class="comment">## 输出结果为:</span></span><br><span class="line"><span class="comment"># (54687, 33538)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 每个细胞中表达多少基因</span></span><br><span class="line">adata.obs.head()</span><br><span class="line"><span class="comment">## 输出结果为一个表格</span></span><br></pre></td></tr></table></figure>
<p>保存上面的每个样本中的细胞数为一个csv文件:</p>
<figure class="highlight py"><table><tr><td class="code"><pre><span class="line">temp = adata.obs.sampleid.value_counts()</span><br></pre></td></tr></table></figure>
<p><strong>查看感兴趣的基因表达矩阵</strong>:稀疏矩阵不支持直接查看,所以我们转化为数据框</p>
<blockquote>
<p>转化为矩阵会丢失行名列名</p>
</blockquote>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">adata[<span class="number">0</span>:<span class="number">6</span>,[<span class="string">'CD3D'</span>,<span class="string">'TCL1A'</span>,<span class="string">'MS4A1'</span>]].to_df()</span><br></pre></td></tr></table></figure>
<h1 id="数据质控"><a href="#数据质控" class="headerlink" title="数据质控"></a>数据质控</h1><ul>
<li>主要目的:对低表达基因和低质量细胞进行过滤</li>
</ul>
<p>首先计算每个细胞中线粒体基因、核糖体基因、红血细胞基因表达比例</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 计算线粒体基因表达比例</span></span><br><span class="line">adata.var[<span class="string">'mt'</span>] = adata.var_names.<span class="built_in">str</span>.startswith(<span class="string">'MT-'</span>)</span><br><span class="line"><span class="comment"># 计算核糖体基因表达比例</span></span><br><span class="line">adata.var[<span class="string">'ribo'</span>] = adata.var_names.<span class="built_in">str</span>.<span class="keyword">match</span>(<span class="string">'^RP[SL]'</span>)</span><br><span class="line"><span class="comment"># 计算红血细胞基因比例</span></span><br><span class="line">adata.var[<span class="string">'hb'</span>] = adata.var_names.<span class="built_in">str</span>.<span class="keyword">match</span>(<span class="string">'^HB[^(P)]'</span>)</span><br><span class="line"><span class="comment"># 计算</span></span><br><span class="line">sc.pp.calculate_qc_metrics(adata, qc_vars=[<span class="string">'mt'</span>, <span class="string">'ribo'</span>, <span class="string">'hb'</span>], percent_top=<span class="literal">None</span>, log1p=<span class="literal">False</span>, inplace=<span class="literal">True</span>)</span><br></pre></td></tr></table></figure>
<p>查看每个基因表达情况</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">adata.var.head()</span><br></pre></td></tr></table></figure>
<p>结果如图:</p>
<p><img src="https://raw.githubusercontent.com/xyuechen/image/main/image-20250409012610294.png" alt="image-20250409012610294"></p>
<p>查看每个细胞的比例</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">adata.obs.head()</span><br></pre></td></tr></table></figure>
<p>结果如图:</p>
<p><img src="https://raw.githubusercontent.com/xyuechen/image/main/image-20250409012759632.png" alt="image-20250409012759632"></p>
<p>可视化上述常见参数</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">sc.pl.violin(adata,[<span class="string">'n_genes_by_counts'</span>,<span class="string">'total_counts'</span>,<span class="string">'pct_counts_mt'</span>],groupby=<span class="string">'sampleid'</span>,jitter=<span class="literal">False</span>,rotation=<span class="number">90</span>)</span><br></pre></td></tr></table></figure>
<p>结果如图:</p>
<p><img src="https://raw.githubusercontent.com/xyuechen/image/main/image-20250409012959000.png" alt="image-20250409012959000"></p>
<h2 id="过滤"><a href="#过滤" class="headerlink" title="过滤"></a>过滤</h2><p>接下来对数据进行过滤,代码如下,可以根据具体情况调整参数</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 过滤细胞,每个细胞中至少有200个基因表达</span></span><br><span class="line">sc.pp.filter_cells(adata, min_genes=<span class="number">200</span>)</span><br><span class="line"><span class="comment"># 过滤基因,至少在5个细胞中表达</span></span><br><span class="line">sc.pp.filter_genes(adata, min_cells=<span class="number">5</span>)</span><br><span class="line"><span class="comment"># 过滤细胞:大于8000个基因过滤</span></span><br><span class="line">adata = adata[adata.obs.n_genes_by_counts < <span class="number">8000</span>, :]</span><br><span class="line"><span class="comment"># 过滤细胞:线粒体基因比例大于0.2过滤</span></span><br><span class="line">adata = adata[adata.obs.pct_counts_mt < <span class="number">20</span>, :].copy()</span><br><span class="line">adata</span><br></pre></td></tr></table></figure>
<p>输出结果为:</p>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">AnnData object with n_obs × n_vars = 44238 × 26480</span><br><span class="line"> obs: 'sampleid', 'n_genes_by_counts', 'total_counts', 'total_counts_mt', 'pct_counts_mt', 'total_counts_ribo', 'pct_counts_ribo', 'total_counts_hb', 'pct_counts_hb', 'n_genes'</span><br><span class="line"> var: 'mt', 'ribo', 'hb', 'n_cells_by_counts', 'mean_counts', 'pct_dropout_by_counts', 'total_counts', 'n_cells'</span><br><span class="line"> uns: 'sampleid_colors'</span><br></pre></td></tr></table></figure>
<p>因此,过滤后还剩下:44238个细胞,26480个基因</p>
<h1 id="降维聚类"><a href="#降维聚类" class="headerlink" title="降维聚类"></a>降维聚类</h1><p>接下来就是标准流程</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 首先将数据矩阵标准化</span></span><br><span class="line">sc.pp.normalize_total(adata, target_sum=<span class="number">1e4</span>)</span><br><span class="line"><span class="comment"># 对数据进行对数转换</span></span><br><span class="line">sc.pp.log1p(adata)</span><br><span class="line">adata.raw = adata.copy()</span><br><span class="line"><span class="comment"># 选择高变基因</span></span><br><span class="line">sc.pp.highly_variable_genes(adata)</span><br><span class="line"><span class="comment"># 归一化</span></span><br><span class="line">sc.pp.scale(adata)</span><br><span class="line"><span class="comment"># PCA降维</span></span><br><span class="line">sc.tl.pca(adata, use_highly_variable=<span class="literal">True</span>)</span><br><span class="line"><span class="comment"># harmony 整合</span></span><br><span class="line">sc.external.pp.harmony_integrate(adata, <span class="string">'sampleid'</span>)</span><br><span class="line"><span class="comment"># 聚类</span></span><br><span class="line">sc.pp.neighbors(adata, use_rep=<span class="string">'X_pca_harmony'</span>,n_pcs=<span class="number">30</span>)</span><br><span class="line">sc.tl.umap(adata)</span><br><span class="line">sc.tl.leiden(adata, flavor=<span class="string">'igraph'</span>, n_iterations=<span class="number">2</span>, resolution=<span class="number">0.5</span>)</span><br></pre></td></tr></table></figure>
<p>到这里基本分析完成,降维聚类分群,harmony去批次,我们再看一下数据变化</p>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">AnnData object with n_obs × n_vars = 44238 × 26480</span><br><span class="line"> obs: 'sampleid', 'n_genes_by_counts', 'total_counts', 'total_counts_mt', 'pct_counts_mt', 'total_counts_ribo', 'pct_counts_ribo', 'total_counts_hb', 'pct_counts_hb', 'n_genes', 'leiden'</span><br><span class="line"> var: 'mt', 'ribo', 'hb', 'n_cells_by_counts', 'mean_counts', 'pct_dropout_by_counts', 'total_counts', 'n_cells', 'highly_variable', 'means', 'dispersions', 'dispersions_norm', 'mean', 'std'</span><br><span class="line"> uns: 'log1p', 'hvg', 'pca', 'neighbors', 'umap', 'leiden'</span><br><span class="line"> obsm: 'X_pca', 'X_pca_harmony', 'X_umap'</span><br><span class="line"> varm: 'PCs'</span><br><span class="line"> obsp: 'distances', 'connectivities'</span><br></pre></td></tr></table></figure>
<p>这时候除了obs,var还多了很多其他数据:</p>
<ul>
<li>obs:保存每个细胞对应的表型信息,对应Seurat里的metadata</li>
<li>var:对应每一个基因的相关信息</li>
<li>uns:对应字典类型的元素,保存了如hvg,umap等信息</li>
<li>obsm:保存的空间坐标</li>
</ul>
<h2 id="常规绘图"><a href="#常规绘图" class="headerlink" title="常规绘图"></a>常规绘图</h2><ol>
<li><p>相关性:</p>
<p><code>total_counts</code>和<code>n_genes_by_counts</code>的相关性:</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">sc.pl.scatter(adata, x=<span class="string">'total_counts'</span>, y=<span class="string">'n_genes_by_counts'</span>)</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<p>结果如图:</p>
<p><img src="https://raw.githubusercontent.com/xyuechen/image/main/image-20250409015628375.png" alt="image-20250409015628375"></p>
</li>
<li><p>绘制聚类图</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 绘制PCA图,并根据sampleid进行着色</span></span><br><span class="line">sc.pl.pca(adata, color=<span class="string">'sampleid'</span>)</span><br></pre></td></tr></table></figure>
<p><img src="https://raw.githubusercontent.com/xyuechen/image/main/image-20250409020007003.png" alt="image-20250409020007003"></p>
</li>
</ol>
<p> 提取坐标和聚类数据</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">import</span> seaborn <span class="keyword">as</span> sns</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"></span><br><span class="line">pca_df = pd.DataFrame({</span><br><span class="line"> <span class="string">'PC_1'</span>: adata.obsm[<span class="string">'X_pca'</span>][:, <span class="number">0</span>],</span><br><span class="line"> <span class="string">'PC_2'</span>: adata.obsm[<span class="string">'X_pca'</span>][:, <span class="number">1</span>],</span><br><span class="line"> <span class="string">'Cluster'</span>: adata.obs[<span class="string">'leiden'</span>]</span><br><span class="line">})</span><br><span class="line">pca_df.head()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 主成分贡献度:</span></span><br><span class="line">sc.pl.pca_variance_ratio(adata, log=<span class="literal">True</span>, n_pcs=<span class="number">50</span>)</span><br></pre></td></tr></table></figure>
<ol start="3">
<li><p>umap图</p>
<p>绘图代码为:</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">sc.pl.umap(adata,color=[<span class="string">'leiden'</span>],legend_loc=<span class="string">'on data'</span>,size=<span class="number">5</span>)</span><br><span class="line"><span class="comment"># 提取umap图的坐标</span></span><br><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">import</span> seaborn <span class="keyword">as</span> sns</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"></span><br><span class="line">umap_df = pd.DataFrame({</span><br><span class="line"> <span class="string">'UMAP_1'</span>: adata.obsm[<span class="string">'X_umap'</span>][:, <span class="number">0</span>],</span><br><span class="line"> <span class="string">'UMAP_2'</span>: adata.obsm[<span class="string">'X_umap'</span>][:, <span class="number">1</span>],</span><br><span class="line"> <span class="string">'Cluster'</span>: adata.obs[<span class="string">'leiden'</span>]</span><br><span class="line">})</span><br><span class="line">umap_df.head()</span><br></pre></td></tr></table></figure>
<p>结果如图所示:</p>
<p><img src="https://raw.githubusercontent.com/xyuechen/image/main/image-20250409222133634.png" alt="image-20250409222133634"></p>
</li>
</ol>
]]></content>
<categories>
<category>daily</category>
<category>experience</category>
</categories>
<tags>
<tag>experience</tag>
</tags>
</entry>
<entry>
<title>Autodl的使用</title>
<url>/2024/06/01/Autodl%E7%9A%84%E4%BD%BF%E7%94%A8/</url>
<content><![CDATA[<h2 id="创建实例"><a href="#创建实例" class="headerlink" title="创建实例"></a>创建实例</h2><p>首先登录网页<a href="https://www.autodl.com/home">AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL</a></p>
<blockquote>
<p>注:记得进行学生认证</p>
</blockquote>
<p><img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20240601144233859.png" alt="image-20240601144233859"></p>
<p>按照自己的需求选择,我希望进行深度学习,同时预算不高,因此我选择按量计费以及3090</p>
<p><img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20240601144820389.png" alt="image-20240601144820389"></p>
<p>这里可以选择需要预先安装的框架,我们选择Miniconda,依赖之后再安装</p>
<p><img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20240601145116937.png" alt="image-20240601145116937"></p>
<p>这样就创建成功了,主要登陆的指令在ssh登录里面,我们可以使用<code>Xshell</code>来进行连接,也可以直接点击<code>JupyterLab</code>来进行连接</p>
<h2 id="连接实例"><a href="#连接实例" class="headerlink" title="连接实例"></a>连接实例</h2><p>我们选择直接点击<code>JupyterLab</code>进行连接</p>
<p><img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20240601145500031.png" alt="image-20240601145500031"></p>
<p>如图所示,连接成功</p>
<p>我们也试一下<code>xftp</code>连接</p>
<p>首先复制连接指令<code>ssh -p 53669 root@connect.yza1.seetacloud.com</code></p>
<p>这段指令中:</p>
<ul>
<li>53669:端口号</li>
<li>root:用户名</li>
<li><code>connect.yza1.seetacloud.com</code>:主机host</li>
<li>密码:在网页上</li>
</ul>
<p><img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20240601151900110.png" alt="image-20240601151900110"></p>
<p>按照上图填入xftp中即可</p>
<h3 id="配置环境"><a href="#配置环境" class="headerlink" title="配置环境"></a>配置环境</h3><ol>
<li>输入<code>vim ~/.bashrc</code></li>
<li>在最后加上<code>source /root/miniconda3/etc/profile.d/conda.sh</code></li>
<li>输入<code>bash</code>刷新一下实例</li>
</ol>
<p><img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20240601150102502.png" alt="image-20240601150102502"></p>
<ol start="4">
<li>激活环境<code>conda activate base</code></li>
<li>创建新环境<code>conda create -n happy python=3.10</code>,这里<code>happy</code>是我的环境名称</li>
<li>进入新环境<code>conda activate happy</code></li>
</ol>
<h3 id="下载包"><a href="#下载包" class="headerlink" title="下载包"></a>下载包</h3><p>autodl的官网帮助文档中有关于pytorch安装的说明</p>
<blockquote>
<p>注:安装<code>conda install ipykernel</code>,然后输入<code>ipython kernel install --user --name=happy</code>来更新页面</p>
</blockquote>
<p>可以将requirement.txt传输到服务器上再下载</p>
<h3 id="java环境配置"><a href="#java环境配置" class="headerlink" title="java环境配置"></a>java环境配置</h3><p>有些包需要Java环境,因此我们也安装一下java</p>
<p>首先从官网下载对应的文件<a href="https://www.oracle.com/java/technologies/downloads/#java8">Java Downloads | Oracle</a></p>
<p>下载好后使用xftp传输到服务器上的<code>/usr/local</code>的位置上,解压</p>
<p>解压命令为<code>tar -zvxf zulu8.56.0.21-ca-jdk8.0.302-linux_x64.tar.gz </code></p>
<p>解压后配置环境变量,环境变量在<code>/etc/profile</code>文件中</p>
<p>输入<code>vim /etc/profile</code>进入编辑模式</p>
<p>然后输入</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">export JAVA_HOME=/usr/local/jdk1.8.0_321 #自己的安装目录</span><br><span class="line">export JRE_HOME=${JAVA_HOME}/jre</span><br><span class="line">export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH</span><br><span class="line">export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin</span><br><span class="line">export PATH=$PATH:${JAVA_PATH}</span><br></pre></td></tr></table></figure>
<p>保存退出,再刷新<code>source /etc/profile</code></p>
<p>输入<code>java -version</code>来检验是否配置成功</p>
]]></content>
<categories>
<category>experient</category>
</categories>
<tags>
<tag>dl</tag>
</tags>
</entry>
<entry>
<title>archlinux的截图配置</title>
<url>/2023/07/30/archlinux%E7%9A%84%E6%88%AA%E5%9B%BE%E9%85%8D%E7%BD%AE/</url>
<content><![CDATA[<h3 id="下载"><a href="#下载" class="headerlink" title="下载"></a>下载</h3><p>选择的是flameshot</p>
<p>在终端输入</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">sudo pacman -S flameshot-git</span><br></pre></td></tr></table></figure>
<p>截图方式:在终端输入</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">flameshot gui</span><br></pre></td></tr></table></figure>
<h3 id="快捷键配置"><a href="#快捷键配置" class="headerlink" title="快捷键配置"></a>快捷键配置</h3><p><img src="/image/image-20230730223313668.png" alt="image-20230730223313668"></p>
<p>如上图所示,选择一个自己喜欢的快捷键即可</p>
]]></content>
<categories>
<category>linux</category>
</categories>
<tags>
<tag>archliux</tag>
<tag>linux</tag>
</tags>
</entry>
<entry>
<title>arch之hyprland</title>
<url>/2024/07/04/arch%E4%B9%8Bhyprland/</url>
<content><![CDATA[<hr>
<p>之前试图在硬盘arch中安装nvidia驱动再安装hyprland,导致系统直接挂了,现在来试试在虚拟机中直接安装试试</p>
<p>官网<a href="https://hyprland.org/">Hyprland</a></p>
<h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sudo pacman -S hyprland</span><br><span class="line">yay -S hyprland-git</span><br></pre></td></tr></table></figure>
<p>上面两种方法任选一个</p>
<h3 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">mkdir -p ~/.config/hyprland</span><br><span class="line">cp /usr/share/hyprland/hyprland.conf ~/.config/hyprland</span><br><span class="line">vim ~/.config/hyprland/hyprland.conf</span><br></pre></td></tr></table></figure>
<p>编辑配置文件</p>
<p>找到$mainMod这一行,后面都是快捷键配置,其中<code>$</code>的字符表示应该被替换的</p>
]]></content>
<categories>
<category>linux</category>
</categories>
<tags>
<tag>linux</tag>
<tag>archlinux</tag>
</tags>
</entry>
<entry>
<title>arch软件安装以及美化</title>
<url>/2024/07/04/arch%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85%E4%BB%A5%E5%8F%8A%E7%BE%8E%E5%8C%96/</url>
<content><![CDATA[<hr>
<h3 id="软件安装"><a href="#软件安装" class="headerlink" title="软件安装"></a>软件安装</h3><h4 id="浏览器"><a href="#浏览器" class="headerlink" title="浏览器"></a>浏览器</h4><figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">sudo pacman -Syu firefox</span><br></pre></td></tr></table></figure>
<p>安装后中文无法显示,我们可以安装中文字体</p>
<figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">sudo pacman -Syu noto-fonts-cjk</span><br></pre></td></tr></table></figure>
<p>登出后再重新登录即可看到正常的中文</p>
<h4 id="中文输入法"><a href="#中文输入法" class="headerlink" title="中文输入法"></a>中文输入法</h4><p>我们选择fcitx5的输入法</p>
<figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">sudo pacman -S fcitx5-im</span><br><span class="line">sudo pacman -S fcitx5-chinese-addons fcitx5-rime qt5-wayland</span><br></pre></td></tr></table></figure>
<p>安装后编辑环境变量文件<code>/etc/environment</code>,在其中添加</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">/etc/environment</span></span><br><span class="line">QT_QPA_PLATFORM=wayland</span><br><span class="line">GTK_IM_MODULE=fcitx</span><br><span class="line">QT_IM_MODULE=fcitx</span><br><span class="line">XMODIFIERS=@im=fcitx</span><br><span class="line">SDL_IM_MODULE=fcitx</span><br></pre></td></tr></table></figure>
<p>打开fcitx5-configuration这个软件,将右边的input_method中的pinyin加入到左边</p>
<h4 id="蓝牙"><a href="#蓝牙" class="headerlink" title="蓝牙"></a>蓝牙</h4><figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">sudo pacman -S bluez</span><br><span class="line">sudo systemctl <span class="built_in">enable</span> bluetooth</span><br></pre></td></tr></table></figure>
<h4 id="visual-studio-code"><a href="#visual-studio-code" class="headerlink" title="visual studio code"></a>visual studio code</h4><figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">yay visual-studio-code-bin</span><br></pre></td></tr></table></figure>
<p>提示没有yay,那么我们安装一下yay</p>
<figure class="highlight sh"><table><tr><td class="code"><pre><span class="line"><span class="built_in">cd</span> /opt</span><br><span class="line">sudo git <span class="built_in">clone</span> https://aur.archlinux.org/yay.git</span><br><span class="line"><span class="built_in">cd</span> /opt/yay</span><br><span class="line">sudo <span class="built_in">chown</span> -R username:username .</span><br><span class="line"><span class="built_in">export</span> GOPROXY=https://proxy.golang.com.cn,direct</span><br><span class="line">makepkg -si</span><br><span class="line">yay</span><br><span class="line">yay -Yc</span><br><span class="line"><span class="built_in">cd</span> ..</span><br><span class="line">sudo <span class="built_in">rm</span> -rf yay/</span><br></pre></td></tr></table></figure>
<p>安装成功后再安装vscode,即可成功</p>
<h4 id="音乐"><a href="#音乐" class="headerlink" title="音乐"></a>音乐</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">yay yesplaymusic</span><br></pre></td></tr></table></figure>
<h4 id="terminal"><a href="#terminal" class="headerlink" title="terminal"></a>terminal</h4><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">sudo pacman -S gnome-terminal-transparency</span><br></pre></td></tr></table></figure>
<h4 id="微信和wps"><a href="#微信和wps" class="headerlink" title="微信和wps"></a>微信和wps</h4><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">yay wechat-universal-bwrap</span><br><span class="line">yay wps-office</span><br></pre></td></tr></table></figure>
<h4 id="deb安装包"><a href="#deb安装包" class="headerlink" title="deb安装包"></a>deb安装包</h4><p>有时候第三方软件会以deb的格式出现,这种文件在arch中的安装步骤如下</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">yay debtap</span><br><span class="line">sudo debtap -u</span><br><span class="line">cd Downloads</span><br><span class="line">debtap *.deb</span><br><span class="line">sudo pacman -U package_name</span><br></pre></td></tr></table></figure>
<p>或者还可以</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">yay -S dpkg</span><br><span class="line">dpkg -i *.deb</span><br></pre></td></tr></table></figure>
<h4 id="下载助手"><a href="#下载助手" class="headerlink" title="下载助手"></a>下载助手</h4><p>windows上的internet download manager可以实现多线程快速下载,但是这个软件在linux上无法使用,我们可以使用替代品fdm</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">yay freedownloadmanager</span><br></pre></td></tr></table></figure>
<h4 id="java"><a href="#java" class="headerlink" title="java"></a>java</h4><blockquote>
<p>注:</p>
<ol>
<li>archlinux官方只支持openjdk</li>
<li>刚安装的java环境需要 source /etc/profile 或者注销重新登陆来完成识别</li>
<li><strong>务必</strong>使用 <code>archlinux-java</code>编辑 <code>/usr/lib/jvm/default</code> 和 <code>/usr/lib/jvm/default-runtime</code> 这两个链接</li>
</ol>
</blockquote>
<p>下载</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">sudo pacman -S jdk-openjdk</span><br></pre></td></tr></table></figure>
<p>使用<code>archlinux-java</code>管理java环境</p>
<ul>
<li>查看环境:<code>archlinux-java status</code></li>
<li>切换环境:<code>archlinux-java set <JAVA_ENV_NAME></code></li>
</ul>
<h4 id="时间同步"><a href="#时间同步" class="headerlink" title="时间同步"></a>时间同步</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sudo timedatectl set-ntp true</span><br></pre></td></tr></table></figure>
<h3 id="美化"><a href="#美化" class="headerlink" title="美化"></a>美化</h3><h4 id="gnome拓展"><a href="#gnome拓展" class="headerlink" title="gnome拓展"></a>gnome拓展</h4><p>首先要下载必要的一些软件</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sudo pacman -S gnome-extensions</span><br><span class="line">sudo pacman -S gnome-tweaks</span><br><span class="line">yay ocs-url</span><br><span class="line">git clone https://aur.archlinux.org/chrome-gnome-shell.git</span><br><span class="line">cd chrome-gnome-shell</span><br><span class="line">makepkg -si</span><br></pre></td></tr></table></figure>
<p>进入gnome拓展官网 <a href="https://extensions.gnome.org/">https://extensions.gnome.org/</a> </p>
<blockquote>
<p>我们可以在tweaks中打开gnome的最大化和最小化</p>
</blockquote>
<p>首先安装<em>input method panel</em> 美化输入法<br>安装的几个插件</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">input method panel</span><br><span class="line">blur my shell</span><br><span class="line">AppIndicator and KStatusNotifierItem Support</span><br><span class="line">Compiz alike magic lamp effect</span><br><span class="line">dash to dock</span><br><span class="line">just perfection</span><br><span class="line">hide topbar</span><br></pre></td></tr></table></figure>
<h4 id="还原点"><a href="#还原点" class="headerlink" title="还原点"></a>还原点</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">yay aura-bin</span><br></pre></td></tr></table></figure>
<p>我们可以使用<code>aura -b</code>设置还原点,通过<code>aura -b restore</code>来回到之前的还原点</p>
<h4 id="终端美化"><a href="#终端美化" class="headerlink" title="终端美化"></a>终端美化</h4><p>首先下载<code>zsh</code>及相关软件</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sudo pacman -S zsh zsh-theme-powerlevel10k zsh-autosuggestions zsh-syntax-highlighting</span><br></pre></td></tr></table></figure>
<blockquote>
<p>这里powerlevel10k找不到,因为已经移到了aur库中,可以通过yay 下载</p>
</blockquote>
<p>下载不了,我们直接从github下载<br>首先对github加速</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">git config --global url."https://gitclone.com/".insteadOf "https://github.com/"</span><br></pre></td></tr></table></figure>
<p>配置文件在<code>~/.gitconfig</code>中<br>但是使用yay的时候我们必须取消加速</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">git config --global --<span class="built_in">unset</span> url.https://github.com/.insteadOf</span><br></pre></td></tr></table></figure>
<p>配置好了加速后下载</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">git <span class="built_in">clone</span> --depth=1 https://gitee.com/romkatv/powerlevel10k.git ~/powerlevel10k</span><br><span class="line"><span class="built_in">echo</span> <span class="string">'source ~/powerlevel10k/powerlevel10k.zsh-theme'</span> >>~/.zshrc</span><br></pre></td></tr></table></figure>
<p>在<code>~/.zshrc</code>中输入</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">ZSH_THEME=<span class="string">"powerlevel10k/powerlevel10k"</span></span><br></pre></td></tr></table></figure>
<p>下载成功后更换默认shell</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">chsh -l</span><br><span class="line">chsh -s /bin/zsh # 换成自己的路径</span><br></pre></td></tr></table></figure>
<p>然后按指引配置就行</p>
]]></content>
<categories>
<category>linux</category>
</categories>
<tags>
<tag>linux</tag>
<tag>archlinux</tag>
</tags>
</entry>
<entry>
<title>archlinux记录</title>
<url>/2023/07/29/archlinux%E8%AE%B0%E5%BD%95/</url>
<content><![CDATA[<p>2023 年 7 月 26 日<br>买的移动硬盘到了,于是决定搞个 archlinux 系统玩玩</p>
<p>遇到第一个错误<br>虚拟机进入不了安装界面<br>原因:内存分配太少了<br>解决:多加点内存</p>
<p>安装过程参考 b 站的文章 <a href="https://www.bilibili.com/read/cv20753052?spm_id_from=333.999.0.0">https://www.bilibili.com/read/cv20753052?spm_id_from=333.999.0.0</a><br>过程很详尽,可以直接对着操作</p>
<p>我使用的是 kde 的桌面<br>于是遇到第二个错误:中文输入法<br>fcitx 5 虽然很多人推荐,但是不知道什么毛病死活用不了<br>最后还是下载了 ibus</p>
<p>美化使用了类苹果的主题</p>
<p>后来尝试下载 ohmyzsh<br>遇到第三个问题:浏览器的文字不能复制到 vim 中<br>(字数那么多全部打上去要我死)<br>解决:<code>sudo pacman -S gvim</code><br>这样就可以复制了(必须使用 gvim)</p>
<p>接下来是最麻烦的一个问题,无法从 github 下载文件<br>还在解决中<br>clash 失败了<br>最后使用的还是 v2ray</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">yay -S v2raya-bin</span><br><span class="line">sudo systemctl <span class="built_in">enable</span> --now v2raya</span><br></pre></td></tr></table></figure>
<p>这样就成功安装了,再使用 KDE 菜单打开浏览器地址,导入代理<br>行吧,还是不能科学上网,ohmyzsh 也还是下载不了</p>
<p>2023 年 7 月 28 日<br>今天继续美化<br>oh-my-zsh 下载成功<br>具体操作:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh</span><br><span class="line"><span class="built_in">cp</span> ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc</span><br><span class="line">chsh -s /bin/zsh</span><br></pre></td></tr></table></figure>
<p>第一步并没有 git 成功,我是直接在 github 把这个项目打包下载,再在 <code>/home/xu</code> 下复制并重命名为 <code>.oh-my-zsh</code><br>第三步其实也没有成功,我是直接在图形界面修改的<br>接着编辑 <code>/.zshrc</code> 配置文件修改主题<br>我选择的是 <code>ys</code>,也可以设置为 <code>random</code>,这样每次都是不一样的主题</p>
<hr>
<p>2024年7月4号</p>
<p>时隔一年,再次捡起这个帖子,在上个月,参考<a href="https://www.bilibili.com/video/BV1kN411m7w4/?share_source=copy_web&vd_source=262fce51bcecea4097592dd1df9c9958">2023年在移动硬盘上安装 Arch Linux 及网络/桌面/输入法/字体/声音/蓝牙驱动的配置</a> 的视频,成功将arch安装到我的移动硬盘上,进行了一系列安装美化后,成功挂在了nvidia显卡驱动安装上,现在不仅无法开机,还丢失了在arch上写的笔记(心痛)</p>
<p>于是在blog上记录一下,重新安装的过程,防止再次丢失</p>
<p>首先,设置一个虚拟机,要点:</p>
<ul>
<li>USB控制器中选择相应的兼容</li>
<li>选项-高级中应该选择uefi引导,关闭Hyper-V通道缓解</li>
</ul>
<p>虚拟机开机后将移动硬盘连接到虚拟机上,进入安装程序</p>
<h3 id="查看当前硬盘情况"><a href="#查看当前硬盘情况" class="headerlink" title="查看当前硬盘情况"></a>查看当前硬盘情况</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">fdisk -l</span><br></pre></td></tr></table></figure>
<p><img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20240704021507623.png" alt="image-20240704021507623"></p>
<p>如图所示,其中<code>/dev/sdb</code>为我们的移动硬盘,其中有我之前设置的Linux系统,我们格式化,重新操作</p>
<h3 id="联网并且验证时钟同步"><a href="#联网并且验证时钟同步" class="headerlink" title="联网并且验证时钟同步"></a>联网并且验证时钟同步</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">ip link</span><br><span class="line">ping www.baidu.com</span><br><span class="line">ip link</span><br><span class="line">timedatectl</span><br></pre></td></tr></table></figure>
<h3 id="设置磁盘空间"><a href="#设置磁盘空间" class="headerlink" title="设置磁盘空间"></a>设置磁盘空间</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">fdisk /dev/sdb</span><br><span class="line">g # 新建分区表</span><br><span class="line">n # 新分区</span><br></pre></td></tr></table></figure>
<p>这里扇区和起始点可以默认,大小需要手动分配,我们分配600M,即输入<code>+600M</code></p>
<p>此后重复操作,第二个区域我们分配16G,第三个区域我们分配120G,然后输入t,设置分区类型,第一个区域的类型编号为1,第二个为19,第三个为23,然后输入p打印看一下,确认无误后输入w写入</p>
<h3 id="分区设置"><a href="#分区设置" class="headerlink" title="分区设置"></a>分区设置</h3><p>首先设置文件系统类型</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">mkfs.ext4 /dev/sdb3 # 创建文件系统</span><br><span class="line">mkswap /dev/sdb2</span><br><span class="line">mkfs.fat -F 32 /dev/sdb1</span><br></pre></td></tr></table></figure>
<p>然后挂载</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">mount /dev/sdb3 /mnt</span><br><span class="line">mount --mkdir /dev/sdb1 /mnt/boot</span><br><span class="line">swapon /dev/sdb2</span><br></pre></td></tr></table></figure>
<h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><h4 id="设置镜像"><a href="#设置镜像" class="headerlink" title="设置镜像"></a>设置镜像</h4><p>为了安装更快,我们可以配置一个镜像源(以清华镜像源为例)</p>
<p>编辑文件<code>/etc/pacman.d/mirrorlist</code>,在顶端添加</p>
<figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/<span class="variable">$repo</span>/os/<span class="variable">$arch</span></span><br></pre></td></tr></table></figure>
<h4 id="安装必备的文件"><a href="#安装必备的文件" class="headerlink" title="安装必备的文件"></a>安装必备的文件</h4><figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">pacstrap -K /mnt base linux linux-firmware sof-firmware netwoekmanager vi vim man-db texinfo gnome</span><br></pre></td></tr></table></figure>
<p>等待片刻即可</p>
<h4 id="配置系统"><a href="#配置系统" class="headerlink" title="配置系统"></a>配置系统</h4><figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">genfstab -U /mnt >> /mnt/etc/fstab</span><br><span class="line">arch-chroot /mnt</span><br><span class="line"><span class="comment"># 配置时区</span></span><br><span class="line"><span class="built_in">ln</span> -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime</span><br><span class="line"><span class="comment"># 同步时间</span></span><br><span class="line">hwclock --systohc</span><br><span class="line"><span class="comment"># 语言</span></span><br><span class="line">vim /etc/locale.gen <span class="comment"># 取消en_US:utf-8的注释,保存退出</span></span><br><span class="line">locale-gen <span class="comment"># 生成语言</span></span><br><span class="line">vim /etc/locale.conf <span class="comment"># 写入:LANG=en_US.UTF-8</span></span><br><span class="line">vim /etc/hostname <span class="comment"># 写入系统名字,随意取</span></span><br><span class="line">pacman -S base-devel</span><br><span class="line">useradd -m username <span class="comment"># 添加一个普通用户</span></span><br><span class="line">passwd username <span class="comment"># 设置这个用户的密码</span></span><br><span class="line">visudo <span class="comment"># 为这个用户添加管理权限,在这个文件中找到ALL,在下面添加一行 username ALL=(ALL:ALL) ALL</span></span><br></pre></td></tr></table></figure>
<p>安装引导程序</p>
<figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">pacman -Syu grub efibootmgr amd-ucode intel-ucode</span><br></pre></td></tr></table></figure>
<p>在这里会出现警告信息</p>
<p><img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20240704033440304.png" alt="image-20240704033440304"></p>
<p>解决方法:在<code>/etc/pacman.conf</code>中添加源</p>
<figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">Server = https://mirrors.tuna.tsinghua.edu.cn/arch4edu/<span class="variable">$arch</span></span><br></pre></td></tr></table></figure>
<p>然后输入</p>
<figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">pacman-key --recv-keys 7931B6D628C8D3BA</span><br><span class="line">pacman-key --finger 7931B6D628C8D3BA</span><br><span class="line">pacman-key --lsign-key 7931B6D628C8D3BA</span><br><span class="line">yay -S upd72020x-fw</span><br></pre></td></tr></table></figure>
<p>如果由于网速无法下载,那么可以</p>
<figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/denisandroid/uPD72020x-Firmware ~/Desktop/firmware</span><br><span class="line"><span class="built_in">cp</span> ~/Desktop/firmware/UPDATE.mem ~/.cache/yay/upd72020x-fw</span><br><span class="line"><span class="built_in">cp</span> ~/Desktop/firmware/License.rtf ~/.cache/yay/upd72020x-fw</span><br></pre></td></tr></table></figure>
<p>继续我们的安装,接下来是开机引导程序</p>
<figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">grub-install --target=x86_64-efi --efi-directory=/boot/ --bootloader-id=GRUB --removable</span><br><span class="line">grub-mkconfig -o /boot/grub/grub.cfg</span><br></pre></td></tr></table></figure>
<p>开启开机服务</p>
<figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">systemctl <span class="built_in">enable</span> gdm</span><br><span class="line">systemctl enabel NetworkManager</span><br></pre></td></tr></table></figure>
<p>安装完成,可以通过BIOS进入系统了</p>
]]></content>
<categories>
<category>linux</category>
</categories>
<tags>
<tag>linux</tag>
<tag>archlinux</tag>
</tags>
</entry>
<entry>
<title>conda_set</title>
<url>/2024/04/19/conda-set/</url>
<content><![CDATA[<h2 id="conda修改环境路径"><a href="#conda修改环境路径" class="headerlink" title="conda修改环境路径"></a>conda修改环境路径</h2><p>conda 默认的环境路径在<code>C:\Users\用户名\conda</code>中,C盘位置不够,因此希望修改到其余地方</p>
<p>在anaconda的终端输入</p>
<p><img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20240419225720792.png" alt="image-20240419225720792"></p>
<p>之后新建的环境就会出现再目标路径下了</p>
<h2 id="conda修改jupyter-notebook的默认文件夹"><a href="#conda修改jupyter-notebook的默认文件夹" class="headerlink" title="conda修改jupyter notebook的默认文件夹"></a>conda修改jupyter notebook的默认文件夹</h2><p>在anaconda的终端找到jupyter的配置文件</p>
<p><img src="/./../image/image-20240420000758149.png" alt="image-20240420000758149"></p>
<p>打开文件,找到这几行</p>
<p><img src="/./../image/image-20240420000917995.png" alt="image-20240420000917995"></p>
<p>取消<code>c.NotebookApp.notebook_dir</code>这一行的注释,在单引号中写入目标路径</p>
<p><img src="/./../image/image-20240420001053387.png" alt="image-20240420001053387"></p>
<p>打开jupyter notebook的应用路径</p>
<p><img src="/./../image/image-20240420001221183.png" alt="image-20240420001221183"></p>
<p>将选中区域删除</p>
<p>配置完成</p>
<ul>
<li>如果环境中没有jupyter,那么在终端输入<code>conda install nb_conda</code>即可</li>
<li>pytorch下载命令<code>pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118</code></li>
</ul>
<h2 id="jupyter设置"><a href="#jupyter设置" class="headerlink" title="jupyter设置"></a>jupyter设置</h2><p>新建的环境中没有jupyter,想要使用的话我们需要下载配置</p>
<p>首先下载</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">pip install jupyter</span><br></pre></td></tr></table></figure>
<p>下载后的界面如图</p>
<p><img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20240602163539892.png" alt="image-20240602163539892"></p>
<p>比较简陋,我们也无法进行代码自动补全</p>
<p>因此我们进行一些配置,在anaconda中输入</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">pip install jupyter_contrib_nbextensions</span><br><span class="line">jupyter contrib nbextensions install --user</span><br><span class="line">pip install jupyter_nbextensions_configurator</span><br><span class="line">jupyter nbextensions_configurator enable --user</span><br></pre></td></tr></table></figure>
<p>安装后界面如下<img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20240602164243456.png" alt="image-20240602164243456"></p>
<p><img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20240602164408582.png" alt="image-20240602164408582"></p>
<p>选中<code>hinterland</code>,设置完成</p>
]]></content>
<categories>
<category>experient</category>
</categories>
<tags>
<tag>dl</tag>
</tags>
</entry>
<entry>
<title>conda环境迁移</title>
<url>/2024/11/14/conda%E7%8E%AF%E5%A2%83%E8%BF%81%E7%A7%BB/</url>
<content><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>在笔记本上配置好环境后发现同样的步骤在另一个电脑上无论如何都无法成功,于是想有没有一个办法无痛转移环境</p>
<h2 id="迁移"><a href="#迁移" class="headerlink" title="迁移"></a>迁移</h2><p>首先将已经配置好并确定可以使用的环境打包压缩,然后发送/转移到另一个电脑上</p>
<p>解压后进行如下操作</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">conda <span class="built_in">env</span> list</span><br><span class="line">conda config --append envs_dirs D:\ProgramAPP\anaconda\envs\<span class="built_in">test</span></span><br></pre></td></tr></table></figure>
]]></content>
<tags>
<tag>daily</tag>
<tag>experient</tag>
</tags>
</entry>
<entry>
<title>hexo-git报错</title>
<url>/2024/04/20/hexo-git%E6%8A%A5%E9%94%99/</url>
<content><![CDATA[<h2 id="无法连接"><a href="#无法连接" class="headerlink" title="无法连接"></a>无法连接</h2><p>半年没用hexo,今天连接时发现需要输入用户名和密码,输入后报错,无法连接</p>
<p>遂重新配置一遍</p>
<ol>
<li><p>首先配置一下git的用户名和邮箱</p>
<p><img src="/./../image/image-20240420173725105.png" alt="image-20240420173725105"></p>
</li>
<li><p>创建ssh密钥</p>
<p><img src="/./../image/image-20240420173931385.png" alt="image-20240420173931385"></p>
<p>在显示的路径下找到文件</p>
<p><img src="/./../image/image-20240420174042116.png" alt="image-20240420174042116"></p>
<p>复制里面的内容</p>
</li>
<li><p>上传密钥</p>
<p><img src="/./../image/image-20240420174519454.png" alt="image-20240420174519454"></p>
<ol start="4">
<li><p>验证连接</p>
<p><img src="/./../image/image-20240420174753903.png" alt="image-20240420174753903"></p>
<p>出现图中”Hi“后面的内容即连接成功</p>
</li>
</ol>
</li>
</ol>
]]></content>
<categories>
<category>dairy</category>
</categories>
<tags>
<tag>hexo</tag>
</tags>
</entry>
<entry>
<title>hexo美化记录</title>
<url>/2023/07/29/hexo%E7%BE%8E%E5%8C%96%E8%AE%B0%E5%BD%95/</url>
<content><![CDATA[<hr>
<h2 id="主题"><a href="#主题" class="headerlink" title="主题"></a>主题</h2><p>在网站(hexo)[<a href="https://hexo.io/themes/">Themes | Hexo</a>]中可以查看别人的主题,下载并进行自己的美化</p>
<p>下载后文件会放在/themes目录下</p>
<p>更改blog文件夹下的_config.yml,修改主题</p>
<p><img src="/image/config.png" alt="image-20230729122511291"></p>
<p>有能力的也可以修改模板文件进行自定义主题</p>
<h2 id="文章分类"><a href="#文章分类" class="headerlink" title="文章分类"></a>文章分类</h2><p>生成的新文章头部会有一个说明</p>
<p>例如这篇博客的头部</p>
<p><img src="/image/%E5%A4%B4%E9%83%A8%E4%BF%A1%E6%81%AF.jpg" alt="图片"></p>
<p>在这一块加上</p>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">categories: hexo</span><br></pre></td></tr></table></figure>
<h2 id="本地图片插入文章网页不显示"><a href="#本地图片插入文章网页不显示" class="headerlink" title="本地图片插入文章网页不显示"></a>本地图片插入文章网页不显示</h2><p>关于这个问题,搜索后发现有几种方法:</p>
<ul>
<li>修改配置文件</li>
<li>安装插件</li>
<li>手动插入</li>
</ul>
<p>我尝试了一下,修改配置文件是指<code>_config.yml</code></p>
<p><img src="/image/assert%E4%BF%AE%E6%94%B9.jpg" alt="配置"></p>
<p>将这一行改成false,再将图片存放在与博客同名的文件夹中</p>
<p><strong>这个方法没用</strong></p>
<hr>
<p>于是我又尝试了手动插入</p>
<p>在<code>source</code>文件夹下新建一个文件夹为<code>image</code>,再将图片存放在里面,博客里使用相对路径,如<code>/image/assert.jpg</code>这样就可以成功显示了</p>
<p><strong>这个方法对我有用,于是没有尝试插件</strong></p>
<h2 id="插件"><a href="#插件" class="headerlink" title="插件"></a>插件</h2><p>网址:[插件](<a href="https://hexo.io/plugins/">Plugins | Hexo</a>)</p>
<p>待补充</p>
<h2 id="背景图片"><a href="#背景图片" class="headerlink" title="背景图片"></a>背景图片</h2><p>几个可以找背景的网址:</p>
<ul>
<li><a href="https://wallhaven.cc/">Awesome Wallpapers - wallhaven.cc</a></li>
<li><a href="https://bz.zzzmh.cn/index">极简壁纸_海量电脑桌面壁纸美图_4K超高清_最潮壁纸网站 (zzzmh.cn)</a></li>
<li><a href="https://wall.alphacoders.com/">Wallpaper Abyss - HD Wallpapers, Background Images (alphacoders.com)</a> 这个网站有点慢,但是图很多</li>
</ul>
<p>背景图片地址:</p>
<p>E:\projects\blog\blog\themes\diaspora\source\img</p>
<p>其中的<code>disapora</code>是主题名字,对应自己的主题名寻找,然后存进去</p>
<p>然后编辑主题的配置文件(主题文件夹下的_config.yml)</p>
<p><img src="/image/%E5%B0%81%E9%9D%A2%E5%9B%BE%E4%BF%AE%E6%94%B9.jpg" alt="封面图修改"></p>
<p>修改这几个参数就好,此处图片地址也为相对路径</p>
]]></content>
<categories>
<category>hexo</category>
</categories>
<tags>
<tag>daily</tag>
</tags>
</entry>
<entry>
<title>R多环境管理</title>
<url>/2024/07/04/R%E5%A4%9A%E7%8E%AF%E5%A2%83%E7%AE%A1%E7%90%86/</url>
<content><![CDATA[<h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><p>一直想找到一个像anaconda那样管理python环境来管理R环境的工具,今天正好看到一个,尝试一下</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">winget install posit.rig</span><br></pre></td></tr></table></figure>
<p>在Windows终端中运行上述命令下载,重启终端即可运行</p>
<p>其他操作系统的命令</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">macOS</span></span><br><span class="line">brew tap r-lib/rig</span><br><span class="line">brew install --cask rig</span><br><span class="line">brew upgrade --cask rig # 更新命令</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">linux</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash"><span class="comment"># ubuntu和debian</span></span></span><br><span class="line">`which sudo` curl -L https://rig.r-pkg.org/deb/rig.gpg -o /etc/apt/trusted.gpg.d/rig.gpg</span><br><span class="line">`which sudo` sh -c 'echo "deb http://rig.r-pkg.org/deb rig main" > /etc/apt/sources.list.d/rig.list'</span><br><span class="line">`which sudo` apt update</span><br><span class="line">`which sudo` apt install r-rig</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash"><span class="comment"># rhel、fedora、centOS、Rocky Linux、Almalinux等</span></span></span><br><span class="line">`which sudo` yum install -y https://github.com/r-lib/rig/releases/download/latest/r-rig-latest-1.$(arch).rpm</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash"><span class="comment"># opensuse和SLES</span></span></span><br><span class="line">`which sudo` zypper install -y --allow-unsigned-rpm https://github.com/r-lib/rig/releases/download/latest/r-rig-latest-1.$(arch).rpm</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash"><span class="comment"># 任意Linux发行版</span></span></span><br><span class="line">curl -Ls https://github.com/r-lib/rig/releases/download/latest/rig-linux-$(arch)-latest.tar.gz |</span><br><span class="line"> `which sudo` tar xz -C /usr/local</span><br></pre></td></tr></table></figure>
<h3 id="用法"><a href="#用法" class="headerlink" title="用法"></a>用法</h3><ul>
<li>列出当前安装的R:<code>rig list</code>,类似于<code>conda env --list</code></li>
<li>查看所有命令和示例:<code>rig</code>,类似于<code>conda</code></li>
<li>查看帮助文档:<code>rig --help</code>,类似于<code>conda --help</code></li>
</ul>
<p>命令列表</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">rig add -- install a new R version [<span class="built_in">alias</span>: install]</span><br><span class="line">rig available -- List R versions available to install.</span><br><span class="line">rig default -- <span class="built_in">print</span> or <span class="built_in">set</span> default R version [<span class="built_in">alias</span>: switch]</span><br><span class="line">rig library -- manage package libraries [<span class="built_in">alias</span>: lib] (experimental)</span><br><span class="line">rig list -- list installed R versions [<span class="built_in">alias</span>: <span class="built_in">ls</span>]</span><br><span class="line">rig resolve -- resolve a symbolic R version</span><br><span class="line">rig <span class="built_in">rm</span> -- remove R versions [aliases: del, delete, remove]</span><br><span class="line">rig rstudio -- start RStudio with the specified R version</span><br><span class="line">rig run -- Run R, an R script or an R project</span><br><span class="line">rig sysreqs -- manage R-related system libraries and tools (experimental) (macOS)</span><br><span class="line">rig system -- manage current installations</span><br><span class="line"><span class="comment"># windows子命令</span></span><br><span class="line">rig system add-pak -- install or update pak <span class="keyword">for</span> an R version</span><br><span class="line">rig system clean-registry -- clean stale R related entries <span class="keyword">in</span> the registry</span><br><span class="line">rig system make-links -- create R-* quick links</span><br><span class="line">rig system rtools -- manage Rtools installations</span><br><span class="line">rig system setup-user-lib -- <span class="built_in">set</span> up automatic user package libraries [<span class="built_in">alias</span>: create-lib]</span><br><span class="line">rig system update-rtools40 -- update Rtools40 MSYS2 packages</span><br></pre></td></tr></table></figure>
<h3 id="IDE"><a href="#IDE" class="headerlink" title="IDE"></a>IDE</h3><p>我们可以下载<code>positran</code>来管理切换环境,不过目前还在测试阶段</p>
]]></content>
<categories>
<category>daily</category>
</categories>
<tags>
<tag>R</tag>
</tags>
</entry>
<entry>
<title>openslide安装</title>
<url>/2024/05/16/openslide%E5%AE%89%E8%A3%85/</url>
<content><![CDATA[<h2 id="openslide-下载"><a href="#openslide-下载" class="headerlink" title="openslide 下载"></a>openslide 下载</h2><p>在(<a href="https://openslide.org/download/">Downloading OpenSlide</a>)下载对应操作系统的二进制包,解压</p>
<p><img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20240516200241133.png" alt="image-20240516200241133"></p>
<p>为这个文件夹中的<strong>bin</strong>和<strong>lib</strong>添加环境变量</p>
<p>激活环境,在命令行中运行</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">pip install Openslide-python</span><br></pre></td></tr></table></figure>
<p><img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20240516201746994.png"></p>
<p>出现这行字表示成功安装</p>
<h2 id="openslide-导入"><a href="#openslide-导入" class="headerlink" title="openslide 导入"></a>openslide 导入</h2><p>在环境中输入python</p>
<p><img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20240516201923931.png" alt="image-20240516201923931"></p>
<p>这个时候直接导入会报错</p>
<p>我们可以进行如下操作:</p>
<p>先加载os</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> os</span><br><span class="line">os.add_dll_directory(<span class="string">"D:\\Users\\xuhui\\anaconda3\\Library\\openslide-win64-20231011\\bin"</span>)</span><br></pre></td></tr></table></figure>
<p>再进行加载</p>
<p><img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20240516202221041.png" alt="image-20240516202221041"></p>
<p>成功导入</p>
]]></content>
<categories>
<category>experient</category>
</categories>
<tags>
<tag>dl</tag>
</tags>
</entry>
<entry>
<title>hexo_迁移</title>
<url>/2025/02/24/hexo-%E8%BF%81%E7%A7%BB/</url>
<content><![CDATA[<blockquote>
<p>最近换了电脑,因此想将原始文件夹转移到新电脑上</p>
</blockquote>
<h2 id="直接复制"><a href="#直接复制" class="headerlink" title="直接复制"></a>直接复制</h2><p>直接将原电脑上的文件夹打包,利用网盘/移动硬盘转移,在新电脑配置好环境后复制过来,这里由于我的博客数量很少,所以可以直接复制,那么当我们的文件夹很大时,最好还是利用GitHub进行迁移</p>
<h2 id="网络迁移"><a href="#网络迁移" class="headerlink" title="网络迁移"></a>网络迁移</h2><p>首先,我们应该配置新电脑的环境,这一点在之前的hexo配置中介绍过,不再赘述</p>
<p>然后新建一个文件夹,并初始化为blog文件夹,接着clone你的blog仓库,将<code>source</code>,<code>theme</code>等资源文件复制过来</p>
<blockquote>
<p>但是这种操作只能转移内容,而不能转移配置</p>
</blockquote>
<p>另一种方法</p>
<p><strong>原电脑操作</strong>:</p>
<ul>
<li>给你的博客仓库新建一个分支,并设为默认分支,例如<code>hexo</code></li>
<li>找到一个目录,使用<code>git clone</code>将仓库克隆到本地,删除除了<code>.git</code>外的所有内容</li>
<li>命令行将本地清空的仓库推送到<code>hexo</code>分支</li>
<li>将清空的仓库中的.git文件夹复制到博客目录下</li>
<li>将博客目录下的themes中每个主题文件夹下的.git和.gitgnore删掉</li>
<li>将上述博客目录推送到hexo分支</li>
</ul>
<p><strong>新电脑</strong>:</p>
<ul>
<li>创建好空文件夹后,<code>git clone</code></li>
<li>进入目录后,<code>npm install</code>,<code>hexo g</code>,<code>hexo s</code>,如无意外就可以看到原始内容了</li>
</ul>
<blockquote>
<p>🧐</p>
<p>好复杂啊。。我还是直接复制吧</p>
</blockquote>
]]></content>
<categories>
<category>daily</category>
</categories>
<tags>
<tag>daily</tag>
</tags>
</entry>
<entry>
<title>picgo+github</title>
<url>/2023/07/30/picgo-github/</url>
<content><</a>)</p>
<p>下载安装后打开,进入 <code>图床设置</code>-><code>github</code></p>
<p><img src="/image/image-20230730225439663.png" alt="image-20230730225439663"></p>
<p>填入相应的信息</p>
<p>token要在GitHub生成</p>
<h2 id="生成token"><a href="#生成token" class="headerlink" title="生成token"></a>生成token</h2><p>在GitHub新建一个仓库,取一个自己喜欢的名,(*这里取的是<code>image</code>*)</p>
<p>然后在设置里,拉到最下面,选择开发者选项</p>
<p><img src="/image/image-20230730225729836.png" alt="image-20230730225729836"></p>
<p>填入即可</p>
<h2 id="typora设置"><a href="#typora设置" class="headerlink" title="typora设置"></a>typora设置</h2><p>由于app上传失败(不知道为什么,于是选择了插件模式)</p>
<p><img src="/./../image/image-20230730231733097.png" alt="image-20230730231733097"></p>
<p>选择这个模式并下载,接着在C盘中/APPData/Roaming文件夹下找到Typora文件夹,里面的/picgo/win64子文件夹,其中有一个.exe文件,不用管他,在路径中输入cmd打开终端,并按照下图输入</p>
<p>其中customUrl最后两个为你的用户名和仓库名,按照自身情况替换</p>
<p><img src="/./../image/image-20230730231709888.png" alt="image-20230730231709888"></p>
<p>接着输入<code>picgo use uploader</code>,回车后选择GitHub,成功后回到typora选择验证,在GitHub中看到图片即成功</p>
<p><img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20230730232515873.png" alt="image-20230730232515873"></p>
<p>这样就成功了</p>
]]></content>
<categories>
<category>hexo</category>
</categories>
<tags>
<tag>hexo</tag>
</tags>
</entry>
<entry>
<title>python单元测试</title>
<url>/2026/01/06/python%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/</url>
<content><![CDATA[<h2 id="发现规则"><a href="#发现规则" class="headerlink" title="发现规则"></a>发现规则</h2><p><code>pytest</code>默认按照以下规则搜索测试:</p>
<ul>
<li><code>test_*.py</code></li>
<li><code>*_test.py</code></li>
<li>以<code>test_</code>开头的函数</li>
<li>以<code>Test</code>开头的类</li>
</ul>
<h2 id="基本用法"><a href="#基本用法" class="headerlink" title="基本用法"></a>基本用法</h2><p>首先应该明确测试条件,然后创建一个基本框架:</p>
<ol>
<li>创建一个 <code>test_</code> 开头的文件</li>
<li>创建一个 <code>Test</code> 的类</li>
<li>创建一个 <code>test_</code> 开头的方法<br>然后可以在命令行输入 <code>pytest</code>,他就会执行对应的测试用例(函数和方法),例如:<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">test_a</span>():</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Test</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">test_b</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">pass</span></span><br></pre></td></tr></table></figure>
上面的例子中有两个测试用例 <code>test_a</code> 和 <code>test_b</code>,pytest 会输出测试用例执行和汇总信息</li>
</ol>
<ul>
<li>我们可以使用断言抛出错误信息</li>
<li>测试用例中没有异常即为通过</li>
<li>测试用例存在异常,判定为失败</li>
</ul>
<h2 id="高级用法"><a href="#高级用法" class="headerlink" title="高级用法"></a>高级用法</h2><ol>
<li>mark<br> 标记是为了用例彼此不同,实现用例筛选,使用步骤为<ul>
<li>注册标记</li>
<li>使用标记<br> 标记的配置文件在根目录下,命名为 <code>pytest.ini</code>,在里面写入需要的内容,例如: <figure class="highlight text"><table><tr><td class="code"><pre><span class="line">[pytest]</span><br><span class="line">markers = </span><br><span class="line">api</span><br><span class="line">ui</span><br><span class="line">ut</span><br><span class="line">e2e</span><br></pre></td></tr></table></figure>
我们可以在测试用例上加上装饰器 <code>@pytest.mark.xx</code> 其中的 <code>xx</code> 替换为对应的标记</li>
<li>筛选标记:如果我们只希望之星对应标记的用例,可以这样 <code>pytest -m xx</code>,其中 <code>xx</code> 为对应的标记</li>
<li>一个用例可以有多个标记</li>
<li>一次可以筛选多个标记,例如 <code>pytest -m "api or e2e"</code> 就是同时筛选出 <code>api</code> 和 <code>e2e</code> 的标记的用例</li>
</ul>
</li>
<li>fixture<br> 可以实现<strong>自动</strong>在用例之前、之后完成用于测试的环境的构建和销毁<br> 编写一个生成器,并使用 <code>@pytest.fixture()</code> 装饰,在测试用例中使用 <code>@pytest.mark.usefixtures('生成器名称')</code>。<ul>
<li>可以使用 <code>conftest.py</code> 创建全局范围的 fixture</li>
</ul>
</li>
<li>hook<br> 当 pytest 在合适的时机允许进入和退出 pytest 核心部分,可以<strong>改变</strong>原有的运行模式。<br> 我们可以编写 <code>yaml</code> 文件来定义自身的测试</li>
</ol>
<h2 id="封装"><a href="#封装" class="headerlink" title="封装"></a>封装</h2><p>通过隐藏细节的方式降低使用的复杂度,添加新的功能特性。缺点:没有日志记录<br>可以在 <code>pytest.ini</code> 中设置日志</p>
<figure class="highlight text"><table><tr><td class="code"><pre><span class="line">log_file = ./logs/pytest.log</span><br><span class="line">log_file_level = info</span><br><span class="line">log_file_format = %(levelname)-8s %(asctime)s [%(name)s:(lineno)s] : %(message)s</span><br><span class="line">log_file_date_format = %Y-%m-%d %H:%M:%S</span><br></pre></td></tr></table></figure>
<p>生成测试报告:修改配置文件,加上一行 <code>addopts = --alluredir=./temps --clean-alluredir</code>,然后在终端执行 <code>allure generate -o report temps</code></p>
<ul>
<li>一键执行:创建一个 <code>run.py</code> 的文件,在里面输入<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> pytest</span><br><span class="line"></span><br><span class="line">pytest.main()</span><br><span class="line">os.system(<span class="string">'allure generate -o report temps'</span>)<span class="comment"># 生成测试报告</span></span><br></pre></td></tr></table></figure></li>
</ul>
]]></content>
<categories>
<category>python</category>
</categories>
</entry>
<entry>
<title>python工具uv</title>
<url>/2025/04/28/python%E5%B7%A5%E5%85%B7uv/</url>
<content><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>在此之前常使用conda管理python环境和包,但是conda体积较大,而<code>uv</code>是一个用<code>Rust</code>写的工具,其优势在于速度快,兼容性强;当然,他不能处理发布包、运行脚本、管理项目元数据的,这是<code>poetry</code>的长处。</p>
<h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>他的安装很简单。</p>
<ol>
<li>使用<code>curl</code>(推荐)<ol>
<li>在Linux或者Mac上:<code>curl -LsSf https://astral.sh/uv/install.sh | sh</code></li>
<li>在window上,可以使用powershell:<code>powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"</code></li>
</ol>
</li>
<li>使用<code>pipx</code>:命令为<code>pipx install uv</code></li>
</ol>
<p>安装后可以在终端使用<code>uv --version</code>来验证安装是否成功</p>
<h2 id="工作流"><a href="#工作流" class="headerlink" title="工作流"></a>工作流</h2><ol>
<li><p>创建虚拟环境</p>
<p>在开始安装前,通常需要先创建一个独立的环境以避免依赖冲突,<code>uv</code>创建环境的命令为:</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">uv venv env_name</span><br></pre></td></tr></table></figure>
<p>其中可以给自己的环境换一个名字,这个命令将查找系统中可用的python解释器,如果需要指定python版本,可以加一个参数:</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">uv venv env_name --python 3.x</span><br></pre></td></tr></table></figure>
</li>
<li><p>激活虚拟环境</p>
<p>激活方式取决于使用的shell:</p>
<ul>
<li><strong>Bash/zsh</strong>:<code>source .venv/bin/activate</code></li>
<li><strong>Fish</strong>:<code>source .venv/bin/activate.fish</code></li>
<li><strong>Nushell</strong>:<code>source .venv/bin/activate.nu</code></li>
<li><strong>PowerShell</strong>:<code>.venv/Scripts/Activate.ps1</code></li>
<li><strong>cmd</strong>:<code>.venv/Scripts/activate.bat</code></li>
</ul>
</li>
<li><p>安装依赖</p>
<p>激活环境后就是安装需要的依赖包,<code>uv</code>是兼容<code>pip</code>安装命令的,优势在于更快,下面是一些命令的解释</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装一个包</span></span><br><span class="line">uv pip instal requests</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装多个包</span></span><br><span class="line">uv pip install requests flask</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装指定版本的包</span></span><br><span class="line">uv pip install "requests==2.28.1"</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">从requirement安装</span></span><br><span class="line">uv pip install -r requirement.txt</span><br></pre></td></tr></table></figure>
<p>卸载包可以将<code>install</code>换成<code>uninstall</code>,但是这样会导致虚拟环境和<code>requirement.txt</code>不同步,更好的做法是:修改<code>reqirement.txt</code>,然后运行<code>uv pip compile</code>更新,最后运行<code>uv pip sync</code>来清理环境。</p>
<blockquote>
<p><code>uv add</code>也可以下载依赖,区别在于这个命令可以自动更新依赖到<code>.pyproject.toml</code>中</p>
</blockquote>
</li>
<li><p>其他命令</p>
<p>还有一些可以使用的命令如下:</p>
<ul>
<li><code>uv tree</code>:查看项目的依赖关系树</li>
<li><code>uv init</code>:初始化一个项目,新项目的目录下会生成<code>pyproject.toml</code>,<code>.python-version</code>等文件</li>
</ul>
</li>
</ol>
<p>更多具体内容可见<a href="https://docs.astral.sh/uv/">官方文档</a></p>
]]></content>
<categories>
<category>daily</category>
</categories>
<tags>
<tag>daily</tag>
</tags>
</entry>
<entry>
<title>torch_geometric安装</title>
<url>/2024/05/12/torch-geometric%E5%AE%89%E8%A3%85/</url>
<content><</a>)的地址,点击Additional Libraries中的<a href="https://data.pyg.org/whl">here</a></p>
<p><img src="/./../image/image-20240512124006928-1715488907105-1-1715488924173-4.png" alt="image-20240512124006928"></p>
<p>找到对应的pytorch和cuda版本,点击进去</p>
<p>其中一共有四种依赖,下载下来,如图所示</p>
<p><img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20240512124526032.png" alt="image-20240512124526032"></p>
<h4 id="安装依赖"><a href="#安装依赖" class="headerlink" title="安装依赖"></a>安装依赖</h4><p>打开虚拟环境,进入上述四个文件的目录下</p>
<p>然后依次安装</p>
<ol>
<li>torch_scatter</li>
</ol>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">pip install torch_scatter-2.0.9-cp36-cp36m-win_amd64.whl</span><br></pre></td></tr></table></figure>
<ol start="2">
<li>torch_sparse</li>
</ol>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">pip install torch_sparse-0.6.12-cp36-cp36m-win_amd64.whl</span><br></pre></td></tr></table></figure>
<ol start="3">
<li>torch_cluster</li>
</ol>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">pip install torch_cluster-1.5.9-cp36-cp36m-win_amd64.whl</span><br></pre></td></tr></table></figure>
<ol start="4">
<li>torch_spline_conv</li>
</ol>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">pip install torch_cluster-1.5.9-cp36-cp36m-win_amd64.whl</span><br></pre></td></tr></table></figure>
<ol start="5">
<li>安装torch_geometric,可以指定版本</li>
</ol>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">pip install torch_geometric -i https://mirrors.aliyun.com/pypi/simple</span><br></pre></td></tr></table></figure>
<p>最后验证一下</p>
<p><img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20240512125706881.png" alt="image-20240512125706881"></p>
]]></content>
<categories>
<category>experient</category>
</categories>
<tags>
<tag>-dl</tag>
</tags>
</entry>
<entry>
<title>vscode远程通道</title>
<url>/2025/04/10/vscode%E8%BF%9C%E7%A8%8B%E9%80%9A%E9%81%93/</url>
<content><![CDATA[<h1 id="windows做服务器"><a href="#windows做服务器" class="headerlink" title="windows做服务器"></a>windows做服务器</h1><p>以Linux做远程服务器的教程很多,但是有时候需要Windows系统做服务器,这种情况的设置我也想记录一下。</p>
<h2 id="安装Windows中的openssh"><a href="#安装Windows中的openssh" class="headerlink" title="安装Windows中的openssh"></a>安装Windows中的openssh</h2><p>用ssh连接时,本地称为client,远程主机称为host。</p>
<p>我们以Windows系统做host,需要安装一个连接工具,这里使用openssh。</p>
<p>启动<code>设置</code>,然后转到<code>应用</code>><code>应用和功能</code>><code>管理可选功能</code>。</p>
<p>扫描列表后,查看OpenSSH客户端是否已安装,如果没有,在页面顶部选择“添加功能”,然后:</p>
<ul>
<li>若要安装OpenSSH客户端,请找到“OpenSSH客户端”,然后单击“安装”。</li>
<li>若要安装OpenSSH服务器,请找到“OpenSSH服务器”,然后单击“安装”。</li>
</ul>
<p>安装完成后,就可以看到列出的OpenSSH组件。</p>
<h2 id="SSH的初始设置"><a href="#SSH的初始设置" class="headerlink" title="SSH的初始设置"></a>SSH的初始设置</h2><p>若要配置OpenSSH,以管理员身份启动PowerShell,然后运行一下命令来启动SSHD服务:</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">Start-Service sshd</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">OPTIONAL but recommended:</span></span><br><span class="line">Set-Service -Name sshd -StartupType 'Automatic'</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Confirm the Firewall rule is configured. It should be created automatically by setup.</span> </span><br><span class="line">Get-NetFirewallRule -Name *ssh*</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">There should be a firewall rule named <span class="string">"OpenSSH-Server-In-TCP"</span>, <span class="built_in">which</span> should be enabled</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">If the firewall does not exist, create one</span></span><br><span class="line">New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22</span><br></pre></td></tr></table></figure>
<p>在Windows服务器中,username可以用激活电脑时使用的用户名,即文件资源管理器中<code>C:\Users\username</code>中的username。而servername则是<code>设置</code>><code>系统</code>><code>关于</code>中的“设备名称”。</p>
<p>然后在管理员运行的powerShell中输入</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">Ssh username@servername</span><br></pre></td></tr></table></figure>
<p>第一次运行时会弹出</p>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">The authenticity of host 'servername (10.00.00.001)' can't be established.</span><br><span class="line">ECDSA key fingerprint is SHA256:(<span class="tag"><<span class="name">a</span> <span class="attr">large</span> <span class="attr">string</span>></span>).</span><br><span class="line">Are you sure you want to continue connecting (yes/no)?</span><br></pre></td></tr></table></figure>
<p>回答<code>yes</code>后输入开机密码,密码不会显示出来</p>
<blockquote>
<p>?由于我使用的是Mac,暂时没找到连接win的方法,搁置</p>
</blockquote>
]]></content>
<categories>
<category>daily</category>
</categories>
<tags>
<tag>experience</tag>
</tags>
</entry>
<entry>
<title>tensorflow下载过程</title>
<url>/2024/06/14/tensorflow%E4%B8%8B%E8%BD%BD%E8%BF%87%E7%A8%8B/</url>
<content><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>我在一年前曾写过一个<code>tensorflow</code>的安装流程笔记,但是今天再次安装发现存在一些问题,因此重新撰写</p>
<h3 id="版本"><a href="#版本" class="headerlink" title="版本"></a>版本</h3><p>之前的笔记中我没有意识到python,tensorflow,cuda,cudnn的对应关系,这次在服务器上安装就掉坑里了,因此在安装前首先要注意需要下载的版本,以及自己的cuda和cudnn版本</p>
<p>我使用的是<code>python = 3.9</code>,<code>tensorflow==2.10.0</code>,<code>cuda==11.3.1</code>,<code>cudnn==8.2.1</code></p>
<p>具体步骤为</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">conda create -n env_name python=3.9</span><br><span class="line">conda activate env_name</span><br><span class="line">conda install cudatoolkit==11.3.1</span><br><span class="line">conda install cudnn==8.2.1</span><br><span class="line">pip install tensorflow==2.10.0 -i source</span><br></pre></td></tr></table></figure>
<p>这样就初步安装成功了</p>
<h3 id="验证"><a href="#验证" class="headerlink" title="验证"></a>验证</h3><p>在之前的验证中我只验证了<code>tensorflow</code>是否安装成功,而没有检测能否使用<code>GPU</code>,因此将验证命令更新如下</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> tensorflow <span class="keyword">as</span> tf</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(tf.__version__)</span><br><span class="line"><span class="built_in">print</span>(tf.test.is_gpu_available())</span><br><span class="line"><span class="built_in">print</span>(tf.test.gpu_device_name())</span><br><span class="line"><span class="built_in">print</span>(tf.config.list_physical_devices(<span class="string">'GPU'</span>))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">"Num GPUs Available: "</span>,<span class="built_in">len</span>(tf.config.experimental.list_physical_devices(<span class="string">'GPU'</span>)))</span><br></pre></td></tr></table></figure>
<p><img src="https://cdn.jsdelivr.net/gh/xyuechen/image/image-20240614094327445.png" alt="image-20240614094327445"></p>
<p>运行结果中出现这个<code>True</code>表示识别成功</p>
]]></content>
<categories>
<category>daily</category>
</categories>
<tags>
<tag>dl</tag>
</tags>
</entry>
<entry>
<title>两数之和</title>
<url>/2026/01/11/%E4%B8%A4%E6%95%B0%E4%B9%8B%E5%92%8C/</url>
<content><![CDATA[<h1 id="两数之和"><a href="#两数之和" class="headerlink" title="两数之和"></a>两数之和</h1><p>题目:给定一个已按照 <strong>升序排列</strong> 的整数数组 <code>numbers</code> ,请你从数组中找出两个数满足相加之和等于目标数 <code>target</code> 。</p>
<p>函数应该以长度为 <code>2</code> 的整数数组的形式返回这两个数的下标值<em>。</em><code>numbers</code> 的下标 <strong>从 0 开始计数</strong> ,所以答案数组应当满足 <code>0 <= answer[0] < answer[1] < numbers.length</code> 。</p>
<p>假设数组中存在且只存在一对符合条件的数字,同时一个数字不能使用两次。</p>
<p>示例:</p>
<ul>
<li>输入:numbers = [1,2,4,6,10], target = 8</li>
<li>输出:[1,3]</li>
</ul>
<h2 id="暴力解法"><a href="#暴力解法" class="headerlink" title="暴力解法"></a>暴力解法</h2><p>直接循环遍历该数组两次,直到找到解。</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">twoSum</span>(<span class="params">self, nums: <span class="type">List</span>[<span class="built_in">int</span>], target: <span class="built_in">int</span></span>) -> <span class="type">List</span>[<span class="built_in">int</span>]:</span><br><span class="line"> numDict = <span class="built_in">dict</span>()</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(nums)):</span><br><span class="line"> <span class="keyword">if</span> target - nums[i] <span class="keyword">in</span> numDict:</span><br><span class="line"> <span class="keyword">return</span> numDict[target - nums[i]], i</span><br><span class="line"> numDict[nums[i]] = i</span><br><span class="line"> <span class="keyword">return</span> [<span class="number">0</span>]</span><br></pre></td></tr></table></figure>
<p>执行通过,但是耗时47ms,消耗内存17.6MB</p>
<h2 id="双指针"><a href="#双指针" class="headerlink" title="双指针"></a>双指针</h2><p>已知数组是有序的,如示例所示,如果我们选取第一个和最后一个元素,相加的结果为11,比目标值大,那么数组中的任何一个元素加上最后一个元素都会大于目标值,我们可以<em>去除</em>最后一个值,继续运算,1加6为7,小于目标值,那么数组中其他任何一个元素与6相加都会大于7,去掉第一个元素,以此类推,这就是相向双指针。</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">twoSum</span>(<span class="params">self, numbers: <span class="type">List</span>[<span class="built_in">int</span>], target: <span class="built_in">int</span></span>) -> <span class="type">List</span>[<span class="built_in">int</span>]:</span><br><span class="line"> left_index=<span class="number">0</span></span><br><span class="line"> right_index=<span class="built_in">len</span>(numbers)-<span class="number">1</span></span><br><span class="line"> <span class="keyword">while</span> left_index < right_index:</span><br><span class="line"> <span class="keyword">if</span> numbers[left_index] + numbers[right_index] == target:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">elif</span> numbers[left_index] + numbers[right_index] > target:</span><br><span class="line"> right_index -= <span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> left_index += <span class="number">1</span></span><br><span class="line"> <span class="keyword">return</span> [left_index,right_index]</span><br></pre></td></tr></table></figure>
<p>执行通过,耗时38ms,内存19.3MB,时间复杂度log(n)</p>
<h2 id="进阶版本:三数之和"><a href="#进阶版本:三数之和" class="headerlink" title="进阶版本:三数之和"></a>进阶版本:三数之和</h2><p>题目:给你一个整数数组 <code>nums</code> ,判断是否存在三元组 <code>[nums[i], nums[j], nums[k]]</code> 满足 <code>i != j</code>、<code>i != k</code> 且 <code>j != k</code> ,同时还满足 <code>nums[i] + nums[j] + nums[k] == 0</code> 。请你返回所有和为 <code>0</code> 且不重复的三元组。</p>
<p><strong>注意:</strong>答案中不可以包含重复的三元组。</p>
<p>示例:</p>
<ul>
<li>输入:nums = [-1,0,1,2,-1,-4]</li>
<li>输出:[[-1,-1,2],[-1,0,1]]</li>
</ul>
<p>解法:从上面的例子我们可以知道,如果数组是有序的,我们就可以使用相向双指针,我们可以先对数组排序;由于题目中说顺序不重要,那么我们人为规定一个顺序:<code>i<j<k</code>,然后我们可以枚举第一个数,然后问题就变成了另外两个数相加等于目标值减去第一个数,也就是上面的两数之和的问题。答案不能包含重复的元组,那么枚举时,如果这个数和上一个数相同,我们就跳过这个数。</p>
<p>代码:</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">threeSum</span>(<span class="params">self, nums: <span class="type">List</span>[<span class="built_in">int</span>]</span>) -> <span class="type">List</span>[<span class="type">List</span>[<span class="built_in">int</span>]]:</span><br><span class="line"> nums.sort()</span><br><span class="line"> ans = []</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(nums)-<span class="number">2</span>):</span><br><span class="line"> x = nums[i]</span><br><span class="line"> <span class="keyword">if</span> i > <span class="number">0</span> <span class="keyword">and</span> x == nums[i-<span class="number">1</span>]:</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> j = i + <span class="number">1</span></span><br><span class="line"> k = <span class="built_in">len</span>(nums) - <span class="number">1</span></span><br><span class="line"> <span class="keyword">while</span> j < k:</span><br><span class="line"> s = x + nums[j] + nums[k]</span><br><span class="line"> <span class="keyword">if</span> s > <span class="number">0</span>:</span><br><span class="line"> k -= <span class="number">1</span></span><br><span class="line"> <span class="keyword">elif</span> s < <span class="number">0</span>:</span><br><span class="line"> j += <span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> ans.append([x,nums[j],nums[k]])</span><br><span class="line"> j += <span class="number">1</span></span><br><span class="line"> <span class="keyword">while</span> j < k <span class="keyword">and</span> nums[j] == nums[j-<span class="number">1</span>]:</span><br><span class="line"> j += <span class="number">1</span></span><br><span class="line"> k -= <span class="number">1</span></span><br><span class="line"> <span class="keyword">while</span> j < k <span class="keyword">and</span> nums[k] == nums[k+<span class="number">1</span>]:</span><br><span class="line"> k -= <span class="number">1</span></span><br><span class="line"> <span class="keyword">return</span> ans</span><br></pre></td></tr></table></figure>
<p>执行时间695ms,消耗内存22.02MB</p>
<blockquote>
<p>还可以继续优化吗</p>
</blockquote>
<p>我们可以假设,这个数组排序后,最小的三个数相加都大于0,那么所有的数都一定不会满足条件,同理,如果最大的三个数相加都小于0,那么所有的数也一定都不会满足条件。</p>
<p>此外,如果当前i对应的数与数组最大两个的数相加大于0,那么也不用计算j和k了,因为一定不会存在解。</p>
<p>按照上面的思路优化代码后,执行时间499ms,消耗内存21MB</p>
]]></content>
<categories>
<category>algorithm</category>
</categories>
<tags>
<tag>study</tag>
</tags>
</entry>
<entry>
<title>免费科学上网方法记录</title>
<url>/2023/08/10/%E5%85%8D%E8%B4%B9%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91%E6%96%B9%E6%B3%95%E8%AE%B0%E5%BD%95/</url>
<content><,这是一个名为warp的软件,下载后可以免费获得1G的科学流量</p>
<p>但是这显然不够用</p>
<p>免费获取永久资格的方法有两种:</p>
<ul>
<li>使用信用卡或者paypal注册一个CloudFlare的账号,选择团队套餐,$0的那个,就可以获得免费的流量</li>
<li>关注warp的telegram</li>
</ul>
<p>我选择的是第二种</p>
<p>先使用免费的1G流量注册一个telegram账号(国内手机号可以使用),然后搜索<code>warp+bot</code></p>
<p><img src="/./../image/image-20230810221713595.png" alt="image-20230810221713595"></p>
<p>如图所示,选择这个账号,进入后点击”/generate“,他会提醒你关注两个账号,关注后点击第三个”我已关注“,它会返给你几个计算题,算好后就会生成密钥,最后回到warp软件偏好设置中更换密钥,就可以获得花不完的流量啦</p>
<p>原视频链接:<a href="https://www.youtube.com/watch?v=mkv6MRzvjPE">(10) 免费VPN的杀手!Warp+ 速度贼快,不限制流量,由大名鼎鼎的CloudFlare 提供,放心白嫖 | 零度解说 - YouTube</a></p>
]]></content>
<categories>
<category>daily</category>
</categories>
<tags>
<tag>daily</tag>
<tag>magic</tag>
</tags>
</entry>
<entry>
<title>动态规划</title>
<url>/2024/09/05/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/</url>
<content><![CDATA[<h2 id="步骤"><a href="#步骤" class="headerlink" title="步骤"></a>步骤</h2><ol>
<li>定义状态:确定问题的状态表示</li>
<li>状态转移方程(核心步骤):建立状态之间的递推关系。通常,当前状态最优解可通过之前计算的状态最优解得到</li>
<li>初始化:确定初始状态的值或设置起始条件</li>
<li>计算最优解:根据状态转移方程,逐步计算所有可能的状态的值</li>
</ol>
<h2 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h2><p>假设有一个二维的网络,每个单元格中有一个非负整数,目标为从左上角到右下角,每次只能向右或向下移动,要求路径上的数字之和最小</p>
<ul>
<li><p>定义状态:定义<code>dp[i][j]</code>为到达第<code>i</code>行第<code>j</code>列的最小路径和</p>
</li>
<li><p>状态转移方程:由于只能向右或向下移动,因此,状态转移方程为 $dp[i][j] = min(dp[i-1][j],dp[i],[j-1]) + grid[i][j]$</p>
<p>这里<code>grid[i][j]</code>是网格中第<code>i</code>行第<code>j</code>列的值</p>
</li>
<li><p>初始化条件:初始化左上角的值<code>dp[0][0] = grid[0][0]</code>;第一行只能从左边来,所以<code>dp[0][j] = dp[0][j-1] + grid[0][j]</code>;第一列只能从上面来,所以<code>dp[i][0] = dp[i-1][0] + grid[i][0]</code></p>
</li>
<li><p>填充DP表:按行或按列迭代填充整个DP表,最终<code>dp[m-1][n-1]</code>将包含从左上角到右下角的最小路径和</p>
</li>
</ul>
<h2 id="代码展示"><a href="#代码展示" class="headerlink" title="代码展示"></a>代码展示</h2><p>这里使用python代码</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">minPathSum</span>(<span class="params">grid</span>):</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> grid <span class="keyword">or</span> <span class="keyword">not</span> grid[<span class="number">0</span>]:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line"> m, n = <span class="built_in">len</span>(grid), <span class="built_in">len</span>(grid[<span class="number">0</span>])</span><br><span class="line"> dp = [[<span class="number">0</span>] * n <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(m)]</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 初始化起点</span></span><br><span class="line"> dp[<span class="number">0</span>][<span class="number">0</span>] = grid[<span class="number">0</span>][<span class="number">0</span>]</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 初始化第一行和第一列</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, m):</span><br><span class="line"> dp[i][<span class="number">0</span>] = dp[i-<span class="number">1</span>][<span class="number">0</span>] + grid[i][<span class="number">0</span>]</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, n):</span><br><span class="line"> dp[<span class="number">0</span>][j] = dp[<span class="number">0</span>][j-<span class="number">1</span>] + grid[<span class="number">0</span>][j]</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 填充剩余的dp表</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, m):</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, n):</span><br><span class="line"> dp[i][j] = <span class="built_in">min</span>(dp[i-<span class="number">1</span>][j], dp[i][j-<span class="number">1</span>]) + grid[i][j]</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> dp[m-<span class="number">1</span>][n-<span class="number">1</span>]</span><br><span class="line"></span><br></pre></td></tr></table></figure>
]]></content>
<categories>
<category>experience</category>
</categories>
</entry>
<entry>
<title>如何打开并贡献文档仓库</title>
<url>/2024/11/14/%E5%A6%82%E4%BD%95%E6%89%93%E5%BC%80%E5%B9%B6%E8%B4%A1%E7%8C%AE%E6%96%87%E6%A1%A3%E4%BB%93%E5%BA%93/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>git作为常用的版本管理工具,我们应该学会如何使用git与文档仓库连接</p>
<blockquote>
<p>本文以GitHub为例</p>
</blockquote>
<h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><p>我们使用git连接github</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">ssh-keygen -t rsa -b 4096 -C "your_email@example.com"</span><br></pre></td></tr></table></figure>
<p>这里的email填入注册GitHub用的邮箱</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">ssh-add ~/.ssh/id_rsa</span><br></pre></td></tr></table></figure>
<p>然后将<code>~/.ssh/id_rsa.pub</code>的内容复制到GitHub中,通过下面的命令验证是否连接</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">ssh -T git@github.com</span><br></pre></td></tr></table></figure>