-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.xml
4057 lines (3693 loc) · 471 KB
/
index.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Ricardo</title>
<link>https://sona201.github.io/</link>
<description>Recent content on Ricardo</description>
<generator>Hugo -- gohugo.io</generator>
<language>zh-CN</language>
<lastBuildDate>Wed, 22 May 2024 14:20:01 +0800</lastBuildDate><atom:link href="https://sona201.github.io/index.xml" rel="self" type="application/rss+xml" /><item>
<title>python包都安装到哪里去了</title>
<link>https://sona201.github.io/posts/where-are-your-python-packages-installed/</link>
<pubDate>Wed, 22 May 2024 14:20:01 +0800</pubDate>
<guid>https://sona201.github.io/posts/where-are-your-python-packages-installed/</guid>
<description><h1 id="python包都安装到哪里去了">python包都安装到哪里去了?</h1>
<p><a class="link" href="https://frostming.com/2019/03-13/where-do-your-packages-go/" target="_blank" rel="noopener"
>原文链接: 你的 Python 包都装到哪了?</a></p>
<blockquote>
<p>终结一切找不到包、可执行文件的问题</p>
</blockquote>
<h2 id="背景">背景</h2>
<p>经常在python社区看到的高频问题:</p>
<ul>
<li>我安装了pip为什么找不到可执行文件</li>
<li><code>import module</code> 为什么报 <code>ModuleNotFound</code>?</li>
<li>为什么我用 Pycharm 能运行在cmd里运行不了?</li>
</ul>
<h2 id="python是如何寻找包的">Python是如何寻找包的</h2>
<p>现在大家的电脑上很可能不只有一个<code>Python</code>,还有更多的虚拟环境,导致安装包的时候,一不小心你就忘记注意安装包的路径了。
首先我们来解决找包的问题,这个问题回答起来很简单,但很多人不知道这个原理。
假如你的<code>Python</code>解释器的路径是<code>$path_prefix/bin/python</code>,那么你启动<code>Python</code>交互环境或者用这个解释器运行脚本时,会默认寻找以下位置:</p>
<ol>
<li><code>$path_prefix/lib</code>(标准库路径)</li>
<li><code>$path_prefix/lib/pythonX.Y/site-packages</code>(三方库路径, X.Y是对应<code>Python</code>的主次版本号,如<code>3.8</code>,<code>2.7</code>)</li>
<li>当前工作目录(<code>pwd</code>命令返回的结果)</li>
</ol>
<p>这里如果你用的是<code>Linux</code>上默认的<code>Python</code>,<code>$path_prefix</code>就是<code>/usr</code>,如果你是自己使用默认选项编译的,<code>$path_prefix</code>就是<code>/usr/local</code>。从上面第二条可以看到不同的<code>Python</code>版本的第三方库路径不同,如果你把<code>Python</code>从<code>3.6</code>升级到<code>3.8</code>那么之前装的三方库都没法用了。当然你可以整个文件夹都拷贝过去,大部分情况不会出问题。</p>
<h2 id="几个有用的函数">几个有用的函数</h2>
<ul>
<li><code>sys.executable</code>: 当前使用的<code>Python</code>解释器路径</li>
<li><code>sys.path</code>: 当前包的搜索路径列表</li>
<li><code>sys.prefix</code>: 当前使用的 <code>$path_prefix</code></li>
<li>除此之外,还可以在命令行中运行<code>python -m site</code>,会打印出当前的 <code>Python</code> 的一些信息,包括搜索路径列表。</li>
</ul>
<p>例:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">Python 3.8.15 <span class="o">(</span>default, Mar <span class="m">27</span> 2024, 17:03:04<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="o">[</span>Clang 14.0.3 <span class="o">(</span>clang-1403.0.22.14.1<span class="o">)]</span> on darwin
</span></span><span class="line"><span class="cl">Type <span class="s2">&#34;help&#34;</span>, <span class="s2">&#34;copyright&#34;</span>, <span class="s2">&#34;credits&#34;</span> or <span class="s2">&#34;license&#34;</span> <span class="k">for</span> more information.
</span></span><span class="line"><span class="cl">&gt;&gt;&gt; import sys
</span></span><span class="line"><span class="cl">&gt;&gt;&gt; sys.executable
</span></span><span class="line"><span class="cl"><span class="s1">&#39;/Users/admin/PycharmProjects/opstools/.venv/bin/python&#39;</span>
</span></span><span class="line"><span class="cl">&gt;&gt;&gt; sys.path
</span></span><span class="line"><span class="cl"><span class="o">[</span><span class="s1">&#39;&#39;</span>, <span class="s1">&#39;/Users/admin/.pyenv/versions/3.8.15/lib/python38.zip&#39;</span>, <span class="s1">&#39;/Users/admin/.pyenv/versions/3.8.15/lib/python3.8&#39;</span>, <span class="s1">&#39;/Users/admin/.pyenv/versions/3.8.15/lib/python3.8/lib-dynload&#39;</span>, <span class="s1">&#39;/Users/admin/PycharmProjects/opstools/.venv/lib/python3.8/site-packages&#39;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">&gt;&gt;&gt; sys.prefix
</span></span><span class="line"><span class="cl"><span class="s1">&#39;/Users/admin/PycharmProjects/opstools/.venv&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="使用环境变量添加搜索路径">使用环境变量添加搜索路径</h2>
<p>如果你的包的路径不存在上面列出的搜索路径列表里,可以把路径加到<code>PYTHONPATH</code>环境变量里,多个路径用<code>:</code>隔开(Windows用<code>;</code>)。</p>
<p>但需注意,避免把不同<code>Python</code>版本包的路径加到<code>PYTHONPATH</code>里,比如<code>PYTHONPATH=/home/admin/.local/lib/python2.7/site-packages</code>,因为<code>PYTHONPATH</code>中的路径是优先于默认搜索路径,如果用<code>Python3</code>的话会有兼容性问题。事实上<code>PYTHONPATH</code>里最好不要出现任何带<code>site-packages</code>的路径。</p>
<p>简单附一个<code>PYTHONPATH</code>实际案例,django项目经常有人自定义一个<code>apps</code>目录用来放所有项目,一般都是将路径放到<code>sys.path</code>里。这里可以设置环境变量<code>PYTHONPATH</code>来解决这个问题,代码如下</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">BASE_DIR</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="vm">__file__</span><span class="p">)</span><span class="o">.</span><span class="n">resolve</span><span class="p">()</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">parent</span>
</span></span><span class="line"><span class="cl"><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">&#39;PYTHONPATH&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">BASE_DIR</span><span class="p">,</span> <span class="s1">&#39;apps&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># sys.path.insert(0, os.path.join(BASE_DIR, &#39;apps&#39;))</span>
</span></span><span class="line"><span class="cl"><span class="n">ABS_BASE_DIR</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">BASE_DIR</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>顺便说下<code>PATH</code>是用来找<strong>可执行程序</strong>的搜索路径,假如你在终端运行命令<code>my_cmd</code>,系统会依次扫描<code>PATH</code>中的路径,看<code>my_cmd</code>是否在于该路径下,所以如果是提示找不到程序或命令无法识别,那你就要看路径是否加到<code>PATH</code>里了。</p>
<h2 id="python-是如何安装包的">Python 是如何安装包的</h2>
<p>现在用安装<code>Python</code>包基本是用的<code>pip</code>,就算你是用<code>pipenv</code>,<code>poetry</code>,底层依然是<code>pip</code>,一律适用。如果你没有安装<code>pip</code>,请参考<a class="link" href="https://pip.pypa.io/en/stable/installation/" target="_blank" rel="noopener"
>pip 安装</a>,如果安装了还无法使用<code>pip</code>命令请看上一节。</p>
<p>运行<code>pip</code>有两种方式:</p>
<ul>
<li><code>pip ...</code></li>
<li><code>python -m pip ...</code></li>
</ul>
<p>第一种方式和第二种方式大同小异,区别是第一种方式使用的 Python 解释器是写在 pip 文件的 shebang 里的,一般情况下,如果你的 pip 路径是<code>$path_prefix/bin/pip</code>,那么 <code>Python</code> 路径对应的就是 <code>$path_prefix/bin/python</code>。如果你用的是 <code>Unix</code> 系统则 <code>cat $(which pip)</code> 第一行就包含了 <code>Python</code> 解释器的路径。第二种方式则显式地指定了 <code>Python</code> 的位置。这条规则,对于所有 <code>Python</code> 的可执行程序都是适用的。流程如下图所示。</p>
<p><img src="https://sona201.github.io/images/20240517-python%e8%b7%af%e5%be%84.png"
loading="lazy"
alt="20240517-python路径"
></p>
<p>那么,不加任何自定义配置时,使用 pip 安装包就会自动安装到 <code>$path_prefix/lib/pythonX.Y/site-packages</code> 下(<code>$path_prefix</code> 是从上一段里得到的),可执行程序安装到 <code>$path_prefix/bin</code> 下,如果需要在命令行直接使用 <code>my_cmd</code> 运行,记得加到 <code>PATH</code>。</p>
<h2 id="pip-中更改安装位置的选项">pip 中更改安装位置的选项</h2>
<ul>
<li><code>--prefix PATH</code>,替换<code>path_pretix</code>为给定的值</li>
<li><code>--root ROOT_PATH</code>,在<code>$path_prefix</code>,前面加上<code>ROOT_PATH</code>,比如<code>--root /home/admin</code>,<code>$path_prefix</code>就会从<code>/usr</code>变成<code>/home/admin/usr</code></li>
<li><code>--target TARGET</code>,直接指定安装到<code>TARGET</code></li>
</ul>
<h2 id="虚拟环境">虚拟环境</h2>
<p>虚拟环境就是为了隔离不同项目的依赖包,使他们安装到不同的路径下,以防止依赖冲突的问题。理解了 Python 是如何安装包的机制之后就不难理解虚拟环境(<code>virturalenv</code>, <code>venv</code>模块)的原理。其实,运行 <code>virtualenv myenv</code> 会复制一个新的Python解释器到<code>myenv/bin</code>,并创建好<code>myenv_lib</code>,<code>myenv/lib/pythonX.Y/site-packages</code>等目录(<code>venv</code>模块不是用的复制,但结果基本一样)。执行<code>source myenv/bin/activate</code>以后会把<code>myenv/bin</code>塞到<code>PATH</code>前面,让这个复制出来的 <code>Python</code> 解释器最优先被搜索到。这样,后续安装包时,<code>$path_prefix</code>就会是<code>myenv</code>了,从而实现了安装路径的隔离。</p>
<h2 id="脚本运行方式对搜索路径的影响">脚本运行方式对搜索路径的影响</h2>
<p>从上面的介绍大家可以知道,Python 找不找得到一个包,最直接的原因是<code>sys.path</code>,而更进一步的原因是<code>sys.executable</code>的路径。程序写完了,我们总得需要运行它,不同的运行方法却有可能影响到<code>sys.path</code>而造成不同的行为,下面我们就来讨论这个问题。</p>
<h3 id="情况一">情况一</h3>
<p>假设你的包结构如下</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">.py_test
</span></span><span class="line"><span class="cl">├── main.py
</span></span><span class="line"><span class="cl">└── my_package
</span></span><span class="line"><span class="cl"> └── b.py
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>main.py</code>的内容:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">my_package.b</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>b.py</code> 的文件内容很简单:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">sys</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;I&#39;m b&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>现在在 <code>main.py</code> 同级的目录下执行,可以看到正常输出<code>path</code>,且<code>path</code>路径第一个就是我们项目的当前目录<code>py_test</code>,也是我们的执行目录</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ py_test python main.py
</span></span><span class="line"><span class="cl">I<span class="s1">&#39;m b
</span></span></span><span class="line"><span class="cl"><span class="s1">[&#39;</span>/Users/admin/Files/Projects/py_test<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python38.zip<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8/lib-dynload<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8/site-packages<span class="err">&#39;</span><span class="o">]</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>python xxx.py</code> 的运行方式叫做直接运行,这时该文件中的 <code>__name__</code> 值会指定为 <code>__main__</code>,IDE 中的「 Run File」「 运行脚本」用的就是这种方式。可以看到这时 <code>sys.path</code>的第一个值是该脚本文件所在的目录,随脚本路径而变化,记住我们执行测试始终是在 <code>/home/admin/test_path</code> 这个目录下。</p>
<h3 id="情况二">情况二</h3>
<p>还是那个结构,我们将项目复制一份,在<code>my_package</code>目录里增加一个<code>a.py</code>文件,仅做一个简单的打印`print(&ldquo;I&rsquo;m a&rdquo;)</p>
<p>项目结构如下</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">.py_test1
</span></span><span class="line"><span class="cl">├── main.py
</span></span><span class="line"><span class="cl">└── my_package
</span></span><span class="line"><span class="cl"> ├── a.py
</span></span><span class="line"><span class="cl"> └── b.py
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>a.py</code> 的文件内容:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;I&#39;m a&#34;</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>好,那么如果我们需要在 <code>b.py</code> 中导入 <code>a.py</code>,那么 <code>b.py</code> 脚本中应该怎么写呢?</p>
<p><code>b.py</code> 的文件内容,这里的<code>import</code>并没有写在最上面是为了能看到<code>sys.path</code>的输出:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">sys</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;I&#39;m b&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">a</span>
</span></span></code></pre></td></tr></table>
</div>
</div><ol>
<li>此时,再执行一遍上面的测试</li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ py_test1 python main.py
</span></span><span class="line"><span class="cl">I<span class="s1">&#39;m b
</span></span></span><span class="line"><span class="cl"><span class="s1">[&#39;</span>/Users/admin/Files/Projects/py_test1<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python38.zip<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8/lib-dynload<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8/site-packages<span class="s1">&#39;]
</span></span></span><span class="line"><span class="cl"><span class="s1">Traceback (most recent call last):
</span></span></span><span class="line"><span class="cl"><span class="s1"> File &#34;main.py&#34;, line 1, in &lt;module&gt;
</span></span></span><span class="line"><span class="cl"><span class="s1"> import my_package.b
</span></span></span><span class="line"><span class="cl"><span class="s1"> File &#34;/Users/admin/Files/Projects/py_test1/my_package/b.py&#34;, line 6, in &lt;module&gt;
</span></span></span><span class="line"><span class="cl"><span class="s1"> import a
</span></span></span><span class="line"><span class="cl"><span class="s1">ModuleNotFoundError: No module named &#39;</span>a<span class="err">&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>执行报错了,根据前面讲的内容,这个报错就是意料之中了——<code>a.py</code>所在的目录 <code>/Users/admin/Files/Projects/py_test1/my_package</code> 压根没有包含 <code>sys.path</code>中 ,自然就找不到 <code>a</code> 文件了。</p>
<p>那换个思路,直接在当前main目录执行<code>b.py</code>是否会报错?</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ py_test1 python my_package/b.py
</span></span><span class="line"><span class="cl">I<span class="s1">&#39;m b
</span></span></span><span class="line"><span class="cl"><span class="s1">[&#39;</span>/Users/admin/Files/Projects/py_test1/my_package<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python38.zip<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8/lib-dynload<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8/site-packages<span class="s1">&#39;]
</span></span></span><span class="line"><span class="cl"><span class="s1">I&#39;</span>m a
</span></span></code></pre></td></tr></table>
</div>
</div><p>结果没有报错,相应的目录位置也变了,不是<code>main.py</code>所在的<code>/Users/admin/Files/Projects/py_test1</code>目录,而是<code>my_package</code>目录</p>
<h3 id="情况三">情况三</h3>
<p>还是刚刚的代码,只是把<code>b.py</code>的内容更新了下,将 <code>import a</code> 改成 <code>from my_package import a</code></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">sys</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;I&#39;m b&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">my_package</span> <span class="kn">import</span> <span class="n">a</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>同样的先执行<code>python main.py</code>测试(我重新拷贝了项目命名为<code>py_test2</code>)</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ py_test2 python3 main.py
</span></span><span class="line"><span class="cl">I<span class="s1">&#39;m b
</span></span></span><span class="line"><span class="cl"><span class="s1">[&#39;</span>/Users/admin/Files/Projects/py_test2<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python38.zip<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8/lib-dynload<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8/site-packages<span class="s1">&#39;]
</span></span></span><span class="line"><span class="cl"><span class="s1">I&#39;</span>m a
</span></span></code></pre></td></tr></table>
</div>
</div><p>改成 <code>from my_package import a</code>,执行不报错了,注意由于 <code>b</code> 是在 <code>my_package</code> 包中的,这时可以使用相对导入,写 <code>from . import a</code> 和 <code>from my_package import a</code> 的效果是一样的。</p>
<p>因为基于同样的分析,我们可以推断直接执行 <code>python my_package/b.py</code>会报错提示<code>找不到 my_package</code>,运行结果如下</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">py_test2 python my_package/b.py
</span></span><span class="line"><span class="cl">I<span class="s1">&#39;m b
</span></span></span><span class="line"><span class="cl"><span class="s1">[&#39;</span>/Users/admin/Files/Projects/py_test2/my_package<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python38.zip<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8/lib-dynload<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8/site-packages<span class="s1">&#39;]
</span></span></span><span class="line"><span class="cl"><span class="s1">Traceback (most recent call last):
</span></span></span><span class="line"><span class="cl"><span class="s1"> File &#34;my_package/b.py&#34;, line 7, in &lt;module&gt;
</span></span></span><span class="line"><span class="cl"><span class="s1"> from my_package import a
</span></span></span><span class="line"><span class="cl"><span class="s1">ModuleNotFoundError: No module named &#39;</span>my_package<span class="err">&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>果然跟我们推理的一样,就是路径不对报错。</p>
<h3 id="情况四">情况四</h3>
<p>那么我有没有让这两次运行都不报错的方法呢?有。我们要知道,一个项目中的入口是有限的,实际上不会出现可以执行的代码既在顶层有,又在子目录里也有。我们应该把主要的运行逻辑,都放在 <code>main.py</code> 中(不一定是这个名字,比如 <code>Django</code> 项目是 <code>manage.py</code>),如果这时确实需要运行一个子目录中某脚本的代码,应该用 <code>python -m &lt;module_name&gt;</code>,而 <code>b.py</code> 中导入 <code>a</code> 的语句应为 <code>from my_package import a</code>,我们来看一下运行效果:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ py_test2 python main.py
</span></span><span class="line"><span class="cl">I<span class="s1">&#39;m b
</span></span></span><span class="line"><span class="cl"><span class="s1">[&#39;</span>/Users/admin/Files/Projects/py_test2<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python38.zip<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8/lib-dynload<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8/site-packages<span class="s1">&#39;]
</span></span></span><span class="line"><span class="cl"><span class="s1">I&#39;</span>m a
</span></span><span class="line"><span class="cl">$ py_test2 python -m my_package.b
</span></span><span class="line"><span class="cl">I<span class="s1">&#39;m b
</span></span></span><span class="line"><span class="cl"><span class="s1">[&#39;</span>/Users/admin/Files/Projects/py_test2<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python38.zip<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8/lib-dynload<span class="s1">&#39;, &#39;</span>/Users/admin/.pyenv/versions/3.8.15/lib/python3.8/site-packages<span class="s1">&#39;]
</span></span></span><span class="line"><span class="cl"><span class="s1">I&#39;</span>m a
</span></span></code></pre></td></tr></table>
</div>
</div><p>可以看到这两次运行的 <code>sys.path</code> 内容一致了,它的第一个值是当前运行所在的目录。这种运行方式叫做以模块方式运行,<code>python -m</code> 后面的参数是(以 <code>.</code> 分隔的)模块名,而不是路径名。由于这种统一性,你在项目中的所有导入都可以用相同的定义方式,而不用管是在哪个脚本中。这也是为什么 <code>Django</code> 官方文档中推荐导入名称全部用 <code>myapp.models.users</code> 这种形式。</p>
<p>除此之外,以模块方式运行的时候,传入模块名的每一级父模块(或包)都会以模块形式运行,这意味着你可以在模块中使用相对导入(以直接运行方式运行不可以),并且传入的模块中<code>__name__</code> 的值会置为 <code>__main__</code>,你依然可以应用 <code>if __name__ == &quot;__main__&quot;:</code> 的判断。如果 <code>python -m &lt;module_name&gt;</code> 中传入的模块是个包,那么会执行包目录中的 <code>__main__.py</code> 脚本(如果存在),此时该脚本的 <code>__name__</code> 值为 <code>__main__</code>。</p>
<h2 id="总结">总结</h2>
<p>看到这里大家可以发现,关于包路径搜索最重要的就是这个<code>$path_prefix</code>路径前缀,而这个值又是从使用的 <code>Python</code> 解释器路径推导出来的。所以要找到包的路径,只需要知道解释器的路径就可以了,如果遇到改变包的路径,只需要通过正确的PATH设置,指定你想要的 <code>Python</code> 解释器即可。</p>
<p>现在回到开头的三个问题,已经解决了。</p>
</description>
</item>
<item>
<title>40 问</title>
<link>https://sona201.github.io/posts/40-%E9%97%AE/</link>
<pubDate>Wed, 31 Jan 2024 13:26:26 +0800</pubDate>
<guid>https://sona201.github.io/posts/40-%E9%97%AE/</guid>
<description><p>2023年回顾</p>
<ol>
<li>你今年做了哪些之前从未做过的事?答: 去看了郭德纲相声</li>
<li>你有没有遵守年初时和自己许下的约定?答: 没有</li>
<li>你身边有人生孩子了吗?答: 有朋友生娃了</li>
<li>你身边有人去世了吗?答: 去年外婆走了。</li>
<li>你去了哪些城市/州/国家?答: 去了绍兴玩</li>
<li>明年你想要获得哪些你今年没有的东西?答: 不知道</li>
<li>今年的哪个或哪些日子会铭刻在你的记忆中,为什么?答: 老婆的生日吧,这次过的不一样</li>
<li>你今年最大的成就是什么?答:</li>
<li>你今年最大的失败是什么?答:</li>
<li>你今年还遇到过哪些困难?答: 工作不被认可</li>
<li>你今年是否生过病或受过伤?答: 嘴唇疱疹次数变多了</li>
<li>你今年买过的最好的东西是什么?答: 戴森,别的好像基本没买</li>
<li>谁的行为值得去表扬?答:</li>
<li>谁的行为令你感到震惊?答: 同事的发火</li>
<li>你大部分的钱都花到哪里去了?答: 吃,房贷</li>
<li>有什么事让你感到超级、超级、超级兴奋?答: 遇到志同道合,被认可</li>
<li>哪首歌会永远让你想起这一年?答: 17年是陈奕迅的约定</li>
<li>与去年的这个时候相比,你是:感到更快乐还是更悲伤了?变得更瘦还是更胖了?变得更富还是更穷了?答: 变更悲伤了</li>
<li>你希望自己能做得更多的是什么?答:</li>
<li>你希望自己能做得更少的是什么?答:</li>
<li>你是如何度过节假日的?答:</li>
<li>你今年坠入爱河了吗?答: 是的</li>
<li>你是否有讨厌某个你去年此时不觉得讨厌的人呢?答: 答:</li>
<li>你最喜欢的电视节目是什么?答:</li>
<li>你读过最好的一本书是什么?答: 陈皓的书,23年尾,24年初读完的</li>
<li>你今年发现的最好听的一首歌是什么?答:</li>
<li>你今年看过最喜欢的一部电影是什么?答:</li>
<li>你今年吃过最好吃的一顿饭是什么?答:</li>
<li>有什么是你想要且得到了的?答:</li>
<li>有什么是你想要却没有得到的?答:</li>
<li>你生日那天做了什么?答: 没印象了</li>
<li>有什么还未发生的事,如果发生了,会让你的这一年变得无比满足?答: 一份被认可的工作</li>
<li>你会如何描述你今年的个人时尚风格?答:</li>
<li>是什么让你保持理智?答:</li>
<li>你最欣赏哪个名人/公众人物?答:</li>
<li>哪个政治问题最令你有感而发?答:</li>
<li>你想念哪些人?答: 外婆</li>
<li>在你新认识的人之中,谁是最好的?答: 前同事</li>
<li>今年你学到了什么宝贵的人生经验?答: 好像有好多,但暂时说不上来</li>
<li>能够总结你这一年的一句话是什么?答: 没有认清自己</li>
</ol>
</description>
</item>
<item>
<title>为什么随着年龄增长,我们感觉时间似乎流逝得更快 [译][转]</title>
<link>https://sona201.github.io/posts/why-time-seems-to-pass-faster-as-we-age/</link>
<pubDate>Wed, 31 Jan 2024 13:26:26 +0800</pubDate>
<guid>https://sona201.github.io/posts/why-time-seems-to-pass-faster-as-we-age/</guid>
<description><p>原文:Why time seems to pass faster as we age
作者:Paras Chopra
翻译原文:https://baoyu.io/translations/life/why-time-seems-to-pass-faster-as-we-age#google_vignette</p>
<p>1/ 这种感觉让我非常着迷。</p>
<p>作为一个 36 岁的人,我感觉一年的时间比我还是个孩子或青少年时要短得多。</p>
<p>这似乎是宇宙间的不公——我们的寿命更短了,而每一年过得也更快了。</p>
<p>2/ 但为什么会这样呢?</p>
<p>我初步认为,这是进化如何塑造我们的大脑成为一个高效存储装置的不幸副作用。</p>
<p>3/ 我们的大脑本质上是一个预测机器。</p>
<p>它的主要任务是构建一个世界模型,以此来获得生存和繁衍的优势。</p>
<p>4/ 能预测现象意味着能控制它,从而拥有力量。因此,我们的大脑痴迷于预测事物的走向。</p>
<p>它渴望能预见如何找到伴侣、赚钱的方式、什么能让人发笑等等。</p>
<p>5/ 同时,它追求效率。</p>
<p>如果某件事已经发生过,再次关注它并记住它有何意义呢?</p>
<p>重复存储是低效的,因此大脑倾向于只关注并记忆那些新奇和令人惊讶的事物。</p>
<p>6/ 对孩子来说,一切都是新奇和令人惊讶的。</p>
<p>世界是一个充满学习机会的地方,因此大脑在记忆方面进行大量更新。</p>
<p>你生日、假期、学校日子的完整记录,都被铭记。</p>
<p>7/ 每天都有新奇的信息涌现,因此大脑极为关注,你就会感觉一天中有很多“时间片段”。</p>
<p>这些丰富的信息被存储起来,使得即使是回顾,那些日子也似乎更加漫长。</p>
<p>8/ 随着年龄的增长,新奇的事物仅仅成为旧记忆上的一小片“补丁”。</p>
<p>为什么要存储你第 N 次假期的完整细节,而不是简单地记录下它与第一次的不同之处呢?</p>
<p>9/ 换句话说,随着我们年龄的增长,我们的记忆和注意力成了它们过去的低保真版本。</p>
<p>随着生活中的模式开始自我重复,我们注意到并记住的“时间片段”变得越来越少,越来越粗糙。</p>
<p>10/ 因此,如果有人问你生命中的时间都去哪儿了,你回想起来,大部分记忆都与童年有关,近期的记忆却寥寥无几。</p>
<p>这就是为什么时间感觉像是积累在了过去,而不是近现在。</p>
<p>11/ 让你感觉时间加速的主要罪魁祸首是可预测性。</p>
<p>你的日子越可预测,你就越会觉得它们短暂。</p>
<p>12/ 来做个思想实验。</p>
<p>如果你有一份稳定的工作,你可以在脑海中进行一整年的时间旅行,发现每一天都差不多。</p>
<p>但如果我让你想象在一个外国大学攻读梵语博士学位,你将无法想象你的日子会是什么样子。</p>
<p>13/ 因此,可预测性不仅影响我们对当前时间的感知,也影响对未来时间的预期。</p>
<p>在童年时,假期因为充满了新奇信息,因此它让人觉得充实而漫长。</p>
<p>现在,你第 N 次去某个地方旅行就感觉短多了,因为你知道将会发生什么。</p>
<p>14/ 那么,我们该如何行动,以减缓时间的流逝呢?</p>
<p>我能想到的唯一方法是打破日常的可预测性,主动寻找(大量的)惊喜。</p>
<p>参与那些你完全不了解的项目。</p>
<p>15/ 不幸的是,随着年龄的增长,进化让我们更倾向于避免探索和冒险。</p>
<p>我们的大脑倾向于更多地利用我们已经较好理解的世界,而不是鼓励我们去探索更多。</p>
<p>但这正是让你的岁月匆匆流逝的原因。</p>
<p>16/ 你需要问自己:</p>
<p>你想如何度过一生?</p>
<p>是简单地活得久,还是让每一刻都活得充实和精彩?</p>
<p>对自己来说,哪种生活更为重要。</p>
<p>17/ 有趣的是,让时间放慢的解决方案不是无聊(正如我曾以为的)。</p>
<p>无聊是一种消极状态。解决方法是勇敢地投身于未知的领域。</p>
<p>也就是说,</p>
<p>要么是身体上的旅行,体验不同的文化和环境,做一些从未尝试过的活动;</p>
<p>要么是心灵上的旅行,阅读、学习新技能、挑战自我。</p>
<p>18/ 注意,我们非常擅长掌握模式/建立预测模型。</p>
<p>一旦我们弄清楚了游戏的获胜条件或故事情节,我们就会兴趣全无。</p>
<p>19/ 因此,存在的危机实际上是对生活的一种预警。</p>
<p>拥有所有预测模型的大脑会问:这就是生活的全部吗?</p>
<p>但它错了——这只是它选择的生活的全部。</p>
<p>20/ 它无法预测的(彻底)不同的生活会让大脑保持警觉。</p>
<p>这里的关键词是“彻底”。</p>
<p>变化越小,记忆留存的时间就越短。</p>
</description>
</item>
<item>
<title>左耳听风读后感</title>
<link>https://sona201.github.io/posts/zuoertingfeng-reading-thought/</link>
<pubDate>Tue, 23 Jan 2024 01:10:19 +0800</pubDate>
<guid>https://sona201.github.io/posts/zuoertingfeng-reading-thought/</guid>
<description><h2 id="关于作者陈浩">关于作者陈浩</h2>
<p>大概是我刚入行的时候,在通过各种百度搜索资料的时候,发现了他的<a class="link" href="https://coolshell.cn/haoel" target="_blank" rel="noopener"
>网站-个人博客</a>,当时还不知道这是怎样的一个人,后来在极客时间看到他出专栏了,才知道原来是大佬。</p>
<p>再后来就是看到他很多关于技术思想的文章,开始&quot;追星&quot;。甚至在推特上也在关注他的发言,看看是怎样的一个人,想模仿他。但意外来临的太快,甚至我都没有参加过他的大会,他就离开了。</p>
<p>当初学习极客时间学的太粗糙,很多都没理解,主要原因是我知识有限。终于他的书出来了,我知道有不少部分跟他专栏重合,但这样就等于我再复习一遍,有何不可。顺便记录点文字,待自己以后翻阅。</p>
<h2 id="收获">收获</h2>
<ul>
<li>治愈焦虑</li>
<li>不在迷茫学什么,知道还有哪些运维的事情可以做</li>
</ul>
<h2 id="我的思考">我的思考</h2>
<p>&hellip;</p>
</description>
</item>
<item>
<title>ARTS-20240107</title>
<link>https://sona201.github.io/posts/arts-20240107/</link>
<pubDate>Sun, 07 Jan 2024 00:34:58 +0800</pubDate>
<guid>https://sona201.github.io/posts/arts-20240107/</guid>
<description><h3 id="algorithm">Algorithm</h3>
<h3 id="review">Review</h3>
<h3 id="tip">Tip</h3>
<h3 id="share">Share</h3>
</description>
</item>
<item>
<title>What is ARTS</title>
<link>https://sona201.github.io/posts/what-is-arts/</link>
<pubDate>Sun, 07 Jan 2024 00:34:58 +0800</pubDate>
<guid>https://sona201.github.io/posts/what-is-arts/</guid>
<description><h2 id="一概念-什么是arts">一、概念: 什么是ARTS</h2>
<p>ARST 是陈浩发起的一个活动, <a class="link" href="https://www.zhihu.com/question/301150832/answer/529809529" target="_blank" rel="noopener"
>原文链接 https://www.zhihu.com/question/301150832/answer/529809529</a></p>
<p>ARST 分别代表了四个单词,四个动作</p>
<ol>
<li>
<p>Algorithm
每周至少做一个 Leetcode 的算法题。主要是为了编程训练和学习。如果不训练你看再多的算法书,你依然不会做算法题。关于做 Leetcode 的优势,你可以看一下我在 coolshell 上的文章。</p>
</li>
<li>
<p>Review
阅读并点评至少一篇英文技术文章。主要是为了学习英文,如果你的英文不行,你基本上无缘技术高手;我个人最喜欢去的地方是 Medium(需要梯子)以及各个公司的技术 blog,如 Netflix 的。</p>
</li>
<li>
<p>Tip
学习至少一个技术技巧。主要是为了总结和归纳你在日常工作中所遇到的知识点。</p>
</li>
<li>
<p>Share
分享一篇有观点和思考的技术文章。主要是为了建立你的影响力,能够输出价值观。</p>
</li>
</ol>
<h2 id="二发起arts的原因为什么要做这个事情">二、发起ARTS的原因(为什么要做这个事情)</h2>
<blockquote>
<p>我们整个世界进入了前所未有的信息爆炸时代,人们担忧的不再是无知识可学,而是有学不完的知识。而且时代的节奏变得越来越快,你可能再也不像 20 年前,可以沉着优雅平和地泡上一杯茶,坐在一个远离喧嚣的环境下,认认真真地看本书。这个时代,你再也不会有大块大块的时间,你的时间都被打成碎片了,不知不觉你也成为了快餐文化的拥趸……</p>
<p>在这样一个时代下,快速、简单、轻松的方式给人带来的快感更强烈,而高层次的思考、思辨和逻辑则被这些频度高的快餐信息感所弱化。商家们看到在这样的时代里怎么治愈这些人在学习上的焦虑的商机,他们在想方设法地用一些手段推出各种代读、领读和听读类产品,让人们可以在短时间内体会到轻松获取知识的快感,并产生勤奋好学和成长的幻觉(老实说,像我这种付费专栏或是得到等知识付费产品基本上就是类似的产物)。</p>
<p>这些所谓的“快餐文化”可以让你有短暂的满足感,但是无法让你有更深层次的思考和把知识转换成自己的技能的有效路径,因为那些都是需要大量时间和精力的付出,不符合现代人的生活节奏。人们开始在朋友圈、公众号、得到等这样的地方进行学习,导致他们越学越焦虑,越学越浮燥,越学越不会思考。于是,他们成了“什么都懂,但依然过不好这一生”的状态。</p>
<p>你有没有发现,在知识的领域也有阶层之分,那些长期在底层知识阶层的人,需要等着高层的人来喂养,他们长期陷于各种谣言和不准确的信息环境中,于是就导致错误或幼稚的认知,并习惯于那些不费劲儿的轻度学习方式,从而一点点地丧失了深度学习的独立思考能力,从而再也没有能力打破知识阶层的限制,被困在认知底层翻不了身。</p>
</blockquote>
<h2 id="三高效学习">三、高效学习</h2>
<p>学习金字塔图</p>
<p><img src="https://sona201.github.io/images/learning_pyramid.jpeg"
loading="lazy"
alt="learning_pyramid 学习金字塔"
></p>
<p>我们可以看到,你听别人讲,或是自己看书,或是让别人演示给你,这些都不能让你真正获得学习能力,因为你是在被别人灌输,在听别人说。</p>
<p>只有你开始自己思考,开始自己总结和归纳,开始找人交流讨论,开始践行,并开始对外输出,你才会掌握到真正的学习能力。</p>
<p><strong>所以,学习不是努力读更多的书,盲目追求阅读的速度和数量,这会让人产生低层次的勤奋和成长的感觉,这只是在使蛮力。要思辨,要践行,要总结和归纳,否则,你只是在机械地重复某件事(记忆知识),而不会有质的成长的。</strong></p>
<h2 id="四arts的初衷">四、ARTS的初衷</h2>
<p>ARTS的初衷Algorithm。主要是为了编程训练和学习。每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard)。进行编程训练,如果不训练你看再多的算法书,你依然不会做算法题,看完书后,你需要训练。关于做Leetcode的的优势,你可以看一下我在coolshell上的文章 Leetcode 编程训练 - 酷 壳 - CoolShell。Review:主要是为了学习英文,如果你的英文不行,你基本上无缘技术高手。所以,需要你阅读并点评至少一篇英文技术文章,我个人最喜欢去的地方是http://Medium.com(需要梯子)以及各个公司的技术blog,如Netflix的。Tip:主要是为了总结和归纳你在是常工作中所遇到的知识点。学习至少一个技术技巧。你在工作中遇到的问题,踩过的坑,学习的点滴知识。Share:主要是为了建立你的影响力,能够输出价值观。分享一篇有观点和思考的技术文章。这就是ARTS的全部动机。</p>
<h2 id="五为什么要写下来">五、为什么要写下来</h2>
<p>因为写作是一种非常重要的技能,写作不仅仅可以帮你组织你的思路和语言,帮你梳理你的知识,更重要的是写作其实是一种自己对自己的思考,同时还可以很容易地扩散并引入其它人的讨论、指正、批评,这对个人来说是非常重要的。</p>
</description>
</item>
<item>
<title>2023年终总结</title>
<link>https://sona201.github.io/posts/2023-year-end-summary/</link>
<pubDate>Mon, 01 Jan 2024 21:36:00 +0800</pubDate>
<guid>https://sona201.github.io/posts/2023-year-end-summary/</guid>
<description><p>2023年做了那些事:</p>
<ul>
<li>坚持写周报,虽然很水,质量有待提高</li>
<li>java 学习计划报废</li>
<li>学习k8s,勉强及格</li>
<li>django 学习计划报废</li>
<li>搞定博客,但还想继续优化主题</li>
<li>双拼音输入法,也算是一个坑</li>
<li>搞了一个 plantegg 的星球,学习了 tcp 相关的知识,但还是没用起来。因该是方向错了,不应该上来就搞 tcp,而是在应用层看看</li>
<li>看完 wireshark 这本书</li>
<li>看完《蛤蟆先生去看心里医生》</li>
<li>看完《认知觉醒》</li>
<li>学习英语,多邻国坚持了 57 天,确实有些是通过零点的bug 混过去的,2024 年希望能坚持 ARST 打卡</li>
</ul>
<p>一、遗憾</p>
<p>翻了翻周报,今年一如既往的整了一些小玩意儿,应该算是证明我还没有失去热情,还能拯救下。
年初的时候,外婆离开了,猜测大概率是新冠离世,外公离开4年了,他俩下去一起陪伴了。也好,能互相又个照应,每次路过外婆家都回去看一眼,现在已经不能这么称呼了。</p>
<p>今年也听说了很多厉害的人离开,但最意外的是陈浩,我也很好奇为啥我会对他的离开有深深的遗憾,在我心里他也许是一导师,在我做技术撑不下去的时候,抬头看看发现前面有个影子,我可以看看他走过的痕迹跟着走。
明明有很大的差距,但还是会继续跟着前行。可能是我在身边总是难找到志同道合的人,很多人在一定程度后就不在相信技术可以改变命运。我也没有天真认为技术真可以改变一切,但我就是想坚持走技术这条路,但身边这样的人太少了。
也许有跟我差不多的想法的人,在默默独行,这条路太难走了,我想在路上找个能说话的就行。</p>
<p>二、学习</p>
<p>看书几乎没啥动静,之前买pad想用来看书,还是B站香些。《认知觉醒》《wireshark》《蛤蟆先生去看心里医生》,还有很多只看一半的书,就不提了,24年想啃一本厚点技术书,不知道能不能完成。
跟别的书友不能比,但比我之前是有进步了,还是那句,希望能坚持下去。</p>
<p>看完了《永生之酒》《进击的巨人》两部动漫,看动漫的一个原因,自己给自己的压力有点大,想用这种发式来解压的。从结果看这个方式效果一般,但我还是挺喜欢动漫的,喜欢大家一起讨论剧情的氛围。</p>
<p>今年为数不多能夸夸自己的就是在坚持写周报,虽然还是有很多都是敷衍凑数,能坚持也是一种胜利。也勉强把自己的博客搭建起来,也算有个门面了,不在全是搭建xx这种水技术文。
也尝试了不少小技能,正在使用的双拼音输入法,remi输入法,vim高级操作,tcp抓包,wireshark使用,java的简单启动使用等等,需要继续坚持,其次就是,不在满足于玩小工具,而是能形成体系。
23年初就说了要学习java,想了n个计划,但仅仅是做了些简单的尝试,需要做更深层次的学习,说的简单点就是专注力,(查理·芒格:我的成功靠的不是智商而是专注力。)
还有学习网络知识计划,包括各种网络相关的书籍,点子实体都买了,在看书这块确实遇到不小的&quot;困难&quot;
在代码层面,就是想把源码好好学习,也是早就埋在心里的计划,到现在都没有执行完成。</p>
<p>三、生活</p>
<p>今年尝试了很多不一样的体验,更多的陪老婆,22年,我们在小区里,走遍小区的每个角落。今年把周围和小红书上的打卡点也几乎走遍。
稍微远点的就是去了绍兴,夜游拙政园,元旦又去了一趟迪士尼,准备了一些小惊喜,陪老婆过一个难忘的生日。</p>
<p>今年回老家的次数比之前少了,更多的花在陪自己身上。五一也没有回家,老丈人颈椎问题,来上海做手术,做了一回孝顺的子女。
朋友和表弟也结婚了,身边单身的人又少了两个。大家都在走向&quot;正轨&quot;。</p>
<p>唯一遗憾的点可能是陪朋友少了,陪爸妈的时间少了,跟爸妈沟通的时间少了。
因为一些原因跟一个朋友疏远了。长大的路上是不是朋友会越来越少</p>
<p>四、未来</p>
<ul>
<li>能做好arts,坚持下去。</li>
<li>读完tcpip权威指南</li>
<li>学习java 廖雪峰,评判标准有点头疼</li>
<li>多陪陪家人</li>
</ul>
</description>
</item>
<item>
<title>week33</title>
<link>https://sona201.github.io/posts/week33/</link>
<pubDate>Wed, 09 Aug 2023 22:20:00 +0800</pubDate>
<guid>https://sona201.github.io/posts/week33/</guid>
<description><h2 id="2023年第33周0807-0813">2023年第33周,0807-0813</h2>
<h2 id="胡算乱想">胡算乱想</h2>
<ul>
<li>心态平衡后, 对学习知识的效率要求大大降低, 反而让自己更耐心. 对于知识星球的网络只是学习, 放松了很多. 理解一年做一个实验的道理, 反复做, 每次都有不同的收获. <br>
尽量在实际场景中理解知识点, 也就理解那张图, 零散的知识串成体系, 不再是孤岛.</li>
<li>看到有人提到 李笑来 《财富自由之路》和《把时间当作朋友》这两本书。第二本我也看过,确实不错。网友说的很精准,不买币,只看书。
对 时间的朋友这书的内容不太记得,想到复利,也是最近比较感慨的,做事总是没有沉淀,每次都像是第一次做,不是好事。要多做笔记,搞博客。前期不要太在意内容质量不高,尽量去写高质量的,后期慢慢迭代。知识需要升级的。</li>
<li>《财富自由之路》 这本书微信读书已经下架, 考虑要不要买本实体书</li>
<li>听了 tinyfool 关于学英语的一期视频, 最让我意外的是, 他建议学英语不要看字幕, 会让大脑偷懒, 只去理解字幕, 不在乎听力. <br>
如果经常听到一个单词, 根据语境能猜出大概得意思, 这种方式学习会更牢靠, 好像有点道理.</li>
<li>这个现在感觉不是完全可行, 一个单纯的聊天, 并不会把一些单词关联到场景里. <br>
今天在电梯里听到老外聊天说到送花啥的, 我只能猜到大概, 但并不清楚具体的一些单词词义, 这种场景也不会给我反复练习的机会. <br>
还是得不停的重复看一些剧, 看到最后能直接不看字幕, 或者只看英文字幕就算成功.</li>
</ul>
<h3 id="阅读">阅读</h3>
<ul>
<li>
<p><a class="link" href="https://www.kawabangga.com/posts/4515" target="_blank" rel="noopener"
>TTY 到底是什么?</a>
这周再把文章看一遍, 然后写下笔记跟读后感吧, 记录下自己不熟悉的知识, 这周看下就先放下, 这个知识点暂时不知道怎么用, 实际使用场景也很少. <br>
过于在意大而全并不是件好事, 放下也是不错的选择</p>
</li>
<li>
<p><a class="link" href="https://blog.alswl.com/2023/07/architecture-design-the-easy-way/" target="_blank" rel="noopener"
>架构设计 the Easy Way</a><br>
文章还没有来的及仔细研读,但总体内容比较喜欢,讲了一些&quot;大道理&quot;,也举例具体案例,都是比较贴近我的日常实践。</p>
</li>
<li>
<p>决定后续还是慢慢维护自己的博客,博客还是比较重要得,既能形成自己的知识体系,也能向别人展示自己的技能。</p>
</li>
<li>
<p>关于半队列, 全队列的知识点, 之前不是很理解. 最近复习了一些网络基础知识再看就清晰很多了.
<a class="link" href="https://www.51cto.com/article/687595.html" target="_blank" rel="noopener"
>从一次线上问题说起,详解 TCP 半连接队列、全连接队列</a> <br>
<a class="link" href="https://www.cnblogs.com/xiaolincoding/p/12995358.html" target="_blank" rel="noopener"
>TCP 半连接队列和全连接队列</a> <br>
再回过头看 小林coding 讲的网络基础知识确实不错, 而且会有一些&quot;课后作业&quot;, 似乎更懂我哪里还不熟</p>
</li>
<li>
<p>本周的 wireshark 并没有看太多, 但更多的心思在了解一些概念上, 直接通过 wireshark 实验了解. 这点感觉做的还行. 但整体进度确实慢.</p>
</li>
</ul>
<h3 id="视频">视频</h3>
<p>永生之酒, 剧场版已经看完, 还有三个 ov 版没看. 开始看的云里雾里, 后面能渐渐理清故事线, 最后爱上整个设定架构. <br>
在我看来永生之酒有点像蝙蝠侠小丑那集, 小丑给两艘游轮安装了炸药, 把遥控器分别给了对方. 堵得是人性. 永生之酒也一样, 给他们一个似乎只有你死我活的背景. <br>
但如果人人都忘记这个规则, 那就不能构成威胁, 甚至更有意思.</p>
<h2 id="博客笔记">博客/笔记</h2>
<ul>
<li><a class="link" href="https://github.com/sona201/noteDoc/blob/master/tcp/wireshark%20%E9%98%85%E8%AF%BB.md" target="_blank" rel="noopener"
>wireshark 一些理解</a></li>
<li>java 笔记</li>
<li>django 序列化 context</li>
</ul>
<h2 id="本周行动">本周行动</h2>
<p>上周说记录学习笔记, 8-10 写了一篇入门笔记: <a class="link" href="https://github.com/sona201/noteDoc/blob/master/java/java_spring.md" target="_blank" rel="noopener"
>java_spring 笔记</a></p>
<h2 id="四象限法">四象限法</h2>
<ul>
<li>【重要不紧急1(有计划的执行)】</li>
<li>【重要紧急2(立即处理)】</li>
<li>【不重要紧急3(合理授权)】</li>
<li>【不重要不紧急4(控制比例)】</li>
</ul>
<h3 id="vim学习每周更新">vim学习(每周更新)</h3>
<p>本周 vim 没有进展, 几乎停止, 打算找本书详细看看.</p>
<h2 id="虚无主义想法">虚无主义想法</h2>
<ul>
<li>搞清楚request请求的链路,比如view层的get请求 ==&gt; 可以让代码写的更快更好,然后呢?对,就是为了熟练的curd,然后把这个思想用来看java
django restful serializer 与 get_queryset 的代码执行顺序, 怎么看源码</li>
<li>解决当前自己写的一些bug,不能解决的问题,感觉需要优化的点。自定义的response里有两层data,不知道怎么解决</li>
<li>mysql的orm调用返回datetime是时区类型,怎么能自动改成普通类型</li>
<li>django debug tool <a class="link" href="https://github.com/jazzband/django-debug-toolbar" target="_blank" rel="noopener"
>https://github.com/jazzband/django-debug-toolbar</a></li>
<li>django prometheus 暴露</li>
<li><a class="link" href="https://pypi.org/project/django-sql-explorer/" target="_blank" rel="noopener"
>https://pypi.org/project/django-sql-explorer/</a> (这个已经不重要了,有sql抓包)</li>
<li>xops的好多功能都没有玩过,要加油了,要自己写个服务,开源玩起来。</li>
<li>多逛逛大佬的博客,看看他们的知识体系构建,平时都记录了哪些</li>
<li>这周找到两个关于网络底层的文章,真的很想自己也能有这样的能力,争取能写成文章 <br>
<a class="link" href="https://plantegg.github.io/2019/06/21/%E5%B0%B1%E6%98%AF%E8%A6%81%E4%BD%A0%E6%87%82%E6%8A%93%E5%8C%85--WireShark%E4%B9%8B%E5%91%BD%E4%BB%A4%E8%A1%8C%E7%89%88tshark/" target="_blank" rel="noopener"
>https://plantegg.github.io/2019/06/21/%E5%B0%B1%E6%98%AF%E8%A6%81%E4%BD%A0%E6%87%82%E6%8A%93%E5%8C%85--WireShark%E4%B9%8B%E5%91%BD%E4%BB%A4%E8%A1%8C%E7%89%88tshark/</a></li>
<li>整理笔记,对个人成长很重要的,而且不是几个小时就能学会的内容,需要几周甚至几个月才能学完的知识,对以后工作,职业都有很大的帮助,这个已经在做了。</li>
<li>websocket: 找到 k8s websocket 代码,有空抄一抄。 失败,客户端调用失败</li>
<li>hugo 主题美化, 改成自己喜欢的样子.</li>
<li>再次学习陈浩的专栏,应该会有收获</li>
<li>学习k8s -&gt; kubernetes网络权威指南,这个优先级降低,遇到问题解决问题,因为系统过于庞大,系统性的学习成本很大,优势不清楚。</li>
<li>看老友记,学习英语 / 影子英语,学习方法。还保存了英语学习的方法</li>
<li>追动漫</li>
<li>算法学习</li>
<li>devops项目todo, 同步资源,application最好要提上日程,因为定时任务时间改成半小时执行一次。</li>
<li>devops项目todo, k8s命令行交互</li>
<li>django源码学习,是否需要每周产出笔记?但不需要为了产出而产出</li>
<li>jvm优化(没有方向,目前实在点的就是学会看gc日志,与中信沟通交流) -&gt; 遇到问题查问题,不主动丰富知识体系,因为缺口太大,短时间不会见效。知识利用率低</li>
<li>李三红的极客时间视频学习。这个应该能坚持学完吧,貌似对调优有提高。</li>
<li>java入门(廖雪峰java学习指南) -&gt; 学习使用spring框架,写一个小demo网上收集了一个文章讲破解java的json序列化的,用来学习 <br>
<a class="link" href="https://mp.weixin.qq.com/s/SOKLC_No0hV9RhAavF2hcw" target="_blank" rel="noopener"
>基础入门Fastjson系列漏洞</a></li>
<li>wireshark这么薄的一本书,都没有看完。看到一半,想记笔记,搭建博客,博客丑,想搞主题,太分心了。需要多做思想的减法,专注。</li>
<li>django的中间件记录请求日志,中间件的使用,高级</li>
<li>django channels功能学习 / channel官网教学深刻理解,然后修改成自己的技能,要学会修改</li>
</ul>
<h2 id="task1-2小时">Task(1-2小时)</h2>
<ul>
<li>网上收集了一个文章讲破解java的json序列化的,用来学习,<a class="link" href="https://mp.weixin.qq.com/s/SOKLC_No0hV9RhAavF2hcw" target="_blank" rel="noopener"
>基础入门Fastjson系列漏洞</a></li>
<li>django的单元测试学习</li>
</ul>
<ol>
<li>TODO: 处理文件上传卡住的问题,学会在实践中运用知识,不再对tcpdump害怕,不知所措。确认好问题,给大佬一个答复</li>
<li>TODO: 实验问题,原计划是上周五在公司完成的,但还是偷懒了。想法是今天大致写下实验步骤,下周记录实验数据。这个已经搁置很久了,先下调一个级别,是mysql实验,还是服务器实验,需要看看最初的目的,了解知识点</li>
</ol>
<p>学习 java, 写了 java 博客. 后续把同事写的 java 项目自己启动起来. 然后加个接口.
想做的事情, 用 python/go 写 socket 服务, 了解下 socket 相关实验, 理解 tcp 的相关处理.</p>
<h2 id="总结">总结</h2>
<ol>
<li>还是老方法比价舒服,把需要做的事情写下来,完成一件就用笔划去,这样真的能减轻焦虑。</li>
<li>做好劳逸结合, 上班时间也可以学习, 不是单纯的下楼摸鱼. 不要为了摸鱼而摸鱼.</li>
<li>我好像特别喜欢记录, 把自己的生活记录下, 会感觉非常有意思, 可以回顾自己, 而不是一遍又一遍的犯同样的错</li>
</ol>
</description>
</item>
<item>
<title>shaoxing</title>
<link>https://sona201.github.io/posts/travel-shaoxing/</link>
<pubDate>Sun, 06 Aug 2023 22:20:00 +0800</pubDate>
<guid>https://sona201.github.io/posts/travel-shaoxing/</guid>
<description><h3 id="说走就走的旅行">说走就走的旅行</h3>
<p>周四晚上临时决定去绍兴玩, 但却没有合适的回城票, 周五发现居然有票了. <br>
早上 7.30 出发去虹桥火车站, 特意选了小红书介绍的(虹桥2号航站楼)捷径, 第一次上候车厅 2 楼, 从二楼看候车厅, 感受到密密麻麻的人群. <br>
之前都是从高楼上俯瞰, 感受个人的渺小, 但第一次从高空俯瞰这么密集的人群, 心里还是很震撼的.</p>
<p><img src="https://sona201.github.io/images/hongqiao_people.jpg"
loading="lazy"
alt="虹桥人"
></p>
<h3 id="绍兴东湖">绍兴东湖</h3>
<p>这次去绍兴计划先去东湖, 直接打车去, 攻略上说这里的风景不错, 因为与鲁迅故居那一片景点离的远, 所以先来东湖看风景, 然后再去鲁迅故里. <br>
亲近大自然能让人有种原理工作的感受, 毕竟在这样的环境里不会给你各种需要工作的暗示, 远离城市, 忘记工作, 这感觉挺好. <br>
东湖的景色最不能错过的就是在船上看山, 有些一线天的角度, 让人感叹大自然的鬼斧神工. 后来听边上的人讲, 这是人工景色, 赶紧百科一波.</p>
<p><img src="https://sona201.github.io/images/donghu_yixiantian.jpg"
loading="lazy"
alt="东湖一线天"
></p>
<p><img src="https://sona201.github.io/images/donghu.jpg"
loading="lazy"
alt="东湖"
></p>
<p>东湖所在地,原为一座青石山,秦始皇东巡时曾在此驻驾饮马,故被称为箬篑山。汉代以后,箬篑山成了绍兴的一处石料场,经过千百年的凿穿斧削,又是采用特殊的取石方法,搬走了半座青山,并形成了高达50多米的悬崖峭壁。劳动者取石还普遍深入到地下20多米,有的甚至四五十米处,日子一久,形成了长过200米,宽约80米的清水塘。清末,绍兴著名乡贤陶浚宣眼光独到,利用采石场筑起围墙,对水面稍加拓宽,遂成山水相映的东湖。东湖经过百年的人工装扮,成为一处巧夺天工的山水大盆景。 &ndash;百度百科</p>
<h3 id="鲁迅故里">鲁迅故里</h3>
<p>东湖游玩的时间多了, 回宾馆休息了一会儿去鲁迅故居, 鲁迅故居的那一片称之为鲁迅故里, 包含鲁迅祖屋, 鲁迅纪念馆, 三味书屋. <br>
鲁迅的并不是一个平民子弟, 祖父做官, 青少年逢家道中落, 走向不一样的道路. 鲁迅的两个弟弟, 一个周作人(评价是汉奸文人), 周建人(浙江省长) <br>
相关的内容是参观后才查资料了解的, 不过看到这些后, 再结合历史, 人在历史的车轮面前太无力了, 或者也可以说, 是历史创造了他们, 他们成就了历史. <br>
绍兴的名人很多, 王羲之(书圣故里)/蔡元培/鲁迅三兄弟, 算是一种良性循环, 我猜也许跟周建人当官有关, 扶持当地教育事业有关.</p>
<p><img src="https://sona201.github.io/images/baicaoyuan.jpg"
loading="lazy"
alt="百草园"
>
<img src="https://sona201.github.io/images/sanweishuwu.jpg"
loading="lazy"
alt="三味书屋"
>
<img src="https://sona201.github.io/images/luxun_zuowei.jpg"
loading="lazy"
alt="鲁迅座位"
>
<img src="https://sona201.github.io/images/caiyuanpei_guju.jpg"
loading="lazy"
alt="蔡元培故居"
></p>
<h3 id="美食">美食</h3>
<p>绍兴的特产其实就是黄酒, 应该是与时俱进, 产生了一些新奇的玩意儿. 黄酒奶茶, 黄酒冰棍; 这两个至少原来是没有的, 应该是后来某个商人开发的.</p>
<p><img src="https://sona201.github.io/images/shaoxing_naicha.jpg"
loading="lazy"
alt="绍兴黄酒奶茶"
></p>
<p>晚上在肯德基吹着空调思考去哪里吃, 原计划要找一家饭店好好吃一顿, 最后想直接去仓桥直街(商业街)逛逛, 看看有没有好吃的. <br>
最后被一家心心念的醉蟹的小店吸引了, 点了几个特色菜, 醉蟹/醉虾/绍三鲜, 终于感觉这次旅游圆满了, 当时只顾吃忘记拍照了(饿死鬼附身).</p>
<h3 id="思考">思考</h3>
<p>这段是刚刚想到加上的, 跟媳妇儿聊到旅游的时候发现鲁迅的祖宅没有周作人的相关简介信息. 在听到鲁迅是三兄弟, 但在祖宅里只介绍了周树人/周建人, 没有周作人的信息. <br>
当时参观的时候认为周作人可能比较平平无奇, 只是一个普通人罢了, 后来查百科才知道并不是.</p>
<p>俗话总说: 历史总是赢家写的. 这个只能概括战争史, 我想说: 历史书上只给你想让你看见的.</p>
<p>了解周作人的相关生平: 他的文学造诣甚至比鲁迅更高, 但他似乎不在乎站队, 对这点不知道怎么评价, 有得有失吧.</p>
<h5 id="百度百科相关介绍">百度百科相关介绍</h5>
<blockquote>
<p>全国性抗战时期曾任伪华北政务委员会教育总署督办。抗战结束后被捕入狱,1949年释放,晚年主要从事翻译工作。著有《自己的园地》《雨天的书》《谈龙集》《鲁迅的故家》 《鲁迅小说中的人物》 《知堂文集》《知堂回想录》等,译有《日本狂言选》《伊索寓言》《路吉阿诺斯对话集》等</p>
</blockquote>
<p>听说他是个&quot;反派&quot;的时候, 有种想抓住他一切把柄, 认为他就是亲日, 甚至取日本人做老婆. 但后来发现, 周建人也是取的日本人, 周作人/周建人 他两的老婆还是姐妹, 只能说我太天真, 有些东西真的没法评价.</p>
</description>
</item>
<item>
<title>blog-theme</title>
<link>https://sona201.github.io/posts/blog-theme/</link>
<pubDate>Wed, 19 Jul 2023 23:19:42 +0800</pubDate>
<guid>https://sona201.github.io/posts/blog-theme/</guid>
<description><h2 id="博客折腾">博客折腾</h2>
<p>这两天折腾博客,总是遇到困难就想放弃。想法无非就是博客的主题哪哪不好看,不满意。人生呐,很难满足(就是想安慰自己不努力)。
不过早就明白了,博客的本质还是要内容好,而不是花里胡哨的样子。但都想有点虚荣心。</p>
<p>这两天还是看见了一个基本满意的主题,但作者是外国人,估计对中文支持有点问题。其次是主题本地测试跑不起来,感觉是自愿获取被墙拦截了。
好像代码也有bug,本着偷懒原则,暂停折腾。这两天折腾的结果只有心累,还是跟原来一样,想速成,一点耐心都没有,硬生生找了两个主题跟着敲了一遍代码。
有点样子了,但又嫌弃太慢,不能立马写出我想要的主题,又开始改动原来的主题。于是想了想,开个主题,给自己挖个坑,慢慢填吧。</p>
<h2 id="折腾记录">折腾记录</h2>
<h3 id="跟着简书上的文章写">跟着简书上的文章写</h3>
<p>最初的想法是,类似于学习demo一样,找个中文版本,跟着手敲一遍,想想大概就能搞定了。抱着这个想法,我打开了第一个收藏链接</p>
<p><a class="link" href="https://www.jianshu.com/p/0b9aecff290c" target="_blank" rel="noopener"
>如何创建自己的hugo主题</a>,天真的我,看内容写的非常详细,还贴了很多代码。
我想,只要我跟着后面做,铁定就会了。事实是,跟着后面做,根本跑不起来,只记录了大概得过程,最后的截图更像是hugo的 bootstrip 主题替换的结果。
不知道是我跟着写的步骤不对,还是被欺骗了。代码也没有贴上,大概理清楚了 hugo 的架构</p>
<h3 id="疯狂搜索一目十行">疯狂搜索,一目十行</h3>
<p>疯狂谷歌 &ldquo;hugo 主题开发&rdquo; , 找到两个比较靠谱的方案,都是有经验的,而且把博客主题代码放在 github 上。<br>
<a class="link" href="https://io-oi.me/tech/developing-a-hugo-theme/" target="_blank" rel="noopener"
>https://io-oi.me/tech/developing-a-hugo-theme/</a> <br>
<a class="link" href="https://blog.gimo.me/posts/creating-a-hugo-theme/" target="_blank" rel="noopener"
>https://blog.gimo.me/posts/creating-a-hugo-theme/</a> <br>
我想,这总能行了吧,大家对 hugo 主题开发的基本功要求不一样,或者我的基础太差。实在是跟不上,半天想搞起来确实费劲。但经验确实值得参考。</p>
<p>后面也看了 <a class="link" href="https://qwqaq.com/2022/04/migrate-to-hugo/#%E5%88%B6%E4%BD%9C%E4%B8%BB%E9%A2%98" target="_blank" rel="noopener"
>转向 Hugo:主题制作指北</a>
确实很详细,但不是我想要的一步一步带着我写好,其实他已经提醒了很多,给了官网的链接,已经想跟着官网写,最后还是放弃了。官网写的感觉并不友好。
最后发现问题是我对 golang 不熟悉,其实这 hugo 可以当成一个 python 的 jinja2 模板来理解。可能本质就是一样。</p>
<h3 id="找一个已经写出来的博客跟着做">找一个已经写出来的博客跟着做</h3>
<p>跟着一个靠谱的写一个主题,最后的效果还是有点问题,熟悉了架构
主要是自己不想从零开始写主题,更多的是想修改一个现有主题</p>
<p><a class="link" href="https://retrolog.io/blog/creating-a-hugo-theme-from-scratch/" target="_blank" rel="noopener"
>https://retrolog.io/blog/creating-a-hugo-theme-from-scratch/</a></p>
<p>这个博客的代码其实也有一点点的问题,比如链接失效,最新版本不一致,但幸好都找到替代方案。最后代码成功的运行起来了。
结果这才发现是我想要的功能,大概怎么实现,距离实现的目标还差多少。</p>
<p>给自己挖了个坑,虽然跟着这个做出了一个完全不能用的主题,但还是勇敢的把这行代码加在现在的主题上。我一直想做成上下布局的结构。
想修改当前主题,一直不知道怎么下手,慌忙之间把一些基础知识都搞忘记了,最后发现居然就是加了一行 html ,本质上还是有很多坑。</p>
<p><img src="https://sona201.github.io/images/hugo_theme_header.png"
loading="lazy"
alt="hugo_theme_header"
></p>
<h2 id="总结">总结</h2>
<blockquote>
<p>回归最初的目的</p>
</blockquote>
<p>我在友链的文章里写了好几个主题是我喜欢的风格,但作者都没有开源,想到我最初的目标就是把博客搭建起来,然后修改成自己喜欢的样子。
增加一些想要的功能,仅此而已,对现有主题的不满没有那么夸张,只是在看到别人折腾主题的过程,发现更多的细节,自己也先要,或者也要踩坑。
由此慢慢偏离最初的目的,现在功能基本都满足自己,只剩一些样式的问题,干脆开个坑,慢慢积累,反正我也不是那种一鼓作气搞定一切的人。
或许,慢慢来,比较快。</p>
</description>
</item>
<item>
<title>Study_think</title>
<link>https://sona201.github.io/posts/study_think/</link>
<pubDate>Sun, 16 Jul 2023 11:15:33 +0800</pubDate>
<guid>https://sona201.github.io/posts/study_think/</guid>
<description><h1 id="方法论通过拆解马拉松深刻领会阶梯原理">方法论:通过拆解马拉松,深刻领会阶梯原理</h1>
<p><a class="link" href="https://www.jianshu.com/p/f61df42ba6cb" target="_blank" rel="noopener"
>原文链接</a></p>
<h2 id="原文摘要">原文摘要</h2>
<blockquote>
<p>你一定知道那个日本的马拉松冠军选手——山田本一。山田本一获得多个国际马拉松赛事冠军后,退役,并揭秘了自己的夺冠技巧。</p>
<p>那就是,在每次马拉松比赛前,他都要驱车把比赛路程提前走一遍。然后,他把整个比赛路段,分成若干段,分别以各种标志建筑物、地貌特征为标记。</p>
<p>正式比赛时,山田本一就会只考虑当前这一段路怎么跑,然后全力以赴完成这一段赛程。当一段赛程完成后,他就又会全力以赴地完成下一个赛段。</p>
</blockquote>
<p>看到这里,我以为,跑马拉松,只要把整个赛段分解成多个赛段,问题就解决了。就好像做学习或工作计划,只要把学习或工作任务,按照时间,分配好进度就能做好。</p>
<p>可事实却打了我的脸。</p>
<p>我的学习计划,工作计划,都不能按期完成,看来拆解目标,可不只是分段、分时、分任务,应该设立进阶条件。</p>
<p>使用阶梯原理的关键,就是如何合理地拆解目标,山田本一的拆解,只是调整了我们实现目标时的心态,那就是心无旁骛,全力以赴做好当前的任务。
而真正合理有效的目标拆解,一定要多设立几个中间标准,并且,你需要先完成前一个,再去进阶下一个目标。</p>
<h2 id="我的思考">我的思考</h2>
<p>学习是一件需要终生持续的事情,因此我总是认为只要我学习了就没有&quot;浪费生命&quot;,为此我陷入每天都要学习的&quot;自我感动&quot;中,不去考虑学习的效率。
毕竟再笨也会偶尔全身心投入到学习中,并且能从中感受到快乐,也许那就是&quot;内啡肽&quot;。</p>
<p>我对学习效率要求很低,或者很少考虑这项指标,更多的是凭感觉做事。
毕竟这个指标的考量难度和维度都比较复杂,不像从学习时间这个维度参考。甚至学习时间还有水分,愣神,玩手机偶尔也会被归算到学习时间内。
对自己学习的计算没有办法能真正精确,还有就是人性,总是美化自己,眼睛会自动给自己的外貌进行美化,也会美化自己的学习能力,记忆力等等。</p>
<p>参考山田本一的马拉松阶梯原理: 小步子原理,也叫阶梯原理,心理学上也叫里程碑效应。</p>
<p>他的诀窍: 那就是,在每次马拉松比赛前,他都要驱车把比赛路程提前走一遍。然后,他把整个比赛路段,分成若干段,分别以各种标志建筑物、地貌特征为标记。</p>
<h3 id="一熟悉整个流程">一、熟悉整个流程</h3>
<p>跟了解马拉松比赛路程一样,学习一个知识需要知道学会哪些东西才能叫入门,知道整个比赛路程,就会对学习的知识任务量有概念。</p>
<p>我总是一股脑找一堆学习方法论,学习资料,文章、书籍、视频。然后想当然的对自己说,坚持看完就会了。</p>
<p>比如学习java,想当然的认为跟着廖雪峰的java资料后面敲一遍代码就会了。事实是,看了两篇文章后就一直停止在那一章节。
我对学会java没有一个概念,不知道怎样才叫入门,把别人的目标直接拿过来,没仔细想过这个是不是自己的目标,当前的教程内容合不合适我,
是偷懒认为跟着别人的教程就会了。</p>
<p>这种情况生活中太多了,买了书(资料)认为就是学会了,收藏锻炼视频就是锻炼了。</p>
<h3 id="二设立目标">二、设立目标</h3>
<p>都知道需要设立目标,我平时也没少给自己设目标,甚至会对身边的人说出来,让身边的来一起督促自己,最后结果是周围的人也知道我喜欢乱立Flag了。</p>
<p>上面说的是一个典型的问题,设目标,但是目标其实不清晰,跟第一点有关联,但不全一样。</p>
<p>偶尔会出现我确实立了一个明确的目标,例如看java学习视频,一共大概128个视频,计划一个月学完,然后一个除法,128/30=4.2。拍脑袋决定一天看5个视频。前期看的时候发现还行,每个视频的时间在13分钟左右,每天看完大概要一个小时。但后来就坚持不下去了。</p>
<ol>
<li>并不能保证每天能抽空出1个多小时,碰到加班或者家庭活动,几乎完全抽不出时间来学习。</li>
<li>前期的介绍类的视频,一个视频只有10分钟,但后期详情视频一个大约30分钟,要按计划的话,2.5小时。远超计划。</li>
<li>因为对学习内容的不熟悉,看视频会停下来思考,或者跟着敲代码,即使是1个小时的视频,加上理解可能会时间翻倍。</li>
</ol>
<p>要做出合理的计划,总之不能拍脑袋定了目标后,完成不了就放弃,需要动态更新计划,而不是拖延跟放弃。</p>
<ol>
<li>目标内容合理,慢就慢点,每天一共2个小时的学习时间应该算是一种极限。</li>
<li>目标清晰,看视频或文章,如果没有自己的思考等于白看,甚至记录笔记但转头就忘也是需要改进的。
比如想自己写个博客主题,这个目标就不清晰,怎么做,做成什么样子都是空的。
做这个主题要多久,没有一个考量,一个任务(task)的时间大概控制在1小时左右</li>
<li>认识到自己的精力是有限的,不能总是在理想情况下做计划,满负荷学习(工作),总会遇到问题,需要劳逸结合</li>
</ol>
<h3 id="三冷启动坚持">三、冷启动,坚持</h3>
<p>学习一个新的知识一般都会很容易产生新奇感,但要是遇到难点,总是解决不了,大概率就是放弃。</p>
<p>因为这个问题经常困扰我,可能我以前解决过这个情况,但没有形成一套方法论,这里先推出一个想法: 继续学习,挑有成就感的知识点学习。
总之需要先继续学习,遇到难题记录下来,然后继续学习。本身学习也是需要通过笔记来复习巩固,记忆力再好还是不如笔记来的实在。
而且能通过复习笔记发现之前的问题。</p>
<p>笔记有一个问题,不像早期知识内容比较贫乏的时候,现在网上能搜到一堆写的比你好的笔记,但这个时候用这个笔记当成自己的笔记等于没有思考,变相等于没有做笔记。这也是一个很要注意的点。</p>
<p>坚持学下去,但不要每次都是从0开始,就想高中被英语单词,最熟悉的第一页,项目是要有推进的。</p>
<h3 id="四设立奖励">四、设立奖励</h3>
<p>与上面讲的劳逸结合一个意思,人不是机器,不可能总是高强度满负荷学习,需要给自己主动休息的时间。</p>
<p>主动休息也是一种给自己一个信号,我休息了,而不是自己陷入不想开始学习的状态,不停的刷小视频,玩2-3小时,最后人更累。
主动玩游戏,看看动漫视频,做点与学习无关自己喜欢的事情,让大脑接受到&quot;我正在休息&quot;的信号,也是给自己奖励,建立一个正向反馈机制。</p>
<h3 id="五优先级">五、优先级</h3>
<p>四象限法,一个老生常谈的方式,但实际情况是我们不能分清哪些事情优先级高,需要多思考。</p>
<p>当然前面也提到,设立了阶段目标后,只需要心无旁骛,全力以赴</p>
</description>
</item>
<item>
<title>友链</title>
<link>https://sona201.github.io/%E5%8F%8B%E9%93%BE/</link>
<pubDate>Mon, 03 Jul 2023 00:00:00 +0000</pubDate>
<guid>https://sona201.github.io/%E5%8F%8B%E9%93%BE/</guid>
<description><blockquote>
<p>平时喜欢用chrome书签收集博客文章,收藏再看,最后大都没有下文了。想自己也好好整理博客,干脆就重新整理到这里,也算是单项友链</p>
</blockquote>
<h3 id="感觉文章很有深度记录下httpsblogmwishme"><a class="link" href="https://blog.mwish.me/" target="_blank" rel="noopener"
>感觉文章很有深度,记录下</a></h3>
<p>博客渊源介绍: 这个好像是一个学生,但好厉害发现这个博客主要是因为<a class="link" href="https://blog.mwish.me/2022/11/24/SOSP-11-Windows-Azure-Storage/#Introduction" target="_blank" rel="noopener"
>对象存储的文章</a>吸引,虽然没看,但感觉能写出这么详细的文章的人真的很厉害。</p>
<h3 id="跟着大佬后面自己每周记录周报给自己复习回顾使用httpsstrrldev"><a class="link" href="https://strrl.dev/" target="_blank" rel="noopener"
>跟着大佬后面自己每周记录周报,给自己复习回顾使用</a></h3>
<p>博客渊源介绍: 最早是在推上无意间发现的,感觉写的东西很厉害,最近发现大佬也会有烦恼,润或者英语,说他是大佬的一个原因是因为他有创业的想法,我感觉很厉害。至少目前我完全没有,能在这个行业混下去就已经很不错了。他的一个<a class="link" href="https://strrl.dev/post/weekly-report/2022/52-2022%E6%80%BB%E7%BB%93/" target="_blank" rel="noopener"
>周报</a>讲到创业</p>
<h3 id="laixintao经常打开他的博客当wiki用httpswwwkawabanggacom"><a class="link" href="https://www.kawabangga.com/" target="_blank" rel="noopener"
>laixintao,经常打开他的博客当wiki用</a></h3>
<p>博客渊源介绍: 好像也是推特上发现的,他自己发的。他也是一个播客: 捕蛇者说 的主持之一,lanxintao。<br>