thphd 在小组 2047
动态 帖子 396 评论 2047 短评 2 收到的赞 送出的赞
  1. thphd   在小组 2047 回复文章

    【分享】如何雇佣成功人士假扮自己去参加高中同学聚会并让所有人对你刮目相看

    这个也给我推了。

    比较贴切的标题是《不想参加高中同学聚会,所以请了一个长得像我的帅哥替我去》

  2. thphd   在小组 2047 回复文章

    【一席】可是没有精彩的杀马特,只有生命极其贫乏的杀马特

    一席演讲在此

    https://www.bilibili.com/video/BV1uy4y1k7t9

    原片暂时找不到

  3. thphd   在小组 2047 发表文章

    刀下阅尸

    有些人认为,社区就是观点的集合:一个社区,就是一帮人聚在一起发表相似的观点。

    比如有人说品葱是支黑聚集地,也有人说2047是左左聚集地,其实都是在以观点对社区分类。

    人的观点是可以变化的,任何人都可以在任何时间持有任何观点。屏幕的另一头可能是猫、狗或者机器人。习近平也可以说他支持民主法治。因此针对他人观点的讨论,绝大多数是浪费时间。

    “如何看待谁对什么东西的何种言论”,凡是喜欢提这种问题的人,都犯了“以观取人”的错误。


    你跟一个社区里的其他人观点不合,于是你决定自己开一个社区,这个新的社区人气通常不会好。

    因为大多数人根本不在乎你的观点。你不满共产党,我也不满共产党,所以我们两个就能成为好朋友一起玩耍吗?如果世界上有这么便宜的事情,那每个人都可以拥有无数的朋友了。

    你不满品葱,我也不满品葱,所以我们两个就能成为好朋友一起玩耍吗?同理。按照鹿儿的说法,这样的友情相当塑料。

    没有人会因为你粉红或者反共就成为你的朋友。大家在乎的是你这个人怎么样,是不是勤学好问,是不是乐于助人,会不会见利忘义……之类的道德品质。

    观点会变,但人不会变。大家是跟人做朋友,不是跟观点做朋友。对一个社区而言,人比观点更值钱。如果把观点看得比人更重要,让观点凌驾在人之上,就犯了“文化大革命”的错误。

    新品葱的灭亡,是因为他们保护观点,却牺牲了人。

  4. thphd   在小组 2047 回答问题

    帮一个朋友问的问题(真的是朋友,不是我)

    屠穆通常发生在穆斯林移民多的国家,排华通常发生在华人移民多的国家

    不想被种族主义者骚扰的话,可以去北欧。

    “为什么我要为共产党和NMSLESE等人的罪恶买单?“”难道我自己做的再好,也会因为种族被攻击?“”我一直认为只要自己善良就可以获得别人的善良。但是外国人却只想用核武器核平中国!“”甚至有黑人希望继续歧视亚裔,因为这是上帝的意愿?”“现在真的是不同种族互相残害的时候吗?”“我对全世界都很失望,为什么要这么对待我们这些善良的中国人,剩下的那些中国人也是,为什么要对世界这样,害得我们正常人不能好好生活?”

    参见刘仲敬《祖父学》

  5. thphd   在小组 2047 回复文章

    我觉得自己对这个世界现在的"混乱"负有一定责任

    长此以往,我想只会有越来越多self-righteous的人出现,人与人之间的交流势必只会更加困难吧。

    观念上存在不可调和的矛盾,最终通过战争决胜负,胜利者的叙事成为官方正史,失败者的叙事被丢进垃圾桶——人类社会一直以来都是这样的,前有三大宗教,后有希特勒斯大林。

    提高算法效率,降低追踪成本,更好地构造信息茧房,或许让楼主联想到苏联的国家机器提高了独裁者杀人的效率,降低了消灭异己的成本。同时楼主考虑到自己或者家人也有某天被投入gulag的风险,因此对自己的做法深感不安。

    那么不妨设想一下,有什么机制可以限制美俄之间互丢核弹?考虑到这个可能性,全世界的原子能专家每天都得提心吊胆呢。

    我认为是教育。如果美国不是一个人均高中毕业的国家,如果美国没有那么多所谓左的大学毕业生,美式民主选出来的人只会比川普更极端。注射消毒水也许不能解决武汉肺炎,但是解决中美洲移民还是绰绰有余的。

    很多人认为扔核弹只是弄脏别人的国家,对自己没什么影响。其实就是教育不足导致的无知。

    美国现在有很多家长拒绝给孩子打疫苗,同理。

    沉迷黄赌毒,同理。

    所谓的信息茧房,就和黄赌毒、互扔核弹、拒绝打疫苗等人类顽疾一样,只能通过教育或刑法解决。

    美国在二战期间和结束后,政府、军方发布了很多教育影片,这些影片直到今天仍然有很高的观赏和教育价值(除了部分内容科学上已经过时,如下面这个)。

    youtu.be/WH8AQAgwbY4

    从言论自由的角度,我们似乎并不应该强迫他人接受任何类型的教育。但实践来看,要避免人类重蹈覆辙,教育是除了监狱之外唯一有效的解决方案。中国极端强硬的禁毒政策,从一开始就确定男女平等的宪法,还有九年义务制教育,是中国为数不多可以在美国面前装逼的资本。

    如果楼主是教育部长,开学第一课要改成什么内容呢?

  6. thphd   在小组 2047 回复文章

    DeepL翻译功力鉴赏

    @陈士杰 #111500 严格来说不算错,deputy 约等于 vice,PM约等于Premier,毕竟根据上下文并不能推测这里的副总理是哪个国家的副总理。

  7. thphd   在小组 2047 回复文章

    你如何看待死刑?你支持废除死刑吗?

  8. thphd   在小组 2047 回复文章

    刘润:到底是什么《新规》,暂缓了蚂蚁上市?

    这篇很好,手动赞一个。

  9. thphd   在小组 2047 发表文章

    DeepL翻译功力鉴赏

    鉴赏地址:这里

    宝藏女孩的变种,由于管不住嘴迈不开腿,总是在吃吃吃,肚子经常饱胀,所以就叫饱胀女孩。
    
    A variation of the treasure girl is called the full girl because she can't keep her mouth shut and can't move her legs and is always eating and her stomach is often full.
    
    晚上睡觉前,把文献放在脑袋和枕头之间,知识会从浓度较高的的书本向浓度较低的脑袋渗透。
    
    Before going to bed at night, place literature between your head and pillow, and knowledge will percolate from the more concentrated book to the less concentrated head.
    
    著名NBA火箭队当家球星詹姆斯哈登因其历史级别的造犯规(碰瓷)能力被篮球论坛的网友们戏称为景德镇之子。
    
    The famous NBA Rockets star James Harden was dubbed the son of Jingdezhen by basketball forum users for his historical level of foul-making (clinching) ability.
    
    
  10. thphd   在小组 2047 回复文章

    【重点关注】常熟农商银行群体性肺结节多人肺癌事件追踪

    【GitHub】8mm 常熟农商银行群体性肺结节多人肺癌事件追踪项目

    这标题太糟糕了

    【苏州2.5产业园】常熟农商银行苏州办公室环境有毒,过百名年轻员工全体肺癌,部分员工已切除肺部,如今仍然坚持上班

    这还差不多。不要小看标题的力量。


    已知大楼空气致癌(所以导致大量人肺部结节)。其中一个怀疑方向,是大楼内含有放射性同位素,这可能是因为装修污染导致的,也可能是通风系统被人投毒(钋-210之类的可以了解一下)。石棉不会这么快致癌。

    别说上班了,那栋楼根本就不要回去,如果东西忘在公司都不要回去拿,全身衣物以及携带物品统统扔掉。

    这很有可能是本年度最严重的谋杀/投毒案,请被害者在死前尽快离开公司,不然你们的家人可能会因为来公司找你而罹患不治之症。

    我的答复的完整版,见 https://github.com/csrcbank/8mm/issues/12

  11. thphd   在小组 2047 回复文章

    是匪谍,也做反贼,兼任五毛支黑

    如果要反对共产党,首先你得有一个比共产党更好的替代品,不然就是为反对而反对了。

    有人说要民主,但是他不说具体应该怎么民主,这些人最烦了。

    提不出可行的方案,又不愿意去研究的,占大多数。

    号召大家向陈士杰学习。他至少给出了民主化的一个框架,包括议会应该有多少个代表也计算了。

  12. thphd   在小组 2047 回复文章

    The Rememberer - exurb1a

    exurb1a是youtube上极少有的哲学+科幻+历史+科学+文学+吐槽频道

  13. thphd   在小组 2047 回复文章

    吃亲人的人血馒头做官的现象

    弱势群体在社会上必然占多数,一人一票的结果就是谁最受弱势群体欢迎,大家就选谁。

    亲人死于暴政/非命,能够引起弱势群体强烈共鸣,在民主体制下是非常有效的票引子。

    亲人就是有血缘关系的人,亲人受难约等于本人受难,所以问题的本质是[本人以及与本人有血缘关系的人受难可以获取政治资本]。

    黄之锋的政治资本,最关键是他自己去坐牢那一段。一个政治人物,什么都可以作假,唯牢狱之灾和挨枪子没办法作假。首先证明自己勇敢,其次证明自己在利益上已经划清界限,政治上肯定是加分的。

  14. thphd   在小组 2047 回答问题

    如何评价电影《波拉特2》?

    是我转水的。我确实没看过Borat,而且你那个帖子除了语录没有其他内容,所以转水了。

    准备组织所有人观看学习,然后写800字以上读后感

  15. thphd   在小组 2047 回答问题

    如何在极权主义语境下做一个有趣的人?

    按照罗振宇《罗辑思维》的定义,有趣你得先有料。

    一个人做的事情、见的东西多了,就容易从经验中提取出有趣的东西。

    这样写出来的文章,讲出来的话,就幽默。

    比如说《翻车新闻》,其实就是把社会上发生的新闻,其中有趣的点提取出来。如果对中国社会不了解,就不知道哪些点让中国人觉得好笑,当然也就不可能做出翻车新闻。

  16. thphd   在小组 2047 发表文章

    是匪谍,也做反贼,兼任五毛支黑

    经常有人说我是共匪/共匪的走狗。当然不是每次都用“共匪”这个词。

    比如有一次他跟我说:你为什么要给共产党打工?共产主义的危害有多大你不知道吗?你以为你是赵家人吗?

    有时说得更隐晦一些:你相信共产主义还是资本主义?你是左派还是右派?保守还是自由?你赞成温和改良还是暴力革命?你支持诸夏还是大一统?

    我:我现在很忙

    他:你如果不关心政治,政治就会来关心你

    我:深有体会


    所以我最近就在思考“共匪”这个词的含义。匪就是强盗暴徒,坏人的意思。“共匪”就是“共产党这帮强盗”、“共产党是坏人”的意思。

    “共产党这帮强盗”去年把香港示威者揍了一顿。我在telegram跟香港示威者交流,最常遇到的一种情况是,我说其实我是大陆人,然后他们就把我踢了。

    也有一些比较友善的香港人,愿意跟我交流。他们问我,你在大陆是做什么的。我说我就是一个普通的[删去],想了解香港的情况。没聊两句,他们就问我,你是共产党吗?我说我不是。但是我家人里面有共产党员。

    你跟共产党穿一条裤子、用一双筷子。共产党欺负香港人,你做过什么?我们手足被黑警打到骨折、被强奸,你又做过什么?你除了享受共产党的福利,能做什么?


    跟网友聊起这个事情。

    网友:那你自认是?

    我:自认什么

    网友:就是你认为你自己属于哪一类?比如支持共产主义还是资本主义?还是其他什么主义?

    我:你让我想想。

    我:我觉得,分类是基于定义,而这个定义太主观了。

    我:比如说,我和你,对同一个人进行分类,你认为他是好人,我认为他是坏人。但是汉语辞典它不告诉你具体怎样算好、怎样算坏,而是让每个人自己去判断。每个人的道德观不可能一样,所以世界上没有绝对的好和坏,只有每个人自己的判断。

    我:一个人如果说自己“支持共产党”,说明他认为共产党对他好。如果他认为共产党对他不好,他就会说自己“反对共产党”。所以你看,政治上的分类,不是基于客观现实,而是基于一个人的想法,而一个人的想法是会变化的,可以“胡思乱想”,今天支持共产党,明天反对共产党,今天喊“组织”,明天喊“共匪”,今天是粉红五毛,明天是反贼美分,谁都可以这么干。所以这样的分类,除了掩盖问题的本质,又有什么意义呢?

    网友:共产主义,就是生产资料公有,这个定义应该够客观了。那你认为,生产资料应该公有还是私有?

    我:什么是生产资料?如果机器设备是生产资料,那人的知识经验技能算不算生产资料呢?现代科学认为,人的知识经验技能是存在于大脑中的,而以目前的技术手段,大脑只能是私有的,不可能是公有的。就算你建一座图书馆,把所有的书籍文献都放进去,对所有人开放,由于人的寿命是有限的,不可能每个人都学到一样的知识经验技能,最后每个人的知识经验技能仍然是私有的。除非将来出现一种新技术,可以把所有人的大脑都同步起来。

    我:如果原材料、能源都是生产资料,那这些原材料和能源的最初来源,也就是像太阳这样的恒星,算不算生产资料呢?现代科学认为,地球上的一切能源,包括煤炭石油天然气太阳能风能(潮汐能除外),最初都来源于太阳上的核反应。而以目前的技术手段,太阳只能是公有的,不可能是私有的。就算你建一个戴森球把太阳包起来,把太阳据为己有,由于人的寿命是有限的,太阳还没死你先死了,你死后太阳肯定要让给其他人。除非将来出现一种新技术,可以让你活得比太阳的寿命还久。

    我:换句话讲,人类社会最基本的两种生产资料,一种在人的大脑里,没法公有;一种在天上挂着,没法私有;其他一切生产资料,不管是机器还是原材料,都是前两者按照某种比例结合而成的产物。所以生产资料的完全公有或者完全私有,首先是违背科学规律的。所谓的共产主义国家,到处都在进行对资源的侵占和掠夺,和资本主义有什么区别?所谓的资本主义国家,享受社会福利允许组织工会,和共产主义有什么区别?这些“主义”不过是人们的一厢情愿。在一个国家里,一种生产资料究竟是公有还是私有,往往只是大家脑海里的一种感觉,而不是也不可能基于严谨的定义。

    那些相信“共产主义”或者“资本主义”能够决定一个文明的发展程度的人,通常科学素养都很差(例如肯尼迪家族的一件小事),意识不到矛盾的存在。中国被共产党统治,统治的水平不取决于主义的水平,而取决于领导人的科学素养。江泽民是工程师,他的水平大家看在眼里。胡锦涛提出科学发展观,大家怀念他。现在这个习近平,没有做过一天科学研究,让他管理一个国家肯定要犯错误的,与社会主义还是资本主义没有任何关系。美国是“资本主义”国家,美国总统还不是照样建议大家喝消毒水。

    我:放眼世界来看,决定不同地区文明发展水平最大的因素,正是技术水平和阳光强度。比如说地球南北两极阳光少气温低,不适合粮食生产,所以在南北两极就没有发展出农业文明。而农业条件相仿的地区,文明发展水平就取决于技术水平。没有技术和能源,只靠主义能把南极建设成发达国家吗?

    网友:不是这个意思,我不是问你科不科学,我就想知道你是挺共还是反共嘛。

    我:我是水瓶座的,你猜我是挺共还是反共

  17. thphd   在小组 2047 回复文章

    钟美美所有作品合集时长53分钟

    对这种感觉特别熟悉。我上学的时候也遇到过这样的老师,讲话的方式和视频里面几乎是一模一样。相信这也是为什么这视频这么火。

    中国基层教师有相当一部分是受压迫的。他们出身寒门,费劲一切努力换来一张教师资格证。面对世界的恶意,只有打碎牙齿和血吞。

    唯独在教室里,这批老师可以肆意发泄,体现他们最本真的人性,而且不用担心被学生报复(这在每人一台手机的时代越来越难了)。他们对学生的爱,约等于他们的父母对他们的爱。

    嘴臭的老师和一般泼妇的区别?老师读书多,文化水平高,可以讲一节课不重样。

    为什么我会遇到这种老师?想了一下,要么是因为我学习太不努力,要么是因为我家太不善于搞钱。

    也可能是这样的老师,数量确实是太多了。

  18. thphd   在小组 2047 回复文章

    【待证实】推特的私信系统是最不安全的,能不用中文就不用。

    从技术层面看gfw看到你电脑里的浏览数据,浏览历史的难度并不大。

    捕风捉影传谣,不是第一次了。

  19. thphd   在小组 2047 回复文章

    【重要】10月23日故障通告

    @通音宽依 #110002 搬运可以继续,数据修复完成后不会影响已经发表的新内容。

  20. thphd   在小组 2047 发表文章

    【重要】10月23日故障通告

    美西时间10月23日周五上午,本站合作机房因线路施工,在一部分实例上造成了10秒短暂断电,断电后服务立即恢复,但导致RocksDB数据库文件部分损坏,且无法通过传统方式修复。

    目前本站应急处置小组正在进行数据修复工作(有大概一周的数据需要修复)。

    在数据修复完成以前,本站将不会显示10月13日至10月23日发表的内容。

    在此期间用户可如常使用本站,包括发布和回复内容。修复后的数据将合并至当前数据库中,不会影响用户已经发表的内容。

    为此给本站用户带来诸多不便,深表歉意。

    公司内部已经大范围检讨,往后数据备份频率会增加至每小时一次,以避免类似事件再次造成服务中断。

    本次故障未导致数据泄露。用户的非公开数据(私信、密码等)仍是安全的。

    北京市五道口计算机技术有限公司 2020年10月24日

  21. thphd   在小组 2047 回复文章

    tor带不上?

    对tor封锁越来越严,由于tor是免费,加上最近出口被KCP+BBR堵死,服务质量也不可能好

    你既然有梯子,不如介绍一下你什么梯子。比如说你是SSR梯子,那么你就选“使用代理访问互联网”,然后代理信息填你SSR本地socks5代理端口即可。

  22. thphd   在小组 2047 回复文章

    该如何不带情绪地评价黄右川粉浪友?(更新:已被挂冲浪TV)

    黄右川粉浪友 书面语应该是“华裔右派川普支持者冲浪TV网友”

    不带情绪评价?很简单啊,不要挑对方的缺点来评价,就不会冒犯到对方,就不会闹情绪了。

    我感觉楼主的问题其实是,如何批判黄油川粉同时不被对方批斗。

    请他们喝消毒水吧。

  23. thphd   在小组 2047 回复文章

    Watch Live: President Trump and Joe Biden in Their Final Debate

  24. thphd   在小组 2047 回复文章

    这两天论坛有点冷清啊

    你不玩网的时候都在干啥?

  25. thphd   在小组 2047 回复文章

    老生常谈,为啥港台人可以把zhina脱口而出?(原贴2分钟内居然新增了20个回复)

    请不要把没有门槛的讨论区的泼妇骂街拿到2047上来问为什么

  26. thphd   在小组 2047 回复文章

    Johnson这个词,中港台翻译差异很大啊。

    首先

    其实

    • 人名翻译最关键是和非人名的词汇区分,例如把Johnson翻译成养生会造成混乱。由于各地用语习惯不同,人名翻译当然也不同。

    • 各地方言口音不同。庄逊在广东话中读作 zhong-shon,与Johnson非常接近。

    • Johnson在大陆翻译成约翰逊是受北欧Johanssen/Johansson的影响。

  27. thphd   在小组 2047 回复文章

    为什么中国人现在老喜欢动不动扯三观正不正?

    因为人类社会的很多矛盾本质上是观念问题,只要转换了观念,矛盾就迎刃而解。

    比如说老公打我怎么办,那就离婚啊,为什么不离呢,因为你对婚姻的观念过时了。

    爱情,婚姻,吃中药,虎妈……一切现代生活中的矛盾,只要不触及刑法的,基本上可以归为当事人观念不合。

    久而久之,大家发现因为观念问题,自讨苦吃的人数量还挺多的,就逐渐形成了凡事先从【观念】入手的的习惯。

  28. thphd   在小组 2047 回复文章

    一点关于渐进改革的个人想法,和对2047的期待

    请问楼主在哪里看到本社区是自由派社区的

  29. thphd   在小组 2047 回复文章

    在一个民主的国家里,网民应不应该有胡说八道和阴阳怪气的自由?

    你不认识我,又要跟我说话,那就必须我朋友引荐,或者我朋友的朋友引荐。

    至于言论自由,此处正确的问法是,用噪音影响他人工作是否违法。

  30. thphd   在小组 2047 回复文章

    浅谈海外民运的历史

    文昭和法轮功什么关系?我印象中文昭没传过此教啊。

  31. thphd   在小组 2047 回复文章

    【肥宅繪圖】2047看板娘

    相信你已经做好准备了

    • breasts too pronounced. in a weird way.

    • bang kinda messy.

    • never use the liren logo. the liren logo is mostly for paying tribute to liren college, not aesthetics. 2047 doesn't have an official logo yet.

  32. thphd   在小组 2047 回复文章

    【端传媒】水炮车、防暴警与伞阵:军政府驱散示威者的曼谷夜晚

    这就是不禁社交媒体+不禁美剧的下场,皇帝都给你掀翻下去。

  33. thphd   在小组 2047 回复文章

    拜登儿子邮件门是真是假?经过严谨分析,真相只有一个!

    2047作为一个不知名的小众网站,估计是没什么人看的

  34. thphd   在小组 2047 回复文章

    MV | LeLe Farley - Donald the Pooh (OFFICIAL MUSIC VIDEO)

    旋律和歌词不错,还有优化提升空间。【尊李反习倒川】的套路我还是第一次在YouTube上看到,新唐人赶快抄作业。

    @Ambulance 是的,辱葱了。

  35. thphd   在小组 2047 发表文章

    我亲自教大家做网站(3)

    第一节课讲了HTML和CSS,第二节课讲了TCP/IP,本节我们继续讲TCP,以及HTTP。

    上课之前先给大家打预防针,这个做网站系列教程注重的是原理,将来不管是做一个网络留言板,还是做一个google/facebook,都能派上用场。

    现在网上很多所谓教程,敲几下键盘就搭好一个wordpress/nodebb,虽然快速地实现了目标,但是遇到问题的时候没办法灵活变通。授人以鱼,不如授人以渔;授人以渔,不如授人与海洋生物学。

    除此之外你可能会觉得,讲这么多原理性的东西不如直接看教材。其实这点我是同意的,我也希望人手一本《计算机网络》《操作系统原理》,从此人间不再有饥饿和痛苦。

    言归正传。如第二课所说,要通过TCP协议通信,一个应用程序首先要“占用”本地操作系统的一个“端口”,然后:

    • 如果你要连接别人,就向别人的IP地址和端口,发起一个TCP连接请求
    • 如果你要等别人来连接你,就“监听”(等待)其他人向你发起的TCP连接请求

    这些功能(发起TCP请求、监听TCP请求)都是由操作系统提供,我们只需要在编写程序的时候,“调用”操作系统的这些功能。至于具体怎么与网卡沟通、怎么按照端口号分发数据包,都是操作系统的工作,不需要我们插手。

    Socket(套接字)

    我们的应用程序需要与操作系统沟通,告诉操作系统我们需要占用端口、监听TCP连接。那具体怎么沟通呢(有哪些系统功能可以调用、调用参数分别是什么、代码怎么写)?

    伯克利在他们自研的BSD操作系统中,提出了一套“沟通方式”,或者叫“API(应用程序编程操作界面,‘如何用C语言告诉操作系统你想干嘛’)”,用来做“TCP/UDP通信”这件事,他们把这种沟通方式称为socket(s),后世一般称为Berkeley Sockets https://en.wikipedia.org/wiki/Berkeley_sockets 或者BSD Sockets。

    由于Berkeley Sockets实在太好用(相比其他API而言),它最终成为了行业标准,包括在Windows上也可以用sockets进行TCP/UDP通信。

    大实验(期末成绩40%)

    下面我就通过一个简单的python程序,演示如何通过编程调用系统的socket API,实现占用、监听TCP端口,并向所有连接者返回HTML网页。

    import socket
    # socket一般译为“套接字”,意思是“通过编程调用操作系统网络通信功能的界面”
    

    HOST = '0.0.0.0'
    # 全零地址表示“所有IP地址”,意思是我们要监听所有人向我们发来的连接(不论在他看来,我的IP地址是什么) PORT = 80
    # 我们要占用本机的80端口

    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: # 创建一个socket,类型为IP/TCP

    s.bind((HOST, PORT))
    <span class="hljs-comment"># 向系统申请占用本机的80端口,占用IP地址范围为“所有IP地址”</span>
    
    s.listen()
    <span class="hljs-comment"># 向系统申请开始监听到达本机80端口的连接</span>
    
    print(<span class="hljs-string">'listening on'</span>, HOST, PORT)
    
    <span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:
        <span class="hljs-comment"># 循环接收到达的每一个连接</span>
    
        conn, addr = s.accept()
        <span class="hljs-comment"># 从系统收到一个连接。系统向我们提供:连接对象(socket)本身,</span>
        <span class="hljs-comment"># 以及对方的IP地址和端口号</span>
    
        print(<span class="hljs-string">'connected from'</span>, addr)
        <span class="hljs-comment"># 在命令行终端输出“connected from &lt;连接者的IP地址和端口号&gt;”</span>
    
        received = <span class="hljs-string">b''</span> <span class="hljs-comment"># 收到的所有字节</span>
        <span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:
            <span class="hljs-comment"># 循环读取对方发来的数据</span>
    
            data = conn.recv(<span class="hljs-number">1</span>)
            <span class="hljs-comment"># 每次读取一个字节</span>
    
            <span class="hljs-keyword">if</span> data:
                <span class="hljs-comment"># 如果读取到字节,就把字节合并到收到的所有字节中</span>
                received = received + data
    
            <span class="hljs-keyword">if</span> received[<span class="hljs-number">-4</span>:]==<span class="hljs-string">b'\r\n\r\n'</span>:
                <span class="hljs-keyword">break</span>
                <span class="hljs-comment"># 如果收到的最后四个字节是“回车换行回车换行(表示HTTP请求结束)”,就停止读取</span>
    
        print(<span class="hljs-string">'received:'</span>, received.decode(<span class="hljs-string">'utf-8'</span>))
        <span class="hljs-comment"># 在终端输出对方发来的数据(以UTF-8解码)</span>
    
        response = (
            <span class="hljs-string">'HTTP/1.0 200 OK\r\n'</span>
            <span class="hljs-string">'Content-Type: text/html; charset=utf-8\r\n\r\n'</span>
            <span class="hljs-string">'&lt;h1&gt;习近平必须下台&lt;/h1&gt;'</span>)
            <span class="hljs-comment"># 我们准备发回给对方的回复</span>
    
        print(<span class="hljs-string">'send response:'</span>, response)
        <span class="hljs-comment"># 终端输出我们的回复</span>
    
        conn.sendall(response.encode(<span class="hljs-string">'utf-8'</span>))
        <span class="hljs-comment"># 把回复内容以UTF-8编码,发回给请求方</span>
    
        conn.close()
        <span class="hljs-comment"># 关闭连接(让对方知道我们已经发完回复了)</span>
    

    FAQ:为什么要用python编程语言

    因为python在语法上非常简洁。

    补充一些题外话。这几年python热度逐渐增加,有很多人说python适合初学者。我认为初学者可以通过python了解编程的一些基本概念,但是如果真的打算做大事,还是应该老老实实学计算机专业的基础课,尤其是操作系统(C语言),然后再回来使用python,才能真正得心应手。

    为了运行上面这个python程序,首先我们把代码保存到一个叫做 a.py 的文本文件里面,然后让python读取并运行这个文件。如果你的电脑上没有python,可以去python官网下载安装python3.7版本。

    安装python之后,请在windows命令行或者mac终端, 以管理员权限 (通常出于安全考虑,1024以下的端口都需要系统权限才可以占用)运行 python a.py 。运行命令后,你应该会看到:

    listening on 0.0.0.0 80
    

    表示我们已经占用了本机的80端口(HTTP协议默认端口),监听来自所有IP地址的连接(上节课讲过,一台机器可以拥有超过一个IP地址,比如公网IP和内网IP)。

    然后我们打开浏览器,访问 http://127.0.0.1/ (这个地址指向本机),会看到一个网页,上面写着:

    习近平必须下台

    这个时候命令行会显示:

    connected from ('127.0.0.1', 64663) # 意思就是收到本机64663端口发起的TCP连接
    # 收到对方发来的内容如下
    received: GET / HTTP/1.1 
    Host: 127.0.0.1
    Connection: keep-alive
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    Accept-Encoding: gzip, deflate
    

    # 我们给对方的回复如下 send response: HTTP/1.0 200 OK Content-Type: text/html; charset=utf-8

    <h1>习近平必须下台</h1>

    通过这个实验,我们就知道,浏览器访问一个网站的步骤是:

    1. 随机挑选一个端口(在这个例子中是64663端口),占用这个端口,然后向对应网站的IP地址(这个例子中是本机127.0.0.1)的80端口,发起一个TCP连接
    2. TCP连接建立后,向对方发送 GET / HTTP/1.1... 这样一条信息,意思是 我要获取路径 / 的内容,我的协议版本是HTTP1.1版,其他附加信息如下……
    3. 等待对方回复。我们的回复是 HTTP/1.0 200 OK... 意思是 我的协议版本是HTTP1.0版,状态码200(返回数据),其他附加信息如下,网页内容如下……
    4. 浏览器收到我们的回复,把HTML内容显示在屏幕上。

    要停止这个(无限循环运行的)python程序,需要在命令行/终端,按下键盘的 ctrl+c

    在上面的实验过程中,我们占用了80端口,而占用80端口需要系统管理员权限,如果我们占用一个数字比较大的端口(比如56789),就不需要管理员权限。

    小实验1

    将上面代码中的80修改为56789,然后再运行一次 python a.py

    这个时候我们用浏览器就无法访问 http://127.0.0.1/ 了,但我们可以访问 http://127.0.0.1:56789/

    这个实验说明,建网站不一定要占用80端口,只不过因为80端口是HTTP默认端口,浏览器在输入网址的时候,可以省略这个端口号不写。如果用其他端口就必须写明端口号。

    小实验2

    你家不止一台电脑吧?

    如果你的电脑的内网IP地址是192.168.1.35,而你妈妈的电脑(或者手机)跟你连接的是同一个WiFi/路由器,那么她就可以通过你的内网IP地址,来访问你的网站。

    假设你已经做完了上面的小实验1,现在用你妈妈的电脑(或者手机)的浏览器访问 http://192.168.1.35:56789/ ,就能看到主席同志的问候了。

    如果提示不能访问,请把你电脑上的Windows防火墙完全关掉。

    至此,我们就成功地在内网架设了一个可以让内网的其他用户访问的、涉嫌煽动颠覆国家政权的网站啦。

    HTTP协议

    刚才我提了很多次HTTP,但是没有解释HTTP是什么。

    浏览器和服务器之间,可以通过TCP连接通信,这个我们刚才实验已经做过了。但是通信总得有个协议,或者叫规范、标准,比如说你发过来的信息必须是什么格式,我发回去的东西是什么格式,大家都按照格式来,不能随便乱发。细心的同学肯定注意到了,我在刚才的python程序里面,就用到了一些这样的格式,比如 HTTP/1.0 200 OK 这行字,就是按照HTTP协议规定的格式。如果不按这个格式,浏览器就没办法接收的,不信你可以改几个字再试一下。

    HTTP协议是一个既简单又复杂的协议,它的简单体现在它是通过英语表达意思,人类可以很容易看懂。它的复杂体现在它规定的功能和实现细节非常丰富(各位可以去翻一下HTTP协议的文档)。

    如果一个TCP连接,双方都遵守HTTP协议,我们就称这个连接为HTTP连接。一个网页浏览器,访问一个网站,从旁观者的角度来看,就是浏览器通过无数个HTTP连接,从网站获得了许多资源(比如HTML/CSS/JS/图片/视频),最后把这些资源组合成一个网页,显示到计算机屏幕上。

    小实验3

    在电脑浏览器(比如Chrome Firefox TorBrowser)里打开2047主页,然后在页面上空白地方,点右键,在菜单中点“检查(Inspect)”,打开开发者面板。

    在开发者面板中选择“网络(Network)”选项卡,然后刷新页面,可以看到下面这样的提示:

    左下角显示,总共发起了53个request(HTTP请求),其中绝大多数是各位的头像图片,总共通过网络传输了22.9kB的内容。右下角可以看到HTTP的请求和响应的具体内容,跟我们刚才python程序收到的非常相似。

    通过这个实验我们知道,办网站的本质,就是通过一个计算机程序,以响应外部HTTP连接的方式,向位于其他IP地址上的计算机返回各种资源。

    作为2047站长,我的工作的本质,也就是写一个python程序,接收各位浏览器发过来的HTTP连接,并返回相应的资源。

    前三节课小结

    IP协议解决的是,一个网络里面,计算机之间怎样才能互相发数据且互不干扰。

    TCP协议是建立在IP协议之上的,它解决的是,如果一台计算机有很多应用程序、需要发出很多网络连接,怎样让这些连接之间互不干扰。

    HTTP协议是建立在TCP协议之上的,它解决的是,如果计算机上的程序,想要通过TCP连接获取另一台计算机上的资源(比如网页和图片之类的),应该遵守怎样的一个通信格式,以确保全世界的浏览器、服务器都能互相兼容。同一个网站之所以能用不同的浏览器打开,正是因为所有浏览器都(某种程度上)遵守HTTP协议。

    HTML是一种用来描述网页的语言,CSS是用来辅助排版上色的语言,它们解决的是,一个网页在用户屏幕上究竟要显示成什么样子的问题。它们也有相应的标准,这就是为什么不同的浏览器,显示同一个网页,会有相同(或者近似相同)的效果。

    python是一种编程语言,它跟C语言(以及绝大多数编程语言)一样,可以通过代码调用操作系统的功能(API);这些API里面就包括了socket,我们用socket可以告诉操作系统我们想要占用端口、发起或监听TCP连接。

    下一节课我会介绍建设HTTP服务器最常见的方案(不是python也不是C,而是Apache/Nginx),以及如何解决内网地址无法从公网访问的问题。

  36. thphd   在小组 2047 回复文章

    【每日翻车新闻搬运】600:居然600期了.......

    内容已删除
    内容已被作者本人或管理员删除。 如有疑问,请点击菜单按钮,查看管理日志以了解原因。
  37. thphd   在小组 2047 回复文章

    你们是否支持禁止酒后驾驶?

    你是认真的吗

  38. thphd   在小组 2047 回复文章

    我亲自教大家做网站(2)

    @消极 #103173 you can of course do that, but that only gives you the illusion of freedom.

  39. thphd   在小组 2047 发表文章

    我亲自教大家做网站(2)

    在第一课中,我向大家介绍了HTML和CSS两种语言,教大家做自己的第一个网页。

    今天我要介绍的是,怎样让别人通过网络,查看/浏览你做好的网页。

    假设我现在有一个网页 a.html,内容如下:

    <h1>习近平必须下台</h1>
    

    这个网页我自己可以用浏览器打开,但是我最终的目的是让全世界网民都能看到这个网页。要实现这个目标,有几个概念是必须要了解的。下面我就跟大家讲讲这几个一般人容易搞混的概念。

    IP地址

    网络上的每个设备,都必须有一个地址,包括你的电脑和手机也是这样,如果没有地址的话,就没有办法互相发送数据,就好比如果你家没有地址,别人就没办法把快递寄到你家。在计算机世界,这个地址叫IP地址,它是一个32位的二进制整数。

    32位的二进制整数看上去像这样:01010101110100010110... 这个地址难读难记,所以一般我们把这个地址拆分成4个8位的二进制整数,然后把这4个数都换成10进制来表示,中间用点连接,例如 202.112.233.75

    至于这个地址为什么要叫IP地址,诸位自己谷歌一下。

    你的电脑如果可以上网,它肯定也有一个IP地址(通常是由路由器或者运营商分配的),这个地址在任何操作系统里都是可以看到的,具体怎么看,诸位自己谷歌一下。

    你的电脑的IP地址,可能是192.168.1.35或者10.0.0.4这样的形式。注意,这个地址绝大多数情况下不是国际互联网地址,而是位于某个局域网中的地址。

    国际互联网地址(俗称“公网IP”),就好比你居住的小区的地址(比如中国北京朝阳区XX路XX号);而局域网地址(俗称“内网IP”),就好比你家在小区里面的楼号和房号。

    为什么IP地址要分成“公网”和“内网”两种地址呢?

    理论上讲,32位二进制整数,能够表示的整数有42亿个(2^32 = 4294967296),但是这42亿个地址,不可能100%高效利用,这就好比你家的地址有20个汉字,而常用汉字有5000个,理论上20个汉字可以组成5000^20个不同的地址(天文数字),但是实际上是做不到的,因为快递员必须靠前缀(也就是你家地址最开头那几个字,比如“北京市朝阳区”)来决定一封信要送到哪里,而前缀不可能是汉字的随意组合,只能在有限的组合里面选择(全国的省市区是有限的),所以实际上可以使用的前缀数量是非常有限的。同理,你家地址能选择的后缀(也就是地址结尾的那几个字,比如“三巷6号2楼”)也是非常有限的。总之,邮政地址对汉字编码的利用率是低于1%的。

    国际互联网,也是靠IP地址的前缀,来决定数据包(packets)的去向的,所以也存在同样的问题。理论上有42亿个地址,实际上能够有效分配到设备的地址,不到1亿。

    而地球上联网的计算机数量,早就超过了一亿台。运营商想到的解决办法,就是不给消费者(互联网最底层的用户)的每一台计算机分配公网IP,而是每几百台、几千台、甚至几十万台计算机,分配一个公网IP,这些计算机组成一个内网,它们在内网可以通过内网IP互相连接访问,而当他们需要连接公网(比如使用google、facebook)的时候,再通过某种方式,共用一个公网IP地址。这就是为什么会有公网和内网两种地址。

    正因如此,今天我们使用的互联网,是非对称的:你从内网可以访问公网的Google.com(因为Google买下了很多公网IP,没错,作为一种稀缺资源,IP地址是可以花钱买的),但是公网上的其他人,无法访问内网中的你(所以也就无法访问你电脑上的网页)。

    但互联网并非一直都是这样。互联网刚刚步入平常百姓家的时候(1995年),不管是中国还是美国,宽带用户联网之后,都可以分配到公网IP,因为那个时候IP并不是稀缺资源。

    光阴似箭,如今全世界互联网用户数量增长了几万倍,一个中国人如果想要在家庭宽带获得公网IP(用来开设网站),唯一的选择是中国电信宽带,报装之后打电话去客服申请,理由合理才能分配到公网IP。分配到的IP地址虽然是公网IP,却不是固定的,往往是一天一换或者三天一换。

    正因如此,在自己家电脑上建网站,同时又要让世界各地的人能看到,并不是一件简单的事情,且有越来越困难的趋势。

    小实验

    怎么证明在国际互联网上,通过IP地址可以与另一台计算机通信呢?

    其实有一些网站是支持通过IP地址直接访问的,以google为例,你可以先去https://mxtoolbox.com/DnsLookup.aspx,查询google.com的IP地址,得到结果:

    • 172.217.15.110

    然后在浏览器里面访问http://172.217.15.110/,确实可以打开google。

    小实验

    国际互联网按照IP地址前缀,决定如何转发一个IP数据包,那么怎样才能知道我的数据包是如何被转发到目的地的(中间经过了几手、分别都是谁)?

    • Windows用户请在开始菜单输入cmd回车,打开命令提示符窗口,输入tracert baidu.com,然后回车。
    • OSX用户请打开“终端(Terminal)”应用,输入traceroute baidu.com,然后回车。

    TCP协议

    在一个IP网络(使用IP地址,实现数据定向发送和接收的网络)里,一台计算机可以向另一台计算机发送IP数据包。

    假如你的电脑同时干两件需要联网的事情,比如说你一边用浏览器下载文件,同时又在用微信聊天,那么你就需要同时跟两台计算机进行IP通信,他们会同时向你发来很多很多的IP数据包。这些数据包被计算机操作系统收到以后,要分发给不同的应用程序,有的数据包要发给浏览器,有的数据包要发给微信客户端。

    问题是,怎么确定哪个数据包要发给哪个应用程序?你可能会说,用发送方的IP地址来区分。那万一两个发送方使用的是同一个IP地址(你下载的微信安装包,跟你微信聊天的数据,都来自腾讯的同一个服务器),怎么办?

    这个例子就说明,光有IP协议、IP地址是无法满足人们日常的网络使用需求的。于是工程师们决定,在IP协议的基础上,扩展一个新的协议,以使得一台计算机上的多个应用程序,能够同时和多台计算机上的多个应用程序进行连接,不同连接之间互不干扰。

    工程师们最终决定,把IP地址延长一点点,在地址的后面,加一个叫“端口号(port number)”的东西,来区分不同的连接。端口号是一个16位的二进制整数,对应十进制的 0..65535。有了端口号以后,每台计算机不再是一个公用的大邮箱、大电报局,而被分成了六万个互相隔离的小邮箱、小电报局,使得同一台计算机上,不同的应用程序能够互不干扰地与远端的计算机通信。

    换句话来讲,自从有了端口号,从一台计算机向另一台计算机,可以发起很多很多的网络连接,每一个连接都必须指定起点和终点的端口号,应用程序通过“占用”端口的形式,与远端计算机上的应用程序通信。

    这种依赖于端口号的通信方式,或者叫通信协议,应用最广泛的,一个叫TCP,一个叫UDP。你的浏览器、微信客户端、网络游戏……可以说绝大多数联网的计算机程序,用的都是TCP或者UDP协议。TCP/UDP is everywhere.

    TCP到底是怎么工作的呢?对于一个应用程序来说,可以像下面这样理解:

    • 两台计算机的IP地址分别是192.168.1.3192.168.1.4

    • 192.168.1.3上,有一个应用程序server.exe,它跟操作系统说:我想占用12345号端口,等待其他计算机向我发起连接。

    • 操作系统说:12345端口没有其他人占用,你可以占用了。

    • 192.168.1.4上,有一个应用程序client.exe,它跟操作系统说:我想占用34567端口,同时向192.168.1.3:12345发起连接。

    • 操作系统说:34567端口没有其他人占用,你可以占用了。你想发些什么?

    • client.exe说:我要发i hate xijinping

    • 操作系统说:好的,我现在就把i hate xijinping这句话,贴上IP地址和端口号192.168.1.3:12345,发给192.168.1.3

    • 192.168.1.3上,操作系统跟server.exe说:嘿,收到一个数据包,目标端口号是12345,也就是发给你的,内容是i hate xijinping

    小实验

    当网页浏览器访问一个网站的时候,会向这个网站服务器的80端口(HTTP协议默认端口),发起一个TCP连接,告诉对方自己需要什么。我们可以手动模拟这个TCP通信的过程,来获取网页的内容。

    • Windows(7/10): 管理员权限运行CMD,输入dism /online /Enable-Feature /FeatureName:TelnetClient以启用Telnet功能。Telnet允许我们用键盘输入字符,来和远端计算机进行TCP通信。

      启用Telnet之后,输入telnet baidu.com 80,回车。这里我用了baidu.com,你也可以替换成百度的ip地址,效果是一样的。

      连接baidu.com的80端口成功后,CMD窗口会变成一片黑,此时以最快速度(慢了会因超时而断开),输入:GET / HTTP/1.0[回车][回车]

      如果一切顺利,你会收到百度给你的回复,内容如下:

    HTTP/1.1 200 OK
    Server: Apache
    Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
    ETag: "51-47cf7e6ee8400"
    Accept-Ranges: bytes
    Content-Length: 81
    Cache-Control: max-age=86400
    Connection: Close
    Content-Type: text/html
    

    <html> <meta http-equiv="refresh" content="0;url=http://www.baidu.com/"> </html>

    在百度返回的内容里面,包含一个HTML文档,文档内容的大意是:所有访问baidu.com的朋友,请跳转到www.baidu.com。

    如果你在发起TCP连接的时候,把端口从80改成其他数字,比如85,连接将会失败,说明TCP协议确实是通过端口号来区分同一台计算机上的不同目标的。

    如果我们能设计一个程序,像百度那样,“占用”计算机的80端口,“监听”或者叫“等待”来自其他计算机的TCP连接,每收到一个连接,我们就发一次HTML的网页过去,那么在其他计算机看来,我们就在这台计算机上,架设了一个可以用浏览器访问的网站。

    具体的架设过程,以及HTTP协议,我下节课再讲。