-
Notifications
You must be signed in to change notification settings - Fork 6
/
pd.org
12854 lines (11029 loc) · 422 KB
/
pd.org
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: \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: 2024-07-02 清华
: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 “观测”。
- 实验物理的目标:发现物理规律,包括测量物理常数。
从取得的数据出发,进行统计推断,证伪物理规律的假设。
**** 什么是“大数据”
商业概念。“大”是相对的,大数据是指无法用一台计算机处理的数据。
*** 实验物理与计算机
- 逻辑电路的起源
- 盖革计数器,电离辐射通过时给出脉冲信号
- 需要构造:顶端探测器无计数,中间有计数的逻辑
- 真空电子管“与”、“或”、“非”等逻辑门出现
- 真空电子管通用电子计算机: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) 经管新楼A119
- 第一周 :: Git,Python 基础
+ 周二至周五,三四大节
- 第二周 :: Python 科学计算与可视化
+ 周一至周四,三四大节
- 实验物理的大数据方法(2) 经管新楼
- 第三周 :: 数据处理的命令行工具
- 第四周 :: 基于关系代数的数据组织
- 答疑:课后 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= 虚拟机。
+
- Microsoft Windows :: 本身不满足,但可以使用以下扩展
1. Windows Subsystem for Linux (WSL)
2. Cygwin, MinGW
- 权威指南: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://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 [email protected]:physics-data/lecture.git (fetch)
origin [email protected]:physics-data/lecture.git (push)
#+end_example
- pull, push :: 从远程下载和上传改动,单元为差分 commit
- merge :: 与其他仓库或分支通过交换差分来整合
- merge request :: GitLab 平台术语,发送 merge 请求。请他人整合自己的差分贡献。
* Python 基础
:PROPERTIES:
:EXPORT_FILE_NAME: p1
:EXPORT_DATE: 2024-07-03 清华
: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:当代的版本控制
- 快照与差分
- 三个状态:
- 已提交 committed (未改动 unmodified)
- 已修改 modified
- 待提交 staged
**** 程序编辑器三大流派
请完成网络学堂的“课程问卷”,计划帮助大家掌握一款编辑器。
- Emacs
- Vi
- Visual Studio Code
** Python 入门
*** 为什么用 Python
#+attr_beamer: :overlay <+->
- Python 是一门“解释型语言”,相对于“编译型语言”更易调试。
- Python 的语法风格简明,即使对外行也易读。
- 书写效率高,快速写出不错的程序。
- Python 可以直接调用 Fortran, C/C++, R 等语言库,因此也叫“胶水”语
言,即把不同的程序粘合在一起。
- 易于与已有工具整合。
- 促进团队分工,协作。
- 大大丰富了 Python 生态系统的功能,进一步优化程序运行效率。
- 符合 _最佳工具_ 原则。
- Python 是一个通用语言,不仅在科学研究,在生活中的方方面面都会有用。
- 在科学计算领域得到广泛欢迎和采用。
https://www.python.org/
*** 特点和用途
- Python 是一门“解释型语言”,相对于“编译型语言”更易调试。
- Python 的语法风格简明,即使对外行也易读,大大降低了程序设计的门槛
- Python 可以直接调用 Fortran, C/C++, R 等语言库,因此也叫“胶水”语 言,即把不同的程序粘合在一起。
- Python 是一个通用语言,不仅在科学研究,在生活中的方方面面都会有用。
- 操作系统生成器和管理器 ([[https://wiki.gentoo.org/wiki/Portage][Gentoo Portage]])
- 网站 ([[https://www.djangoproject.com/][Django]])
*** 参考资料
- Allen Downey, Think Python 2e
简明通俗的入门书
- http://py4e.com/
Python for everybody,全球知名的 Python 在线教程,新手友好。
- Learn X in Y minutes
https://learnxinyminutes.com/docs/python3/
已经掌握若干门语言的同学,可以通过此提纲快速入门
*** Python 环境
安装了 Python 之后,在命令行界面可以直接进入 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
**** IPython (Jupyter 前身)增强的额外交互功能环境
#+ATTR_LATEX: :environment verbatim
#+begin_example
# apt install ipython3
$ ipython3
Python 3.11.2 (main, Mar 13 2023, 12:18:29) [GCC 12.2.0]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.5.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]:
#+end_example
*** 查看 Python 的基本信息
#+begin_src python :results output :session local :exports both
import sys
print(sys.version)
#+end_src
#+RESULTS:
: 3.11.2 (main, Mar 13 2023, 12:18:29) [GCC 12.2.0]
#+begin_src python :results output :session local :exports both
print("\n".join(sys.path))
#+end_src
#+RESULTS:
:
: /usr/lib/python311.zip
: /usr/lib/python3.11
: /usr/lib/python3.11/lib-dynload
: /usr/local/lib/python3.11/dist-packages
: /usr/lib/python3/dist-packages
: /usr/lib/python3.11/dist-packages
*** Python 之禅
#+begin_src python :results output :session local :exports both
import this
#+end_src
#+RESULTS:
#+begin_example
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
#+end_example
*** 算术基本运算
+ =+= 加, =-= 减, =*= 乘, =/= 除, =//= 整除, =%= 取余, =**= 乘方
+ 其它运算由函数来定义
#+begin_src python :results value :session local :exports both
2+1
#+end_src
#+RESULTS:
: 3
#+begin_src python :results value :session local :exports both
2*7, 2**7, 3/2, 3//2, 3%2
#+end_src
#+RESULTS:
| 14 | 128 | 1.5 | 1 | 1 |
#+begin_src python :results value :session local :exports both
import math
math.factorial(10) # 10!
#+end_src
#+RESULTS:
: 3628800
*** 整数是高精度的
- 计算机上标准整数运算有界;
- 高精度整数并没有硬件的底层支持,是 Python 的软件实现,以一些性能损失为代价给予用户便利。
#+begin_src python :results value :session local :exports both
math.factorial(66)
#+end_src
#+RESULTS:
: 544344939077443064003729240247842752644293064388798874532860126869671081148416000000000000000
#+begin_src python :results value :session local :exports both
2**100
#+end_src
#+RESULTS:
: 1267650600228229401496703205376
*** 整除的基本约定
负数整除:向小的方向截断。
#+begin_src python :results value :session local :exports both
5 // 3, -5 // 3, 5.0 // 3.0, -5.0 // 3.0
#+end_src
#+RESULTS:
| 1 | -2 | 1.0 | -2.0 |
#+begin_src python :results value :session local :exports both
5 % 3, -5 % 3, 5.0 % 3.0, -5.0 % 3.0
#+end_src
#+RESULTS:
| 2 | 1 | 2.0 | 1.0 |
#+begin_src python :results value :session local :exports both
(-5 // 3) * 3 + (-5 % 3) == -5
#+end_src
#+RESULTS:
: True
*** 布尔运算:真与假
Python 的设计目标是“符合直觉”
#+begin_src python :results value :session local :exports both
not True, not False
#+end_src
#+RESULTS:
| False | True |
#+begin_src python :results value :session local :exports both
True and False, False or True
#+end_src
#+RESULTS:
| False | True |
#+begin_src python :results value :session local :exports both
True + True, True * False # True 实际上是 1, False 实际上是 0
#+end_src
#+RESULTS:
| 2 | 0 |
#+begin_src python :results value :session local :exports both
True * 8, False - 5 # 只为了说明 True 和 False 的内部表示,不要这样写代码
#+end_src
#+RESULTS:
| 8 | -5 |
*** 条件判断
- 等号写两次用于判断,写一次用于赋值。
#+begin_src python :results value :session local :exports both
1 == 1, 2 == 1
#+end_src
#+RESULTS:
| True | False |
#+begin_src python :results value :session local :exports both
1 != 1, 2 != 1
#+end_src
#+RESULTS:
| False | True |
#+begin_src python :results value :session local :exports both
1 < 10, 1 > 10, 2 <= 2, 2 >= 2
#+end_src
#+RESULTS:
| True | False | True | True |
*** 数据类型
=int= 指整型,没有上限; =float= 是浮点型,一般为双精度; =str= 是字符串
#+begin_src python :results value :session local :exports both
type(1)
#+end_src
#+RESULTS:
: <class 'int'>
#+begin_src python :results value :session local :exports both
type(1.5)
#+end_src
#+RESULTS:
: <class 'float'>
#+begin_src python :results value :session local :exports both
type('Hello')
#+end_src
#+RESULTS:
: <class 'str'>
#+begin_src python :results output :session local :exports both
print(type("a"), type("你好")) # 单个字符和汉字都是字符串
#+end_src
#+RESULTS:
: <class 'str'> <class 'str'>
*** 字符串
与高精度整数一样,字符串也没有硬件的对应,是 Python 的软件实现。这极大方便了使用 Python 进行文本处理。
#+begin_src python :results value :session local :exports both
"今天" + "要下雨"
#+end_src
#+RESULTS:
: 今天要下雨
#+begin_src python :results value :session local :exports both
"1" + "2"
#+end_src
#+RESULTS:
: 12
*** 标准输入输出
- 标准输出默认与屏幕连接, =print()= 默认向标准输出写