有没有遇到过CPU降到0%的CPU使用情况怎么看,而且经鱿

2713 条评论分享收藏感谢收起赞同 49 条评论分享收藏感谢收起&p&为 PyCharm 新手整理了最常用的10个小技巧,能帮你省下不少时间。&/p&&h2&&b&0. 常用快捷键&/b&&/h2&&p&先上两张速查图,可以设为桌面或者打印出来放在手边,想不起来时瞄一眼,很快就能记住常用快捷键了。&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-cb058dde6feedc8193acee_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&3308& data-rawheight=&1805& class=&origin_image zh-lightbox-thumb& width=&3308& data-original=&https://pic1.zhimg.com/50/v2-cb058dde6feedc8193acee_r.jpg&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-72a7b52bb_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&3308& data-rawheight=&1805& class=&origin_image zh-lightbox-thumb& width=&3308& data-original=&https://pic1.zhimg.com/50/v2-72a7b52bb_r.jpg&&&/figure&&p&&br&&/p&&h2&&b&1. 查看使用库源码&/b&&/h2&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-dadfbdb13d7_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&720& data-rawheight=&636& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic4.zhimg.com/50/v2-dadfbdb13d7_r.jpg&&&/figure&&p&经常听人说,多看源码。源码不仅能帮我们搞清楚运行机制,还能学习优秀的库或者框架的最佳实践。调用库时,你可以在你好奇的几乎任何地方点击 &i&Command+B&/i&,就可以很方便的跳转到源码里的类,方法,函数,变量的定义。&/p&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//www.zhihu.com/video/504256& target=&_blank& data-video-id=&& data-video-playable=&true& data-name=&& data-poster=&https://pic2.zhimg.com/v2-36e18d0c9a7fcbeb7f80d.jpg& data-lens-id=&504256&&
&img class=&thumbnail& src=&https://pic2.zhimg.com/v2-36e18d0c9a7fcbeb7f80d.jpg&&&span class=&content&&
&span class=&title&&&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://www.zhihu.com/video/504256&/span&
&/a&&p&&br&&/p&&h2&&b&2. 让你的代码 PEP8&/b&&/h2&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-393e12efbbbbaf80f062d6f54ecf2445_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&720& data-rawheight=&585& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic1.zhimg.com/50/v2-393e12efbbbbaf80f062d6f54ecf2445_r.jpg&&&/figure&&p&写 Python 代码时,你会严格遵守 pep8 规范么?还是要遵守的,不然代码传到 github 或者知乎上被人怼就不好了。但是如果靠肉眼去检查和注意的话,太累,靠 PyCharm 来做这事就好,&i&Command+Option+L&/i&,一键 pep8 走起。&/p&&p&&br&&/p&&h2&&b&3. 新手不再愁安装库&/b&&/h2&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-b8f49a56fbc4778dcecff_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&720& data-rawheight=&612& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic3.zhimg.com/50/v2-b8f49a56fbc4778dcecff_r.jpg&&&/figure&&p&如果你是新手,可能会为了安装库而感到烦恼,在 PyCharm 里面可以使用你熟悉的图形化界面来安装库,就不用陷在一堆命令行里了。&/p&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//www.zhihu.com/video/620160& target=&_blank& data-video-id=&& data-video-playable=&true& data-name=&& data-poster=&https://pic2.zhimg.com/v2-40ba73fd001bf9da7b35.jpg& data-lens-id=&620160&&
&img class=&thumbnail& src=&https://pic2.zhimg.com/v2-40ba73fd001bf9da7b35.jpg&&&span class=&content&&
&span class=&title&&&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://www.zhihu.com/video/620160&/span&
&/a&&p&&br&&/p&&h2&&b&4. 查找文件,类, 方法&/b&&/h2&&p&当我们需要在项目中寻找一个文件名的时候,输入 &i&Command + Shift + O&/i&,然后输入你想查找的文件名就可以了。如果你不记得全名了,只需要输入首字母,Pycharm 就会提示你。比如我想查找一个叫 &i&test_errors.py&/i& 的文件,那么只需要输入&i& tee&/i& 就可以找到。又或者查询 &i&test_errors_1.py&/i& 那么只需要输入 &i&tee1&/i& 就可以查找到。&/p&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//www.zhihu.com/video/151168& target=&_blank& data-video-id=&& data-video-playable=&true& data-name=&& data-poster=&https://pic3.zhimg.com/v2-daf2df0900e6.jpg& data-lens-id=&151168&&
&img class=&thumbnail& src=&https://pic3.zhimg.com/v2-daf2df0900e6.jpg&&&span class=&content&&
&span class=&title&&&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://www.zhihu.com/video/151168&/span&
&/a&&p&&br&&/p&&h2&&b&5. 快速选择代码块&/b&&/h2&&p&你会怎么快速注释一段 Python 代码块?不会是一行一行的加#吧……&/p&&p&在需要选择某个函数的时候,只需要把光标放在最前面,然后点击 &i&Command + Option + Shift + [ &/i&,就可以选择对当前代码块, 使用 &i&Command + / &/i&注释。&/p&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//www.zhihu.com/video/920896& target=&_blank& data-video-id=&& data-video-playable=&true& data-name=&& data-poster=&https://pic1.zhimg.com/v2-69af83b6d922d.jpg& data-lens-id=&920896&&
&img class=&thumbnail& src=&https://pic1.zhimg.com/v2-69af83b6d922d.jpg&&&span class=&content&&
&span class=&title&&&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://www.zhihu.com/video/920896&/span&
&/a&&p&&br&&/p&&h2&&b&6.快速插入常用代码&/b&&/h2&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-107fec50a31a59e11e873f7924fcc51f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&720& data-rawheight=&728& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic4.zhimg.com/50/v2-107fec50a31a59e11e873f7924fcc51f_r.jpg&&&/figure&&p&有时候需要输入很长的代码,比如 &i&if __name__ == '__main__':&/i& ,这时候手动输入不如直接 &i&Command + J&/i& ,就可以直接插入常用代码了。&/p&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//www.zhihu.com/video/147904& target=&_blank& data-video-id=&& data-video-playable=&true& data-name=&& data-poster=&https://pic3.zhimg.com/v2-3c0dd2ccde96.jpg& data-lens-id=&147904&&
&img class=&thumbnail& src=&https://pic3.zhimg.com/v2-3c0dd2ccde96.jpg&&&span class=&content&&
&span class=&title&&&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://www.zhihu.com/video/147904&/span&
&/a&&p&&br&&/p&&h2&&b&7.运行/调试代码&/b&&/h2&&p&运行代码、调试代码应该是大多数人最常用的快捷键吧。具体操作见视频:&/p&&p&&br&&/p&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//v.qq.com/x/cover/n05165kwfy6/n05165kwfy6.html& target=&_blank& data-video-id=&527872& data-video-playable=&true& data-name=&7运行或调试_腾讯视频& data-poster=&https://pic1.zhimg.com/v2-f9f5dfd8dfe7fbdb06c92008.jpg& data-lens-id=&&&
&img class=&thumbnail& src=&https://pic1.zhimg.com/v2-f9f5dfd8dfe7fbdb06c92008.jpg&&&span class=&content&&
&span class=&title&&7运行或调试_腾讯视频&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://v.qq.com/x/cover/n05165kwfy6/n05165kwfy6.html&/span&
&/a&&p&&br&&/p&&h2&&b&8.缩进你的代码块&/b&&/h2&&p&在写前端页面的时候,经常要更改一大段代码的缩进,这时候可以先用 &i&Shift + 上下键&/i& 来选择你要缩进的代码块,然后使用 &i&Tab&/i& 就能缩进啦。&/p&&p&&br&&/p&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//v.qq.com/x/cover/kq/kq.html& target=&_blank& data-video-id=&330112& data-video-playable=&true& data-name=&8缩进代码块_腾讯视频& data-poster=&https://pic3.zhimg.com/v2-b1a06e396ce.jpg& data-lens-id=&&&
&img class=&thumbnail& src=&https://pic3.zhimg.com/v2-b1a06e396ce.jpg&&&span class=&content&&
&span class=&title&&8缩进代码块_腾讯视频&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://v.qq.com/x/cover/kq/kq.html&/span&
&/a&&p&&br&&/p&&h2&&b&9.展开/收缩代码&/b&&/h2&&p&当项目写到一定规模的时候,难免方法/函数会很多,这个时候我们可以使用&/p&&p&&i&Command + Shift + -符号&/i& 来收缩代码,这个主要是为了方便查看。&/p&&p&&br&&/p&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//v.qq.com/x/cover/i05165x5smx/i05165x5smx.html& target=&_blank& data-video-id=&418560& data-video-playable=&true& data-name=&9展开/收缩代码_腾讯视频& data-poster=&https://pic1.zhimg.com/v2-fabb5d94b1e345f439a2ac.jpg& data-lens-id=&&&
&img class=&thumbnail& src=&https://pic1.zhimg.com/v2-fabb5d94b1e345f439a2ac.jpg&&&span class=&content&&
&span class=&title&&9展开/收缩代码_腾讯视频&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://v.qq.com/x/cover/i05165x5smx/i05165x5smx.html&/span&
&/a&&p&&br&&/p&&h2&&b&10.展示多个页面&/b&&/h2&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/50/v2-f21ad6fc87a18d7bc5a49307_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&720& data-rawheight=&312& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic2.zhimg.com/50/v2-f21ad6fc87a18d7bc5a49307_r.jpg&&&/figure&&p&当你的公司不愿意为你配置2个显示屏时,你依然可以使用 PyCharm 在一个屏幕里查看多个文件。鼠标放到当前导航处的文件名,然后右键 &i&Split Vertically&/i& 或者 &i&Split Horizontally&/i& 就可以啦。&/p&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//v.qq.com/x/cover/l0516z0yiqy/l0516z0yiqy.html& target=&_blank& data-video-id=&976256& data-video-playable=&true& data-name=&_腾讯视频& data-poster=&https://pic2.zhimg.com/v2-1d987ada680bee.jpg& data-lens-id=&&&
&img class=&thumbnail& src=&https://pic2.zhimg.com/v2-1d987ada680bee.jpg&&&span class=&content&&
&span class=&title&&_腾讯视频&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://v.qq.com/x/cover/l0516z0yiqy/l0516z0yiqy.html&/span&
&/a&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&——————————纠结的更新分割线——————————&/p&&p&看到大家这么喜欢很开心,想更新10个高阶一点的技巧,又有点担心太长了没人看,很纠结。不过本着对知识负责的态度,还是要更新高阶技巧的。看不完没关系,先收藏起来以后再看嘛。&/p&&h2&&b&11.IdeaVim 插件回到 VIM&/b&&/h2&&figure&&img src=&https://pic3.zhimg.com/50/v2-acab774049_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&720& data-rawheight=&728& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic3.zhimg.com/50/v2-acab774049_r.jpg&&&/figure&&p&如果你是 VIM 的忠实粉丝,那么没关系,IdeaVim 插件让你能享受 PyCharm 的智能可视化功能时 还不失去 VIM 的快捷编辑 。Enjoy VIM in PyCharm!&/p&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//www.zhihu.com/video/696832& target=&_blank& data-video-id=&& data-video-playable=&true& data-name=&& data-poster=&https://pic4.zhimg.com/v2-6cbea4c0bcacb.jpg& data-lens-id=&696832&&
&img class=&thumbnail& src=&https://pic4.zhimg.com/v2-6cbea4c0bcacb.jpg&&&span class=&content&&
&span class=&title&&&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://www.zhihu.com/video/696832&/span&
&/a&&p&&br&&/p&&h2&&b&12. 设置代码模板&/b&&/h2&&p&设置代码模版是个非常实用的技巧,通过代码模版我们可以指定新建代码文件诸如解释器路径、文件编码方法、版权、作者等通用信息。&/p&&p&&br&&/p&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//www.zhihu.com/video/080704& target=&_blank& data-video-id=&& data-video-playable=&true& data-name=&& data-poster=&https://pic3.zhimg.com/v2-40cb12a89fd5b0477ecc0a4f.jpg& data-lens-id=&080704&&
&img class=&thumbnail& src=&https://pic3.zhimg.com/v2-40cb12a89fd5b0477ecc0a4f.jpg&&&span class=&content&&
&span class=&title&&&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://www.zhihu.com/video/080704&/span&
&/a&&p&&br&&/p&&h2&&b&13. 函数调用层级可视化&/b&&/h2&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-f8e32f5cedd4f5f751d97_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&720& data-rawheight=&711& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic1.zhimg.com/50/v2-f8e32f5cedd4f5f751d97_r.jpg&&&/figure&&p&在大型项目中,函数调用关系及其复杂时,若我们要从整体上理清业务的逻辑关系,那么关键函数的调用层级信息则非常重要。&/p&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//v.qq.com/x/cover/u1319g8fad7/u1319g8fad7.html& target=&_blank& data-video-id=&074112& data-video-playable=&true& data-name=&Pycharm 操作03_腾讯视频& data-poster=&https://pic4.zhimg.com/v2-4ecbb19fd5d755b997b7cd7.jpg& data-lens-id=&&&
&img class=&thumbnail& src=&https://pic4.zhimg.com/v2-4ecbb19fd5d755b997b7cd7.jpg&&&span class=&content&&
&span class=&title&&Pycharm 操作03_腾讯视频&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://v.qq.com/x/cover/u1319g8fad7/u1319g8fad7.html&/span&
&/a&&p&&br&&/p&&h2&&b&14. 实时显示文档和函数参数&/b&&/h2&&p&当你在默默写着代码时,突然发现自己忘记了正使用的库函数定义和参数时,你会怎么办,切出到浏览器里搜索该函数吗?NO,PyCharm 提供了更好的方法,只需要一键即可显示出该函数的定义,并且可以实时显示出参数。在 PyCharm 中, 通过快捷键 &i&F1&/i& 可以调出光标处函数文档,&i&Command+P&/i& 可以显示出光标处函数参数。&/p&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//v.qq.com/x/cover/t0516rqntvo/t0516rqntvo.html& target=&_blank& data-video-id=&071616& data-video-playable=&true& data-name=&14. 实时显示文档和函数参数_腾讯视频& data-poster=&https://pic1.zhimg.com/v2-161cd053c3e93d37af5db00caf6c0e04.jpg& data-lens-id=&&&
&img class=&thumbnail& src=&https://pic1.zhimg.com/v2-161cd053c3e93d37af5db00caf6c0e04.jpg&&&span class=&content&&
&span class=&title&&14. 实时显示文档和函数参数_腾讯视频&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://v.qq.com/x/cover/t0516rqntvo/t0516rqntvo.html&/span&
&/a&&p&&br&&/p&&h2&&b&15. 超实用搜索 Search Everywhere&/b&&/h2&&p&提到搜索,不得不表扬下 PyCharm 的 &i&Search Everywhere&/i& 功能,你可以搜索到整个项目中(包括库文件)所有类、文件、符号(变量、函数)等,非常方便。当然它也支持你单独搜索类、文件或符号。&/p&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//v.qq.com/x/cover/o131975dqnf/o131975dqnf.html& target=&_blank& data-video-id=&219008& data-video-playable=&true& data-name=&Pycharm 操作05_腾讯视频& data-poster=&https://pic2.zhimg.com/v2-65c8c051f21b87b28c0704a4fcc89271.jpg& data-lens-id=&&&
&img class=&thumbnail& src=&https://pic2.zhimg.com/v2-65c8c051f21b87b28c0704a4fcc89271.jpg&&&span class=&content&&
&span class=&title&&Pycharm 操作05_腾讯视频&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://v.qq.com/x/cover/o131975dqnf/o131975dqnf.html&/span&
&/a&&p&&br&&/p&&h2&&b&16. DEBUG&/b&&/h2&&p&试想下,Python 怎么进行调试呢?pdb,没错,这个和 gdb 类似的工具。那么一般如何使用, 一种常见的方式是在需要加入断点的地方插入 &i& pdb.set_trace()&/i&, 然后再正常运行脚本, 程序会自动在设置断点处停下来。 在 PyCharm 中,你可以像使用 VC++调试 C/C++代码那样来调试 Python,这种既视感可是很舒服的。&/p&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//v.qq.com/x/cover/e1319ffgcd4/e1319ffgcd4.html& target=&_blank& data-video-id=&392000& data-video-playable=&true& data-name=&Pycharm 操作06_腾讯视频& data-poster=&https://pic3.zhimg.com/v2-dca740aad7a.jpg& data-lens-id=&&&
&img class=&thumbnail& src=&https://pic3.zhimg.com/v2-dca740aad7a.jpg&&&span class=&content&&
&span class=&title&&Pycharm 操作06_腾讯视频&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://v.qq.com/x/cover/e1319ffgcd4/e1319ffgcd4.html&/span&
&/a&&p&&br&&/p&&h2&&b&17. 智能重构&/b&&/h2&&figure&&img src=&https://pic3.zhimg.com/50/v2-c54e3d09d2ff7a8ce8fddf3d1e298fae_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&720& data-rawheight=&592& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic3.zhimg.com/50/v2-c54e3d09d2ff7a8ce8fddf3d1e298fae_r.jpg&&&/figure&&p&某日产品经理丢来一个需求,要求一周搞定,然后你每晚加班到凌晨辛勤工作来搞定这个需求,时间刚好过去一半,产品经理又来找你了,“我们这个需求能否做点小调整”,当你听到这个消息时,你的心里应该隐隐感觉到不妙。是的,产品经理可不管你之前代码 import 依赖有多复杂,函数或者变量或者类的命名是否贴切,代码文件路径是否合适......So,幸好 PyCharm 有智能的 Refactor 功能, 让你轻松重构函数、类,变换路径,更改文件名等等操作。&/p&&a class=&video-box& href=&//link.zhihu.com/?target=http%3A//v.youku.com/v_show/id_XMjgzOTQzMTE4OA%3D%3D.html& target=&_blank& data-video-id=&894208& data-video-playable=&true& data-name=&7智能重构& data-poster=&& data-lens-id=&&&
&img class=&thumbnail& src=&&&&span class=&content&&
&span class=&title&&7智能重构&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&http://v.youku.com/v_show/id_XMjgzOTQzMTE4OA==.html&/span&
&/a&&p&&br&&/p&&h2&&b&18. 快捷生成单元测试模板&/b&&/h2&&figure&&img src=&https://pic4.zhimg.com/50/v2-1dba6ab19e88ebdd8ff58_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&720& data-rawheight=&610& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic4.zhimg.com/50/v2-1dba6ab19e88ebdd8ff58_r.jpg&&&/figure&&p&单元测试是每个程序员都无法逾越的一道鸿沟,甚至单元测试覆盖率也会用来评估软件的健壮性。PyCharm 则提供了快速生成单元测试模版的方法。当然,PyCharm 只是帮你生成了单元测试的基础代码,测试的逻辑还是需要自己码的。&/p&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//v.qq.com/x/cover/vg/vg.html& target=&_blank& data-video-id=&559872& data-video-playable=&true& data-name=&PyCharm 08_腾讯视频& data-poster=&https://pic1.zhimg.com/v2-3abb7901484.jpg& data-lens-id=&&&
&img class=&thumbnail& src=&https://pic1.zhimg.com/v2-3abb7901484.jpg&&&span class=&content&&
&span class=&title&&PyCharm 08_腾讯视频&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://v.qq.com/x/cover/vg/vg.html&/span&
&/a&&p&&br&&/p&&h2&&b&19. 图形化 VSC 操作之 git&/b&&/h2&&p&git 作为程序员代码版本管理利器,广为程序员使用。但如果你对记忆 git 一堆堆命令比较头痛的话,那么 PyCharm 的图形化 VCS 将是你的拯救者。PyCharm 的 VCS 支持 git 和 svn,并通过图形界面方式提供了你所能想到的功能,而且界面简洁,易于操作。&/p&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//v.qq.com/x/cover/x0516clxk7p/x0516clxk7p.html& target=&_blank& data-video-id=&180544& data-video-playable=&true& data-name=&19. 图形化 VSC 操作之 git_腾讯视频& data-poster=&https://pic3.zhimg.com/v2-ca7fdd993a59d8309eeb3d2.jpg& data-lens-id=&&&
&img class=&thumbnail& src=&https://pic3.zhimg.com/v2-ca7fdd993a59d8309eeb3d2.jpg&&&span class=&content&&
&span class=&title&&19. 图形化 VSC 操作之 git_腾讯视频&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://v.qq.com/x/cover/x0516clxk7p/x0516clxk7p.html&/span&
&/a&&p&&br&&/p&&h2&&b&20. 利用 ssh 远程部署&/b&&/h2&&p&一般参与开发的大型项目时,个人负责的小组件都可能会依赖其它组建才能运行起来,而其它组建又比较复杂而不便于本地部署时,你会怎么办?是选择每次修改后,手动打包拷贝到远程服务器,在远程服务器上解压部署;还是希望在编辑器中修改之后,编辑器自动同步到远程服务器呢。不出意外,你会选择后者,而 PyCharm 则帮你实现了,你只需要配置一次,即可一劳永逸。&/p&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//v.qq.com/x/cover/dzu/dzu.html& target=&_blank& data-video-id=&753984& data-video-playable=&true& data-name=&Pycharm 操作10_腾讯视频& data-poster=&https://pic2.zhimg.com/v2-ef2657aab432f54b4fd6cc647d406e2d.jpg& data-lens-id=&&&
&img class=&thumbnail& src=&https://pic2.zhimg.com/v2-ef2657aab432f54b4fd6cc647d406e2d.jpg&&&span class=&content&&
&span class=&title&&Pycharm 操作10_腾讯视频&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://v.qq.com/x/cover/dzu/dzu.html&/span&
&/a&&hr&&p&打个广告:&/p&&p&如果你和当初的我一样,迫不及待想要做点东西、却还是个新手,那么可以试试我为你设计的这门课《实用主义学 Python》:&/p&&a href=&//link.zhihu.com/?target=https%3A//www.mugglecode.com/practical& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic2.zhimg.com/v2-b474e0b8a8af17ec0d670b88bf989891_ipico.jpg& data-image-width=&466& data-image-height=&525& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&实用主义学Python-27天挑战27个新手项目&/a&&p&从 7 行代码的脚本项目开始,逐渐叠加复杂度,直到解决真实世界的复杂问题。&/p&&p&编程语言是个工具,只有当情境复杂时才会用到工具的高级功能,这是我的教学方法,而不是先停下来去学习瑞士军刀的100种用法,却不上手做点什么。&/p&&p&如果你没有任何语法基础,可以在学这门课之前,先看看这门免费的小白入门课:&/p&&a href=&//link.zhihu.com/?target=https%3A//www.mugglecode.com/introduce& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic1.zhimg.com/v2-743a4cbe7ae46e9003d28bc_180x120.jpg& data-image-width=&1440& data-image-height=&695& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&麻瓜编程 - 实用主义学编程&/a&&p&同样是以练习和使用为主,并且有大量图解,每一页都抓注意力,更适合不喜欢读太多字/听冗长视频的人以及像我一样的 ADD。&/p&&p&最后,祝大家都能写更多代码,做更多事情。&/p&
为 PyCharm 新手整理了最常用的10个小技巧,能帮你省下不少时间。0. 常用快捷键先上两张速查图,可以设为桌面或者打印出来放在手边,想不起来时瞄一眼,很快就能记住常用快捷键了。 1. 查看使用库源码 经常听人说,多看源码。源码不仅能帮我们搞清楚运行机…
2+1D 时空中的电磁学和3+1D时空的电磁学是差别很大的。简单来说磁场变成了标量,不是矢量,也就没有方向这一说了。&br&&br&如果有兴趣的话你可以看看这个:&br&&a href=&//link.zhihu.com/?target=http%3A//www.physics.princeton.edu/%7Emcdonald/examples/2dem.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&physics.princeton.edu/~&/span&&span class=&invisible&&mcdonald/examples/2dem.pdf&/span&&span class=&ellipsis&&&/span&&/a&
2+1D 时空中的电磁学和3+1D时空的电磁学是差别很大的。简单来说磁场变成了标量,不是矢量,也就没有方向这一说了。 如果有兴趣的话你可以看看这个:
&p&《失乐园》中有这样一句话,&i&The mind is its own place, and in itself can make a heaven of hell, a hell of heaven.(心自有其所在。它本身就能把天堂变成地狱,地狱变成天堂。)&/i&&/p&&p&我们来跟题主聊一聊抑郁情绪吧。&/p&&p&我们曾经从长期抑郁会对自己产生哪些影响、如何治疗以及日常自助建议等方面,回答了这个问题:&a href=&https://www.zhihu.com/question//answer/& class=&internal&&总是走不出抑郁怎么办? - 知乎&/a&(btw,“KY教主”是我们的老号,现已停更并搬家到新号KnowYourself咯)&/p&&p&这次,我们想仔细的梳理&b&那些导致我们抑郁、不快乐的思维与想法&/b&,究竟是什么样的?或许&b&只有真的搞清楚我们都在由哪些消极想法所左右,才能知道如何克服他们。 &/b&&/p&&p&就像题主自己描述的,我们能列举出来造成抑郁情绪的原因有很多种,比如基因因素、童年的敌意情绪等等。但不管由什么原因导致,容易被抑郁情绪“困住”的人群都有一个共同特点,即&b&自责&/b&。&/p&&p&在&b&弗洛伊德&/b&看来,&b&自我责备的根源是愤怒&/b&——本来这种愤怒是指向他人的,之后却转向了内部,指向自己。比如,在童年时期的亲子关系中,个人的期望和要求不能得到满足,成人后一旦遭遇损伤,便会使敌意情绪活跃起来,童年时指向父母的愤怒转而指向个体自身的自我。&/p&&p&与弗洛伊德着眼于“指向自身的愤怒”不同,认知学派的大牛&b&阿伦·贝克&/b&则总结出了&b&抑郁的“认知三合一”理论&/b&,他认为,导致抑郁的消极认知集中在三个方面:&b&对自己消极的看法,消极的当前体验,对未来消极的看法&/b&。&/p&&p&贝克认为,&b&抑郁病人倾向于将自己看作在某种程度上是没有能力、有缺陷的、一无是处的,他们不仅认为当前的体验是负面的,并且相信将来会继续给自己带来痛苦和困难。&/b&&/p&&p&这种负性思维模式,会使人生所有的体验都阴沉暗淡起来,一个总是预期负面后果的人,不太有可能有动机去追求任何目标,这就造成了抑郁的主导症状——&b&意志瘫痪&/b&。&/p&&p&顺着贝克的“三个消极”展开来,Preston Ni总结出,意志瘫痪的人们往往会有以下8个消极想法:&/p&&br&&p&&b&1. 自我挫败式(self-defeated)谈话&/b&&/p&&p&尽管我是个写字并生产各种内容的人,很长一段时间来,却总是存有对“露脸”的恐惧,比如在各种作品署上自己的真实姓名。经常在写完一篇别人看来还不错的文章后,不敢自己回头通读一遍,看的时候还会想:怎么写得这么差?&/p&&p&到后来,抑郁情绪使我的写作能力持续受损,我真的写得越来越差,甚至写不出来了。&/p&&p&阿伦·贝克认为,&b&消极的认知过程是抑郁的根源,是由自我挫败式的思维方式造成的&/b&。自我挫败的思维,是指个体消极否认自己的能力和着手做某事成功的可能性,在此假设前提下,个体或是干脆放弃行动努力,或是行动时畏首畏尾,致使行动不尽如人意或彻底失败,而这又反过来强化了他的自我假设。&/p&&p&这对于不快乐的人们是一种常见的思维方式,他们总觉得自己是失败者,因而产生社交退缩,&b&甚至会反问自己的朋友,我这么失败,为什么还要和我交朋友?&/b&&/p&&p&自认失败的人,喜欢和自己进行挫败式的谈话,传递消极信息,从而更加导致自信心和表现力锐减、潜能降低。&/p&&p&常见的自我挫败式谈话有如下几种:&/p&&p&“我做不到… …”&/p&&p&“我还不够优秀… …”&/p&&p&“我没有信心… …”&/p&&p&“我不具备… …”&/p&&p&“我会失败的… …”&/p&&p&习惯性同自己进行自我挫败式谈话,就像是交到了一个时刻都在贬低你的朋友,你认为这样的人是真正的朋友吗?&/p&&br&&p&&b&2. 消极假设&/b&&/p&&p&心理学中有一个著名的假设:一个装有一半水的杯子,你会觉得它是半空的,还是半满的?对方的答案能够在某种程度上反映出乐观还是悲观——“你希望它是什么样,它就是什么样”。&/p&&p&在不快乐的人们看来,杯子往往是半空的。&b&当带有抑郁情绪的人观察一种形势、与他人活动或互动时,常常做出的是消极的假设和预期。&/b&&/p&&p&不快乐的人会不自觉地将交通拥堵、下雨天或买单都自动归为消极的经历。而&b&实际上,交通、天气或付账本身既无消极也无积极可言,是你根据具体情境,选择性地赋予了它们消极或积极的意义。&/b&&/p&&p&在同样的情况下,你可以试着这样想:交通拥堵正好给了你听轻音乐或专注于呼吸的机会;下雨天恰好可以窝在家里喝杯热咖啡,读读书;买单恰好让你有机会实践“先为自己投资”的财富积累策略。&/p&&p&&b&对这些事件的评价,取决于你考虑问题的方式。&/b&&/p&&br&&p&&b&3. 与他人进行消极比较&/b&&/p&&p&我们总会忍不住与那些有魅力、有作为或社交网络粉丝更多的人进行比较,这是人之常情;然而,如果你发现自己特别希望拥有别人所拥有的东西,感到嫉妒,觉得自己处处都不如别人,就构成了消极的社会比较。&/p&&p&&b&有抑郁情绪的人,往往都是自我评价过低、喜欢贬低自己的。其中,贬低自己最简单也是最常见的方式,就是同他人进行不恰当的比较。&/b&&/p&&p&研究发现,习惯性进行消极的社会比较,会给人们带来更大的压力、焦虑和沮丧,并且做出自暴自弃的选择。&/p&&br&&p&&b&4. 消极地沉湎于过去&/b&&/p&&p&&b&抑郁的人们喜欢沉湎于过去的记忆里,对于未来则毫无期待。&/b&&/p&&p&对此,需要记住的是:应当从过去吸取经验教训,但不是沉溺于过去无法自拔;我们改变不了已经发生的事,但可以改变和影响将要发生的事。有时,你迈出了第一步,就会明白你的过去已经成为历史,现在掌握主动权的是你自己。&/p&&p&如歌德曾经说过的:“&b&没有什么比今天更有价值&/b&。”&/p&&br&&p&&b&5. 对难缠的人,感到丧气和自卑&/b&&/p&&p&大多数人在生活中都会遇上一些难缠的人——喜怒无常的领导、较真的客户,都会给生活和工作带来多多少少的困扰。区别则在于你看待他们及与这些人交往的方式。
&/p&&p&面对这些人时,&b&有抑郁情绪的人们往往会将他们视为作恶者,自己是受害者,从而感到非常丧气,自信心降低。这样的态度虽然看起来合乎情理,实际上却是一种被动的反应——是在自我弱化。&/b&&/p&&p&无论对方是自恋狂、消极攻击者、操纵狂、恐吓者,你都可以运用技巧和策略来应对。但首先,改变的关键是从消极被动变为积极主动。&/p&&br&&p&&b&6. 指责别人&/b&&/p&&p&自我评价低的人&b&既容易指责自己,又喜欢让别人为自己的不幸买单&/b&。一些人认为自己不快乐或者不成功的人,总能把原因归结到别人身上:父母能力不足、人际关系消极、社会和经济实力缺乏优势、身体状况欠佳……&/p&&p&自己不快乐却去责怪他人,无疑也是将自己看成了受害者。&b&成为受害者好像拥有一些虚幻的优势,因为通过相互指责,可以为生活中的不满找理由,从而有借口摆脱那些必要的工作。&/b&&/p&&p&然而,&b&你指责的对象往往并不知道,或者毫不在乎你的真实感受,所以,实际上伤害的是你自己。长期习惯性的指责会带来永久的痛苦、悔恨和无力感。如&/b&梭罗《瓦尔登湖》中的一句话——“The mass of men lead lives of quiet desperation”——寂静的绝望,在抑郁的核心,也许就是这样一种寂静的绝望感。&/p&&br&&p&&b&7. 难以原谅自己&/b&&/p&&p&每个人都会犯错,回首过去时,总会有让你后悔的决定,给自己或他人造成伤害的时候。乐观的人们会放下包袱前行,抑郁的人们则总是因为犯下的错、造成的伤害、错失的机遇而责怪自己,认为自己是一个“坏人”或者“&b&有瑕疵的人&/b&”,陷入深深的&b&自我厌弃&/b&之中。&/p&&p&在这些时刻,你需要的是与自己和解——既然已经意识到了,就有机会避免重蹈覆辙,从而对自己及他人带来积极的影响。&b&错误只是一些个别的、特殊的时刻,并不能代表你自己本身。&/b&&/p&&br&&p&&b&8. 害怕失败和犯错&/b&&/p&&p&&b&抑郁症的高发人群往往是完美主义者&/b&,或者至少在某些方面是完美主义者,他们惧怕失败和犯错,总觉得某些方面不够优秀,因而给自己施加了过多的压力。&/p&&p&尽管高标准要求自己可以带来动力,就像适度的焦虑是有益的;但是过于期待完美却会带走生活的乐趣,也会使得自己的潜能得不到最大程度的发挥。&/p&&p&许多研究表明,&b&完美主义和不快乐之间有着必然联系&/b&。事实是,尽管我们常常很努力,但也不可能时时事事做到完美——这时,完美主义者就开始焦虑了。&/p&&p&&b&如果都没有正视真实的自己,何谈喜欢自己呢?&/b&&/p&&br&&p&最后,假如你对号入座,发现自己拥有以上8种情绪中的一种或者几种,可以试着通过改变陈述自己的方式、看待事物的方式、对待未来的方式,来改变自己;从而不再沉溺于对过去情境的消极想法,而是更多地注意将来的积极想法。这当然也是有依据的,这样的过程被前面那位“认知三合一”理论的大牛阿伦·贝克称为“认知重建”:由于人的思维和态度会影响动机,人的行为反应则会因为偶然的强化而改变,因此,可以通过&b&将人的消极陈述改变为更有建设性的陈述&/b&,来改变人的行为模式。&/p&&p&贝克认知行为疗法有一个基本假设,我常常在想,也想分享给其他和我有类似感受的人:&/p&&blockquote&&b&相信自己应该做什么,你就会那样去做;&/b& &b&告诉自己是什么样的人,你就会成为那样的人。&/b&&/blockquote&&p&以上。&/p&&p&ps&i&如果以上几种情绪你几乎全都有,而且较为严重,就要考虑寻求医生的帮助了。&/i&&/p&&p&&i&而如果,你身边有人也在经历类似的阶段,&b&请给他们以时间,以空间,对他们的感受保留一份尊重,更给他们以信任,相信他们知道什么样是对自己最好的,不需要你过于殷切的“建议”。默默支持并保持节制,是比热情关切更难许多的事。&/b&&/i&&/p&&br&&p&原文发表于&a href=&//link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s%3F__biz%3DMzI1OTAwNDc1OA%3D%3D%26mid%3Didx%3D2%26sn%3D450ba7d4bf1008bf08ada2eea148d54b%26mpshare%3D1%26scene%3D1%26srcid%3D0412Cbm3dO1DMXMi8znClJSK%26key%3De500c1316b0dabab9dc7bbf17cc18aafd9d3976f7ebeb26961fb43fec4bbe201d3474dbcdaf0cfbac9e06a11db1c5eb20872%26ascene%3D0%26uin%3DNDg0OTUzNzc1%26devicetype%3DiMac%2BMacBookAir6%252C1%2BOSX%2BOSX%2B10.11.6%2Bbuild%%26version%3Dnettype%3DWIFI%26fontScale%3D100%26pass_ticket%3DbcSQ%252BAIVQxXbWG17YQo4LAPI%252FvLD58i5MoCy8yGIACQ7ubPWWO0vgXda4VMbwObr& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&抑郁 和 8种让你不容易快乐的思维模式&/a&&/p&&p&了解更多与心理相关的知识、研究、话题互动、人物访谈等等,欢迎关注&a href=&https://www.zhihu.com/org/knowyourself-1/activities& class=&internal&&KnowYourself - 知乎&/a&&/p&&p&&i&宇宙中最酷的心理学社区,人人都能看懂,但只有一部分人才会喜欢。&/i&&/p&
《失乐园》中有这样一句话,The mind is its own place, and in itself can make a heaven of hell, a hell of heaven.(心自有其所在。它本身就能把天堂变成地狱,地狱变成天堂。)我们来跟题主聊一聊抑郁情绪吧。我们曾经从长期抑郁会对自己产生哪些影响…
&figure&&img src=&https://pic2.zhimg.com/v2-403ba3847e1f_b.jpg& data-rawwidth=&1632& data-rawheight=&1046& class=&origin_image zh-lightbox-thumb& width=&1632& data-original=&https://pic2.zhimg.com/v2-403ba3847e1f_r.jpg&&&/figure&(本文内容与上一场live:&b&&a href=&https://www.zhihu.com/lives/159680?utm_campaign=zhihulive&utm_source=zhihucolumn&utm_medium=Livecolumn& class=&internal&&并不很难的狭义相对论&/a&&/b&互相补充。基础的,简单有趣的内容放live实时互动,更高要求的,需要自己思考的内容放专栏。这样效果比较好。)&p&=====================================================================&/p&&p&&b&第一部分&/b&:&b&演化观点与几何观点&/b&&/p&&br&&p&上一场live里面,我推导了狭义相对论主要的理论框架及其背后的思想,物理图像。并且我在最后提到,狭义相对论的现代语言应该是纯几何的。但由于时间所限,我在live中并无涉及任何几何相关的知识。现在,这篇文章将与大家分享在几何观点下的狭义相对论。&/p&&p&要真正理解狭义相对论,最关键的点在于,&b&要把时间和空间真正看成是平权的对象&/b&(平权,并不是相同,我们稍后看)。&/p&&p&把时间和空间看成平权的对象,这是一句含糊的话。在相对论出现的早期,事实上人们也并没有一套很好的语言来表达这样的思想,所以在讲相对论的时候往往是借助于大量参考系,对具体问题的讨论则变成大量参考系之间一堆令人头晕脑胀的坐标变换。这样的做法显然是不够简洁也不够本质的。而之所以会陷入到这种不聪明的陷阱中,是因为我们在早期仍习惯性地试图用演化而不是几何的观点来看待物理过程。&/p&&p&到底什么是我这里所谓的(含时)演化的观点以及(时空)几何的观点呢。请看下图。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-fd4bc156f7dfbb9dc19e72d3_b.jpg& data-rawwidth=&733& data-rawheight=&551& class=&origin_image zh-lightbox-thumb& width=&733& data-original=&https://pic4.zhimg.com/v2-fd4bc156f7dfbb9dc19e72d3_r.jpg&&&/figure&&p&这幅图有两种看法,&b&一种看法是:这是二维空间沿着时间轴演化的一个令人眼花缭乱的动态过程。这是演化的观点。另一种看法是,这是静止在一个三维时空里的一堆不变的白菜。这是几何的观点。&/b&&/p&&p&这两种看法的区别是,第一种里的时间像一段视频的进度条,独立于空间而存在。第二种则将时间看成是屏幕外的一条独立坐标轴,与两个空间轴共同组成一个三维时空坐标。&/p&&p&我说到这里不知道大家对这两种看法有没有一些体会。如果你直到现在还是觉得这两种看法并没有什么本质不同,那也不奇怪。因为&b&在牛顿力学中,它们就是没有什么本质区别的。&/b&因为在牛顿力学中,&b&时间是绝对的&/b&。这句话的意思是,我们只能以一种方式来对白菜进行切片。这样的话,第一种和第二种的确没有什么本质区别。第一种像电影胶片一样把一帧帧的静态图片捋成一串,第二种则像书一样把一堆静态图片叠成一垛。仅此而已。&/p&&p&但,&b&假如,我们可以用不同的方式对白菜进行切片呢?&/b&我可以沿着原来的方向切片,我还可以稍稍转动一个角度,沿着另一个方向切片?这时候,每一帧图片就完全改变了。在第一种看法下,看起来一切都变了。但在第二种看法下,我们都知道,白菜还是那个白菜。&/p&&br&(也许我们直觉上都会同意第二种看法更接近本质。但深究原因的话,为什么我们它就更本质呢?答案:第一,它更简洁。第二,也是最关键的,因为它包含更多的不变性,它可以不依赖于对白菜进行切片的方式。)&p&相对论到底是什么? &b&相对论无非是想告诉你,其实时间轴真的不是超然物外的。时间和空间是相对的,是可以互相转化,旋转的。之所以以前时间一直没有和空间进行转化,旋转,只是因为我们的速度太慢了。注意不到。但只要速度足够快,时间和空间的相互转化就开始主导我们观测的物理现象了。这时候原先那些在低速三维空间中看起来不变的物理量就无法继续不变啦。所以我们必须用第二种方式来看待物理量,把物理量推广到四维时空去。用四维的不变白菜来刻画世界。&/b&&br&&/p&&p&&br&--------------------------------------------------------------------------------------------------------------------------&/p&&p&&b&第二部分:旋转&/b&&/p&&p&&br&那么问题来了,怎么找到四维不变白菜呢?&/p&&p&还好有个现成的~我们在之前已经证明过&/p&&img src=&https://www.zhihu.com/equation?tex=ds%5E2+%3D+c%5E2dt%5E2+-+dx%5E2+-+dy%5E2+-dz%5E2& alt=&ds^2 = c^2dt^2 - dx^2 - dy^2 -dz^2& eeimg=&1&&&br&&p&在洛伦兹变换&/p&&img src=&https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%2A%7D%0A%26++x%27+%3D+%5Cfrac%7Bx+-+vt%7D%7B%5Csqrt%7B1+-+%5Cfrac%7Bv%5E2%7D%7Bc%5E2%7D%7D+%7D++%5C%5C%0A%26y%27+%3D+y%5C%5C%0A%26z%27+%3Dz%5C%5C%0A%26t%27+%3D+%5Cfrac%7Bt+-+%5Cfrac%7Bv%7D%7Bc%5E2%7Dt%7D%7B%5Csqrt%7B1+-+%5Cfrac%7Bv%5E2%7D%7Bc%5E2%7D%7D+%7D++%5Cend%7Balign%2A%7D& alt=&\begin{align*}
x' = \frac{x - vt}{\sqrt{1 - \frac{v^2}{c^2}} }
&t' = \frac{t - \frac{v}{c^2}t}{\sqrt{1 - \frac{v^2}{c^2}} }
\end{align*}& eeimg=&1&&&br&&p&下保持不变。&/p&&p&那这样如果我们把&img src=&https://www.zhihu.com/equation?tex=ds& alt=&ds& eeimg=&1&&定义为四维时空的白菜,啊呸,&b&间隔&/b&的话(三维空间叫距离,四维时空叫间隔),我们就架构起了一个在洛伦兹变换下不变的几何。也就架构起了一个不依赖于参考系的几何。&/p&&p&值得一提的是,在这样的几何中,&img src=&https://www.zhihu.com/equation?tex=dt%5E2& alt=&dt^2& eeimg=&1&&与&img src=&https://www.zhihu.com/equation?tex=dx%5E2%2C+dy%5E2%2C+dz%5E2& alt=&dx^2, dy^2, dz^2& eeimg=&1&&永远相差一个符号。这个负号使得时间与空间平权但并不完全相同,也使得这样的几何与传统的欧几里得几何有所不同。这样的几何叫&b&闵可夫斯基几何&/b&,有些人也喜欢叫双曲几何。因为在这个几何中和原点间隔相同的点的集合是一条双曲线&/p&&br&&img src=&https://www.zhihu.com/equation?tex=c+%3Dc%5E2+t%5E2+-+l%5E2%2C+%28+l%5E2+%3D+x%5E2+%2B+y%5E2+%2Bz%5E2%29& alt=&c =c^2 t^2 - l^2, ( l^2 = x^2 + y^2 +z^2)& eeimg=&1&&&br&&p&同时,如果我们令&img src=&https://www.zhihu.com/equation?tex=tanh%28%5Ctheta%29+%3D%5Cfrac%7Bv%7D%7Bc%7D& alt=&tanh(\theta) =\frac{v}{c}& eeimg=&1&&的话,原来的洛伦兹变换公式 (暂时忽略y, z, 因为它们不萌) 就可以变成:&/p&&img src=&https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D%0A%26x%27+%3D+x+cosh%28%5Ctheta%29+%2B+ct+sinh%28%5Ctheta%29%5C%5C%0A%26t%27+%3D+tcosh%28%5Ctheta%29+-+%5Cfrac%7Bx%7D%7Bc%7Dsinh%28%5Ctheta%29%0A%5Cend%7Balign%7D& alt=&\begin{align}
&x' = x cosh(\theta) + ct sinh(\theta)\\
&t' = tcosh(\theta) - \frac{x}{c}sinh(\theta)
\end{align}& eeimg=&1&&&br&&p&(tanh, sinh, cosh, 分别是双曲正切,双曲正弦,双曲余弦。cosh^2 - sinh^2 = 1, tanh = sinh/cosh, 利用这两个式子,上面这个很容易证明。)&br&&/p&&br&&p&不知道这个公式有没有勾起大家美好的回忆,反正我马上就想到在普通的欧几里得空间中有一个&/p&&img src=&https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D%0A%26x%27+%3D+x+cos%28%5Ctheta%29+%2B+y+sin%28%5Ctheta%29%5C%5C%0A%26y%27+%3D+ycos%28%5Ctheta%29+-+xsin%28%5Ctheta%29%0A%5Cend%7Balign%7D& alt=&\begin{align}
&x' = x cos(\theta) + y sin(\theta)\\
&y' = ycos(\theta) - xsin(\theta)
\end{align}& eeimg=&1&&&br&&p&它表示在欧几里得几何中把坐标轴旋转&img src=&https://www.zhihu.com/equation?tex=%5Ctheta& alt=&\theta& eeimg=&1&&角的操作。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-2e6cf9f1b1ffe6418977af_b.jpg& data-rawwidth=&251& data-rawheight=&152& class=&content_image& width=&251&&&/figure&&p&所以,&b&所谓的洛伦兹变换,其实真的是在做一个“旋转”操作。只不过这个旋转是作用在双曲几何上的,是一个时间轴和空间轴的旋转。&/b&&/p&&p&所以&b&,在相对论里面,我真的可以转过一个角度,沿着另一个方向对白菜进行切片,这个角度的大小取决与速度与光速的比值。&/b&&/p&&p&所以&b&,每一帧图片都完全改变了。于是长度收缩了,时间变慢了。&/b&&/p&&p&所以,&b&什么长度收缩呀,时间变慢呀。根本没有这么玄乎。不过就是把四维时空坐标系“旋转”了一个角度,时间和空间重新线性组合了一下。于是四维矢量&img src=&https://www.zhihu.com/equation?tex=dx_%7B%5Cmu%3D0%2C1%2C2%2C3+%7D+%3D+%28cdt%2C+dx%2C+dy%2C+dz%29+& alt=&dx_{\mu=0,1,2,3 } = (cdt, dx, dy, dz) & eeimg=&1&& 在时间轴上的分量&img src=&https://www.zhihu.com/equation?tex=t& alt=&t& eeimg=&1&& ,空间轴上的分量&img src=&https://www.zhihu.com/equation?tex=x%2C+y%2C+z& alt=&x, y, z& eeimg=&1&&相应改变了而已。但&img src=&https://www.zhihu.com/equation?tex=s& alt=&s& eeimg=&1&&依然是不变的。&/b&(注意,它是个标量,&img src=&https://www.zhihu.com/equation?tex=ds%3D%5Csqrt%7Bc%5E2dt%5E2-dx%5E2-dy%5E2-dz%5E2%7D& alt=&ds=\sqrt{c^2dt^2-dx^2-dy^2-dz^2}& eeimg=&1&&)&br&&br&&/p&&p&---------------------------------------------------------------------------------------------------------------------------&/p&&p&&b&第三部分:双生子佯谬&/b&&/p&&p&从几何的角度看双生子佯谬可以多简单呢?&/p&&p&&figure&&img src=&https://pic1.zhimg.com/v2-53fcf93c1a7ee2c550f90_b.jpg& data-rawwidth=&4032& data-rawheight=&3024& class=&origin_image zh-lightbox-thumb& width=&4032& data-original=&https://pic1.zhimg.com/v2-53fcf93c1a7ee2c550f90_r.jpg&&&/figure&A是时空图中的弟弟,B是时空图中坐飞船的哥哥。&/p&&p&时空间隔&img src=&https://www.zhihu.com/equation?tex=ds%5E2+%3D+c%5E2dt%5E2+-+dx%5E2-dy%5E2+-+dz%5E2& alt=&ds^2 = c^2dt^2 - dx^2-dy^2 - dz^2& eeimg=&1&&&br&&/p&&p&弟弟的时空间隔&img src=&https://www.zhihu.com/equation?tex=s_%7BA%7D%5E2+%3D+c%5E2%28t_%7B2%7D-t_%7B0%7D%29%5E2& alt=&s_{A}^2 = c^2(t_{2}-t_{0})^2& eeimg=&1&&&br&&/p&&p&哥哥的时空间隔&img src=&https://www.zhihu.com/equation?tex=s_%7BB%7D%5E2+%3D+c%5E2%28t_%7B2%7D-t_%7B0%7D%29%5E2-v%5E2%28t_%7B2%7D-t_%7B0%7D%29%5E2& alt=&s_{B}^2 = c^2(t_{2}-t_{0})^2-v^2(t_{2}-t_{0})^2& eeimg=&1&&&/p&&p&所以&img src=&https://www.zhihu.com/equation?tex=s_%7BB%7D%3Cs_%7BA%7D& alt=&s_{B}&s_{A}& eeimg=&1&&&/p&&p&又因为t2时刻与t0时刻的空间间隔为零,所以&img src=&https://www.zhihu.com/equation?tex=t_%7BB%7D%3Ct_%7BA%7D& alt=&t_{B}&t_{A}& eeimg=&1&&,哥哥更年轻。&/p&&p&end&/p&&p&--------------------------------------------------------------------------------------------------------------------------&/p&&p&&b&第四部分:相对论力学&/b&&/p&&br&&p&所谓几何观点下的狭义相对论,无非就是把时间和空间挪一块作为一个整体的双曲几何问题来研究。找出那些在双曲几何上与参考系无关的白菜。再&b&用那些不变量重写物理方程,这样一来物理方程就不依赖于参考系了。&/b&(然后就可以偷懒不做参考系变换啦~\(≧▽≦)/~) 。&/p&&p&我们现在有了&img src=&https://www.zhihu.com/equation?tex=s& alt=&s& eeimg=&1&&这个不变量, 怎么找出其它不变量呢?有一个立即就能想到的,光速&img src=&https://www.zhihu.com/equation?tex=c& alt=&c& eeimg=&1&&,光速不随参考系变化是相对论的基本假设。&/p&&p&它们两位一除又能得到一个不变时间,叫做固有时&img src=&https://www.zhihu.com/equation?tex=d%5Ctau+%3D+%5Cfrac%7Bds%7D%7Bc%7D+& alt=&d\tau = \frac{ds}{c} & eeimg=&1&&。它的物理意义是观测者相对于自己观测到的自己的时间。&/p&&p&还有一个就是静止质量&img src=&https://www.zhihu.com/equation?tex=m_%7B0%7D& alt=&m_{0}& eeimg=&1&&,这是定死的,没什么好说的。&/p&&p&力学中的不变量大概就这些。然后除了不变量,我们也希望找出那些坐标变换关系和坐标轴&img src=&https://www.zhihu.com/equation?tex=dx_%7B%5Cmu%7D& alt=&dx_{\mu}& eeimg=&1&&一模一样的量,这些量叫协变矢量。找协变矢量的好处是:如果我们物理公式有这样的形式:&img src=&https://www.zhihu.com/equation?tex=A_%7B%5Cmu%7D%3D+f%28B_%7B%5Cmu%7D%29& alt=&A_{\mu}= f(B_{\mu})& eeimg=&1&&. 如果A,B都是协变矢量。那么在做坐标变换的时候,由于A,B的变换关系都和坐标轴的一模一样,所以A,B的变换关系显然也一模一样。于是左右抵消,&b&我们关于协变矢量的物理公式&img src=&https://www.zhihu.com/equation?tex=f%28%29& alt=&f()& eeimg=&1&&就可以在坐标变换下保持不变。&/b&这样一来物理公式就不用管参考系了。跟我们开始的偷懒目的是一致的。&/p&&p&怎么构造协变矢量呢?最简单的办法,用四维坐标矢量&img src=&https://www.zhihu.com/equation?tex=dx_%7B%5Cmu+%7D+& alt=&dx_{\mu } & eeimg=&1&&除以不变量呀!&/p&&p&比如用四维坐标矢量&img src=&https://www.zhihu.com/equation?tex=dx_%7B%5Cmu+%7D+& alt=&dx_{\mu } & eeimg=&1&&除以固有时可以自然定义出四维速度&img src=&https://www.zhihu.com/equation?tex=U_%7B%5Cmu%7D+%3D+%5Cfrac%7Bdx_%7B%5Cmu%7D+%7D%7Bd%5Ctau%7D& alt=&U_{\mu} = \frac{dx_{\mu} }{d\tau}& eeimg=&1&&。PS:它的长度&img src=&https://www.zhihu.com/equation?tex=%5Csqrt%7B+U_%7B%5Cmu%7DU%5E%7B%5Cmu%7D+%7D& alt=&\sqrt{ U_{\mu}U^{\mu} }& eeimg=&1&&也是个不变量,不依赖于参考系。&/p&&br&&p&乘上不变的静止质量&img src=&https://www.zhihu.com/equation?tex=m_%7B0%7D& alt=&m_{0}& eeimg=&1&&又能得到四维动量&img src=&https://www.zhihu.com/equation?tex=p_%7B%5Cmu%7D%3D+m_%7B0%7DU_%7B%5Cmu%7D& alt=&p_{\mu}= m_{0}U_{\mu}& eeimg=&1&&,这个四维动量的时间分量与系统总能量联系,空间分量是动量。也就是说&b&以前的能量和三维动量只是这个四维动量的不同分量而已&/b&。在相对论中,能量和三维动量与参考系相关,但这个四动量的平方却不依赖于参考系。从这里我们还可以得到著名的&b&相对论的能动量关系: &/b&&img src=&https://www.zhihu.com/equation?tex=E%5E2+%2B+p%5E2c%5E2+%3D+m_%7B0%7D%5E2c%5E4& alt=&E^2 + p^2c^2 = m_{0}^2c^4& eeimg=&1&&, (经典力学是:&img src=&https://www.zhihu.com/equation?tex=E+%3D+%5Cfrac%7Bp%5E2%7D%7B2m_%7B0%7D%7D& alt=&E = \frac{p^2}{2m_{0}}& eeimg=&1&&)&/p&&p&最后一个量是&img src=&https://www.zhihu.com/equation?tex=K_%7B%5Cmu%7D%3D+%5Cfrac%7Bdp_%7B%5Cmu%7D%7D%7Bd%5Ctau%7D& alt=&K_{\mu}= \frac{dp_{\mu}}{d\tau}& eeimg=&1&&,叫做四维力。和其它小伙伴一样,它是一个四维协变矢量,满足洛伦兹变换下的与坐标的协变。&/p&&br&&br&&p&自由粒子在经典力学中的牛顿运动方程是&/p&&img src=&https://www.zhihu.com/equation?tex=%5Cfrac%7Bdp%28x%2Cy%2Cz%29%7D%7Bdt%7D%3D0& alt=&\frac{dp(x,y,z)}{dt}=0& eeimg=&1&&&p&这个方程很糟糕。为什么呢?因为分子分母都不是协变矢量。变一下坐标系,方程的形式会因为洛伦兹变换的关系变得面目全非。而如果像经典力学一样继续强行沿用同样的方程形式。这就相当于在该做洛伦兹变换的地方强行引入了伽利略的坐标变换。方程的物理预言自然就错了。&/p&&p&要把它改成洛伦兹变换下不变的方程形式,把物理量改成协变矢量就行了。因此它的修正为&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Cfrac%7Bdp_%7B%5Cmu%7D%7D%7Bd%5Ctau%7D%3D+0& alt=&\frac{dp_{\mu}}{d\tau}= 0& eeimg=&1&&,&/p&&p&它表明虽然能量和动量不一样了,但和经典情况类似的是,自由粒子在时空图上也是一条直线。&/p&&br&&p&受外力的经典牛顿运动方程是&/p&&img src=&https://www.zhihu.com/equation?tex=F+%3D+%5Cfrac%7Bdp%28x%2Cy%2Cz%29%7D%7Bdt%7D& alt=&F = \frac{dp(x,y,z)}{dt}& eeimg=&1&&&p&依然不是协变的形式。应该修正为&/p&&img src=&https://www.zhihu.com/equation?tex=K_%7B%5Cmu%7D%3D+%5Cfrac%7Bdp_%7B%5Cmu%7D%7D%7Bd%5Ctau%7D& alt=&K_{\mu}= \frac{dp_{\mu}}{d\tau}& eeimg=&1&&&p&&b&基本上这个公式就是所有的相对论力学了。&/b&修正后,受恒定外力的粒子在相对论的时空图是一条双曲线,而经典情况是一条抛物线。&/p&&br&&p&---------------------------------------------------------------------------------------------------------------------------&/p&&p&&b&第五部分:相对论电动力学&/b&&/p&&p&和上一部分一模一样的思路。经典的麦克斯韦方程组是&/p&&img src=&https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D%0A%26%5Cnabla%5Ccdot%5Cbm%7BE%7D%3D%5Cfrac%7B%5Crho%7D%7B%5Cvarepsilon_0%7D%5C%5C%0A%26%5Cnabla%5Ccdot%5Cbm%7BB%7D%3D0%5C%5C%0A%26%5Cnabla%5Ctimes%5Cbm%7BE%7D%3D-%5Cfrac%7B%5Cpartial%5Cbm%7BB%7D%7D%7B%5Cpartial+t%7D%5C%5C%0A%26%5Cnabla%5Ctimes%5Cbm%7BB%7D%3D%5Cmu_0%5Cbm%7BJ%7D%2B%5Cmu_0%5Cvarepsilon_0%5Cfrac%7B%5Cpartial%5Cbm%7BE%7D%7D%7B%5Cpartial+t%7D%0A%5Cend%7Balign%7D& alt=&\begin{align}
&\nabla\cdot\bm{E}=\frac{\rho}{\varepsilon_0}\\
&\nabla\cdot\bm{B}=0\\
&\nabla\times\bm{E}=-\frac{\partial\bm{B}}{\partial t}\\
&\nabla\times\bm{B}=\mu_0\bm{J}+\mu_0\varepsilon_0\frac{\partial\bm{E}}{\partial t}
\end{align}& eeimg=&1&&&br&&p&此处引入一个黑科技:&/p&&img src=&https://www.zhihu.com/equation?tex=F_%7B%5Cmu%5Cnu%7D%3D%5Cleft%28%5Cbegin%7Barray%7D%7Bcccc%7D%0A0+%26+%5Cfrac%7BE_x%7D%7Bc%7D+%26+%5Cfrac%7BE_y%7D%7Bc%7D+%26+%5Cfrac%7BE_z%7D%7Bc%7D+%5C%5C%0A-%5Cfrac%7BE_x%7D%7Bc%7D+%26+0+%26+-B_z+%26+B_y%5C%5C%0A-%5Cfrac%7BE_y%7D%7Bc%7D+%26+B_z+%26+0+%26+-B_x%5C%5C%0A-%5Cfrac%7BE_z%7D%7Bc%7D+%26+-B_y+%26+B_x+%26+0%5C%5C%0A%5Cend%7Barray%7D%5Cright%29& alt=&F_{\mu\nu}=\left(\begin{array}{cccc}
0 & \frac{E_x}{c} & \frac{E_y}{c} & \frac{E_z}{c} \\
-\frac{E_x}{c} & 0 & -B_z & B_y\\
-\frac{E_y}{c} & B_z & 0 & -B_x\\
-\frac{E_z}{c} & -B_y & B_x & 0\\
\end{array}\right)& eeimg=&1&&&br&&p&我并没有做任何实际操作,只是定义了一个怪模怪样的东西&img src=&https://www.zhihu.com/equation?tex=F_%7B%5Cmu%5Cnu%7D& alt=&F_{\mu\nu}& eeimg=&1&&,它叫场强张量。(其实此处可展开,有很多漂亮的结构,但貌似和主线关系不大,遂弃)&/p&&br&&p&然后我们可以直接计算证明,麦克斯韦方程组的第一个和第四个方程等价于:&/p&&img src=&https://www.zhihu.com/equation?tex=%5Cpartial_%5Cmu+F%5E%7B%5Cnu%5Cmu%7D%3DJ%5E%5Cnu& alt=&\partial_\mu F^{\nu\mu}=J^\nu& eeimg=&1&&&br&&p&(&img src=&https://www.zhihu.com/equation?tex=J%5E%5Cmu%3D%28%5Crho%2CJ_x%2CJ_y%2CJ_z%29& alt=&J^\mu=(\rho,J_x,J_y,J_z)& eeimg=&1&&,叫做电流四矢量)&br&&/p&&p&第二个和第三个方程等价于:&/p&&img src=&https://www.zhihu.com/equation?tex=%5Cpartial_%5Cmu+F_%7B%5Cnu%5Crho%7D%2B%5Cpartial_%5Cnu+F_%7B%5Crho%5Cmu%7D%2B%5Cpartial_%5Crho+F_%7B%5Cmu%5Cnu%7D%3D0& alt=&\partial_\mu F_{\nu\rho}+\partial_\nu F_{\rho\mu}+\partial_\rho F_{\mu\nu}=0& eeimg=&1&&&br&&p&而这两个关于&img src=&https://www.zhihu.com/equation?tex=F_%7B%5Cmu%5Cnu%7D& alt=&F_{\mu\nu}& eeimg=&1&&的方程都是洛伦兹协变的。&br&&/p&&p&也就是说,&b&经典麦克斯韦方程组自动满足相对论的洛伦兹协变性!&/b&&/p&&p&并且一件更好玩的事情是,既然&img src=&https://www.zhihu.com/equation?tex=F_%7B%5Cmu%5Cnu%7D& alt=&F_{\mu\nu}& eeimg=&1&&的两个方程都是洛伦兹协变的,那我就做做洛伦兹变换看看能得到什么?&/p&&p&我们令&/p&&img src=&https://www.zhihu.com/equation?tex=x_%7B%5Cmu%7D%27+%3D+a_%7B%5Cmu%5Cnu%7Dx_%7B%5Cnu%7D& alt=&x_{\mu}' = a_{\mu\nu}x_{\nu}& eeimg=&1&&&p&&img src=&https://www.zhihu.com/equation?tex=a_%7B%5Cmu%5Cnu%7D& alt=&a_{\mu\nu}& eeimg=&1&&是洛伦兹变换的变换矩阵。&br&&/p&&p&那么&img src=&https://www.zhihu.com/equation?tex=F_%7B%5Cmu%5Cnu%7D& alt=&F_{\mu\nu}& eeimg=&1&&作为协变二阶张量的变换关系为&/p&&img src=&https://www.zhihu.com/equation?tex=F_%7B%5Cmu%5Cnu%7D%27%3Da_%7B%5Cmu%5Ctau+%7Da_%7B%5Cnu%5Ckappa+%7DF_%7B%5Ctau%5Ckappa+%7D& alt=&F_{\mu\nu}'=a_{\mu\tau }a_{\nu\kappa }F_{\tau\kappa }& eeimg=&1&&&br&&p&带入&/p&&img src=&https://www.zhihu.com/equation?tex=%5Cpartial_%5Cmu+F%5E%7B%5Cnu%5Cmu%7D%3DJ%5E%5Cnu& alt=&\partial_\mu F^{\nu\mu}=J^\nu& eeimg=&1&&&br&&img src=&https://www.zhihu.com/equation?tex=%5Cpartial_%5Cmu+F_%7B%5Cnu%5Crho%7D%2B%5Cpartial_%5Cnu+F_%7B%5Crho%5Cmu%7D%2B%5Cpartial_%5Crho+F_%7B%5Cmu%5Cnu%7D%3D0& alt=&\partial_\mu F_{\nu\rho}+\partial_\nu F_{\rho\mu}+\partial_\rho F_{\mu\nu}=0& eeimg=&1&&&br&&p&(一大波我写了你肯定也不会看的计算= =#)&/p&&p&得到&/p&&p&&img src=&https://www.zhihu.com/equation?tex=E%27_%7B%2F%2F%7D+%3D+E_%7B%2F%2F%7D%2C+B%27_%7B%2F%2F%7D+%3D+B_%7B%2F%2F%7D& alt=&E'_{//} = E_{//}, B'_{//} = B_{//}& eeimg=&1&&
(平行于运动方向的电场和磁场。)&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=E%27_%7B%5Cbot+%7D+%3D+%5Cfrac%7B%28E+%2B+v%5Ctimes+B%29_%7B%5Cbot+%7D%7D%7B%5Csqrt%7B1-%5Cfrac%7Bv%5E2%7D%7Bc%5E2%7D%7D%7D%2CB%27_%7B%5Cbot+%7D+%3D+%5Cfrac%7B%28B+-+%5Cfrac%7Bv%7D%7Bc%5E2%7D%5Ctimes+E%29_%7B%5Cbot+%7D%7D%7B%5Csqrt%7B1-%5Cfrac%7Bv%5E2%7D%7Bc%5E2%7D%7D%7D& alt=&E'_{\bot } = \frac{(E + v\times B)_{\bot }}{\sqrt{1-\frac{v^2}{c^2}}},B'_{\bot } = \frac{(B - \frac{v}{c^2}\times E)_{\bot }}{\sqrt{1-\frac{v^2}{c^2}}}& eeimg=&1&&
( 垂直于运动方向的电场和磁场。)&br&&/p&&br&&p&我要说的是,垂直方向的结果实在是太有意思了!&/p&&p&因为当速度趋于零的时候,&b&它就是那个不做功的洛伦兹力呀!&/b&&/p&&br&&p&至此,电磁现象的所有(非量子)问题,完全解决!&/p&&br&&br&&p&====================================================================&/p&&p&这样,狭义相对论的整体框架基本上就写完了。更高层次的东西,那就上手微分几何直接杀向广义相对论吧。&/p&&p&狭义相对论是一个干净,优雅,精确的理论。很少有人工雕琢的痕迹。所以一直想写它。这篇文章是久违的一篇长文,很满足。&/p&&p&很多物理学家说过,“相对论”是相对论最糟糕的名字。因为事实上它是一个非常绝对的理论。这个理论里面的一切都是静止的。都是在时空这个几何上不变的事物。一切都精细地安排好了。没有随机,没有不确定。原则上也没有不确定的未来。不知道我有没有写出这样的感觉。&/p&&br&&br&&p&不过话说回来,真实世界难道真的是机械的,绝对的么?未来真的是完全确定的么?&/p&&p&嗯哼,我们的下一场live:&b&&a href=&https://www.zhihu.com/lives/750400& class=&internal&&量子力学的基本原理
&/a&&/b&&/p&&p&要来打脸了( ̄ε(# ̄)☆╰╮( ̄▽ ̄///)&/p&
(本文内容与上一场live:互相补充。基础的,简单有趣的内容放live实时互动,更高要求的,需要自己思考的内容放专栏。这样效果比较好。)=====================================================================第一部分:演化观点与…
&figure&&img src=&https://pic3.zhimg.com/v2-8db6b4380bdd8e7ab717a43c9f30ec43_b.jpg& data-rawwidth=&1024& data-rawheight=&768& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&https://pic3.zhimg.com/v2-8db6b4380bdd8e7ab717a43c9f30ec43_r.jpg&&&/figure&&p&上文谈到了像读书一样阅读源码的重要性,今天谈谈如何阅读一份代码。我所谓的一份代码,其范围可能从几千行到数万行,有时甚至可多达数十万行。这些代码作为一个有机体,共同完成某些重要的功能。比如说几个著名的 full fledged web framework,祖师爷 rails,师叔 django 和小师妹 phoenix:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-b3f13a3e4fac_b.jpg& data-rawwidth=&1668& data-rawheight=&1186& class=&origin_image zh-lightbox-thumb& width=&1668& data-original=&https://pic3.zhimg.com/v2-b3f13a3e4fac_r.jpg&&&/figure&&figure&&img src=&https://pic3.zhimg.com/v2-fcc3affdaa911f_b.jpg& data-rawwidth=&1702& data-rawheight=&1010& class=&origin_image zh-lightbox-thumb& width=&1702& data-original=&https://pic3.zhimg.com/v2-fcc3affdaa911f_r.jpg&&&/figure&&figure&&img src=&https://pic1.zhimg.com/v2-199e32b00352caec485dfeb_b.jpg& data-rawwidth=&1658& data-rawheight=&878& class=&origin_image zh-lightbox-thumb& width=&1658& data-original=&https://pic1.zhimg.com/v2-199e32b00352caec485dfeb_r.jpg&&&/figure&&p&三者对比很有意思 - rails / django 的代码数都在 200k 上下,而 phoenix 小了整整一个数量级,仅仅在 20k 左右。实现大致相同的功能,语言的表现力难道差距如此之大?这解释不通。实际上 phoenix 实现的功能,和 rails 对标,应该是 actionpack/actionview 两者加起来约 80k 的代码。而 rails 内嵌的 activemodel/activerecord 应该对标 elixir 的 ecto,恰巧又是 80k 比 20k。这种差异反映了语言表现力的差异,同时也体现了框架的成熟度的区别。&/p&&p&几十 k 体量的代码,就像一本不薄不厚的书,读着既不算太过吃力,也不至于读完意犹未尽。&/p&&p&有些巨型的代码库,如 linux kernel,块头堪比『战争与和平』,代码的规模宏伟到令人绝望,大大超过了我们能够阅读理解的范围。其结果是我们每每下定决心阅读,投入的巨大的精力,却像往一池湖水里投个石子,虽掀起一丝涟漪,但湖面很快就归于平静。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-de391ae2f63972abf3f5a7_b.jpg& data-rawwidth=&1842& data-rawheight=&1684& class=&origin_image zh-lightbox-thumb& width=&1842& data-original=&https://pic1.zhimg.com/v2-de391ae2f63972abf3f5a7_r.jpg&&&/figure&&p&读不下来,我们也不要太绝望,可以分而治之,先定个小目标,每次读一部分,比如 scheduler(20k)或者 memory management(80k)。&/p&&p&在选定合理的代码规模和要阅读的源码后,我们就可以清开书桌,摆上 mac,准备好笔墨纸砚,留出至少一个小时到半天时间,开始徜徉在代码的海洋。&/p&&p&由于上一篇文章(&a href=&https://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzA3NDM0ODQwMw%3D%3D%26mid%3D%26idx%3D1%26sn%3D9d8fedb0aecd05dedc3b%26chksm%3Dbf7daaba56cb4dd611dade9007dac35f73f233cscene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&为什么我们要阅读源码?&/a&)从头至尾将阅读书籍和阅读代码进行对比,很多人会不禁联想本文会否和『如何阅读一本书』进行类比,提供同样的思路:基础阅读,检视阅读,分析阅读,对比阅读。不错,这些读书的方法对读代码非常有参考价值,比如说检视阅读,我们读大型代码项目,也是类似的思路:&/p&&ul&&li&&p&我们会读根目录下的 readme,或者任何看上去撩拨着你让你戳它的文件。这就跟书本的「序」一样,能够帮你更进一步了解这份代码的意图;&/p&&/li&&li&&p&接下里我们目光需要聚焦在代码的目录结构,和每个源码的文件名。他们就像书本的目录页。如果每个目录下有 readme,也可快速阅读之。很多语言和框架,有约定俗成的目录结构(Convention by Contract),因此,通过目录我们就可以快速知道哪些是可以略过的部分,比如 django 的 management/commands 目录,elixir 的 mix/tasks 目录,这些目录,承载着支线剧情,需要的时候,或者闲得无聊时再读也不迟;&/p&&/li&&li&&p&然后我们开始从入口梳理主线。不同语言和框架的主线不太一样,比如 C 的入口是 main(),erlang/elixir otp app 的入口是 app:start,nodejs 往往是根目录下的 index.js,等等。一般而言,application 的主线比较清晰,一路下来,会走到一个 mainloop,而 framework 的主线会晦涩一些,因为 framework 往往是 application 抽象出来的部分。&/p&&/li&&/ul&&p&但本文不会过多这样去对比 —— 大家真有兴趣,何不亲自读读那本书(读过的请带着读代码的角度再读一遍)呢?毕竟,它更加完备,更加系统。&/p&&p&我想通过另一个角度 —— 阅读的场景来谈谈如何阅读。谈到场景,很多人会联想到一本著名的书:Linux 内核场景分析。该书的作者显然把握了阅读代码的实质:循着一条线索,进行端到端的一个自成体系的内容的阅读。不同场景下,我们已知的信息,未知的信息,通过阅读想要达到的目标是不一样的,显然,方法也不尽相同。这就和读书一样:想要让自己明智,读史;想要让自己灵秀,读诗;想要让自己周密,研习数学;想要让自己深刻,攻读哲学等等。&/p&&p&接下来,本文就从若干阅读代码的场景开始,讨论个人的读代码的一点微不足道的心得。&/p&&p&场景一:为了破案而阅读代码&/p&&p&这是我们最主要的阅读代码的场景。工作中,免不了用各种各样的开源系统(别人的代码)。使用的过程中,你会遇到各种奇葩的问题,这些问题可能源于对文档的理解不够,或者从网上抄一个已有的,并不完全适合你使用场景的样例,或者是真的撞上了八阿哥。在想方设法解决的过程中,如果同事帮不上忙,google/stackoverflow 不够给力,论坛上各种「急,在线等」也无人理会,你会开始抓狂,仿佛被摄魂怪缠上了一般,生活中的各种美好,希望,都开始离你远去。&/p&&p&这时,你不得不像 CSI 中的警探一样,顺着一点蛛丝马迹,开始剖析代码,试图从迷雾中还原真相。你会抛开一切纷扰和杂音,集中精力,带着线索,循着问题,读且只读和解决问题直接相关的代码。这种状态,我管它叫「猎手模式」—— 我们有如非洲草原上追逐离群斑马的狮子,把身上燃起的小宇宙集中于一点,眼睛紧盯猎物奔走的方向,腿如疾风,势如闪电,心中不断地盘算着雷霆一击究竟用锁喉,打脸抑或拉后腿胜算更大。道路上的石子划了脚,痛;飞奔时撞上了幺蛾子,烦,但这都不是事儿。就算远远的乞力马扎罗山上难得地挂上了两道彩虹,煞是美丽,自拍后发朋友圈定能破百赞,你也无暇顾及这些并不重要的细节。&/p&&p&专注,集中力量攻击且仅攻击一点是这样场景下阅读代码的主要方式。&/p&&p&拿我遇到的 nginx cache 的问题来举个栗子。一年前,当我接手 Tubi TV 的性能较低且很难维护的 API 系统后,虽打定主意日后重写,但摆在面前的,刻不容缓的问题是提高性能。应用层可以施展的空间不大(数据已经在 redis 里),所以只能在 web 层打主意。在 HAProxy 和 nginx cache 之间,我选择了后者, 因为 nginx 已经在当时的生产环境下大量使用。我虽然没用过 nginx cache,但启用 nginx cache 并不是难事,照着文档设置好 cache 的路径和大小等参数后,在需要使用 cache 的 location 下,设置 cache key 并使能即可,我本地的简单的测试运行正常。然而,在生产环境中,本该命中的请求却一直处在 miss 的状态。我一筹莫展,尝试了网上搜到的各种方案无果。最终,我决定自己编译一个打开 DEBUG 开关的 nginx 版本(--with-debug),记录更多的日志,然后对着源码找问题。&/p&&p&nginx cache 及 upstream 里和 cache 相关的代码量并不算多,几千行,我快速过了一下,然后就着日志上的内容寻找相关的处理流程,并在几个大的 bailout 分支猜想可能出现的情景。由于 nginx debug log 还是不够详细到满足我的需求,我在这些没有被顾及到的分支上各自加了调试代码,重新编译,运行。&/p&&p&这个过程中,「猜」起到了很大的作用。我记得本科时的数学老师 —— 一个可爱的小老头 —— 点名提问对方答不上来时,常常挂在嘴边的口头禅是:你猜一下嘛。他总说连蒙带猜也是解题的一种思路,伟大的数学家同时也是伟大的猜想家。&/p&&p&我们读代码时,猜文件名,函数名,变量名的意图,猜某个分支的意图,猜某段代码的意图,最终结合运行的结果,打印出来的调试信息来印证我们的猜测。这是读者和作者间有趣的猫鼠游戏。读得越多,猜得越多,印证得越多,形成一个有效的 feedback loop(read - guess - verify),你下次猜测成功的几率就越大。&/p&&p&最终,问题被我定位出来 —— 它是两三处 configuration 未正确配置的问题。stackoverflow 上的答案是部分正确的,它解决了绝大多数人的问题 —— 没有 ignore cache control 相关的 header 几乎被每个初次使用者忽略了,它也是我的配置问题之一。但之所以这个答案没能解决我的问题,是因为我们生产环境中的 nginx 有个不起眼的配置 disable 了 proxy buffer,从而导致 nginx 直接跳过 cache。&/p&&p&从以上的过程中,我们抽象一下,看看为了破案而阅读代码要注意什么:&/p&&ol&&li&&p&带着线索,从一堆代码中找出和问题相关的代码。nginx cache 的例子中,线索是 proxy 的 upstream,cache 总不能命中,所以出问题的代码和 cache,proxy,upstream 有关。源码目录里一翻,就能挑出需要看的文件。由于问题在 cache 上,在挑出的文件中,具体看 cache 相关的函数名,宏名,以及代码。&/p&&/li&&li&&p&专注阅读挑出来的内容,忽略不相干的噪音。在阅读的过程中,着力寻找潜在的触发问题的路径,然后动用「我猜我猜我猜猜猜」大法,加调试信息。&/p&&/li&&li&&p&编译运行修改过的代码,复现问题,分析调试信息,然后,bingo,恭喜你答对了!请进入第 5 步。&/p&&/li&&li&&p&没答对,请回第 1 步。别急,这不是高考,在老板忍无可忍炒你鱿鱼之前,你一直拥有再来一瓶的机会。&/p&&/li&&/ol&&p&还有个关键的第 5 步,我单拎出来说。很多时候我们轮回数次,终于在第三步 bingo 后快乐地像是刚刚 K.O. 了对手的春丽,夹着腿跳将起来,左右手在空中一齐比划着二,得意忘形,以至于忘记了执行第 5 步。&/p&&p&喜悦是短暂的,记忆也是短暂的。整个过程你的目标是如此清晰,执行力无比强大,为达到目的「不择手段」。三天后老板问你,小程啊,你很棒啊。你用了什么手段征服了这个无比难缠的八阿哥?这时你拼命追忆,却像拿筛子盛水,忙乱半天一无所获。你开始怀疑人生:三天前的我和现在的我究竟是不是一个人?&/p&&p&所以关键的第 5 步是:复盘。解决问题后,别着急接受同事们的致谢和女(男)神的秋波。趁着那坨记忆还热气腾腾,抄起 evernote(或者 xxx),把整个过程用最简洁的方式记录下来 —— 关键代码,关键路径,到达终点的整个猜测过程,以及那些日志验证了猜测是对的,哪些日志验证了猜测走不通(恭喜你 —— console 或者 terminal 在这个时候应该还没关),总之,你在不择手段的过程中用过的一切手段,都应该像记流水账一样记录下来。最后分析总结:&/p&&ul&&li&&p&这个问题的 root cause 是什么?触发它的代码的流程是什么?&/p&&/li&&li&&p&在读代码的过程中,哪些地方我猜对了,哪些没猜对?&/p&&/li&&li&&p&有功夫的话,代码的哪个部分是值得细细品读把玩的?&/p&&/li&&li&&p&下次再出现类似的问题,我该怎么更快地从源码中定位出问题?&/p&&/li&&/ul&&p&在这种「破案」般阅读代码的历程中,如果没有复盘,你 70% 的功夫白费了 —— 你花了不少时间,读了不少代码,除了一个好的结果外,并无太大的收获。可惜的是,绝大多数工作场景,我们都略过了这步。我自己也是(深刻检讨中)。写这个章节时,我搜了搜我的 evernote,翻了翻我的邮件,除了去年初有封邮件只言片语介绍了我使能了 nginx cache 外,再无其他记录。好在我当时解决完问题顺便又读了些 nginx cache 的代码,有些许印象,所以还能把它搬出来做例子。&/p&&p&复盘帮你把这样的信息沉淀下来,让你有机会回顾,进而组织和固化成上篇文章中所说的知识。这样的内容累积多了,慢慢你的头上就会顶起一个光环,光环上傲娇地写着:砖家。&/p&&p&场景二:为了明理而阅读代码&/p&&p&场景一所述的读代码方法是被动的,为了对付问题而读,是大部分人精进代码的唯一途径。这就好比英雄无敌里你就做个守成之主,收收矿,屯屯兵,从不主动招惹野怪,只等着敌人来进攻。这样三个月下来,就打了几仗,稳则稳矣,无奈经验值增长太慢。&/p&&p&要想涨快点怎么办?主动出击啊!计算机领域的很多算法,基础知识,理论,在看过书,读过文章后我们都似懂非懂,这时,阅读代码就是最快地巩固和加深理解的方式:&/p&&ul&&li&&p&算法:bloom filter 究竟怎么实现的?怎么样把 bandit 算法在自己的系统上做简单的推荐?ossip 协议实际的生产环境的代码是什么样子的?Linux kernel 如何实现 O(1) scheduler?&/p&&/li&&li&&p&基础知识:一个完整的涵盖 HTTP 1.1 协议的 REST API framework 如何实现?一个 packet 从 OS 的 driver 是如何一路送上 application 的?什么是 zero copy?Linux kernel 如何实现 zero copy?&/p&&/li&&li&&p&理论:啥是 IoC / DI / Pub Sub?各种 framework 都是咋实现这些设计模式的?supervisor 这个 behavior 背后的实现是如何的?&/p&&/li&&/ul&&p&这个过程是一个正反馈,是马太效应累积地过程。你读的书多,你脑子里的知识点就多,疑问同样也多。这些疑问促使你读相关的代码去印证和解惑,代码读多了,又感觉理论知识欠缺,于是周而复始,不断学习下去。反之,书读得少,你脑子里都没存几个问号,也就无所谓读代码去求证了。&/p&&p&以 REST API framework 为例 —— 两年前我还在 Juniper 做 web security 时,需要做一个坚实的 API system。我们知道做网络的,干起事来要比做互联网严谨得多(所以也慢得多),于是我花了好些时间读了 RFC 2616 及其后续的修订()。然后就是对 API framework 进行选型,找个合适的。当时我正好在研究 clojure,便拿了 liberator 来看。Liberator 受 erlang 下的 webmachine 启发,用简单的 macro 把 decision tree 实现得很优雅。后来我又扫了下 webmachine 的 decision tree,pattern matching + 递归,非常漂亮。可惜当时我在的团队思想比较僵化,眼里只容得下 python。无奈我退而求其次,选用了 eve,一个 python 下的 rest API framework。eve 的代码质量中规中矩,平铺直叙,明显像是你我写出的代码的模样。&/p&&p&详细讲讲我读 webmachine 的过程。我读 webmachine,完全是 liberator 的引荐,liberator 的作者说其 decision tree 来自于 webmachine,并附了图。这时的我就像刚练了李小龙的截拳道,听闻这功夫源自咏春,一下子就心痒痒欲探探咏春的虚实了。&/p&&p&webmachine 的代码很短,只有 4700 行。循着文件名很快就能找到 webmachine_decision_core.erl,这是要阅读的主体内容,约 800 行。这 800 行代码,我们可以将其分成三个部分:头 150 行,decision tree 的架子;中间 300 多行,是具体的一个个 decision 的实现;剩下的两百行,是辅助函数。&/p&&p&每个 decision 的流转见 &a href=&https://link.zhihu.com/?target=https%3A//raw.githubusercontent.com/wiki/webmachine/webmachine/images/http-headers-status-v3.png& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&下图&/a&:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-cdc140763ec_b.jpg& data-rawwidth=&3138& data-rawheight=&2184& class=&origin_image zh-lightbox-thumb& width=&3138& data-original=&https://pic1.zhimg.com/v2-cdc140763ec_r.jpg&&&/figure&&p&这里 atom 的命名完全跟着图走,比方说 v3b13 这个 atom,含义是 v3 版本的图,b 列 13 行的 decision node。这是第一个 decision,如果 service available,则整个 flow 继续往下走,否则返回 503 service unavailable。&/p&&p&明白了这一点,按图索骥,代码的执行流程非常好懂。接下来的事情就很简单了 —— 顺着流程一个一个看 decision node 的代码,RFC 2616 变得鲜活起来,在你眼前跳动。我们再看一个例子:precondition check,是 v3g11:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-3aa10bb264e86b7d7b0ef_b.jpg& data-rawwidth=&1612& data-rawheight=&308& class=&origin_image zh-lightbox-thumb& width=&1612& data-original=&https://pic4.zhimg.com/v2-3aa10bb264e86b7d7b0ef_r.jpg&&&/figure&&p&这段代码从 http header 里读出 if-match header 里的 etags 列表,然后通过 resource_call 调用 generate_etag,来生成 etag,和 etags 里的任意一项匹配,如果匹配,跳转到 v3h10,否则 412 preconditional failed。webmachine 怎么知道如何生成 etag 呢?这便是 framework 的功力了,它抽取并实现协议的公共的部分,而将业务逻辑延递给使用 framework 的 application。换句话说,generate_etag 是 application 要实现的 callback。这便是 IoC。&/p&&p&这个代码解释到这里,明白 HTTP 协议中 etag 作用的人,或者对 concurrency control 方案清楚的人自然一目了然;但我相信不少人会很难理解它的应用场景。再进一步解释一下:比如小明和小红是程序人生的两个管理员,他们通过 API 同时从数据库中获取到程序人生的基本信息(名称,描述等) v1。小明把程序人生的名字改成了「序员人生」,调用 PUT API 成功修改数据为 v2。小红也同时修改这个数据,但她还是使用原有的 v1 的数据进行修改,结果提交时把小明的修改覆盖了。这是个 concurrency control 的经典场景 —— 令

我要回帖

更多关于 CPU降电压 的文章

 

随机推荐