开学第一天

今天是开学第一天。

早上九点,我不情愿地起了床。走到食堂,看着琳琅满目的食物,不知道该吃什么。突然灵机一动:就吃泡面吧!

泡面!
泡面!

吃完泡面,就骑车去上课。今天唯一的一节课是上午三、四节的算法。老师念 PPT,超无聊。

这是课上唯一一件有意思的事:老师问,什么是算法;有人答,\(程序 - 数据结构 = 算法\)

晚上六点我去食堂吃饭,七点要开组会。到了食堂又不知道该吃什么,突然灵光一现,想吃地下一层的肉酱面,但那里的队很长。我以为组会七点半到八点就能结束,于是打算开完会再去吃饭。结果没想到我们一边开会,一边闲聊,一直拖到九点才开完。我本来已经对食堂不抱希望了,结果过去一看,大部分窗口都打烊了,卖面的窗口却还开着。最后我如愿以偿吃到了肉酱面。

肉酱面!
肉酱面!

晚上回到宿舍,看见班上的某位同学在楼道里窜来窜去,跟着他去了他们宿舍,才知道 Python 全英出分了,他正在四处打听成绩。他们宿舍的人分数都在 94–96 之间,又问我的成绩。我拿手机一查——94。于是他们就开始怀疑这门课是随机打分的了。不过不管是不是随机打分,他们都觉得这是门绝世烂课。我大惊,问他们希望拿到多少分,他们说,拿到 95 分就算满意,拿到 98 分就算很满意。

唉,保研。

9 月 2 日(一)定稿

食堂逸事

刚才我在吃饭,对面来了个小伙子,还挺有礼貌,问我这儿有没有人。

我说没有,他就坐了。

我看他穿着 2306 新定做的 T 恤,就问他是不是大二的,他说是。

我说我大三,也是计算机的。

然后他热情地跟我打了个招呼,说老东西好。

我沉默了半晌,强忍笑意,然后问他刚才叫我什么。

他说老同志。

接着他又问我说您是哪位,我说不必了。

9 月 10 日(二)晚于学五食堂

注:用“老东西”称呼学长学姐,以及用“小东西”称呼学弟学妹,是一种网络玩笑用语,不适合于线下交流。

新北村

刚刚做梦,梦见我在新北村。

我说新北村是个什么地方?

不知道,只知道刚下课,人很多,乌泱泱的一大片。

9 月 12 日(四)午于新北

Android 平台开发技术:何去何从?

下午去图书馆研究了一下上节课结尾讲的几个案例。案例没有现成的工程文件,只有制作步骤,步骤还不是很完善。做的时候遇到了问题,翻 PPT 也找不到答案,还得上网去搜。

于是课前我早早到了教室,希望能问问身边的人是怎么学这门课的。我认识的人本就不多,结果好多人到上课了还没出现——十分钟后我才意识到他们不是迟到了,是直接翘课了。

我前面的一排人都没有在听课,他们在看网上的教程。

课间我去问了几个北京学院的同学,她们有人已经开始自学了,有人打算抱别人大腿。

下课以后我问了问室友,室友还没开始学呢,他也准备自学。

我呢?我有什么大腿可以抱呀,好大腿早被抢完了,现在只能靠自己了。

唉,你 6 系是这样的。

9 月 18 日(三)

疯狂小杨哥

周日晚上关了灯,我们却睡不着觉,于是聊起天来。

室友聊到了一些话题。

我问他小杨哥是谁。他回答了我。

我说我不刷短视频。他回答了我。

另一个室友说了一些话;但发起这个话题的室友反驳了他。

我说没有人为他写人物志吗,第三位室友回答了我。我说,他之所以这么火,某种程度上也反映了中国互联网的现状啊——更多人还是喜欢直播带货,但这是为什么呢?第一位室友回答了我。

他聊到了一些事情。一些传闻。

我说这样不好,第二个室友发表了一下自己的看法。

一想到这位室友将来一定会发达,我就很庆幸自己不是他的女朋友(?)。

9 月 23 日(一)夜

夏季学期的前夕

TODO

上课第一天

7 月 4 号星期四是上课的第一天。

早上六点五十,我就起了床。一顿磨蹭以后,到食堂已经七点三十几了,于是吃了碗馄饨,就跑去上课。到了教室,只见已经来了好多人,把有插座的座位都给占上了。

台上的老师说:“我是被迫上这个课的。”我身边的一个同学小声说:“我也是被迫上这个课的。”

然后就开始上课了。上午一共四节课,老师课上说英文,课下讲中文。课间的时候,我因为久坐浑身难受,就去楼道里活动了下。只见整条走廊空荡荡的,偶尔看到有个教室亮着灯,里面却只坐了一个同学。

随着时间的推移,我身旁有些同学的电脑续航能力不足,快要没电了。正好我带了一个插线板,于是我把它取出来,请靠墙的同学把它插到墙上的插座上,然后借给他们用。我自己倒是没有用,助人为乐了属于是。

前三节课是老师讲,第四节课就轮到我们做题了。题目有选择、填空和编程题,中午十二点截止。大家做完题后,就纷纷离开了教室。

下午还有编程课,内容是五道编程题,限一周内完成。但是不必去教室,于是我们就在宿舍里写完了作业。

——这样看来,即使不在学校,也可以上这门课。


下午,我正在宿舍写作业,室友突然说他电脑开不了机了。

他按下电源键,电源键上的小灯亮起,但是屏幕不亮。昨晚还好好的,他说,我也没干什么呀。于是我们提着电脑,去了学校里的维修店。

修电脑的人脸白白的,看着面善,穿了一件花色衬衫,平易近人的样子。他看了电脑的症状,又看了电脑的型号(Lenovo Legion R9000K2021H),得出了一个骇人的结论:要换 CPU。他说,拯救者的一系列型号用的都是 AMD 的 CPU,所以都有接触不良的问题。他先让我们摸键盘的中心位置,室友摸到那里有温度,他说是 CPU 在发热;接着,他用手掌按压那里,同时按下电源键——他说他是在试着把 CPU 压回去。不过,他的尝试失败了。

然后他开出了价钱:换 CPU 要 1900。紧接着他用微信联系了一个自称是联想客服的人,问对方换主板需要多少钱,对方答 10000+。我的室友吓了一大跳。

至于我嘛,我是不太信他这一通操作的,想去联想售后先看看。那个人也没阻拦我们,直接告诉我们南门就有官方维修店。我也在高德上查到了,可惜马上就关门了。室友说他不着急用电脑(现在他拿 Mac 当生产力,这台电脑只用来打游戏),于是我想明天先去售后看看。虽然电脑已经过了保修期,但咨询应该是免费的。于是室友听从了我的建议。

我们把电脑放回了宿舍,然后一起吃麦当劳去了。麦当劳 7 件任选 72 元,不错。

7 月 14 日(日)定稿

不上课的第一天

TODO

第一个周末

TODO

老上海

TODO

串门

今天(7 月 26 日)的作息很糟糕。

早上七点半,闹铃像往常一样响起。我关掉闹铃想要再睡一小会。结果再一睁眼,已经是八点半了。唉。

我在图书馆度过了一上午。吃完午饭就回到宿舍看手机,结果弄得太兴奋了,午觉没睡着。下午三点只好又去图书馆。结果没想到四点多就开始犯困,用凉水冲了把脸,发现不那么困了,于是继续忙。一直坚持到六点,因为看代码看得头晕,只好回宿舍睡觉。

一觉醒来,发现自己从七点睡到了九点。肚子已经饿得咕咕叫了,得考虑晚饭吃什么了。

我开始叹息,感叹一天即将结束,自己的作息多么糟糕,效率多么低下。我觉得我应该为自己找点娱乐活动,让自己对生活充满期待……

可是我的肚子已经饿得咕咕叫了,我得先考虑晚饭吃什么。

我想随便吃点什么,草草结束这一天。但这一天还没有结束,九点才醒的我注定无法早睡。我在十一点前吃完了晚饭,如果一点开始睡觉,那么还有两个小时,应该做点事情,来给这一天增添一点乐趣。做什么呢?那就串门吧。和同学多一点交流,可以减轻独处一室的苦闷。

我先去了隔壁。隔壁的同学正在为 Python 大作业而奋斗。我由衷地佩服他们。

接着,我又来到了队长的房间。队长说他每天中午 12 点起床,下午 2 点开始准备比赛,一直忙到凌晨 2 点,中途只休息一两个小时——真是辛苦。

回到宿舍已是十一点半,于是我找到了更有意思的事情——刷 B 站。当然,后来我也写了一些博客。写博客要趁早,不然的话脑袋里的东西就忘光了;不过我认为,更重要的是用心去写作,不然就会写成无聊的流水账(像这篇一样)

凌晨两点,我上了床,结束了凌乱的一天。希望明天会更好。

P.S. 第二天我九点醒的🤣️

7 月 29 日(一)定稿

室友回来了

室友回来陪我了,好耶!

明天和他一起去买水果。

7 月 27 日(六)定稿

比赛结束了,假期开始了

比赛结束了,我的假期开始了。

其实早在七月末,我们就想过放弃了。那时距离上一次例会已经过去了十天,我们都不知道其他队伍的进度,只知道一共有四个组,两个初赛名额,以及在上一次例会中我们组的进度是倒数第二(倒数第一几乎什么也没做)。到了 7 月 29 号开会的时候,大家纷纷秀出自己的进度。我们组 CPU 各个部件刚刚搭完,还没有组装呢,能不能按时测试完成都说不准。比我们快的那两个组呢,都已经组装完成开始测试了。不过最令我们惊讶的是——上次倒数第一的组竟然直接跑路了!为此我们不得不反思到底能否按时完成任务,最终大家都决定这几天再拼最后一把。

队长花费了几天完成了 CPU 的组装,随后就进入了漫长且痛苦的测试阶段。在组装和测试的过程中,我们帮不上什么忙,偶尔在自己负责的部件出错时帮忙修一修,大多数时候都在做自己的事。

队长一连串发现了好几个错误。每发现一个错误,都需要从测试数据中找出产生错误的指令,通过打印调试信息的方法逐步缩小范围,最后发现是模块的一些小 bug 造成的——真是搞心态。

8 月 2 号深夜,也就是 8 月 3 号凌晨,我们组的三个人齐聚队长的房间(还有一个人不在校),讨论是否应该继续做下去。此时距离 ddl 只剩下两天了,而我们的 CPU 不仅没有通过最基本的测试,甚至有些模块还没有组装上去。队长反思了我们组进度如此之慢的原因:一方面,这个比赛确实非常硬核,以至于根本没有多少人愿意参加;另一方面,我们前期实在是太磨蹭了,没有像其他组那样马不停蹄地赶进度,以至于最后调不完——但凡早两天搭完也还有戏。于是我们三人决定放弃。紧接着队长就让我们看他打了一把雀魂……

8 月 3 号深夜,也就是 8 月 4 号凌晨,我们再次齐聚队长宿舍。队长向那位不在校的队友明确表达了自己放弃的想法(队友自然同意了),并告诉我们他摆烂了一整天,现在过得非常快活。😆️

队长和另一位在校的队员都是 8 月 5 号回家,我 8 月 7 号也该回家了。我们的暑假总算是正式开始了。

8 月 7 日(三)定稿

感冒

我感冒了。

故事得从周六(3 月 16 日)说起。周六晚上,我洗完澡,擦身子的时候无意舔了一下嘴角,结果发现嘴角起了个小泡。

当时我就慌了,因为以前嘴角也起过泡,每次都会变得很大,然后结痂。于是我喝了很多水。可是第二天下午有植树和爬山活动,活动期间我怕上厕所,就没喝多少水。回来的路上遇到晚高峰大堵车,车开了快两个小时才到。我和其他人一样,睡了一路,醒来时就感觉嗓子干。当天晚上参加了一个线上会议,会开了两个半小时,期间没怎么喝水,也没有去厕所。虽然会后补了不少水,但是周一早上醒来的时候,嗓子还是开始疼了。

嗓子疼,吃饭也难受。幸好嘴角的泡结痂了,而且后来越结越大。那天我一整天都在疯狂喝水上厕所。等到周二早上,嗓子不疼了,但是开始流鼻涕了——感冒了。

我一开始以为是半夜着凉了,但是半夜没有开窗户。后来我猜测,可能是当天早上为了上体育课,穿少了,出门被吹了。总之上完体育课,流鼻涕就变得严重起来。周二周三连流了两天鼻涕,用了好多抽纸。感冒上课精神涣散,容易走神;上机头脑不清,智商下线。周二晚上流着鼻涕写完研讨课的 PPT,周三晚上迷迷糊糊写完 OS 课下。

我的一位室友和我同一天感冒,当天下午就请假在宿舍休息。他去校医院开了些西药,按时吃着,只是时不时咳嗽流涕,听着很是难受。

周四过后是周五。到了周五,情况又有变化:流鼻涕变少了,但是咳嗽变多了,而且有了痰。当天晚上,一位已经回老家的室友发来微信,说他去医院看病测了新冠,阳了,让我们也测测。于是我去美团上买了抗原试纸,我们三个都测了一下。结果是他们两个都是阴性,我是弱阳。

之后我继续吃药养病。本来感冒一天天好起来了,但是到了周日,由于我的室友半夜嫌热打开了窗户,导致我早上起床的时候着凉了,感冒又加重了。就这样继续吃药养病,一直到周五(26 日)才敢停药。之后的几天偶尔会突然间开始咳嗽,但嗓子一点也不疼……总而言之,感冒终于是好了。

4 月 7 日(日)定稿

下水道

师傅赠送的铁丝挂在下水道上方的水龙头上

下水道堵了。

在住进新北一个学期又一个月后,大家洗澡时发现,下水道堵住了。水多的时候一下子下不去,于是积在厕所里,有时甚至会从门缝里流出来。

我的室友希望找维修的师傅来通下水道,我则认为是头发堵住了下水道,自己用手掏一下就行了。可是他们却认为用手掏太恶心,坚持要请师傅来,说什么“专业的事要让专业的人来做”。我说就算师傅来了也是用手掏,无奈他们不听。

周四下午,室友好不容易想起来去找了一趟宿管。等到大概五点的时候,师傅就上门了,当时只有我一个人在宿舍。只见师傅拿了一根铁丝,把一个小筒从下水道里勾了出来——上面缠满了头发丝。师傅用手把头发丝掏干净,扔进垃圾桶里,把小筒放回去,然后打开水龙头冲了一会,确认没有堵住。师傅临走的时候,我问他以后堵住了怎么办,于是他把手上的铁丝送给了我,说以后可以用它把小筒勾出来。

我把这件事发到了舍友群里,舍友回了个“6”。下次应该惩罚他们徒手掏下水道😡

3 月 24 日(日)定稿

你想活出怎样的人生

我和三个室友订了 4 月 7 号晚上 8 点的场次。难得整个宿舍一起去看电影。

我们早早出发,骑车十多分钟就到了太平洋影城。道路两侧的建筑绝非等闲之辈——中关村真乃卧虎藏龙之地。融科资讯中心名企林立,富丽堂皇,吊灯喷泉,灯红酒绿。我们匆匆赶路,早早就进了影厅。上百人的影厅里只坐了寥寥几人,电影开始时又进来一批人,一共只有十来人。

电影放了两个小时。结束时播放制作人员名单,我的室友起身要走,我却拉住他们,和他们说,看完片尾是一种表达尊重的方式。但当电影结束时,我已经开始哭了。

我们骑车匆匆回了学校。我的室友纷纷抱怨没看懂,认为这部电影十分费解。我感到十分无奈——他们既没能将各种隐喻与现实联系起来,又没能在高潮部分凭借点睛之笔一举拿下主旨,最后只能怪罪这部电影如何如何。

——这不,他们转身开始打游戏了。幸好我没有和他们一起打游戏,不然就不会有这篇文章了。

4 月 7 日(日)定稿

疲惫的周末

这可能是我开学以来最忙的一个周末了。

故事要从周五讲起。虽然是美妙的周五晚上,但我迫于 ddl,还是得泡在图书馆。来看看我的 ddl:

  • 周六 12:00 交冯如杯论文中稿;
  • 周六 20:00 OO 中测截止;
  • 周二上午体测;
  • 周二下午做 pre
  • 周三交冯如杯论文终稿。

转眼到了闭馆时分,我的 OO 虽然通过了中测,但代码质量不堪入目,需要重构。我起身的时候,发现身后是我认识的同学,就和她聊了起来。据她所说,这一块坐了很多 6 系的同学——可惜我不认识。她没有回宿舍,而是转身去了五号楼,说那里凌晨两点才关门。我虽然回了宿舍,但也没有早睡。写了会儿冯如杯,又改了会儿 OO,等到凌晨两点熬不下去了,才上床睡觉。我的室友则在两点到三点间上了床。

周六没有赖床,八点就醒了,但是很难受。稍作休息后奋战了一个上午,终于写完了冯如杯论文的中稿。危机暂时解除了,但我丝毫不敢懈怠,因为晚上八点就是 OO 的 ddl,在此之后我的代码就要封存起来,再不修改了。于是睡过午觉,我又去了图书馆。

重构真是件麻烦事。由于迭代前对架构的考量并不充分,我有新旧两套架构并存,一套用于新代码,一套用于旧代码。我小心翼翼地将旧代码从旧架构迁移到了新架构,并使用中测的公开数据进行反复测试,希望不要出问题。终于,到下午六点的时候,我将一部分代码完成了迁移,并且没有弄出 bug。虽然还剩一部分代码没有迁移,但我已经没有时间了,只得放弃。

晚上过得比较清闲,12 点就睡了,但是 12 点半又醒了,醒来发现自己满身是汗——今天格外的热。然后发现灯还开着,室友都在聊天。我睡不着,只好等他们关了灯才睡下——已是一点钟了。

周日七点多就起了,依旧是没有睡好。八点多就坐在了五号楼开始自习,在痛苦中度过了一个半小时,然后毅然决然回宿舍洗衣服 + 摆烂。到了下午,望着还没开工的 pre 和还没写完的冯如杯,我叹了口气,又回到了图书馆,并一直待到了十一点。

……所以我就这样一直泡着图书馆,希望自己有朝一日可以不用泡图书馆。

4 月 15 日(一)定稿

五一快乐

五一快乐!终于等到这一天了。虽然有些室友上周四就已经进入半放假状态了,但今天终于可以正式开启假期了。

英语课下课后,我陪室友去刷了 TD,晚饭吃了烤鸭。晚上处理了一些琐事,然后匆匆写完了这篇短文。

快来看看我的室友五一都有什么计划:

  • 有个室友大半个假期都在京外度过,2 号先去参加音乐节,3 – 6 号还要去旅游。
  • 有个室友整个假期都留校,说不定会在京内旅行。
  • 还有个室友也要留校,假期安排以练球为主,学习为辅,也可以考虑京内旅行。

我呢?我计划大部分时间都待在学校,期间应该会回家一趟。我希望这些天能尽早把 ddl 在节后的作业写完,并提前完成一部分 ddl 稍远的作业。另外希望多做一些感兴趣的事。

5 月 1 日(三)定稿

我的五一假期被面向对象给毁了

😅️

5 月 6 日(一)定稿

劳动节学习用时统计

重拾游泳

时隔近一年,我再次走进了游泳馆。

上次游泳还是在大一的末尾。那是最后一节游泳课,我拿着深水证和游泳课的高分成绩,走出了游泳馆。那天的天很晴,心情很好。可是在那之后,我就变得很忙很忙,再也没有时间碰游泳了。那张深水证也被我放进了钱包里,再也没有拿出来。

眼下正是五月的好时光。气温已经回升到舒适的程度,与游泳馆的水温十分接近。于是在五一结束后的第一周,我就决定踏入学院路的游泳馆,看看自己的游泳能力还残存多少。

学院路的游泳馆很是先进。储物柜用的不是钥匙而是芯片,浴室的环境也比沙河好了许多。我走到浅水区,做好热身,在背后绑了一块浮漂,又在手上拿了一块。然后缓缓进到水里,开始换气。

换气的时候就感觉到自己还是怕水。拿着浮漂游了一会,就感觉自己呼吸不太适应了——回到原点了。

游泳的人好多。有大人,也有小孩,但更多的是像我们这样的大学生。岸上的教练正在给一个大人讲着什么。我慢慢从旁边游过,让自己放平心态,坚持游久一点。经过一次次尝试,我渐渐能游 25 米,甚至 50 米了。

这时我感觉头被什么东西轻轻拍了一下,于是失了节奏,马上就从水里起来了。蹬几下游到一边,回头,发现是个小孩在学游泳。他两手各拿着一根海绵棒子,四处挥舞着。

又游了几个来回,终于过了(连续)100 米的大关。我在岸边独自庆幸,打算把手上的浮漂拿掉,用手划水。手脚配合很是得当,就是动作有点慢,摘了浮漂肯定不行。结果划着划着,时间就到了。

我把浮漂放回筐里,然后沿着岸边走到门口。看到对面的深水区里,去年教过我游泳课的老师,现在正带着学生练跳水。四名学生蹲在跳台上,他一声令下,他们就下饺子似的噗噗入水,然后在一遍遍催促声中快速冲刺。紧接着又是一排,又是一排……

下次有空还去游泳。希望能和同学一起去。

5 月 12 日(日)定稿

和软件学院的同学聊聊操作系统

看看软院的 CO——是弱化版的 CO(数字电路 + 背书,不搭 CPU 没有灵魂)。看看软院的 OO——是弱化版的 OO。只有 OS 是计软平等的。

软院的 OO 计院的 OO
组队 单干
一个单元 四个单元
一轮测试 中测强测互测
上机但不实验 上机实验
无研讨课 有研讨课
无博客作业 有博客作业

周三晚上,我下了机,等电梯的时候碰到了软院的同学,于是萌生了采访他们的念头。按照约定,第二天晚上十点,我造访了他们的宿舍。我们先是花了好久的时间来互相了解对方的 OO,然后进入了正题——OS。

那么这两位同学是怎么学 OS 的呢?首先是理论课——他们不听理论课。因为理论课太无聊了,让人犯困,所以他们选择不听(好消息是,不听就不会犯困)。另外如果早上起不来,那就干脆不去了。这样做的结果就是作业写不出来,期中考试也一塌糊涂。我和他们聊天的时候,有人还在为信号量的作业焦头烂额。他说自己先尝试补课,如果还是不会再抄学长的博客(结局是哪条道路可想而知)

接下来是实验。实验分为课下和课上。他们说,课下读指导书读不明白,就抄学长的。抄到最后自然是什么也不懂了——课上测试要花很多时间来写 exam,至于 extra,根本写不出来。

总结起来就是一句话:摆烂了。

临走之前我问他们有没有计划自学 MIT 6.S081,他们答道,上学期间肯定没空,假期又担心自己缺乏动力,只能等到放假再看有没有空。

5 月 12 日(日)定稿

好难过

今天好难过

半夜,我失眠了。四点多钟意外醒来,浑身疲惫,但毫无睡意,不知过了多久才浅浅睡着。

睁眼一看表,已经六点五十了。这时想起来昨天和室友约好去吃肠粉,于是先洗了漱,然后去叫室友。叫了许久,室友终于醒了,但没想到他说他昨晚也失眠了,就不去了。我大失所望,只好去吃食堂了。

饭后我去了图书馆。刚写了一会 OO,到九点二十的时候,突然发现微信里说九点半有场讲座必须要听。我好痛苦——幸好,通知里说线下无法参会的同学也可以选择线上。于是我在图书馆打开了腾讯会议,进入了赛博会场。

会议从九点半开到了十一点,会后我又陷入忙碌,忙着学习、吃饭、午睡、赶路上课,浑身上下一百个不情愿

下午上课时和室友商量晚上下馆子的事,结果别的室友都以忙碌为由拒绝了,只剩下我们两个。真的好可惜啊!我多么希望能和室友齐聚一堂,可是怎么劝,他都不肯来。

课后我待在宿舍一直学到六点,然后出发去吃饭。我们两个人点了三个菜(干锅肥肠、油麦菜、豆腐白菜汤),结果他的饭量并没有那么大,我的饭量更是小,最后素菜和汤都没吃完,我们把素菜打包了,汤就倒掉了。我心里觉得真的好可惜,我们浪费了好多。

饭后稍事休息,我又赶往图书馆写 OO。在悲伤的心情中捱到了十点半,然后匆匆赶回了宿舍。

真是一个难过的周五。希望明天会更好吧。

5 月 31 日(五)定稿

记忆

周一才想起来自己阳光打卡还差一次——但是周日就截止了。于是体育分数 -10。

然后我就想,我的大脑就好像是一个时间片轮转的记忆调度器。大脑内部有个不定时的计时器,控制着我时不时回想起一件还没有做的事情。然后我会判断现在能不能做:能做就做,不能做就先放着。至于下次想起来是什么时候……我不知道,也许是明天,也许是 ddl 的后一天。

6 月 5 日(三)定稿

坚持

昨晚失眠了,今早起晚了。六点五十的闹钟,关掉之后想休息一会,结果一睁眼七点半了。

于是刷牙洗脸,早饭没吃就去上体育课。今天太极拳考试,打拳打到筋疲力尽,幸好考试得了 100 分。回到宿舍热了一罐八宝粥作为早饭,吃了以后就去睡了。

我从十一点一口气睡到了一点,醒来的时候发现室友都还在睡……

下午小学了一会,就去上英语课了。上课前向室友借了一袋烤馍片——白味的,不好吃。

晚上和室友一起吃麦,然后在图书馆自习。事情越来越多了,时间越来越少了。

图书馆的闭馆音乐换成了《稻香》,鼓励着我默默坚持下去。

6 月 5 日(三)定稿

一代人有一代人的高考

今天(6 月 7 日)我参加了一场重要的考试。不是高考,而是 OS 期末考试。

考试 7:45 开始,为此我定了 6:25 和 6:30 的闹钟。虽然前一天晚上已经尽量早睡了,但最后只睡了不到 7 个小时,醒来还是很困。没办法,只好顶着困意起了床,去食堂吃早饭。

那天早上下着雨,所以在路上花的时间多了一些。吃完早饭赶到教室已经 7:40 了,只见教室里坐满了人——大部分人都已经到了。我找了个空位坐下,结果马上就发卷了。这里我犯了一个错误:没有去厕所洗把脸。这就导致我做题的时候还是有些困,速度不够快。

卷子发下来以后,我又犯了一个错误:没有先翻阅一遍试卷,规划一下时间。这就导致我做题时缺乏时间观念,前面写的太慢,最后还剩下一道半大题没有写完。

这次考试就在遗憾中结束了。我打着伞,慢慢走回了宿舍。本以为他们回到宿舍之后就会迫不及待地开始议论,结果没想到大家都一言不发。应该是无语了。

于是我上床补了觉,其他人则一直在玩吃鸡。醒来就是饭点了,我去食堂吃了顿丰盛的午饭。群里陆续传来同学请假的消息——下午还要上课呢。于是生活就这样继续了下去。

一代人有一代人的高考。我们的一生就是考试的一生。

6 月 10 日(一)定稿

OO 害了他

下午晒的被子一直忘了收
晚上下雨被困图书馆了,被子也湿透了😭
不过幸好 OO 和离散数学作业都写完了

——OO 害了他

6 月 10 日(一)定稿

考试加油

时间过得真快,明天就进入烤漆了。

今晚吃了肯德基,去了图书馆,现在坐在电脑前,希望在睡前留下点什么。

随着课程结束、作业减少,学习的动力也日渐消退。最近我一直在努力吃饭,虽然有时会嫌吃食堂吃腻了,很晚才吃饭或者出去下馆子;在努力睡觉,虽然有时会晚睡,导致早上起来没有精神;在努力学习,虽然有时会缺乏动力不愿前进。

细细想来,这已经是入学以来第四个烤漆了。每个学期都在凌乱中度过,每段烤漆都在匆忙中度过,只留下一地鸡毛,学生憔悴。

衷心希望这次烤漆能有所改观,少一点遗憾,已往不谏,来者可追。

祝考试顺利。

6 月 16 日(日)定稿

夏季学期要来了

美好的暑假从夏季学期开始。学习内卷无止境,整个暑假都可以算作夏季学期。夏季学期的选课在 6 月 20 日(四)12:40 开启。

中午 12:40,选课开放的时候,我还在吃午饭。等我不紧不慢地吃完回到宿舍,才从室友的口中得知选课已经结束了——虽然选课名义上是 25 号 17:00 结束,但对于 2206 的同学们来说,选课在开始的 3 秒钟后就已经结束了。

让我们来看看,大家都选了哪些课:

Python程序设计(全英文)

一般专业 + 全英课,而且用上两周,大作业是小组合作,纯纯的绝世好课。唯一的缺点就是名额太少,年年爆满。今年也不例外,120 个名额瞬间抢空。

看到两门一般专都被抢空,我本来打算小学期好好休息的,结果在选课截止的那一天(25 日)下午,这门课偷偷加了 20 个名额,我就趁机挤进去了。不知道这门课最后有没有报满。

Python程序设计(全英文)详细信息
课程代码
B3J060311
课程名称
Python程序设计(全英文)
课序号
001
上课时间地点
1-2周[理论]/星期二/第1节-第4节/李莹[主讲]/主南201,1-2周[理论]/星期四/第1节-第4节/李莹[主讲]/主南201,1-4周[理论]/星期二/第6节-第9节/李莹[主讲]/不使用教室,1-4周[理论]/星期四/第6节-第9节/李莹[主讲]/不使用教室
开课校区
学院路校区
开课单位
计算机学院
课程性质
任修
课程类别
一般专业类
授课语言
全英语
对内/对外容量
140/0
已选对内/对外人数
139/0
学分
2
学时
48
上课教师
李莹(副教授)

计算机视觉计算

略逊一筹了:首先只能算作一般专业课,其次还要上 6 周——暑假一共就 9 周,中间 6 周被它一占,回家就待不了几天了。所以说,这门课适合那些假期留校的同学。就这也能瞬间报满,我也是醉了。

不知道为什么最后反而空出来了几个名额,可能是 Python 扩容以后有些人改报 Python 了。

计算机视觉计算详细信息
课程代码
B3J063822
课程名称
计算机视觉计算
课序号
001
上课时间地点
2-7周[理论]/星期一/第3节-第4节/百晓[主讲]/F201,2-6周[理论]/星期三/第3节-第4节/百晓[主讲]/F201,2-6周[理论]/星期五/第6节-第7节/百晓[主讲]/F201
开课校区
学院路校区
开课单位
计算机学院
课程性质
任修
课程类别
一般专业类
授课语言
全汉语
对内/对外容量
50/0
已选对内/对外人数
43/0
学分
2
学时
32
上课教师
百晓(教授)

体育(5)[游泳1]

大三秋季要考游泳。大一大二没报过游泳课的可以趁暑假报一个,报了游泳课并顺利通过就能免去考试了。至于那些暑假也不打算报的,应该是上大学前已经学过了。

体育(5)[游泳1]详细信息
课程代码
B310023005 [游泳1]
课程名称
体育(5)
课序号
001 – 024
上课时间地点
开课校区
沙河校区
学院路校区
开课单位
体育部
课程性质
任修
课程类别
体育类
授课语言
全汉语
对内/对外容量
0/25
已选对内/对外人数
学分
0.5
学时
16
上课教师
陈艳(副教授)
刘菁(副教授)
孙晓川(副教授)
陆颖(副教授)
田春宽(副教授)
尹天安(副教授)
董徐磊(讲师)
尹宝玉(副教授)

除此之外,剩下的课就没什么人报了。其中不乏一些计算机学院开的全英课,但——都要报全英课了为什么不报个水一点的。至于那些既不是一般专又不是全英的,纯纯浪费时间,不如好好享受这难得的暑假。

6 月 28 日(五)定稿

既然选择了 Arch,便只顾风雨兼程。——周国平没说过这句话

我装了 Arch Linux。

我之前上初中学网安的时候用过 Kali Linux,当时不懂事,用着玩的;上高中学 OI 的时候用过 NOI Linux,是基于 Ubuntu 的;还用过计组的虚拟机,是基于 Debian 的。今年寒假,我得到了升级硬盘、重装系统的机会,这也是一次安装双系统的机会。

那么,装什么呢?虽然 Ubuntu 开箱即用、易于上手,但是我想挑战一下自己。之前看到、听到身边有些人在用 Arch Linux,我便暗暗记在心里,想装个 Arch Linux 挑战一下自己。于是,在官方文档B 站视频知乎教程的帮助下,我在(1 月 23 日)一天之内就装好了 Arch。

但是,挑战才刚刚开始……

高分屏适配(1.23 – 1.24)

两次重启之后,黑白的终端和闪烁的光标并没有如期出现;取而代之的是一幅五彩斑斓的桌面。——KDE!屏幕中央的窗口上写着“Welcome to KDE Plasma”,正是对我安装成功最好的祝福。但是……这行字太小了。预装的 Windows 的缩放比例被设置成了 250%,而 KDE 对这一点全然无知。默认的 100% 缩放比例,让这个窗口显得如此渺小。

于是在安装完成后,我做的第一件事情就是适配高分屏。

ArchWiki 上对 KDE 的高分屏适配已经有了详细的教程,包括:

  • 调节全局缩放率。

  • 调节光标大小(X11 下光标大小不会跟随全局缩放率)。

  • 调节面板高度(X11 下面板高度不会跟随全局缩放率)。

    这里有个小插曲:根据教程,需要设置环境变量来让面板高度跟随整体缩放。经过一番恶补,我终于学会了如何设置环境变量。但是,当我向 ~/.bash_profile 的末尾添加 set PLASMA_USE_QT_SCALING=1 并重启系统之后,我被卡在了登录页面——输入密码之后会黑屏,然后回到登录页面。

    当时我怕极了,以为新装的系统就这样被自己毁了。后来不知道在哪里查到,按 Ctrl + Alt + F3 可以开启一个新的终端,我就用这个终端删掉了那行致命的代码,让电脑恢复了正常。

    我把这件事告诉了湖人,湖人建议我装 Wayland。我装了以后,发现面板高度可以跟随整体缩放了。但是窗口中的内容都会变糊,于是放弃了 Wayland。

    第二天我研究的时候,发现右键面板,选择“进入编辑模式”,可以修改面板高度。于是我按比例调高了面板高度,问题就解决了。

设置中文(1.25)

简体中文本地化一文给出了设置中文的详尽步骤,照做即可。

在修改 /etc/locale.gen、运行 locale-gen 并安装 noto-fonts-cjk 之后,我在系统设置的语言选项中添加了简体中文,但是只有系统设置中的文本成功变为中文,其他软件仍是英文。经过查询,发现上述页面中已经提到了 KDE 可能会生成错误的语言配置文件,最后的解决方法是按教程修改 ~/.config/plasma-localerc 文件:

1
2
3
4
5
6
7
 [Formats]
-LANG=zh_CN
+LANG=zh_CN.UTF-8

[Translations]
-LANGUAGE=zh_CN
+LANGUAGE=zh_CN:en_US

安装 Firefox(2.6)

室友在 Arch Linux 上装了 Chrome,而我选择 Firefox。摆在我面前的有两个选择——用包管理器安装和用 Discover 安装。

最开始我想用包管理器(这里用到了 yay)。ArchWiki 上说有一个“具有更好的 KDE 集成”的版本:firefox-kde-opensuseAUR。但是我在编译的时候遇到了错误,于是转而用 Discover 安装。Discover 装东西真方便,现代的应用商店,点一下就装好了。

正巧那天我和一位同学聊天,聊到了这个问题。他说不建议我用 Flatpak 软件包,因为包管理器安装的软件运行更快、配置更方便。于是我去网上查了一下,看到论坛上有人说与其安装 Flatpak 软件不如用木棍戳眼睛(好吓人),那位同学阅后表示赞同。

另外他告诉我不要装 firefox-kde-opensuse——那是给 OpenSUSE 用的。于是我卸掉了 Flatpak 版 Firefox,改用了包管理器安装 firefoxfirefox-i18n-zh-cn 这两个包。

高分屏适配后续(2.6 – 2.12)

我把我的困惑发到了讨论页,随后与一位大佬展开了长时间对线,最后修正了 ArchWiki 的相关内容。主要内容就是以下几点,感兴趣的可以去看讨论页。

  1. ArchWiki 信息有误。面板上的图标确实可以根据面板大小自动缩放,不能根据全局缩放率自动缩放的是面板本身。
  2. PLASMA_USE_QT_SCALING=1 可以解决让面板跟随全局缩放率自动缩放。正确的写法是 export PLASMA_USE_QT_SCALING=1,而不是 set PLASMA_USE_QT_SCALING=1
  3. 面板高度可以通过右键面板手动调节。
  4. PLASMA_USE_QT_SCALING=1 也可以让其他桌面部件自动缩放。
  5. 使用 Wayland 可以解决自动缩放问题。但是在修改全局缩放率后需要注销才能生效。

Vivado–VCS 联合仿真(2.6、2.17 – 2.19)

本来是打算安装在虚拟机上的,因为给我们培训的学长大都用的是 Ubuntu 虚拟机。但当我用 Debian 虚拟机安装的时候出现了空间不足的情况,扩容后虚拟机无法登录。于是我只好在群里求助,这时群里的学长纷纷推荐我用实体机 Linux 或者 WSL。想到我之前装的 Arch Linux 还不知道拿来干什么好,我决定试着装在 Arch 上。

学长结合自身经验与网上教程撰写了一篇《vivado-vcs联合仿真环境配置》,它将会带领我们披荆斩棘、乘风破浪。

Vivado

先安装,再除错。《联合仿真》给了一篇 Vivado 安装教程以供参考。

安装

有同学告诉我,vivadoAUR 在 AUR 上就有包。但是经过研究,我发现 AUR 上的包用起来比较麻烦——由于下载需要经过登录墙,所以必须手动下载完整版压缩包,然后放置在 PKGBUILD 所在的目录下。考虑到完整版压缩包大小约 100G,我不认为这是个好主意。但我的同学更愿意用 AUR 上的脚本,因为这样可以让 Vivado 归 pacman 管。他说,在 Linux 下安装软件就得严格使用包管理器,否则就会把系统搞乱,和 Windows 没有区别了。

经过一番思索,我最终还是选择用自带安装程序。下载好(版本 2023.2,大小约 300M)后执行命令:

1
# XINSTALLER_SCALE=2 ./FPGAs_AdaptiveSoCs_Unified_2023.2_1013_2256_Lin64.bin
  1. 刚启动安装程序就发现 UI 小得可怜,同时控制台有提示:
    1
    2
    3
    4
        INFO Could not detect the display scale (hDPI).
    If you are using a high resolution monitor, you can set the insaller scale factor like this:
    export XINSTALLER_SCALE=2
    setenv XINSTALLER_SCALE 2
    所以要加 XINSTALLER_SCALE=2
  2. 配置安装选项时发现默认安装到 /tools/Xilinx,需要权限,于是只好退出了安装程序,加上 sudo 又来了一遍。

安装程序先是花了一个半小时下载了约 22G 的 Vivado,然后在十分钟以内完成了安装。不知道如果用了 AUR 上的包会怎么样。

除错

  1. 安装结束时控制台有报错:

    1
    2
        ######## Execution of Pre/Post Installation Tasks Failed ########
    Warning: AMD software was installed successfully, but an unexpected status was returned from the following post installation task(s) /tools/Xilinx/Vivado/2023.2/bin/unwrapped/lnx64.o/vivado: error while loading shared libraries: libcrypt.so.1: cannot open shared object file: No such file or directory /tools/Xilinx/Vivado/2023.2/bin/unwrapped/lnx64.o/vivado: error while loading shared libraries: libcrypt.so.1: cannot open shared object file: No such file or directory

    运行 Vivado 时同样产生了报错。

    1
        $ /tools/Xilinx/Vivado/2023.2/bin/vivado
    1
        /tools/Xilinx/Vivado/2023.2/bin/unwrapped/lnx64.o/vivado: error while loading shared libraries: libcrypt.so.1: cannot open shared object file: No such file or directory

    看来必须得处理了。

    通过搜索 ArchWiki,得知安装 libxcrypt-compat 即可解决。

  2. 我是占位符。

    1
        application-specific initialization failed: couldn't load file "librdi_commontasks.so": libtinfo.so.5: cannot open shared object file: No such file or directory

    《联合仿真》中说要安装 libtinfo5,但是 Arch Linux 中没有 libtinfo5,应该安装的是——ncurses5-compat-libsAUR

于是成功启动。配置缩放参见 ArchWiki

为了测试 Vivado 的性能,我从龙芯杯官网下载了 MIPS 团体赛发布包,解压后将样例 CPU 的性能测试工程导入 Vivado:

1
2
$ cd nscscc2023-group-mips/perf_test_v0.01/soc_axi_perf_demo/run_vivado/mycpu_prj1/
$ vivado -source mycpu.xpr

VCS

先安装,再激活,最后除错。《联合仿真》给了一篇 CSDN 上的联合仿真教程,但是过于简略;又给了一篇激活教程,这篇写得不错。

安装

刚启动 Synopsys Installer,就发现字大得离谱——原来是不支持高分屏。于是我只好把全局缩放率改回了 100%。

配置安装选项时发现默认安装到 /usr/synopsys,需要权限,于是只好退出了安装程序,加上 sudo(以及 -install_as_root)又来了一遍。(梅开二度)

激活

安装完以后就需要激活了。用魔法召唤出 Synopsys.dat,放到对应目录下,执行:

1
$ /usr/synopsys/scl/2018.06/linux64/bin/lmgrd -c /usr/synopsys/scl/2018.06/admin/license/Synopsys.dat

……失败了?

  1. 我是占位符。
    1
        bash: /usr/synopsys/scl/2018.06/linux64/bin/lmgrd: 无法执行:找不到需要的文件
    激活教程中说要安装 lsb-core,但是 Arch Linux 中没有 lsb-core,应该安装的是——ld-lsb
  2. 我是占位符。
    1
        (lmgrd) Invalid License File
    这使我百思不得其解。我一度以为自己的密钥有问题。经过上网查询,发现原来是因为 Synopsys.dat 的权限是 755,而 lmgrd 执意要把它改成 644。解决方法如下:(参考链接
    1
        # chmod 644 /usr/synopsys/scl/2018.06/admin/license/Synopsys.dat
  3. 我是占位符。
    1
        (snpslmd) Can't make directory /usr/tmp/.flexlm, errno: 2(No such file or directory)
    激活教程中已经给了解决方法:
    1
        # mkdir /usr/tmp

除错

服务器架设完成后,我们创建一个测试程序,然后打开另一个终端来编译:

1
2
$ vcs test.v
$ ./simv

如果遇到以下报错,参照激活教程中的参考链接即可解决。

1
undefined reference to `pthread_yield'

如果看到以下输出,说明编译成功。

1
../simv up to date

联合仿真

联合仿真需要先用 VCS 编译 Vivado 的库,我在编译时就遇到了如下报错:

1
[Vivado 12-23673] compile_simlib failed to compile for vcs_mx with error in 28 libraries (cxl_error.log, Number of error(s) = 122)

仿真的时候卡住了,点击取消无用,向控制台发送 Ctrl + C 后仿真中止,并弹出如下报错:

1
[SIM-utils-79] Incompatible GCC compiled simulation library found! Library '/home/triplecamera/Documents/Vivado_lib_VCS' is compiled with GCC version '13.2.1', expected version is '9.2.0'. Please recompile the simulation library or set the correct compiled library path for '9.2.0'.

唯一的解决方法是安装旧版 gcc,我之后会尝试一下。

声音(2.19)

自从装上 KDE 开始右下角的声音图标一直是静音的,今天想把这个问题修好。按照 ArchWiki ALSA 页面中的提示安装了 alsa-utils,但是在解除静音时失败了。搜了论坛才发现那个页面后面提到了需要安装 sof-firmware,安装并重启后问题解决。

输入法(2.23、2.25)

参考 ArchWiki,安装 fcitx5-im包组fcitx5-chinese-addons 和词库(可选),配置 /etc/environment 并重新登录,最后在系统设置中添加输入法。安装之前记得做系统更新,不然就会像我一样失败🙃

更多高分屏与中文适配(3.4)

最后还剩下 GRUB 和登录页面没有缩放且没有中文,解决方法如下:

3 月 25 日更新:更新至 KDE 6 后登录页面无法同步缩放,我在 KDE Discuss 上发帖求助,得知此 bug 已被汇报,将在不久后修复。

4 月 12 日更新:再次检查发现工单已被标记为解决,但测试发现仍然无法同步缩放。通过查阅 Azure Zeng 的博客、上述工单及工单中的链接,我得到了另一种解决方法:修改 SDDM 配置文件 /etc/sddm.conf

1
2
[General]
GreeterEnvironment=QT_SCREEN_SCALE_FACTORS=2.5,LANG=zh_CN.UTF-8

Java(3.4)

根据 ArchWiki,安装 jdk-openjdkjava-runtime-commonjava-environment-common 会自动安装;jdk-openjdk 与 jre-openjdk 有冲突,二者只能选其一),重新登录之后使用 archlinux-java 配置 Java 版本。

蓝牙(3.14)

参见 ArchWiki 蓝牙页面。对我来说,由于之前没有安装 bluedevil (其中包含了 bluez 等核心组件),所以安装了一下,随后完成教程第四步“启动/启用 bluetooth.service”,即可使用。

我听说 KDE 6 更新以后,KDE Connect 支持通过蓝牙连接手机,但是在我这里并没有试验成功。为此我在 KDE Discuss 中发帖求助,得知蓝牙连接功能因故暂时关闭。详情请见我发布的帖子

Vivado again(???)

WIP

面对综合报错和仿真无法打开文件的问题,学长建议我安装 Vivado 2019。但是据说今年官方推荐的版本将改为 Vivado 2023,学长建议我保留 2023。

之前同学就建议我安装 AUR 上的 vivadoAUR,加上 Vivado 2019 的完整版安装包小了很多(26.5G),我觉得值得一试。

我最初的想法是使用支持 Vivado 2019.2 的 PKGBUILD(commit 3dbc515)进行构建,但是报错说有些包找不到。这是因为在三年多的时间里,有些包已经被其他包取代了。

于是我以最新 commit 为基底,修改了版本信息:

最后值得一提的是,在升级时跳过 vivado

启动速度慢 + CPU 高占用(3.31 – 4.2)

最近两天,我的 Arch Linux 突然出现了一些问题,对日常使用有很大影响:

  1. 启动速度慢。GRUB 加载 Linux 之后会黑屏 2 分钟,然后才能正常启动。
  2. CPU 高占用。开机后风扇一直在高速运转,CPU 有一个核满载。

我在 archlinuxcn BBS 上发帖求助,两位大佬帮我解决了问题:

  1. 检查内核日志可知是 Nouveau(NVIDIA 显卡开源驱动)的问题。解决方法是使用 NVIDIA 闭源驱动或者禁用独显,我选择了前者。
  2. 使用 top/htop 查看 CPU 占用,得知是 Baloo 的问题,禁用即可。

非常感谢他们,同时使我认识到自己的 Linux 基础知识仍然匮乏。

下面附上安装 NVIDIA 闭源驱动的方法(总结自 ArchWiki 的 NVIDIA 页面):

  1. 查询显卡型号:
    1
        $ lspci -k | grep -A 2 -E "(VGA|3D)"
  2. 根据 ArchWiki 的指引,安装 nvidialib32-nvidia-utils(不同型号安装的包有所不同)。
  3. 编辑 /etc/mkinitcpio.conf,删除 HOOKS 中的 kms
  4. 重新生成启动镜像:
    1
        # mkinitcpio -P
  5. 重启,完成。

微码(4.15)

微码的作用是将复杂指令分解为一系列简单指令。及时更新微码可以修复 CPU 的重大漏洞。

我根据 ArchWiki 上的教程,运行了以下命令来检查是否已经安装了微码:

1
2
3
# journalctl -k --grep=microcode
4月 15 19:38:29 triplecamera kernel: Register File Data Sampling: Vulnerable: No microcode
4月 15 19:38:29 triplecamera kernel: microcode: Current revision: 0x00000421

看来没有。于是我安装了 intel-ucode,重启后再次检查:

1
2
3
# journalctl -k --grep=microcode
4月 15 20:08:50 triplecamera kernel: microcode: Current revision: 0x00000432
4月 15 20:08:50 triplecamera kernel: microcode: Updated early from: 0x00000421

没想到居然已经装好了。赞。

电源管理方案(4.19)

查看电池状态时注意到电源管理方案不可用:

电源管理方案不可用的提示

于是去 ArchWiki 上查了一下,发现 KDE 的电源管理依赖于 powerdevilpower-profiles-daemon。前者在我安装 plasma 时就一并安装了,后者需要手动安装。

安装过后重启,电源管理方案就可以使用了。

IntelliJ IDEA(4.22)

4 月 21 日那天,我突然想来一场“自我放逐”:从某一天开始,从 Windows 换成 Arch Linux,并且再也不要换回来了。看看自己能坚持多久。

为此我需要将平日会用到的软件在 Arch 上都装一份——其中之一就是 IntelliJ IDEA。去 ArchWiki 上看了发现只有 Community Edition,经过一番搜索才发现 Ultimate Edition 在 AUR 上。

5 月 1 日更新:已在 ArchWiki 上补充相关信息。

但愿是最后一次适配高分屏(4.25)

刚装上 Arch Linux 的时候,默认启动项是 Windows,所以每次想要启动 Arch 都要在开机时长按 F12,切换启动项。为了延长键盘寿命(笑),我决定将默认启动项改为 Arch 使用的 GRUB,然后在 GRUB 中选择启动 Windows 还是 Arch。

上回降低 GRUB 分辨率之后,Windows 的启动画面也变成了低分辨率(启动后分辨率会恢复正常),由于分辨率太低,厂商徽标无法显示,只能显示低清的 Win11 大蓝标,特别丑。Arch 虽然当时没有出问题,但换上 NVIDIA 专有驱动后也出现了启动分辨率同 GRUB 一致的问题。

Arch 的问题是 NVIDIA 专有驱动造成的,无法解决。Windows 的问题倒是可以解决:只需用命令提示符运行 bcdedit /set {globalsettings} highestmode on 或用 PowerShell 运行 bcdedit /set "{globalsettings}" highestmode on。(参考链接

1
2
> bcdedit /set {globalsettings} highestmode on
操作成功完成。

VLC 高分屏适配(6.8)

使用 VLC 时遇到了下方按钮过小的问题——又要做高分屏适配了。

没有启用 HiDPI 的 VLC 界面

上网一搜就能搜到,传入环境变量 QT_SCALE_FACTOR(或 QT_AUTO_SCREEN_SCALE_FACTORQT_SCREEN_SCALE_FACTORS)即可。(参考链接

先用命令行尝试一下,确实可以工作:

1
$ QT_SCREEN_SCALE_FACTORS=2.5 vlc

其实以上内容是我很久之前就研究出来的,今天突然想起来这项研究还没做完就赶紧补完写出来了。

我们在应用程序启动器(KDE 的“开始菜单”)中右键 VLC 的快捷方式,选择“编辑应用程序...”,然后切换到“应用程序”选项卡,将“环境变量”设置为 QT_SCREEN_SCALE_FACTORS=2.5。点击“确定”,Plasma 就会将 VLC 的系统快捷方式(位于 /usr/share/applications/vlc.desktop)拷贝到用户目录(~/.local/share/applications/),然后再进行修改,从而避免对系统快捷方式的影响。

再次打开 VLC,可以看到缩放正常了:

启用了 HiDPI 的 VLC 界面

我正在担心打开文件的时候该怎么传入环境变量,结果一试,双击文件时也会应用环境变量——这点可比 Windows 做的好。

帮助中心(6.9)

每次我查看 KDE 应用程序的使用手册时都会跳转到官网——那么有没有办法离线查看手册呢?我去问湖人,湖人不知道,让我去加微信群。我加群后问了问题,可是一直没有人回答我。

最后我找到了 KDE 的帮助中心 KHelpCenter(软件包:khelpcenter)。确实是离线的,嗯。

paccache(7.15)

一不注意磁盘占用超过 80% 了。拿 Filelight 看了一下,发现能删的东西中,pacman 和 yay 的缓存占了大部分。

那么怎么清理呢?直接删掉缓存文件夹当然是可以的,但 ArchWiki 给出的方法是使用 paccacheyay -Sc。前者可以保留最近几个版本的包(默认是 3 个),后者只会保留最新版的包(yay -Scc 会全部删除,但没有必要那样做)。

我选择了前者:

1
2
3
4
5
6
7
8
$ paccache -d

==> finished dry run: 1383 candidates (disk space saved: 17.32 GiB)
$ paccache -r
==> Escalating privileges using sudo
[sudo] triplecamera 的密码:

==> finished: 1383 packages removed (disk space saved: 17.32 GiB)

清理完后磁盘占用 74%……有人可能问我(其实没人问)为什么不选择后者,我觉得即使选择后者也只能解一时之急,重新分区才是长远之计。

pacdiff(7.23)

起因是星期天滚系统的时候,sudo 更新了配置文件 /etc/sudoers,pacman 将新版本存到了 /etc/sudoers.pacnew,让用户手动处理差异。

这可造成了不小麻烦……我先试着用 Kate 打开,结果 Kate 因为权限不足打不开。我又用 sudo 运行 Kate,结果 Kate 拒绝以 sudo 模式运行。于是我只好用 Vim……先把 /etc/sudoers 移动到 /etc/sudoers.bak,再把 /etc/sudoers.pacnew 修改好以后移动到 /etc/sudoers——结果这第一步就出了问题,/etc/sudoers 不见以后,sudo 没法运行了。于是我只好用 root 账户完成了剩下的操作……

两天以后,glibc 更新了 /etc/locale.gen。因为手动处理差异太麻烦了,我就根据 ArchWiki 的指引尝试了一下 pacdiff

pacdiff 支持各种差异工具。我想找个 GUI 的,最好是 KDE 的。嗯……最后找到了 kdiff3kompare(前者是后者的新版)。那就来比试一番吧!

  • Vim:配色亮目害眼。
  • gVim:没用过,不熟。
  • KDiff3:崩溃了……
  • Kompare:能用,但是不能选择“不应用差异”,只能选择“应用差异”。

就这样。没一个能用的。

发送崩溃报告(7.23)

书接上回。我在尝试 KDiff3 的时候,KDiff3 崩溃了:

1
$ DIFFPROG=kdiff3 pacdiff

幸运的是,崩溃是可以稳定复现的:

1
$ kdiff3 /etc/locale.gen /etc/locale.gen.pacnew

此时屏幕右下角弹出了崩溃处理程序的通知,于是我试着汇报了一下:

点击“报告程序缺陷”,就会弹出一个窗口,上面有“发送自动报告”和“查看开发者信息”两个选项。前者会直接将崩溃信息发送到 crash-reports.kde.org,可惜只有开发者能查看。(参考链接

后者则会显示详细的崩溃日志。可是堆栈信息中全是未知的符号——这是因为缺少调试符号包。点击右上角的“安装调试符号包”,安装完成后堆栈信息就清晰可见了。此时发送的崩溃报告就具备参考价值了。

最后介绍两个选项:

后者十分有用,我就把它勾上了。

修改分区(8.16 – 8.20)

上文提到,半年前规划的分区结构不甚合理:经过半年的使用,Arch 的地位不断上升并有可能(部分)取代 Windows,原先分配的 252 GiB 空间根本不够 Arch 施展拳脚。因此现在迫切需要对分区结构进行修改。

虽然 KDE 和 Gnome 的分区管理器都很好用,但它们不允许你在开着 Linux 的情况下修改 Linux 自身所在的分区——这就好比你没法拆掉自己脚下正踩着的那块地板,要想拆掉它,得先把脚拿开。所以,我们需要一股外部力量来完成修改分区的操作——这股力量正是 LiveCD。

GParted Live

GParted 提供 LiveCD 版本,所以我选择了它。事实证明,这款软件虽然能用,但是存在着一些小问题……

首先是老生常谈的问题——NVIDIA 显卡驱动。第一次进系统时我选了 GParted Live (Default settings) 启动项,结果黑屏了。由于之前帮室友装 Ubuntu 的时候遇到过类似的问题,所以我直接给启动参数加上了 nomodeset,问题顺利解决。后来查看 GRUB 菜单时,发现启动项 GParted Live (Safe graphic settings, vga=normal) 也加了这个参数——下次就用它来启动系统。

接下来是分辨率过高的问题——无论是 GRUB 还是桌面环境,字都小到看不清。幸好我有之前配置 GRUB 的经验,于是直接修改了 /boot/grub/grub.cfg

1
2
3
4
5
6
7
8
 if loadfont $font; then
- set gfxmode=auto
+ set gfxmode=800x600x32,auto
insmod gfxterm
# Set the language for boot menu prompt, e.g., en_US, zh_TW...
set lang=en_US
terminal_output gfxterm
fi

GRUB 的分辨率降下来了。令我惊喜的是,系统的分辨率跟随 GRUB,于是系统的分辨率也降下来了。

另外还有截图工具双击没有反应的问题。经过一番翻找,我找到了这个桌面图标对应的配置文件:~/.idesktop/screenshot.lnk,里面写着运行程序所需的命令:gl-screenshot。我在终端中运行了这个命令,输出如下:

1
2
3
$ gl-screenshot
No gdialog or Xdialog was found!
Program terminated!!!

GitLab issue 里面说这个问题在最新的测试版中已经修复。可惜我没有空去试了,因为我想玩点不一样的——群友的 LiveCD。

群友的 LiveCD

我在 archlinuxcn 交流群中求助时,有人建议我使用群友的 LiveCD,里面包含了 Xfce 桌面环境和 GParted 等实用软件。

第一次启动的时候图形界面没有自动启动,第二次启动的时候就有图形界面了,原因未知。

调节缩放比(Scale)似乎有问题,于是我只好降低分辨率(Resolution)。

以下是修改前的分区(截图工具没装,只好拍屏了):

修改前的分区

GParted,启动!

终于可以对分区进行大刀阔斧的改造了!下面是分解动作:

  1. 将 D 盘压缩至 512 GiB。(为了避免 NTFS 兼容问题,我在这一步使用了 Windows 的磁盘管理工具。)

  2. 将 swap 分区删除。

  3. 将 Linux 主分区移动到空闲区域的最左侧。

  4. 创建 swap 分区,大小为 24 GiB,位于空闲区域的最右侧。

    这台电脑有 16 GiB 内存。ArchWiki 上说,如果要启用休眠,那么 swap 分区的大小应不低于内存大小;RedHat 建议,如果要启用休眠,那么 swap 分区的大小应至少为内存大小的 1.5 倍。虽然我还没有启用休眠,但为了长远考虑,最后我分配了 24 GiB。

  5. 将 Linux 主分区扩展,占满空闲区域。

以下是修改后的分区:

修改后的分区

善后工作

GRUB 和 Arch 的配置都是基于原有的分区结构生成的,现在分区结构变了,配置却还没有更新,势必会带来问题。果不其然:启动 Arch 时,虽然系统能正常启动,但 swap 分区没有正确挂载。

我插上 Arch 启动盘,但这次不需要走完装系统的整个流程。只需要依次挂载主分区、挂载 EFI 分区、启用 swap 分区,然后运行 genfstab -U /mnt >> /mnt/etc/fstab 更新 /etc/fstab 即可。以下是 /etc/fstab 的变更情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 # Static information about the filesystems.
# See fstab(5) for details.

# <file system> <dir> <type> <options> <dump> <pass>
# /dev/nvme0n1p7
UUID=1c13125e-cd3c-427b-adb0-8155a5c5122a / ext4 rw,relatime 0 1

# /dev/nvme0n1p1 LABEL=SYSTEM
UUID=EC68-766C /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2

# /dev/nvme0n1p6
-UUID=4c079726-ded2-4448-9e3a-40eefb72eb90 none swap defaults 0 0
+UUID=f85dc3e2-6486-4cb2-b002-73bf4bfe232f none swap defaults 0 0

注意到只有 swap 分区的 UUID 产生了变化(因为我删除并重新创建了 swap 分区),各个分区的编号都没有变。这就是为什么 GRUB 仍然可以启动 Arch。但保险起见,我还是重新运行了 grub-mkconfig

腾讯会议(8.28 – 8.29)

我在暑假时就安装了腾讯会议(wemeet-binAUR),但一直苦于没有人能帮我测试各项功能是否正常。直到返校以后,才有了和室友一起测试的机会。

经过各方面的测试,我发现:腾讯会议大部分功能都能正常工作,唯一的问题是 Wayland 下不支持屏幕共享:开启屏幕共享后只能操作腾讯会议的控制栏,点击屏幕的其他地方都没有任何反应;同时,会议中其他人看到的只有黑屏。根据 AUR 中的评论,有两种解决方法:

  1. 改用 X11。注销并使用 X11 重新登录。

  2. 使用 OBS 创建虚拟摄像机。安装 obs-studiov4l2loopback-dkmslinux-headers,打开 OBS 即可看到“启动虚拟摄像机”按钮。配置好场景(添加来源“屏幕采集(PipeWire)”并缩放到刚好占满屏幕),点击“启动虚拟摄像机”,然后打开腾讯会议,将摄像头切换为“OBS Virtual Camera”,即可共享屏幕。(参考链接

    注意:画布比例应为 16:9,否则腾讯会议会裁剪掉多余的部分。另外腾讯会议会对摄像头内容进行重度压缩,并且没有办法关闭。

那么就是这样。

Verilog 是一门非常宽松的语言。但这并不是件好事。

有时我会在写 Verilog 的时候犯一些语法错误,我以为编译器会报警告,但是并没有。于是我就要花大力气去排查错误,最后为自己的粗心大意搭上好多时间。我觉得,如果编译器为此而报错,确实不太合适,但好歹报个警告吧?可是 Verilog 是一门非常宽松的语言,于是编译器就会偷偷地做隐式类型转换。实在是烦死了!

在我写 P5 的时候,有一些模块间的接线忘记定义了。Verilog 没有报错误或警告,而是直接把它们当作了 1 位的 wire。不过幸运的是,这其中有些变量应该是多位的,在连接时产生了位宽不匹配的警告,这才使我注意到这个失误。

Verilog 自动生成变量的行为是可以关闭的,使用预处理指令 `default_nettype none 即可禁用其下方的自动生成。但是,某些依赖自动生成的地方也会受到影响(比如 inputoutput)。此时我们需要限定禁用自动生成的范围。以下是一个示例:

1
2
3
4
5
6
7
8
9
10
module Example (
input ...,
output ...
);

`default_nettype none
...
`default_nettype wire

endmodule

转眼到了 P6。我从周六晚上开始写 P6,一直写到凌晨两点;第二天起床接着写,一直写到快要吃晚饭才写完。当时测试样例过了,但是弱测没过。眼看着时间快不够了,我三两下吃完了晚饭,然后就蹬着单车直接去找助教了。(其实助教推荐的做法是自己构造测试数据,然后通过官方的 Analyzer 来评判测试数据的强度,从而不断改进测试数据,最终找出 CPU 中的 bug。)

助教帮我从八点 de 到九点,de 出了两个特别低级的错误。一是我将转发信号常量(常量写在 constants.v 里)从两位扩展到了三位,但是相应的接口都还是两位。于是在作比较的时候发生了隐式转换,最高位被裁掉了。二是我的 DM 有一个接口没有接线,当时预留了接口却没有准备好有关的信号,等到准备好信号之后却把接线的事情忘了。出人意料的是,仿真时 ISE 没有报一个警告。

当助教帮我 de 完 bug 的时候,教室里就剩一两个人了,助教们要收工了。看助教忙到这么晚,我感觉有些对不起助教。于是我问助教如何才能让 ISE 的语法检查更严一些。助教告诉我,可以试试综合。于是我试着点了一下综合,结果五彩斑斓的调试信息夹杂着花式警告顿时喷涌而出。但是呢,综合的缺点是耗时比较长,所以助教建议在 P8 以前不要综合。

我去隔壁宿舍请教了一位大佬,大佬说他知道的唯一的办法也是综合 orz


周六下午,我的室友发微信问我有关转发的事情。原来他正在重写 P5 课下。当时正巧我也在重构 P5,于是就和他讨论了起来。

所以他为什么要重写呢?其实他在周一的时候已经重构过一遍了,但是对代码质量仍然不满意,于是他拿着之前的设计文档,花了一个下午加晚上,一共五六个小时,重写了一遍。但是重写以后通不过测试了,于是他又开始 debug。

我对他说,我非常不建议他重写,因为如果在重写时遇到了 bug 就要花好多时间去 de,如果 de 不出来只能周日晚上去求助助教。如果万不得已要重写的话,最好进行“忒修斯之船”式的重写,一次只重写一小部分,然后过一遍弱测中测强测。

打包、弱测、中测、强测的过程十分麻烦,于是我整了一个小脚本,挺好用的。贴在下面:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# 部分代码由 ChatGPT 生成。

if [ -f "./P5.zip" ]
then
echo "错误:文件 'P5.zip' 已存在。"
else
zip -j ./P5.zip ./P5_L0_weak_2023/src/*.v
co-submit 1124-1245 ./P5.zip
co-submit 1124-1006 ./P5.zip
co-submit 1124-1204 ./P5.zip
fi

我们推着姥姥到院子里散步的时候,她指着一丛鹤立鸡群的花,说这是 pú lán 花。

我用手机扫了一下,发现这是蜀葵Alcea rosea)。仔细看来,它长得笔直而坚挺,有些甚至比人还高。它那宽大的叶子集中在下部,像张开的手掌。而花瓣和果实,都挂在高挑的枝头上。它的花瓣是鲜艳的粉色,它的果实是扁平的圆盘。

可是我没有查到 pú lán 这两个字怎么写。家里有长辈写下了“簠簋”这两个字,可是它们不读 pú lán,它们读 fǔ guǐ。

转眼到了十月,十一的闲暇给了我重拾这些琐事的机会。我在偶然间发现,如果在搜索“pulan”时加入“方言”二字,就能搜到“笸篮”这个词。但是这个词并不读 pú lán,而是 pǒ lán。下面的这篇文章提供了一些线索:

笸(po)篮:小时候经常在各家里见到的,一种竹编的用来盛放剪刀、针线、碎步条等杂物的器具,圆盆形,直径约30多厘米,有的外面还有油漆;关中有的地方读作pulan;

——《陕西人常说的一百字,你能写出几个

接着搜索“笸篮花”,搜索结果却少得可怜。

焰火

又称“放花”。一般于春节或元宵节等喜庆节日放焰火。洋县磨子桥焰火自清代以来为最著名者,曾奉调入京参加国庆焰火晚会。主要有竿子花、笸篮花、马花、冲天炮、满天星、流星赶月、闹龙宫、火树银花、连珠炮等160多个品种,五光十色,绚丽多彩。

这是出现次数最多的搜索结果,原因在于这篇文章已经被转载到泛滥,以至于无法查证来源了。除此之外只剩以下几处零星的提及了:

或许这只是少数人的一种叫法吧。

另外这些搜索结果都有一个共同点:就是它们都没有解释笸篮花是什么花。

眼下正是八月,当我们正在享受这美好而又漫长的暑假的时候,竟然收到了来自计算机组成原理课程团队的一份礼物——预习任务。可喜可贺,可喜可贺。

为了省去安装软件的麻烦,课程团队贴心地为我们准备了虚拟机:Debian 11 系统、LXDE 桌面环境。但是虚拟机在我的高分屏电脑上表现不佳。于是我花了好大功夫来调好它。

助教告诉我:

课程组提供的虚拟机以“轻量”为目标进行构建,选用的桌面环境为LXDE,其优点是占用资源少,缺点之一便是你遇到的——缺乏完善的图形界面支持,没有一键式的适配配置方案。

但是为什么不换一个桌面环境呢?因为我乐意教程里说:

在本地,我们可以换用 GNOME、KDE Plasma 等其他桌面环境,这类桌面环境的功能较默认的 LXDE 更齐全,兼容性更好。但往往占用的资源也较多,在虚拟化环境下性能表现较差,建议谨慎尝试。

注:以下配置适合于我的电脑,自己操作时请自行调整。

修改 DPI

这一部分按照教程即可。

~/.Xresources 文件中写入:

1
Xft.dpi: 283

然后 sudo reboot 重启。

修改文件管理器图标大小

打开文件管理器 PCManFM,在“编辑 > 偏好设置 > 显示 > 图标”里将图标大小调为原来的 2 倍。

修改文件管理器字体大小

调高 DPI 会使文件管理器字体过大。右键桌面,在“桌面偏好设置 > 外观 > 文本 > 标签文本字体”中将“大小”调为 8。

注:使用文件管理器时建议勾选“视图 > 显示隐藏内容”。

修改下方面板大小

感谢助教的帮助!

右键下方面板,在“面板设置 > 几何形状 > 大小”中将“高度”和“图标大小”修改为原来的 2 倍。这导致了背景出错,于是又在此窗口下的“外观 > 背景”中修改了背景。

修改应用文本大小

这一部分按照教程即可。

在终端键入 gsettings set org.gnome.desktop.interface text-scaling-factor 2.5(教程中推荐使用 0.5 的整数倍),之后重启。

修改鼠标光标大小

感谢助教的帮助!

打开 ~/.config/lxsession/LXDE/desktop.conf,将

1
iGtk/CursorThemeSize=18

修改为

1
iGtk/CursorThemeSize=72

然后重启以确保更改完全生效。(参考链接

修改窗口按钮大小

虚拟机使用的默认主题为 Nightmare,存储路径为 /usr/share/themes/Nightmare/openbox-3。窗口按钮的位图为 XBM 文件,大小固定为 5x5。需要将其放大到 20x20,放大后的文件如下:(你可以直接使用它们覆盖你的虚拟机中的对应文件)

之后重启即可。(参考链接

一些其他的问题

更新 co-submit

虚拟机自带的 co-submit 会在提交时询问工具链,让人不知所云。下载最新版 co-submit,用压缩包中的 co-submit.py 覆盖 /opt/co-submit/co-submit.py 即可解决问题。

参考:关于使用虚拟机提交题目时遇到的问题

修改 ISE 设计属性

如果虚拟机的 ISE 在仿真(Synthesize - XST)时出现如下报错:

1
2
ERROR:Xst:2883 - Option "-verilog2001" is not available for the selected device family.
ERROR:Xst:2883 - Option "-mux_extract" is not available for the selected device family.

需要在设计属性(Design Properties)中将“Family”修改为“Automotive Spartan3”,将“Device”修改为“XA3S50”。(此处为教程中使用的型号,其他某些型号也可以工作。)

ISE testbench 生成错误

如果虚拟机的 ISE 在生成 testbench 时生成了错误的内容,且无法与被测试模块相关联,那么可能是因为被测试模块中含有 parameter。注释掉 parameter,生成测试文件,然后再取消注释即可解决问题。当然也可以自己手写 testbench

参考:经验分享:如何解决 ISE 自动生成的 testbench 错误的问题

本学期,我报名了游泳 1,学习内容为蛙泳。通过十余周的学习,以及课下的多次练习,我成功掌握了蛙泳,并完成了各项课程任务。

蛙泳

本学期最大的收获就是学会了蛙泳。蛙泳是最简单的游泳动作,但是学习蛙泳的过程很不容易:

换气

要熟练掌握蛙泳,首先需要熟练掌握换气。换气前后,头要沉在水里,脸部几乎与水面平行。换气时,转动脖子让头浮出水面,下巴贴着水面,身体不动。快速吐出上一口气(可以发出“啪”的声音),然后吸入一口气,头回到水下。

需要注意的是:第一,换气时身体不要乱动(下水之后,换气时要保持双腿伸直夹紧),头不要抬得太高。如果身体过度倾斜,就容易失去平衡下沉。第二,换气速度要快。如果换气太慢,身体也会失衡下沉。换气太慢可能是因为对水产生了恐惧心理,不愿回到水下,需要多加练习克服恐惧。

蹬腿

掌握换气之后,就要练习蹬腿了。蹬腿前,腿伸直,脚面绷直。蹬腿动作可分为:第一步,双腿折叠,大腿垂直于上身,小腿贴近大腿,双脚勾起。第二步,大腿不动,小腿展开,脚面外翻,大小腿成“W”形。第三步,向外蹬腿,腿蹬直后并拢,脚面转为绷直。第四步,不动,等待身体滑行一段距离。简而言之就是“收翻蹬夹”。

需要注意的是:第一,蹬腿动作要规范,大腿不能过度折叠,小腿也不能过度展开,否则会影响发力。第二,蹬腿方向要正确,如果蹬腿方向太靠下,身体就会不由自主往上浮。第三,蹬腿速度不能过快,每蹬一次腿都要耐心等一下,以蹬一次腿换一口气为宜。

划手

最后需要学习的动作是划手。划手前,双手并拢,举到头顶上方最高处。第一步,双手翻掌,手背相对。第二步,胳膊伸直向两侧划手,划到肩宽之后,手臂缩回,双手在胸前合拢;此时应该抬头换气。第三步,双手合拢向前推出,推到头顶的位置;此时应该低头。第四步,手臂静止不动;此时应该蹬腿。

需要注意的是,划到肩宽以后就要收手,不要划到体侧。

换气、蹬腿、划手是蛙泳的三大动作,需要配合得当,多加练习,才能越游越快。

我们

我们先学习了蛙泳的换气动作,头泡在水里、手扒着岸边练习换气。之后学习蹬腿动作:先在垫上做动作,然后上半身趴在岸边、下半身浸在水里练习,最后手握浮板、腰系浮板下水练习,将换气与蹬腿结合起来。再然后学习划手动作:先在岸上练习,然后上半身浸在水里练习,最后撤掉手握的浮板,将三个动作结合起来下水练习。当动作熟练后,我们去掉腰上的浮板,独立完成游泳动作。

班里的大多数人只靠课上的练习就能轻松掌握游泳——但是我不行:才上了几周的课,就渐渐地跟不上了。于是我决定,每周都抽出一个半小时的时间去游泳馆练习蛙泳。本来是想拉上一个会游的,能方便指导我。但是人家会游的也不经常游,每次我去问都很难找到人陪我去游,于是我决定不求助别人,独自去练习了。

最初我很怕水,戴着浮板也不敢游,游几步就感觉自己不行了,换不上气了,要沉底了,淹死了。经过一段时间的练习,我终于可以戴着浮板游泳了。但是摘掉手上的浮板和摘掉背上的浮板之后,都出现了没游多远就沉底的现象。我去问老师,老师说是头抬太高了,还说换气太慢了,我试着改了改,但是并无成效。当时练习了两周都没有进展,非常气馁,晚上从游泳馆回来,感觉自己白练了那么久。但后来不知怎么的,就不会沉底了,逐渐能游 25 米、50 米、100 米、200 米了。这让我意识到了课下练习的重要性,持之以恒,就会有结果。

踩水

踩水是一项重要的救生技能。踩水时,双腿缓慢折叠,形成扎马步的姿势,然后双脚迅速向斜下方蹬直。踩水时需要注意:第一,动作要规范,蹬腿时一定要蹬直。第二,动作频率要适宜。如果害怕下沉而做动作太快,那么收腿时产生的阻力会增大,使蹬腿的效果减弱,反而会更快下沉。第三,蹬腿方向要正确,确保身体不会水平移动,如果身体向后移动说明蹬腿太向前,向前移动说明蹬腿太向后,需要及时调整。归根结底就是蹬腿时不要紧张,需要多多练习才能克服恐惧。

由于踩水动作只能在深水区练习,而每次课上只有半个小时的时间练习踩水,导致我的踩水动作并不熟练。由于害怕沉底,我蹬腿速度太快了,腿没有蹬直,而且身体会不由自主向后移动,只能漂浮 20 秒左右,之后就会沉底。在考深水证的那天,我牢记老师的叮嘱,经过短暂的练习,我终于掌握了规律节奏与身体平衡,最后成功通过了测试,拿到了深水证。这使我明白,直面挑战,才能克服困难。

出发

考试结束后,我们学习了出发动作。出发时,站在池边,双脚与肩同宽,脚趾勾住池沿,两个手掌朝向前方,一前一后贴在一起,后手大拇指勾住前手,胳膊伸直举过头顶,大臂要贴紧头后侧。然后蹲下,上半身尽量压低,手、手臂和上半身在一条直线上。最后,重心前倾,当快要失去平衡时,双腿蹬出,身体斜插入水中。

另一种做法是,双膝微蹲,上半身尽量压低,但是不要贴到大腿,通过弯曲上半身使手臂指向的方向斜向下。然后重心前倾,蹬腿入水。

需要注意以下几点:手掌动作要正确,蹲姿要规范,入水前一定要蹬腿,而且手臂角度要准确。太高会撞上水线,太低会插到池底,正确的做法是入水后留在水中层,手脚不动,从水线下方滑行过去。

准备活动和垫上运动

每节课下水前,老师都会带我们做准备活动。做好准备活动可以防止下水后抽筋。准备活动动作包括:头、扩胸、振臂、腰、体前屈、膝、正压腿、侧压腿、手腕脚踝。每个动作持续四个八拍。

老师还带我们做过一些垫上运动,锻炼我们的力量与柔韧性。但是具体怎么做的我忘了。

跑步过后,老师会带我们做拉伸动作。做好拉伸动作可以充分放松肌肉。拉伸动作包括:向前收腿提膝,双腿折叠,双手十指交叉抱住小腿;向前抬腿,小腿放平,双手吊住小腿;向后收腿,双腿折叠,同侧手拉住绷直的脚面。每条腿每个动作持续 10 秒。

更多

波浪式蛙泳可以加快蛙泳的速度。

老师教过我们蛙泳怎么转身,但是我当时忘了记录,现在已经忘了

除了蛙泳,还有很多泳姿,等待我们学习。

……

我在上游泳课的时候,观察到了一个现象:班上大部分人都只靠课上的时间练习,但是大部分男生都跟上了上课的进度,并且最后拿到了深水证;而只有寥寥几个女生拿到了深水证,甚至有些女生最后只能游 50 米,草草拿了个及格分。

这是为什么呢?我猜测主要是由于以下两个原因:

第一是女生比较怕水,在深水区不敢游。第二是女生力气比男生小,所以游泳容易下沉。这两个问题都会导致女生上课进度比男生慢,最终游不了 200 米;而解决方法只有一个——那就是在课下多练习。

另外,有人还有一个想法:

如果我考了证 以后看见有人落水我是救还是不救 救了万一我死了 不救万一ta死了我是不是会有心理负担 所以一开始就不要给自己选择的机会 在浅水区悠然自得就👌了

PWM

Arduino 可以直接输入模拟信号而无法直接输出模拟信号。但是,PWM 引脚可以通过调整占空比来输出不同幅值的电压,从而输出近似的模拟信号。(详见第 10 章)

(实验 10.1.2)使用 PWM 引脚输出近似的模拟信号,并使用模拟引脚读取,得到的电压变化如下图。其中平滑的曲线为理论上输出的电压,反复振荡的曲线是输入引脚读取的电压,也就是 PWM 引脚实际输出的电压。

使用模拟引脚读取 PWM 信号

但是,这个实验的结果很不精确,因为模拟引脚读取速度十分有限。使用示波器可以得到更为精确的结果:

使用示波器读取 PWM 信号

Timer

Arduino Uno 有三个定时器:Timer0、Timer1 和 Timer2。其中:

  • Timer0 用于 delay()millis()micros() 等函数,并控制着 5、6 号引脚的 PWM 输出;
  • Timer1 在基础实验中不使用,并控制着 9、10 号引脚的 PWM 输出;
  • Timer2 用于 tone() 函数,并控制着 3、11 号引脚的 PWM 输出。

产生电磁波

产生电磁波有两个条件:高频振荡信号和开放电路。后者可以通过接天线实现——当然,悬空的杜邦线也是可以的。下面着重说说前者:

本次实验中使用 Timer1 产生高频振荡信号。配置 Timer1 需要修改 TCCR1ATCCR1BOCR1A 等变量的值,较为麻烦。而 TimerOne 这个第三方库可以用来方便地配置 Timer1。使用以下代码即可在 9 号引脚处生成占空比为 50% 的 PWM 信号:

1
2
Timer1.initialize(1);
Timer1.pwm(9, 512, 1);

产生电报信号

tone()noTone() 函数可以产生指定频率的方波。将方波接入蜂鸣器,即可发声。

电磁波携带电报信号

将高频振荡信号与电报信号通过与门相叠加,再通过开放电路发射出去,即可实现发报功能。

使用示波器测量叠加后的波形,可以看到波形在微秒尺度上具有周期性:

最终发射的信号(比例尺 500ns)

但是,当比例尺缩小到毫秒尺度时,呈现的波形仍然具有周期性。这是为什么呢?我并没有找到原因。可能是因为波形振荡太频繁了,出现了显示错误。

最终发射的信号(比例尺 2ms)

延伸阅读

昨天(2月24日)晚上,我在写作业之余,去隔壁宿舍逛了逛。

刚一进门,原汁就向我求助。原来他在上学期的 C 语言课上学着写了一段生成全排列的代码,但是始终没有搞清楚代码的工作原理。代码如下:

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
#include<stdio.h>

void f( int i ); // i 是正在执行的位数
int num[10]; // 存放每次排列
int a[10]; // 统计该数字有没有被用过

int n; // n 开成全局变量

int main()
{
scanf("%d", &n);
f( 1 );
return 0;
}


void f( int i )
{
if( i == n+1 ){
for( int cnt1=1; cnt1<=n; cnt1++ ){
printf("%d ", num[cnt1]);
}
printf("\n");
return;
}

for( int cnt=1; cnt<=n; cnt++ ){
if( a[cnt] == 1 ){ // 已经使用过这个数字
continue;
}
num[i] = cnt; // 将这个数字存入答案数组
a[cnt]++; // 记录已经使用过这个数字
f( i+1 ); // 进行下一步递归
a[cnt] = 0; // 回溯后将 a 数组归零
}
return;
}

输入数字 n,这个程序就能生成 1–n 的全排列。

原汁不明白,为什么如此简洁的 f 函数能够不重不落地生成全排列。我为他画了树状图,演示递归与回溯是如何进行的;可他还是不理解,于是自己亲手模拟了一遍。后来他又用 Dev-C++ 的调试功能监视了一些变量的变化,最后终于明白了。

这时我想到,我的电脑上装有 VSCode,里面的调试功能可能更高级一些,于是我用我的电脑调试了一遍:果不其然,VSCode 支持显示函数调用栈,清晰地向我们展示了递归与回溯的流程:(注:由于 gdb 不支持中文文件名,我将文件名换成了英文。)

调试界面

隔壁宿舍的高子也在用 VSCode,见状直呼牛逼。他也想用 gdb,但是当我帮他启动调试,向控制台中输入 4 的时候,却直接卡住了,没有任何反应。我按下 Ctrl+C 中止了调试,之前输入的内容立刻显示了出来。我上网查了许多方法,改了 VSCode 的配置,怎么都没有用。眼看时间已经过去了半个小时,问题还是没有解决,我想要放弃了。

最后,我对比了一下我和他屏幕上输出的调试信息,结果发现了端倪:

我输出的前两行调试信息如下:

1
2
=thread-group-added,id="i1"
GNU gdb (GDB) 11.2

再看高子的,如下:

1
2
=thread-group-added,id="i1"
GNU gdb (GDB) 7.6.1

好老喔,这么老的版本还支持吗?我去查了 VSCode 的官方教程,上面说的是“Get the latest version of Mingw-w64…”,看来最好还是用最新版吧。

高子正在用的是 MinGW,而 MinGW 早已停止了更新。我帮他下载了 mingw-w64(注:这是精简包,仅包含必要的功能。),解压出来,并修改了 PATH 环境变量。由于编译器路径写到了他的 VSCode 配置里,我又删掉了配置,这样 VSCode 才会在 PATH 中重新搜索。

至此,VSCode 调试环境的搭建终于成功了。有了 VSCode 强大的调试功能,高子的编程之路更进了一步。

0%