-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathpd.org
More file actions
15096 lines (12969 loc) · 498 KB
/
pd.org
File metadata and controls
15096 lines (12969 loc) · 498 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
#+LaTeX_CLASS_options: [aspectratio=169,ignorenonframetext]
#+OPTIONS: H:2 num:t toc:nil \n:nil @:t ::t |:t ^:t -:t f:t *:t <:t author:nil
#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
#+sTARTUP: beamer
#+LATEX_HEADER: \usepackage{ascmac}
# ctex 必须在 ascmac 的后面,否则会出现 ybaselineshift 无定义问题。
#+LATEX_HEADER: \usepackage[UTF8]{ctex}
#+LATEX_HEADER: \usepackage[subrefformat=parens]{subcaption}
#+LATEX_HEADER: \usepackage{siunitx}
#+LATEX_HEADER: \usepackage{animate}
#+LATEX_HEADER: \usepackage{mathtools}
#+latex_HEADER: \usepackage[version=3]{mhchem}
#+latex_HEADER: \usepackage{mathrsfs}
#+latex_HEADER: \usepackage{wasysym}
#+LATEX_HEADER: \usepackage{braket}
#+latex_HEADER: \usepackage{tipa}
#+LATEX_HEADER: \usepackage{fontspec}
#+LATEX_HEADER: \usepackage{cancel}
#+LATEX_HEADER: \usepackage{amsmath}
#+LATEX_HEADER: \usepackage{amssymb,bm}
#+BEAMER_HEADER: \usepackage{xcolor}
#+LaTeX_HEADER: \setmonofont{Liberation Mono}
#+BEAMER_HEADER: \usepackage{appendixnumberbeamer}
#+LaTeX_HEADER: \usepackage{tikz,tikz-3dplot}
#+LaTeX_HEADER: \usetikzlibrary{decorations.pathreplacing}
#+BEAMER_HEADER: \usetikzlibrary{arrows.meta,backgrounds,ext.paths.ortho,ext.positioning-plus,ext.node-families.shapes.geometric,calc}
#+LaTeX_HEADER: \setCJKsansfont{Noto Sans CJK SC}
#+LaTeX_HEADER: \setbeamercovered{dynamic}
#+LaTeX_HEADER: \DeclareMathOperator{\Tr}{Tr}
#+LaTeX_HEADER: \DeclareMathOperator{\Var}{Var}
#+LaTeX_HEADER: \DeclareMathOperator{\tr}{tr}
#+LaTeX_HEADER: \DeclareMathOperator{\MSE}{MSE}
#+LaTeX_HEADER: \DeclareMathOperator{\Cov}{Cov}
#+LaTeX_HEADER: \DeclareMathOperator{\Exp}{Exp}
#+LaTeX_HEADER: \DeclareMathOperator{\Beta}{Beta}
#+LaTeX_HEADER: \DeclareMathOperator{\E}{E}
#+LaTeX_HEADER: \DeclareMathOperator{\D}{D}
#+LaTeX_HEADER: \DeclareMathOperator{\Ga}{Ga}
#+LaTeX_HEADER: \DeclareMathOperator{\Be}{Be}
#+LaTeX_HEADER: \DeclareMathOperator{\erf}{erf}
#+PROPERTY: header-args :eval never-export :exports both
#+PROPERTY: header-args:dot :eval yes :cmdline -Kdot -Tpdf :exports results
#+name: savefig
#+begin_src python :var figname="plot.pdf" width=5 height=4 :exports none
return f"""fig = plt.gcf()
fig.set_size_inches(w={width}, h={height})
plt.savefig('{figname}')
plt.clf()
'{figname}'"""
#+end_src
#+name: largefig
#+begin_src python :var dpi=100 :exports none
fig, ax = plt.subplots()
fig.set_dpi({dpi})
#+end_src
* 总论
:PROPERTIES:
:EXPORT_FILE_NAME: p0
:EXPORT_DATE: 2025-06-23 清华
:EXPORT_BEAMER_HEADER+: \author{续本达}
:EXPORT_BEAMER_HEADER+: \institute[清华工物]{清华大学 工程物理系}
:EXPORT_BEAMER_HEADER+: \setbeamertemplate{footline}[frame number]
:EXPORT_BEAMER_THEME: Hannover
:EXPORT_BEAMER_FONT_THEME: professionalfonts
:END:
** 认识大家
*** 自我介绍
- 2005-2009 :: 在数理基科学习 (科协)
- 2009-2018 :: 在日本神冈地下实验室,学习研究中微子和暗物质
- 2018-至今 :: 在工程物理系近代物理研究所任教
- 主要工作:锦屏中微子实验
- 合作研究
1. JUNO 江门中微子实验
2. 日本 SuperK 超级神冈实验
- 研究兴趣:中微子质量、核子衰变、地球中微子
- 爱好:大数据分析、高性能计算、系统架构运维
*** 教学团队
**** 助教
#+attr_beamer: :overlay <+->
- 王宇逸 :: 物理系本科毕业,工物系博士生
- 武益阳 :: 物理系本科毕业,工物系博士生
- 徐闯 :: 工物系本科毕业、工物系博士生
- 郝传晖 :: 物理系本科毕业,工物系博士生
- 刘逸祺 :: 工物系本科毕业、工物系博士生
- 胡宇阳 :: 工物系本科毕业、工物系准博士生
- 温欣洋 :: 工物系本科毕业、物理系准博士生
- 张珺铫 :: 物理系本科生(物理系科协)
- 何宇峰 :: 工物系本科生(工物系科协)
- 杨哲涵 :: 工物系本科生(工物系科协)
- 刘骥安 :: 工物系本科生
*** 教学团队(续)
**** 顾问
- 陈晟祺 :: 计算机系本科毕业、计算机系博士生
- 翁俊 :: 工物系本科毕业、工物系博士生
**** 小助教
- 请踊跃报名。
**** 算力支持
物理系科协(somnia)、工物系科协(cat)
** 为什么
*** 我为什么在这里?
#+beamer: \pause
**** 培养方案要求?
+ 本课程的“性价比很低”!(由某巨佬结课后评价道)
***** 班主任的观察 :B_block:
:PROPERTIES:
:BEAMER_env: block
:END:
(学长)每年都劝退(学弟学妹),每年都劝不住……然后劝不住的学完开始劝退下一届
#+beamer: \pause
**** 听说这门课讲 Python?
- 现在猴子都会 Python,我不会的话会很焦虑
*** “实验物理”和“大数据方法”哪个更重要
#+beamer: \pause
- 课程名的中心语在“大数据方法”,所以后者重要?
- 服务于“实验物理”,所以前者重要?
- 思考:如果两者去掉其一,你能否接受?
#+beamer: \pause
**** 形式逻辑与实验同等重要
- 计算机是形式逻辑演绎机,计算机的原理植根于逻辑。
***** 爱因斯坦 1953 给 J.S.Switzer 的信 :B_block:
:PROPERTIES:
:BEAMER_env: block
:END:
西方科学的发展是以两个伟大的成就为基础:希腊哲学家发明形式逻辑体系(在欧几里得几何中),以及(在文艺复兴时期)发现通过系统的实验可能找出因果关系。
*** 释义
**** 什么是“实验物理” :B_exampleblock:
:PROPERTIES:
:BEAMER_env: exampleblock
:END:
- 一切费电的物理!
“理论学家费纸,实验学家费电,理论实验物理学家费米”
- 欧洲核子中心(CERN)一年用电约 \SI{1.3}{\tera\watt\hour}。
北京东城区西城区2016年用电总量 \SI{10.1}{\tera\watt\hour},人口 200 万。
#+beamer: \pause
- 观察物理现象的学科
- 控制物理现象发生的环境?是 \to “实验”(狭义);否 \to “观测”。
- 实验物理的目标:发现物理规律,包括测量物理常数。
从取得的数据出发,进行统计推断,证伪物理规律的假设。
**** 什么是“大数据”
商业概念。“大”是相对的,大数据是指无法用一台计算机处理的数据。
*** 逻辑电路的起源
- 盖革计数器,电离辐射通过时给出脉冲信号
- 真空管:源于阴极射线管。
**** 宇宙射线的发现
Bothe-Kolhoerster 实验 (Bothe 1954 诺贝尔物理奖)
#+attr_latex: :width 0.5\textwidth
[[./fig/Bothe-Kolhoerster_Coincidences-between-counters.png]]
- 用“符合”的方法发现了宇宙射线,证明并为高能带电粒子。
*** 真空三极管的出现与应用
#+attr_latex: :width 0.8\textwidth
[[./fig/Rossis-coincidence-circuit.png]]
- Rossi 盖革计数器与真空三极管组合,形成宇宙射线的测量逻辑。
*** 实验物理与计算机
- 需要构造:顶端探测器无计数,中间有计数的逻辑
- 真空电子管“与”、“或”、“非”等逻辑门出现
- 真空电子管通用电子计算机:ENIAC (1945)
- 中子和辐射输运问题
- 第一代电子计算机大多用来进行 Metropolis Monte Carlo 算法
- 模拟预测氢弹中的输运过程
- 半导体逻辑电路
- 晶体管替代真空电子管
- 计算机功耗和体积大幅减小
- Monte Carlo 算法成为大型物理实验设计的一部分
*** 计算历史:大型机
#+Attr_LaTeX: :height 0.7\textheight
[[./fig/main-frame.jpg]]
- 一台大型计算机,用户通过终端 (Terminal) 连接
*** 计算历史:个人计算机
- 1981年
#+Attr_LaTeX: :height 0.7\textheight
[[./fig/ibm-pc.jpg]]
*** 计算历史:个人计算机组成集群
- 1990s 个人计算机组成集群 "beowulf"
#+Attr_LaTeX: :height 0.65\textheight
[[./fig/computer-cluster.jpg]]
*** 高性能计算与超级计算机
#+attr_latex: :height 6cm
[[./fig/supercomputer.jpg]]
- 更大的计算机集群,优化节点间的通信,共享存储。
- 软件环境如何配置?
*** 大物理与大数据
- 大型物理实验,产生大数据,多台计算机协同工作:分布式计算。
- 跨地理的分布式计算称为“网格”(grid),在早期促进和影响了互联网的发
展。
- FAST 天眼:每年@@latex:$\SI{\sim 1}{\peta B} = \SI{1e15}{B}$@@。
- JUNO 江门中微子实验:每年 \(\SI{\sim 2}{\peta B}\) 。
- CERN 在 90 年代决定使用 Intel 民用计算机组成的集群来完成 LHC 的计
算任务,是个人电脑级硬件集群成为科学计算主流的标志。
- X86(Intel 和 AMD) 计算集群是当今大数据工业界的主流配置。
- 近年来,大数据方法独立于实验物理,被工业界广泛采用,与神经网络结
合,催生了“深度神经网络”,或“深度学习”。
- 一系列新方法被应用到实验物理。
*** 此课在知识体系中的地位
- 这是一个数据的时代。
- 数据时代需要 *黑客技术* Hacking Skills、 *数理统计* Math & Statistics Knowledge 、 *专业知识* Substantive Expertise 等多方面技能。
#+Attr_LaTeX: :height 0.65\textheight
[[./fig/Data_Science_VD-r1.pdf]]
*** 技能树
#+Attr_LaTeX: :height 0.4\textheight
[[./fig/Data_Science_VD.png]]
1. 本课程目标为数理大类的同学补齐 *黑客技术* 。
2. 警惕 *Danger Zone!* 。
- 黑客技术 :: 人类掌握工具的最高水平
- 数学与统计 :: 人类理性思维的最高水平,欢迎选修《概率统计分析及量测技术》
3. *专业知识* 根据自己的兴趣选择。
- 物理学的思维方式和实践方法是一切专业知识的标杆。
4. 本科时代要积极认真学习以上硬知识。
*** 物理学是“硬科学”
以知识的量化程度排序:
#+attr_beamer: :overlay <+->
- 0类学科:努力区分偶然统计关联和因果关系
- 到底哪些是决定性因素?
- X基因决定了此性状,Y基因决定了此性状?XY一起决定?
- $X \bar{Y}$ , $\bar{X} Y$ ?
- 1类学科:努力确认变量之间影响的趋势
- “房价加速增长的势头得到遏制”
- A类学科:努力算出具体的数字
- 地球的年龄是46亿年,45--47亿年,还是 46--48 亿年?
- Z类学科:没有不确定度的结果不是科学结论!
- 电子磁矩,以玻尔磁子 $\mu_B$ 为单位
\[ g/2 = 1.001 159 652 180 73 (28) \]
Ref: Phys.Rev.Lett.100:120801,2008
** 课程概论
*** 数据分析的指导原则
#+attr_beamer: :overlay <+->
- “复现”原则 :: 以人类语言和计算机语言的形式,详细记录每一步计算。
这是科学的基本精神,与可证伪性一起,是区分科学与伪科学的标志。
- “透明”原则 :: 每一步的数据都应尽量可以被人类直接阅读,比如 JSON, CSV。如果不得
不用二进制模式,一定是使用最普遍最开放的格式,比如 HDF5。
- “一次”原则 :: Single Point of Truth, Don't Repeat Yourself. 不可在分析做任何
重复,任何有意义的信息都应该被共享。
- “最佳工具”原则 :: 尽量使用高级语言和语法糖,为每个子任务选择合适的工具。只有在性能
分析之后,才在必要时使用低级语言进行性能加速。
- 最佳工具会随时间变化,因此课程名不是 +Python 数据处理与科学计算+
- 推论:入手研究之前,应当优先调研现有工具。
*** 课程内容
- 以实验物理为主题,学习大数据方法的基础。
1. 理解数据的科学精神,从一开始养成良好的科研习惯
2. 掌握典型工具 Git, Python 和常用命令行工具,鼓励自学
3. 培养工具的品位,针对具体场景选择合适的工具
#+beamer: \pause
**** 计划安排
- 实验物理的大数据方法(1) 五教 5103
- 第一周 :: Git,Python 基础
- 第二周 :: Python 科学计算与可视化
- 实验物理的大数据方法(2) 五教 5203
- 第三周 :: 数据处理的命令行工具
- 第四周 :: 基于关系代数的数据组织
- 答疑:课后 4:55--5:30
*** 课程评估 按百分制记分 录入成绩时映射为等级
**** 平时作业 62%
- 覆盖课堂学习的知识要点
- 平时作业中的 80% 为黑盒测试,20% 为白盒测试。
- 白盒测试重点考察:Git commit 的内容必须有意义,程序书写规范
**** 大作业 30%
- 取材自中微子实验物理的真实场景。也可以由同学自行提出。
- 分两个阶段,对应前两周“生成”和后两周“分析”,互为逆过程。
**** 捌分 8%
- 小助教(A),贡献 FAQ 内容(B),审校讲义内容(C),课堂贡献(D),娱乐作业(E)
- 计入总评 \( \min(8, \sqrt{A^2 + B^2 + C^2 + D^2 + E^2}) \)
*** 教材
- 自编讲义:《实验物理的大数据方法》
**** 参考资料
- 往年课程录像:http://hep.tsinghua.edu.cn/~orv/teaching/physics-data/
**** 辅助资料
- Allen Downey, Think Python 2e
- Fernando Perez et al., Scipy Lecture Notes
- Jeroen Janssens, Data Science at the Command Line
- David MacKay, Information Theory, Inference, and Learning Algorithms
- https://learnxinyminutes.com/ 从已经有编程基础迅速入门 Python。
*** 有智慧地提问
- 遇到困难多求助
- 特别是那些可以把人“卡住”的“小”问题。一定不要自己扛,及时求助:
老师、助教、小助教。
- 学长忠告 +不要问我是怎么知道的系列+
#+beamer: \pause
- 不要用某度,用 Google 或 Bing 海外版
- 以 CSDN 为代表的中文网站 99% 的信息都是错的(或过时的)
- stackexchange 系列英文网站 70% 信息可信,其它英文网站 50% 可信
- 官方文档 100% 可信
- 综合多种信息来源,作出自己的判断,不要轻信小学生博主。
#+beamer: \pause
**** [[http://www.catb.org/~esr/faqs/smart-questions.html][求助时要有智慧]] 作者 Eric Raymond
- 原则:让他人以最小的努力复现出你的问题
1. 不要这样说话: +救命! 我的程序坏了!哪位大神快来帮帮我!急!在线等!哭了!+
2. 使用最简洁的语言,借助最简单的例子描述问题
- 原则:努力让你的问题使更多的人受益
1. 非隐私问题,尽可能公开提问,公开讨论。 _不要私信_
*** 如何使用 Gitlab 提问和解答
- issue (议题)
+ 创建要讨论的问题;
+ 注意指定 issue 的负责人。
**** GitLab issue
- https://git.tsinghua.edu.cn/physics-data/faq/-/issues/
- https://git.tsinghua.edu.cn/physics-data/lecture/-/issues
- 创建 issue
- 标题:概括问题
- 正文:详细描述问题
1. 给出复现问题的方法,提供 _最小可复现单元_
2. (可选)分析问题,提出可能的解决方法
- 回复 issue ,参与讨论
- 关注 issue ,打开 “Notifications”
** 计算环境
*** GNU 环境
- POSIX 是 /Portable Operating System Interface/ 的缩写,是关于计算机
操作系统的国际标准。它规定了操作系统的基本工具和程序接口。
- GNU 是 /GNU is not Unix/ 的缩写,是自由软件运动形成的 POSIX 环境。
- 科学研究中时间和空间跨度都很大,需要使用公开的国际标准化接口,才
能满足 _复现_ _透明_ 和 _最佳工具_ 原则。
**** 可使用 GNU 环境的操作系统
- GNU/Linux :: 天然大佬。请帮助周围的同学,并自荐小助教。
- Apple macOS :: 使用 =UTM= 虚拟机。
+ 安装 Debian 12
- Microsoft Windows :: 本身不满足,但可以使用以下扩展
+ Windows Subsystem for Linux (WSL);
+ 安装 Debian 12
- 权威指南:https://physics-data.meow.plus/faq/
*** GNU 环境的基本操作
#+attr_beamer: :overlay <+->
- ls :: list structure, 列出当前路径中的文件
- cd :: change directory, 改变当前路径
- sudo :: 使用管理员权限执行操作
- apt :: Advanced Package Tool 软件管理器
- =apt update=
- =apt install nano diffutils patch=
- nano :: 文件编辑器,与 emacs, vi, VSCode 等互换
- 查找 =^W= 、替换 =^R= 、保存 =^O= 、退出 =^X=
注: =^W= 代表按住 Ctrl 键,再按 W。
*** 命令参数标准
- GNU 标准定义了推荐的参数格式
- =git config --global user.name "Benda Xu"=
- 命令的各个部分由 *半角* 空格分隔
- 不作为分隔符的空格由 *半角* 引号标出
- 短参数:一条短线接一个字母
- =ls -a=
- =kill -9 xxxx=
- =sudo -s=
- 可以缩写在一起
- =ls -lrta=
- =sudo -sE=
- 长参数:两条短线接一个单词
- =ls --color=tty=
- =git show --pretty=short --show-signature=
- 由 GNU 推荐,是在 POSIX 标准之上的扩展
- 更多参数,使用 =man= 查看文档 =man ls=, =man git=
** 学习建议
*** 学术共同体意识
- 我们在一个月的时间里,共同理解物理和逻辑,沉淀下来我们的探索过程
**** 网站的使用
- 收藏夹
**** 邮件
- 客户端
**** 编辑器
***** 程序编辑器三大流派
- Emacs
- Vi
- Visual Studio Code
** 版本控制
*** 版本控制
- “我和同学合写文章,结果他是在昨天的版本上改的!我还得重改!”
**** 发展历史
#+attr_beamer: :overlay <+->
- 石器时代 :: =实验报告-v1=, =实验报告-v2=, =实验报告-v2.2=, =实验报告-v2.2-续本达更新20190629= ……
- 青铜时代 :: diff, patch 文本差分算法
#+BEGIN_SRC dot :file ./diff-patch.pdf
digraph dataset {
bgcolor="#ffffff00"
{ rank = same; B D1 }
{ rank = same; D2 M }
B [label = "公共版本"]
D1 [label = "差分1"]
D2 [label = "差分2"]
M [label = "合并"]
B -> D1 [label = "更新第二章"]
B -> D2 [label = "修改第一章"]
D1 -> M [label = "修改第一章"]
D2 -> M [label = "更新第二章"]
}
#+END_SRC
#+Attr_LaTeX: :height 0.35\textheight
#+RESULTS:
[[file:./diff-patch.pdf]]
- 铁器时代 :: 版本控制服务:CVS,SVN
- 现代 :: 分布式版本控制:Git
*** Git 案例
“我上周写的程序被不小心覆盖掉了!无法找回之前的版本。”
#+attr_beamer: :overlay <+->
- 小强同学经过认真思考和试验,发明了一种巧妙的解决问题方法,并写成
程序,经验证效果拔群。
- 小强非常振奋,他把成果记了下来,并继续重构并优化解法。
- 两个星期之后,他的优化并没有达到预期效果,反而使结果变差。
- 令他更为懊恼的是,他已经无法达到自己两周之前的高度了,因为忘记
了改之前的程序是怎么写的。
- _复现_ 原则被破坏。
- =解法-20190530.backup= , =解法-20190608= ?重复存储, _一次_ 原则被破坏。
- 讨论:你遇到的最难受的问题,如何解决?
*** Git 基础 安装: =apt install git=
- 使用 Git,养成良好的习惯,就能解决以上问题。
- Git 由 Linus Torvalds 发明,用来支撑全世界 5000 名以上 Linux 操作
系统内核开发者的协作。是我们的 _最佳工具_ 。
#+attr_latex: :height 0.5\textheight
[[./fig/pro-git_snapshots.png]]
- 在任意时间我们都可以选择给工作区进行一次“快照”。
- 相邻快照之间,是代表文件改动的差分量。
*** 例子:撰写讲义
#+attr_latex: :width 0.7\textwidth
[[./fig/tig-example.png]]
- 查看每次提交的改动。工具 =tig= ,可由 =apt install tig= 安装。
*** Git 三种状态
- 已提交(committed) :: 改动安全保存在数据库中
- 已修改(modified) :: 自上一次提交,有文件被修改
- 已暂存(staged) :: 已修改的文件被作了标记,将被包含在下一轮提交中
[[./fig/git-modes.png]]
*** 作业:Git 练习
- [X] DONE 你会在 [[https://git.tsinghua.edu.cn][清华 GitLab]] 收到一个新仓库,是今天的作业
- [X] DONE 设置本地到 [[https://git.tsinghua.edu.cn][清华 GitLab]] 的访问权限
- [X] 生成 SSH 密钥对
- [X] 上传到 https://git.tsinghua.edu.cn
- [X] DONE 同步你的 Git 仓库,输入你的基本信息
#+BEGIN_EXAMPLE
我的姓名:
我的学号:
我的 Python 版本信息:
课程感言:
#+END_EXAMPLE
- [ ] TODO 查看修改 (diff),预估得分
- [ ] TODO 添加修改 (add),提交 (commit),推送 (push)
*** Git 基本命令
- diff :: 查看改动
- status :: 查看状态
- add :: 添加文件
- commit :: 提交
- log :: 查看历史
- pull :: 从远程下载
- push :: 推送到远程
- merge :: 合并分支
**** 内建手册 =man= :B_exampleblock:
:PROPERTIES:
:BEAMER_env: exampleblock
:END:
命令的具体含义可以参考 =man= 命令,例如,
#+BEGIN_EXAMPLE
$ man git add
#+END_EXAMPLE
*** Git 的状态与命令
#+BEGIN_SRC dot :file ./git-stages.pdf
digraph git {
rankdir="LR";
C -> M [label = "编辑\ngit diff"]
C [label = 已提交]
M [label = 已修改]
M -> S [label = "git add\ngit reset\ngit rm"]
S [label = 待提交]
S -> C [label = "git diff --cached\ngit commit"]
}
#+end_src
#+RESULTS:
[[file:./git-stages.pdf]]
*** Git 仓库间通信
#+Attr_LaTeX: :height 0.7\textheight
[[./fig/git-distributed.png]]
- 建议:通过 SSH (secure shell) 通信。
*** SSH 通信
- 通信的认证问题:如何证明我是“我”?
#+latex: \pause
- 手机验证码
- 一次性密码(one-time password,OTP)
- 用户名密码
- 非对称加密(银行 U 盾)
- 生成 SSH 非对称密钥对
- 一个公钥:公布, =id_rsa.pub=
- 一个私钥:私密, =id_rsa=
- 在网页界面把 =id_rsa.pub= 交给 =git.tsinghua.edu.cn=
- =git.tsinghua.edu.cn= 用我的公钥加密挑战码,只有我的私钥才能解密
- =git.tsinghua.edu.cn= 知道了我是“我”
- 我也需要知道它是真的 =git.tsinghua.edu.cn=
- 建立了与 =git.tsinghua.edu.cn= 的可靠通信
*** 提交说明 commit message
- =git commit= 时需要输入一段话概括本次 commit 所作的修改
- 目标:让他人和未来的自己一目了然,只通过读此信息就知道自己做了什么
**** commit 样例
- 不错的例子:“完善了个人信息页面,并填写了课程感言”
- [[https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=78ede4d591c8c16e65e14414389ab9b6a58f21eb][短的]] ,把事情讲清楚,把涉及到的人讲清楚。
- [[https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=71a6a81929f88171feb6e829ff0b87b2ed396d91][较长的]] ,把所有的改动概括清楚。
- [[https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=ed66572a4917c140825ef8cb0a4150bd69296d0c][更长的]] ,在 commit 里说明为什么要这样做,引用相关的讨论。
**** 反例
1. 数数:1,2,3
2. 复读:Update,Update,Update
3. 欺负键盘:aaaaa,wwwww,asdf
- 不太好的例子:“完成作业”
*** 精心撰写提交说明
- 说明既要给人类读,也要易于自动处理
- 第一行:高度概括改动
- 空一行后,撰写具体改动内容
- 形式不限,可分段、分要点。
- 篇幅不限,以描述清楚为目标。
- 备注:感谢其他贡献者。
**** 何时提交 commit ?
- 完成一件事,有一个较独立的“版本”:添加一个功能,修复一个问题,
重构一块代码。
- 初学者可尝试多提交,可以充分练习 Git 操作,也可以获得更细致的开
发历史。
- _不要_ 把多个不相关的修改攒成一次巨大的提交。
*** 来自学长的忠告
**** 作业得分不重要,重要的是优雅地得分
我看到的无意义 commit message 有:“这是一个描述”,“xX”,“1234567899”等等。由于 Git 的特性,后续的提交没有办法覆盖这些无意义的 commit ,所以这个操作在很大程度上是不可逆的。也就是说,批阅作业的助教可以看到这些无意义的提交信息,然后或许会给你的白盒扣上2分。虽然我相信批改作业的助教不会这么残忍,但请一定要有“提交信息要有意义”的意识。
请查看白盒标准:https://physics-data.meow.plus/faq/rules/whitebox/
- 如果想要自己玩一下 Git 的相关操作(强烈推荐这么做,尤其是要学会 add 和 commit 如何取消。我个人对于一个操作是否可逆是有追求的),可以自己在 GitLab 上面创建一个项目练习。
*** Git 与编辑器的整合
**** 禁止使用 Gitlab 网页上传和修改工具
- 远远次于命令行的功能,无推广价值
- 禁止使用,防止养成不良习惯
**** 在命令行调用相应的编辑器
- =git= 会调用 _环境设定_ 的编辑器。临时调整:使用 =EDITOR=xxxxx= 前缀
+ @@latex:\texttt{EDITOR="code --wait"}@@ 见 [[https://git.tsinghua.edu.cn/physics-data/faq/-/issues/88][李禹锋的 issue 88]]
+ @@latex:\texttt{EDITOR="vim"}@@
+ @@latex:\texttt{EDITOR="emacsclient"}@@ 见 [[https://git.tsinghua.edu.cn/physics-data/faq/-/issues/109][黄宇同的 issue 109]]
- Debian 上永久调整系统的默认编辑器,管理员权限选择需要的编辑器。
#+begin_src bash
update-alternatives --config editor
#+end_src
- 配置 git 的编辑器:查看文档配置,关键字是 =core.editor=
#+begin_src bash
man git config
#+end_src
*** Git 分支
参考 https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging
- 一直往 master (或 main) 提交:线性历史
#+beamer: \pause
- =git branch iss53= 创建新分支,名为 iss53
- =git switch iss53= 切换至 iss53 分支
- =git switch --create hotfix= 创建新分支 hotfix 并切换
#+Attr_LaTeX: :height 0.4\textheight
[[./out/basic-branching-4.pdf]]
#+begin_export latex
\vspace{-50pt}
#+end_export
#+beamer: \pause
- 从 C2 开始,iss53 与 hotfix 同时推进
- 都基于 master 的 C2 版本
- hotfix 新增一个 commit C4
- iss53 新增 C3
- 将 iss53 push 到远程: =git push --set-upstream origin iss53=
*** Git 分支的结果:分叉
- 由于 hotfix 紧迫,hotfix 率先被 master 接受
#+beamer: \pause
- =git merge --ff hotfix= 快进合并 (Fast-Forward), 拿来 *原始* 的 hotfix commit (相当于直接在 master 上改动)
#+Attr_LaTeX: :height 0.35\textheight
#+Attr_Beamer: :overlay <1>
[[./out/basic-branching-4.pdf]]
#+Attr_LaTeX: :height 0.35\textheight
#+Attr_Beamer: :overlay <2-3>
[[./out/basic-branching-5.pdf]]
#+Attr_LaTeX: :height 0.35\textheight
#+Attr_Beamer: :overlay <4>
[[./out/basic-branching-6.pdf]]
#+beamer: \pause
- 此时 iss53 与 master 产生了 *分叉 (divergence)*, iss53 的原始修改不再能直接搬到 master 的 C4 上 (无法 *ff*)
#+beamer: \pause
- =git branch --delete hotfix= 删除不再需要的 hotfix 分支
*** Git merge : 合并 (狭义) I
- 出现分叉需要合并,[[发展历史][回忆平行四边形法则]]
- 比较 master 的最新版 (C4) 和 iss53 最新版 (C5) 的差异,取两家之长,处理一次冲突
#+beamer: \pause
- 在 master 上 =git merge iss53=
- 生成一个 Merge commit C6,历史不再线性。
- master 的开发者负责解决冲突
#+Attr_LaTeX: :width 0.7\textwidth
#+Attr_Beamer: :overlay <1>
[[./out/basic-merging-1.pdf]]
#+Attr_LaTeX: :width 0.7\textwidth
#+Attr_Beamer: :overlay <2->
[[./out/basic-merging-2.pdf]]
*** Git rebase : 换祖先
- 思考:让 iss53 的祖先从 C2 切换到 C4 不就没有分叉了吗?基于新版的 C4 重新做一遍 iss53 的开发
#+BEGIN_EXPORT latex
\begin{center}
\includegraphics<1>[width=0.7\textwidth]{./out/basic-rebase-1.pdf}
\includegraphics<2>[width=0.7\textwidth]{./out/basic-rebase-2.pdf}
\includegraphics<3>[width=0.7\textwidth]{./out/basic-rebase-3.pdf}
\includegraphics<4>[width=0.7\textwidth]{./out/basic-rebase-4.pdf}
\includegraphics<5>[width=0.7\textwidth]{./out/basic-rebase-5.pdf}
\end{center}
#+END_EXPORT
#+beamer: \pause
- 在 =iss53= 分支 =git rebase C4= 或 =git rebase master=
- 基于 C4,将 C3 稍作修改变成 C3'
#+beamer: \pause
- 基于 C3',将 C5 稍作修改变成 C5'
#+beamer: \pause
- rebase 修改历史!结束后旧的 =iss53= 历史消失,不要在 =master= rebase!
#+beamer: \pause
- =git switch master; git merge --ff iss53= 快进合并。最终合并出 *线性* 历史
#+beamer: \pause
- 需要处理 iss53 上所有 commit 的冲突 (C4 vs C3 & C3' vs C5'),但在 iss53 分支上操作
- =git rebase -i master= 还能允许你进一步修改历史,例如合并 commit、打磨 commit
*** Git 自动冲突处理 I
- 如果 =C3、C5= 与 =C4= 不干涉 (修改的不是一个文件 or 修改的位置距离较远) 则程序可以自动处理
C4: 补全最后一句的上文 (hotfix):
#+begin_src diff
今日中国,强敵环伺,科技卡膀,海疆未靖,幼苗未长,此誠危急存亡之秋也。
告诉学生們,去修 birkar 的課,交論文,得分最高的,獎一个华为手表。
概率統計,前十名,北京大學佔八名,清華大學沒有
做學問一定要在有學問的朋友氛圍中,時時砥礪成長。
我到落杉机,不熟地方
-我宣布他已經不是我的學生了
+已經到了無恥的地步。我宣布他已經不是我的學生了
#+end_src
*** Git 自动冲突处理 II
- 如何把 =C3= 修改成 =C3'=? [[发展历史][回忆平行四边形法则]]
- 如果 =C3、C5= 与 =C4= 不干涉 (修改的不是一个文件 or 修改的位置距离较远) 则程序可以自动处理
C3: 加入“躲在遊戲屋”语录 (iss53):
#+begin_src diff
今日中国,强敵环伺,科技卡膀,海疆未靖,幼苗未长,此誠危急存亡之秋也。
+我們学生躲在遊戲屋,不觉得羞愧?
告诉学生們,去修 birkar 的課,交論文,得分最高的,獎一个华为手表。
概率統計,前十名,北京大學佔八名,清華大學沒有
做學問一定要在有學問的朋友氛圍中,時時砥礪成長。
我到落杉机,不熟地方
我宣布他已經不是我的學生了
#+end_src
*** Git 自动冲突处理 III
- 如何把 =C3= 修改成 =C3'=? [[发展历史][回忆平行四边形法则]]
- 如果 =C3、C5= 与 =C4= 不干涉 (修改的不是一个文件 or 修改的位置距离较远) 则程序可以自动处理
C3' (rebase C3 upon C4):
#+begin_src diff
今日中国,强敵环伺,科技卡膀,海疆未靖,幼苗未长,此誠危急存亡之秋也。
+我們学生躲在遊戲屋,不觉得羞愧?
告诉学生們,去修 birkar 的課,交論文,得分最高的,獎一个华为手表。
概率統計,前十名,北京大學佔八名,清華大學沒有
做學問一定要在有學問的朋友氛圍中,時時砥礪成長。
我到落杉机,不熟地方
已經到了無恥的地步。我宣布他已經不是我的學生了
#+end_src
*** Git 手动冲突处理 I
#+beamer: \vspace{-0.5cm}
C5: 加一句鼓励的话 (iss53)
#+begin_src diff
概率統計,前十名,北京大學佔八名,清華大學沒有
做學問一定要在有學問的朋友氛圍中,時時砥礪成長。
我到落杉机,不熟地方
-我宣布他已經不是我的學生了
+你们都比我聪明,只是妄自菲薄而已!
+我宣布他已經不是我的學生了!
#+end_src
=git switch iss53; git rebase master=
#+begin_src text
Auto-merging record.txt
CONFLICT (content): Merge conflict in record.txt
error: could not apply 262ef6c... C5: 加一句鼓励的话
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 262ef6c... C5: 加一句鼓励的话
#+end_src
*** Git 手动冲突处理 II
#+begin_src text
Unmerged paths:
(use "git restore --staged <file>..." to unstage)
(use "git add <file>..." to mark resolution)
both modified: record.txt
#+end_src
=record.txt=:
#+begin_src text
<<<<<<< HEAD
已經到了無恥的地步。我宣布他已經不是我的學生了
=======
你们都比我聪明,只是妄自菲薄而已!
我宣布他已經不是我的學生了!
>>>>>>> 262ef6c (C5: 加一句鼓励的话)
#+end_src
需要揣摩两个分支作者的意图,最终合并成一个合理的版本:
#+begin_src text
你们都比我聪明,只是妄自菲薄而已!
已經到了無恥的地步。我宣布他已經不是我的學生了!
#+end_src
*** Git 手动冲突处理 III
- 处理后 =git add record.txt; git rebase --continue=
C5' (rebase C5 upon C3'):
#+begin_src diff
概率統計,前十名,北京大學佔八名,清華大學沒有
做學問一定要在有學問的朋友氛圍中,時時砥礪成長。
我到落杉机,不熟地方
-已經到了無恥的地步。我宣布他已經不是我的學生了
+你们都比我聪明,只是妄自菲薄而已!
+已經到了無恥的地步。我宣布他已經不是我的學生了!
#+end_src
- 有多少 commit 需要 rebase (=iss53= 分支有多少 commit) 就需要处理多少次 (自动 or 手动)
*** Git merge 冲突处理与结果 I
- 回到分叉状态,在 master (C4) 上 =git merge iss53=
#+Attr_LaTeX: :width 0.5\textwidth
[[./out/basic-merging-1.pdf]]
#+beamer: \vspace{-1cm}
#+begin_src
Auto-merging record.txt
CONFLICT (content): Merge conflict in record.txt
Automatic merge failed; fix conflicts and then commit the result.
#+end_src
#+begin_src text
<<<<<<< HEAD
已經到了無恥的地步。我宣布他已經不是我的學生了
=======
你们都比我聪明,只是妄自菲薄而已!
我宣布他已經不是我的學生了!
>>>>>>> iss53
#+end_src
#+beamer: \pause
- 解决好冲突后 =git merge --continue= 生成 merge commit C6
#+beamer: \pause
- Merge commit 有两个祖先,单个差分 (=git log -p=) 无法表达
*** Git merge 冲突处理与结果 II
使用 =git log --diff-merges=combined= 查看 merge commit 相对两个祖先的差分
#+Attr_LaTeX: :options bgcolor=lightgray,fontsize=\tiny
#+begin_src diff
commit 3773ad5beca2111981908d010e7356fa5d381a67 (HEAD -> main)
Merge: 37bb2ab 5f9c706
Author: Yiyang Wu <xgreenlandforwyy@gmail.com>
Date: Fri Jan 31 19:22:46 2025 +0800
Merge branch 'iss53'
diff --cc record.txt
index 046a6d4,598b092..219a08a
--- a/record.txt
+++ b/record.txt
@@@ -1,6 -1,8 +1,9 @@@
今日中国,强敵环伺,科技卡膀,海疆未靖,幼苗未长,此誠危急存亡之秋也。
+ 我們学生躲在遊戲屋,不觉得羞愧?
告诉学生們,去修 birkar 的課,交論文,得分最高的,獎一个华为手表。
概率統計,前十名,北京大學佔八名,清華大學沒有
++這種成績,使人汗顏!如此成績,如何招生?
做學問一定要在有學問的朋友氛圍中,時時砥礪成長。
我到落杉机,不熟地方
- 已經到了無恥的地步。我宣布他已經不是我的學生了
+ 你们都比我聪明,只是妄自菲薄而已!
-我宣布他已經不是我的學生了!
++已經到了無恥的地步。我宣布他已經不是我的學生了!
#+end_src
彩蛋:这个 merge commit 塞了私货
*** 权衡 merge vs rebase
参考 https://git-scm.com/book/en/v2/Git-Branching-Rebasing Rebase vs. Merge
- =git merge= 只处理一次(大)冲突,产生非线性历史
- 遮住其他分支后 merge commit 视作单个祖先,获得简单的线性历史,可以排除低质量 commit 干扰 bisect
- 难理清 commits 的逻辑顺序
- revert 更困难
- 不遮住分支 bisect 困难
#+beamer: \pause
- =git rebase= 处理多次(小)冲突,产生线性历史:
- 所有 commits 逻辑顺序清晰,revert 容易
- bisect 可以检查所有合并进来的 commits
- 所有 commits 在一个历史中,低质量 commits 会干扰 bisect
#+beamer: \pause
- 判据: master 的喜好;分支的所有 commits 是否达到和 master 一样的水准
- 分支充斥半成品 commits、 revert(s),只有最终 commit 达到了 master 水准: merge \pause
- 分支 commits 质量和 master 一致,rebase + 快进 merge \pause
- 分支充斥半成品但 master 不愿 merge:要求分支作者在 rebase 时打磨干净,提升水准: rebase + 快进 merge
*** Git merge 但由待合并分支处理冲突
=git merge= 由 master 处理冲突并敲定 merge commit。
如果 master 可能要求 =iss53= 处理冲突?
- 可以 rebase,但也许工作量更大
- 可以先 =git merge master= 把冲突解决,再由 master =git merge --no-ff iss53=
#+Attr_LaTeX: :width 0.7\textwidth
[[./out/basic-merging-3.pdf]]
- 红色部分表示 merge commit 的默认祖先 (first-parent)
- 如果 =git merge --ff iss53= 则最终 merge commit 是 C6, 默认祖先指向 C5 (iss53 分支),在 revert 和 bisect 时带来困扰
*** 基于 Gitlab merge request (或 Github pull request) 的开发流程 I
gitlab 命令行工具: =apt install glab=, 登录: =glab auth login=
#+begin_src bash
# 首先在 Gitlab fork 需要的上游仓库 foo/bar.git 到 my/bar.git
# 之所以 fork 是因为一般人无法往原仓库 push 分支
glab repo fork # 或在网页上点击 fork
git clone git@git.tsinghua.edu.cn:my/bar.git # 拉取 fork 仓库, 进入 master 分支
cd bar
git switch --create my-dev # 取一个合适的分支名字
# 一通编辑代码
git add xxx
git commit
git push --set-upstream origin HEAD # push 自己的分支
glab mr create # 或者根据命令行提示信息,在网页发起 merge request
# 上游若要求 rebase,则需要先同步 fork 仓库 my/bar.git 的 master 分支
git switch master
git pull # 同步 master, 产生分叉
git switch my-dev
git rebase master
git push --force # rebase 后破坏了 my-dev 的历史,my/bar.git 的 my-dev 远端需要被覆盖
#+end_src
*** 参考资料
- Git 提交说明的白盒采分项:
https://physics-data.meow.plus/faq/whitebox/#git
- 写好提交说明的七大原则 by cbeams
https://chris.beams.io/posts/git-commit/
- 提交说明编写指南 by 阮一峰
http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html
** 对 FAQ 和讲义作贡献
*** 有突出贡献的同学可得 8% 左右的总评鼓励
- 课程 FAQ
- https://git.tsinghua.edu.cn/physics-data/faq/
- 提出好问题,整理问题解答,提交 merge request,……
- 课程讲义
- 修正错别字、语言错误、常识错误
- 指出逻辑不明的地方
- 补充课堂讲授但讲义遗漏的内容
- ……
- 贡献方式
- [X] Git
- [X] GitLab issue
- [ ] GitLab Merge Request
*** 分支
[[https://gitlab.airelinux.org/xmass/waveform/][例子]]
- 关系
- merge request (合并请求)
+ 提交代码审核。
*** Git 仓库间通信的各阶段
- fork :: Gitlab 类 Git 平台的术语,对应于 =git clone=
- 在本人帐号创建复本,用于自己修改和提交
- 提交说明的备注:关闭哪个 issue
- remote :: Git 的远程仓库
#+begin_src bash
git remote -v
#+end_src
#+begin_example
origin git@git.tsinghua.edu.cn:physics-data/lecture.git (fetch)
origin git@git.tsinghua.edu.cn:physics-data/lecture.git (push)
#+end_example
- pull, push :: 从远程下载和上传改动,单元为差分 commit
- merge :: 与其他仓库或分支通过交换差分来整合
- merge request :: GitLab 平台术语,发送 merge 请求。请他人整合自己的差分贡献。
* Python 基础
:PROPERTIES:
:EXPORT_FILE_NAME: p1
:EXPORT_DATE: 2025-06-24 清华
:EXPORT_BEAMER_HEADER+: \author{续本达}
:EXPORT_BEAMER_HEADER+: \institute[清华工物]{清华大学 工程物理系}
:EXPORT_BEAMER_HEADER+: \setbeamertemplate{footline}[frame number]
:EXPORT_BEAMER_THEME: Hannover
:EXPORT_BEAMER_FONT_THEME: professionalfonts
:END:
** 准备与复习
*** 预备
- 查看是否已经安装 Python
#+ATTR_LATEX: :environment verbatim
#+begin_example
python3
Python 3.11.2 (main, Mar 13 2023, 12:18:29) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
#+end_example
- 退出输入 =exit()= 或者按 =Ctrl-d= 。
- =Ctrl-d= 代表文件(标准输入)的终止。
- 如果没有 Python(可能性不大),或想升级 Python
#+begin_src bash
apt install python3 # Debian @ WSL
emerge -vt python:3 # Gentoo Prefix @ macOS
#+end_src
*** 黑客审美
- 当代文明的两大支柱是 _实验_ 和 _逻辑_ 。
- 四个原则:
1. _复现_ - 否则成伪科学
2. _透明_ - 否则玄学黑箱
3. _一次_ - 否则到处是坑
4. _最佳工具_ - 否则效率低下
#+beamer: \pause
- 推论:
1. 兼容比性能优先
#+BEGIN_quote
Premature optimization is the root of all evil.
-- Tony Hoare, Donald Knuth
#+END_quote
2. 人类时间比机器时间宝贵
3. 使用工具进行版本控制
*** 最佳工具
- GNU 环境、 POSIX 标准:用于促进程序有几十年跨度的兼容性。
**** Git:当代的版本控制
- 快照与差分
- 三个状态: