普通视图

发现新文章,点击刷新页面。
昨天以前Godot's Blog

读《平凡的世界》

2024年8月27日 06:52
一直都惦记着读一读这本书,但也许是觉得这样的大部头不好啃,所以迟迟没有开始,最近突然来了兴致,读起来便一发不可收拾,短短几天翻完了,却又感到意犹未尽。 不知为何,黄土地的故事总是很吸引我,比如《血色浪漫》里钟跃民几人在陕北插队那一段就让我印象深刻。贫瘠的土地,苦难的人们,所有的酸甜苦辣都在一首首的信天游中迸发,荡气回肠,而人与自然间长久的生存斗争又激发出无穷的魅力。这一切在那个动荡的年代背景下,让我难以想象到底发生过多少曲折不易的事情,也恨不得亲身跳进漫天的黄沙中,与老乡们一起为了活下去而煎熬。 不论在任何时代,只有年轻的血液才会如此沸腾和激荡。每一个人都不同程度有过自己的少年意气,有过自己青春的梦想和冲动。 还记得老爸特地嘱咐我,叫我看看这本书,我突然很能理解他的用心了,可以肯定的是,他也同样为这片土地上的故事打动,甚至产生了强烈的共鸣。毕竟,就像孙少平一样,他也是在那个年代摸爬滚打地走出了小山村,努力闯出了一片天地。也正因为此,我长大的条件要优渥得多,但幸运的是,我也走过了自己的幽暗山谷,经历了该有的锤炼。这让我同样对书中的人物有极大的共情,比如孙少安审视自己的条件后毅然放弃了和润叶在一起的机会,又比如少平在艰辛的生活中通过读书得到了坚强的精神慰藉,也因此更加理解人生的困苦与幸福。 其中我对少平的成长感触尤深,因为我也坚定地相信和向往精神追求。从书中感悟人生,进而理解幸福的本源,这与《刀锋》中的拉里不谋而合。体力劳动与物质追求是幸福生活必不可少的基础,但更重要的是思想与精神上的修炼。当我们学会坦然面对感情的磨难,也就明白如何表达自己的爱;当我们甘于接受不可逆转的现实,就更了解努力与拼搏的意义;当我们不再集中凝视自己的不幸,才会开始理解他人的处境;当我们体会过失去的痛苦,就能知道珍惜有多么重要。 直到在那远离故乡的地方发生过那场刻骨铭心的感情悲剧后,他才理解了人活在世界上有多少幸福又有多少苦难!生活不能等待别人来安排,要自己去争取和奋斗;而不论其结果是喜是悲,但可以慰藉的是,你总不枉在这世界上活了一场,有了这样的认识,你就会珍重生活,而不会玩世不恭;同时也会给人自身注入一种强大的内在力量…… 小说的最后,少平选择回到了铜城,之后也许当了一辈子煤矿工人,但这绝不是一种失败,因为他已经完成自我的救赎。从双水村到原西县,从黄原再到铜城,他见识了外面的世界,也走出了心中的牢笼。我想,每个人都是一样,我们都有属于自己的枷锁,唯有找到它,面对它,打破它,我们才能从内心的恐惧感中解脱,最终坦然地面对死亡。以《刀锋》中的一句话做结吧: 剃刀边缘无比锋利,欲通过者无不艰辛;是故智者常言,救赎之道难行。

说声再见

2024年5月8日 05:08
上个月就看到 Google Podcasts 准备停运的消息,但服务并没有下线,这让我还抱着一丝侥幸心理,直到前几天再次打开时页面已经变成下图的样子。 该走的总要走,好在高质量的播客 App 还有很多,我简单试用了下之前注意到的 AntennaPod 便决定换用它了,亮点很明显:开源、无广告、简洁好用。除了标配的订阅、收藏和队列功能,它提供了个类似 Readwise 的 Home screen: 本质上就是提供了一些定制化的推荐与简洁入口,因为平时 Readwise 用得比较多,这给我带来了一份额外的亲切感。 当然,AntennaPod 也支持 OPML 格式的数据导入,Google Podcasts 的页面现在还是可以下载之前的订阅源的,或者也可以直接参考这篇教程。 除了这次迁移,还发现了个很神奇的网站,可以方便地查找播客的文稿:app.podscribe.ai. 虽然看起来平平无奇,也不是大厂的产品,但是真的好用,而且免费。在 Reddit 看到关于他们的帖子说目标是汇集所有的播客并提供语音文本,不过用的应该还是第三方的 ASR 服务,所以也不可能一直用爱发电,也许还在寻找合适的盈利方式中吧。 其实他们网站既可以直接听也提供了文字稿,感觉甚至不再需要 App 了 🤷。 最后推荐一些自己在听的播客吧: The Daily 新闻时政,语速比较快,了解时事专用 Modern Love 感情专栏,年纪大的我现在反而很爱听 Life Kit 各类生活小知识,听起来放松不累 Eat Your Crust 很随意的聊天,适合用来熟悉生活化口语 Inside of You 欧美娱乐圈采访类,有感兴趣的明星时是最棒的 Philosophize This! 最近发现的一个哲学播客,感觉很硬核 This American Life 网站做得很棒,自带文本,略长,每集一小时起 最后还是要说声再见,不光对 Google Podcasts,也对一个朋友。人生总有聚散,相识也难免别离,重要的永远是学会珍惜生活中的点点滴滴。生活依旧美好,时光待我不薄,再见。

Implement Dark Mode With React

2024年5月4日 02:10
Being able to switch between light and dark mode has always been a fancy feature in my mind when it comes to the UI part of an app. Recently I’ve done it myself and found it actually quite straightforward to implement. Rationale Aside from any frameworks, let’s think about how color mode switch should work. Apparently we need 2 sets of colors defined with CSS, as well as an easy way to change between them for our HTML elements.

奶奶

2024年2月17日 14:44
奶奶走了。 一切发生得太过突然,远在异国他乡的我迟迟不知道作何反应。也许是事发仓促,也许是相隔太远,也或许是从小没有经历过失去亲人的我,第一次面对,还没有办法意识到这真正意味着什么。 同样,我也无法想象现在的老爸是什么感觉。他是个大孝子,每年春节都会回老家过年。这次回去还跟我提到,奶奶现在身体大不如前,看着她一天天老去,心里不是滋味。初一那天给我拍了视频,里面还看到奶奶坐在椅子和别人聊天,第二天便出了事。老人是突然陷入昏迷,后面也没再醒来。我想那会不会就像做梦,希望梦里没有病痛,她只是轻轻地看着自己的儿女孙辈们,挥手告别,然后迎着光来的方向,去和爷爷团聚了。 说实话,我对奶奶的记忆不多。但出国之前,我专程去看了她,那一天的场景,不断地浮现在我的脑海里。我们一起吃了午饭,又看电视,说了很多很多话,还合了影。我很庆幸,也很感恩这半天的团聚,回忆起来都是开心的样子,我告诉她未来的打算,她高兴地听,又提醒我该早点成家。这一切是如此地历历在目,让我仍然觉得奶奶还在杭州等着我,而不是已经离开了。 再回想起那个下午,我和奶奶说,想出去走走,其实是顺便到附近的水果店转转,看看有没有不那么甜的水果可以买给她。天气有些热,但我跑了几家之后还是有不少收获。回去时还在楼下遇见了奶奶,她是担心我不识路下来找我的。后来我们一起吃了水果,那时我感到很满足,她也一定一定很开心吧。我想我会永远记得那个午后,杭州的初夏,街边的水果店,我们一起看的电视,以及奶奶的笑声。 亲爱的奶奶,一路走好。

读《近距离看美国》

2024年1月29日 06:52
《近距离看美国》是套系列丛书。前两年我早早地读完了前两本,第三本却拖延至今。然而落笔之际又发现还存在第四本,这感觉就像写完作业之后发现书包里还有张空白卷子,经历过的人一定能体会,那就是无论如何也要先缓缓了。所以我必须先写点什么,一吐为快。 书的主题明确,就是以外乡人的视角看待另一个国家的来龙去脉。作者笔名林达,实际上是一对作家夫妇。可以看出来,他们很好地融入了美国社会,也肯定经历了从质疑到理解再到成为的过程。而这几本书对我的最大意义,就是探索一个重要问题的答案:为什么来到北美? 作为中国人,世界总显得很遥远。虽然早就不再是天朝上国,我们仿佛很难摈弃以自我为中心的宇宙模型。同时,过于信赖直觉让结果大于一切的想法盛行,也导致了很多很多缺失的为什么。就像现在,无数人想润,美国、欧洲、日本、新加坡,因为那里光明,此处黑暗,很少人会过多在乎原因。上清华还是北大?好好学习,别老想些没用的。 可是再次来到北美生活,我的感受已经大不相同。也许是有能力静下心来想更多,也或许是年龄让我自然地开始关注人生的重点。我想很明确的是,无论处境如何,搞清楚情况至关重要。说回丛书,前两本讲了很多美国的宪政,三权分立,总统选举,让人印象深刻的是法治的深入人心。第三本集中在奴隶制的废除,从建国到南北战争再到后来,无数的血泪史让人无法不关注种族问题带来的深远影响,尤其是很多问题仍在继续,并且可能会永远存在。但不管怎么说,美国文化对人性的尊重确实让我印象深刻,无论真相多么惨烈,这些老外们依然会选择脚踏实地地面对。相比革命带来的打倒与翻身,这种做法莫名地让人感到安全,如同书中所说: 这并不是说,这里的人们不懂得正义必须得到伸张,更不是他们不关心正义伸张。而是他们理解,历史的前进、制度的完善、人性的醒悟都是渐进的。对一个在人道原则上建立起来的公众契约,对它所包含的制度、游戏规则和运作方式的尊重,是共同推进一个人道社会的基本保障。 还有,就是对待一个具体事件的处理,它的整个过程是向全体人民公开的,是在新闻监督之下的,很难有一手遮天的私藏猫腻。只有这样,人们才可能对一个尚不完美的制度仍然持有信心。假如人们发现,有一个足以超越制度的、凌驾在上的力量在暗中操纵的话,那么,这个社会的整个基础和信心就会在顷刻之间灰飞烟灭了。 这让我想起了童年。一个场景是小时候在家,父母一方面以大道理施加教育,比如好好学习、诚实守信等等,一方面又会在情况对(他们)自己不利的时候找补,比如大人的事小孩子莫管,或者干脆一通训斥了之。另一个场景则是和小伙伴们一起玩,大家年龄相仿,地位相当,没有谁给谁当家做主,也没有什么值得藏着掖着。现在想想,那可能是我的民主启蒙。 最后,如果你真的对移民(北美)感到好奇,那么《近距离看美国》值得一读。这里的移民指的是一种真正的身份认同,而这种认同少不了对一个新的国家以及这个国家不同种族群体的好奇与了解。当有一天我可以坦然地面对"洋鬼子们"而又不那么自以为是的时候,心里应该会轻松许多吧。 P.S. 2024是个闰年,估计也是个润年,希望所有在路上的人都能够得偿所愿,平安喜乐。

游扬州

2023年5月22日 09:53
和之前的习惯一样,这次去扬州也是期待了很久,然后来了一场说走就走的旅行。 故人西辞黄鹤楼,烟花三月下扬州。 孤帆远影碧空尽,唯见长江天际流。 – 李白 遥在疫情之前就向往在三月游玩扬州,却一直拖到了现在。不过最近才知道,古人说的烟花三月其实是四月份,避开凉意尚存的四月和拥挤的五一假期,我总算得以在夏天来临之际前往这座心系已久的小城。 出发时苏州正好下雨,凉快得很,坐高铁一个多小时便到了。订的民宿位置很便利,在彩衣街,邻着有名的东关街。安顿好已经是晚上了,民宿老板推荐了附近的蒋家桥饺面,据说这是当地有名的老店,随意点了三丁包、烫干丝和干拌面,价格都很便宜。其中三丁包肥而不腻,烫干丝微甜爽口,吃得非常满足。随后便顺道逛了逛旁边的东关街。这里可以类比北京的南锣鼓巷,这时候游客不算多,街道干净,也不吵闹,很适合雨后的晚上漫步。 位于街角的老店 三丁包 烫干丝 东关街尽头的城楼 第一天 瘦西湖是我的第一站。早饭本打算就近去怡园,这其实是个酒店的餐厅,听说口碑不错,但到了才发现十分拥挤,服务员也顾不上招呼。我不喜欢扎堆,便随意找了个小店,感觉更贴近当地人的生活。 碳水满满的饺面 到了瘦西湖,已经有不少人在排队了。可能因为前一天刚下过雨,天气很凉爽。买票进去的时候撞见了热闹,前面的两个阿姨用的证件同名同姓,工作人员起了疑心,便要求出示身份证,双方僵持不下。估计就是为了省钱做的手脚,但说实话门票确实不便宜,白天100,夜场120,不过逛了一圈下来我觉得还是很划算的,瘦西湖的美景名不虚传。 整个景区还是很大的 因为我家 KIDDO 不舒服,索性给她来了个直播游览。从南大门开始,一路向北,第一次体验到了网红博主的感觉,原来远程的陪伴也可以很温暖。虽然是工作日,也躲开了假期,游客仍然不少,大部分是跟团旅游的大爷大妈,想来这种 5A 级景区什么时候人都不会少的。从北门出去之后还有大明寺可以逛,但已经临近中午,我便直奔饭馆了。 我的 KIDDO 说拍得很好 随后又来到了个园,这里号称是中国四大名园之一。好奇上网查了一下,有说其实没有个园,而是苏州的留园,但是后来又有了个园的说法,总之都是为了吸引游客,对我来说欣赏美景才是最重要的。个园的名字出处很有意思,园主人好竹,所以栽种了各类竹子,而竹便是个字组成的。 竹林一瞥 此朴树非彼朴树 中间的石头貌似很有讲究 从个园出来又是东关街,看了眼手环已经走了两万多步,着实有点儿累,便直接回去补了个觉。路上还买了扬大酸奶,据说是扬州大学研发的,已经成为本地的网红美食了。有很多种口味,我买了茉莉花和芒果的,前者的花香搭配酸奶的浓稠口感尤其好喝,推荐。 只要 3.5,很实惠 一觉醒来,该吃晚饭了。本来有个红星餐厅想打卡的,可惜已经打烊了,于是又去了蒋家桥。这次点了锅贴和馄饨,再配上醋和辣椒,吃得不亦乐乎。 笋肉锅贴,鲜嫩多汁 虾籽馄饨,量大份足 吃完决定去试试扬州搓澡。聊天之间感受到了扬州师傅的热情,还尝试了烫背,非常解乏。这才是真正的洗澡呀。结束之后天已经黑透,便直接回去睡觉了。 第二天 昨天走得有点儿累,今天就打算悠闲一些。出门先买了个街边的青稞馍,刚出炉的,清甜可口。然后便来到了仁丰里,这条小街和北京的五道营胡同很像,呈现出的都是市井生活与现代美感的交融。 外酥里嫩 仁丰里 竹林,还有鲜花 前面好像是个民族建筑 走到尽头,是一家网红的小吃店,叫做樊记火烧。他们家的烧饼夹鸡蛋油香四溢,层次分明。后来我发现里面还加了五花肉来增加口感,怪不得味道如此诱人。 据说到了下午就会人满为患 一个字,香 一边吃着一边往何园走,路上突然收到了 OPR 的邮件,心情大好,没想到在扬州收获了意外之喜。阳光明媚,在何园里和我家 KIDDO 畅想未来,甚至无暇顾及园内的美景。这里不负晚清第一园的盛名,构思精巧,相比个园更加引人入胜。另外,我发现欣赏景点还是需要导游的讲解才能理解其中的奥妙,不然很容易走马观花。比如片石山房的水中月,以假山堆叠出来的圆洞映射在湖面,既精巧又隐蔽。 假山上的亭子 倚南窗以寄傲,审容膝之易安。登东皋以抒啸,临清流而赋诗。取自陶渊明的归去来兮辞 相映成趣 心中若无烦恼事,便是人生好时节 月牙形的小门 之后来到皮市街,进了一家日式小店,环境不错,安静优雅。点了个手作芝士豆腐,浇上蜂蜜,清甜细腻,比冰激凌更解暑。室内的空调有点儿凉,我便又换到了二楼的阳台,在一片树荫下,偶尔有微风吹过,稍作小憩,又看了会儿书,最后心满意足地离开了。 细腻爽滑,胜似冰激凌 室外比室内更舒服 晚饭本来想去前一天没赶上的红星,却正好路过了之前在小红书看到的狮子楼,于是便改了主意。这家是主打淮扬菜的老店,除了招牌的极品狮子头,我还点了大煮干丝和扬州炒饭。狮子头口感细腻,里面还藏了个蛋黄,可惜口味太淡了,就像没放盐一样,实在喜欢不起来,还是挺遗憾的。大煮干丝和扬州炒饭很棒,吃了个肚儿圆。饭后顺着一条小巷慢悠悠地溜达回去,心里还在因为 OPR 激动不已,很美好的一天。 极品狮子头 大煮干丝 扬州炒饭 喜欢这座小城,也喜欢这种随性的旅行,没有固定行程,也不用为了打卡匆忙赶路。虽然还有很多地方没去,比如大明寺,还有大运河博物馆,但这也让我对下一次的扬州之行充满了期待。 希望早日和我家 KIDDO 团聚,也希望下次再来扬州就是两个人一起啦。

Formatting in Neovim

2023年4月20日 16:05
With Neovim and null-ls plugin we can make code formatting work like a charm, as I stated in My Neovim Revamp previously. While I was happily enjoying it, I did some tweaking for a little more convenience, such as: Format on save. Customize formatter. Format conditionally in runtime. Let’s get right into it. Format on save This is plain easy if you check out the wiki of null-ls. According to this part, all you need is copy&paste the code into your own config.

My Mac Setup

2023年4月13日 17:45
Thanks to my lovely gf, I have been able to get my hands on an Apple M2 lately. Coming from Arch with i3, I thought I’d get to this more UI-based and mouse-involved operating system, which seems like a degradation. However, after some digging, it becomes really comfortable for me being both elegant and efficient. General setup I would skip the system settings part, where you may want to customize display, input methods, or modifier keys etc.

My Neovim Revamp

2023年4月5日 20:31
Yeah, I did it again, but for a good reason. I have been using VSCode for while, which is great with plugins like GitLens and Docker. Besides, it’s really handy to debug code, view all kinds of files and draw various diagrams such as UML. I thought I’d wave my hands to Neovim, however, I found I still need it, a lot. Not trying to nitpick, but I have to switch between keyboard and mouse from time to time with VSCode, which sometimes can really interrupt my train of thoughts.

My First DMCA Takedown

2022年11月25日 19:04
It’s been a while since last post, yet I haven’t been idle. As the title tells, this is a record for that first experience. Since DMCA is a US law, here I chose to write in English. I’m aware many have read my blog for just one reason: “Amazon OA 2022”. I shared quite a bit of information in that post which I consider would be useful for preparing the Amazon online assessment, and there have been some positive feedbacks.

我为什么开始用 Logseq

2022年10月27日 17:29
粗略估计,使用 Obsidian 也有两年了。最近试了下 Logseq,感觉很不错,说说自己的想法。 回顾过去,我是在工作后才开始注重记录的,也尝试过不少工具:有道云笔记,印象笔记,一个比较小众的软件 Leanote,甚至是实体笔记本。 过了一两年,被同事安利了 Notion(那时候小 No 还处于艰难的求生阶段),简单了解之后我觉得非常好,便开始全面使用。 到 2020 年,Roam Research 火了起来,同时炒热的还有双链、图谱等概念。建立一个高效的第二大脑相当吸引人,于是我对个人笔记的热情被再次点燃了。由于 RR 过于昂贵,我投向了 Obsidian 的怀抱,直到现在。 Before Obsidian 于我而言,Notion 之前的笔记软件基本可以归为一类,以印象笔记为代表。这类软件一般基于层级目录的结构,以分类和标签的方式聚合笔记,并配合以关键字为主的查询方式(印象笔记甚至支持搜索图片中的文字)。有段时间我一度沉迷于印象笔记推出的各类折扣。 Notion 的创新应该算是具有划时代的意义了,比如 Page 和 Block 的概念也在 Logseq 中沿用。在我的印象里,除了偶尔的网络问题,Notion 是很完美的,甚至因为功能过于复杂和强大,让我后来有些望而却步了。 With Obsidian 除了 Zettelkasten,本地存储是我切换到 Obsidian 的另外一个重要原因。Notion 对网络的依赖让我认识到本地数据的重要性,再加上云端同步,Markdown + Local files + Dropbox 成为了我的笔记标配。 可惜的是,虽然 Obsidian 非常先进、好用,但它本质上也只是个工具,错误的使用让我又走上了从入门到放弃的老路。 仔细想想,其实我一直把它当成一个加强型的 Markdown 编辑器来用。对于那些核心的 Feature,比如 Backlink,我都是默认关闭(可能是因为显示在右侧,觉得比较占地方吧),几乎没有看过;再比如 Graph view,虽然笔记积累了不少,但也没有从中产生过什么有用的联想;在多数时候,我只是输入关键词做全局查询,连标签都很少用到。 时间一长,我又失去了做笔记的热情。 With Logseq 初看 Logseq 让我觉得很有 Notion + Org-mode 的感觉(曾经试图研究过后者,最后算是弃坑了吧,不过无论 Org-mode 还是 Emacs 都非常了不起),但抛开工具本身,它的设计理念解答了我很久以来的困扰。 这里推荐 Randy 的 我是如何使用 Logseq 的 这个视频,把核心理念解释得很清楚。

游大理

2022年8月30日 14:49
来云南前只想好了去腾冲,并没有决定之后的行程,这样随性的旅行让我觉得自由。 至于其他的城市,小时候跟着家里去过大理和丽江,所以并不打算重游故地。不过,在腾冲结识的一位大叔极力推荐洱海的美景,还热情地拿出照片证明,于是我改变主意,既然不想这么快回家,大理又离得不远,就把它作为下一站吧。 落脚 大理的车站不比昆明,这本没什么,不太方便的是出来找不到厕所。一番折腾后,才在马路对面的巷子里找到了公厕。 打个车来到了预订的住处,与其说酒店,更像是高层的公寓被改造成了统一装修的房间,不过环境尚可。 住宿的位置在下关镇。后来才发现,这是个错误的决定,因为离景区太远了,更明智的选择是古城里面或周边的民宿。 地理位置大致如下(图里的大理镇就是古城): 图片来自豆瓣 - 在大理旅居的日子 简单收拾下,便去城里转了转。不得不说,这趟短行令人失望,街道两边满是小吃店,人声喧闹,让我觉得格格不入。浮躁、商业化是时隔近二十年后大理古城给我的初印象。 洱海 第二天到了下午才出门,一个重要原因是防晒。 之前在腾冲顶着大太阳走,一天下来发现小臂和鼻子都晒伤了,这才意识到云南紫外线的厉害。 虽然擦防晒很管用,但需要配合卸妆油冲洗。在网上看到还有喷雾类的产品,不知道可不可以省去这种麻烦。 前一天在京东下了单,上午便收到了,除了防晒,还买了个 U 盘。之所以买它是因为升级操作系统时不小心搞坏了 Grub,必须要 Live boot 修复。这也让我意识到作为 Linux 用户,随身携带 Live media 的重要性。 下关的风很大(大理有苍山雪,洱海月,上关花,下关风的说法),到了洱海边便风平浪静了。进入生态廊道后,有很多自行车可以租骑,路程很长,所以骑行观赏是个不错的选择。 这次的海边之行,让我真正领略到洱海之美,也动了留在大理的心思。 爸爸和女儿的对话很有爱 小哥的背影完美融合 美丽的洱海 云海笼罩的苍山 一路向前,天色渐晚,我又来到了古城。肚子有些饿,正好看到一位慈祥的老奶奶在摆摊,便决定尝尝。视频里的烤乳扇是大理特色的奶酪制品,加热烤软后再裹上玫瑰酱,甜香又有嚼头。 老人家一边做东西一边亲切地给我介绍大理的小吃,让我深深地感受到了当地人的热情。 佛乐 第三天依然过得很慵懒,虽然知道有很多美景未去,但游玩并不是我的目标。就在这天,我得到了一些期望的慰藉。 之前在豆瓣上联系了家月租的客栈,在古城内,所以下午又来到了这里。客栈的位置很好,紧挨着人民路,小间在一楼,价格便宜,800 一个月,包水电网。我对居住条件没有太高要求,所以觉得还不错,但因为无法就此留下,所以只是答应对方考虑一下。开店的是一对夫妇,大哥告诉我他们定居大理已经四年有余,给我讲了很多当地的风土人情,还说许多人来这里都是为了疗伤,有些选择离开,有些留了下来。最后聊到了饭辙,他们很少做饭,因为附近吃饭很方便,旁边有家本素拾堂,专做素食。我一听便来了兴致,正好晚饭没有着落。 大哥带我来到餐店门口,打了两句招呼,便扭头回去了。我按着看店大姐说的,拿起饭盒打了饭菜,津津有味地吃了起来。 虽然都是素菜,味道却不错。我看其中一道满是青椒,顺嘴问了句会不会很辣。有些出乎意料地,除了大姐,还有个在一旁吃饭的姑娘也加入回答我的问题,对话很是自然。这感觉很舒服,我便开了话匣子,问到店里播放的诵乐,说听得自己想哭。这好像触动了大姐,她提到很少人会有如此感觉,也许是我有缘,还建议我不妨尝试自然地让眼泪流出来。我深知自己是无法在旁人面前落泪的,连忙摆手婉拒。大姐很是理解,没再多说什么,我便自顾自地开始吃剩下的菜。 而后在城内转了转,之前的感觉犹在,仿佛心里打开了一道缺口,有些积压许久的东西缓缓流淌出来,让我在悲伤之中又有些许畅快。 大概是缘分牵引,我又回到了那个小店,打算问问住宿,其实是心里想再听听那诵经声。大姐见我回来,也没有过多诧异,我们便随意攀谈起来。说话之间又聊到了那首曲子,她说是佛乐,网上找不到,我也无意强求什么,只想再多听一会儿。大姐见状也不再打扰,为我泡了壶茶,径自收拾厨房去了。 云滇红,味道清香 这乐曲为女声吟唱,似乎只有一句,听来却不觉得枯燥。说实话,它让我感到久违的疲累,这反倒是件好事,因为我正苦于不知如何放下一些沉重的念头。不用装模作样,不用秉持信念,不用时刻准备战斗。如果能不那么执着,就像电影里说的,把手松开,是不是就可以拥有一切了。 如此一夜过去。那些反覆的杂念,无法消散的呓语,挥之不去的思绪,好像都随着昨日的乐声离去了。或许只是暂时的沉淀,未来还会再度泛起,我不能确定,但心确实有一点放空,还变得有些轻松。 最后一天要赶飞机,夜里难眠,莫名又想起了金刚经里写的: 过去心不可得,现在心不可得,未来心不可得。 好像更理解之前为什么不能放下了,总是在想,过去为何糟糕,未来会不会好。不管是否拥有,一旦想要把握,便会开始失去。心不可得,也就是心一直在变化,不会停留,就像时间一样。 如同在心流中,如果能抛下执念,做任何事情都会变得轻松和满足,也感受不到时光的流逝了。 是为合一的状态?我不知道,也许只需要,一件事一件事地去做就好了。 因为暂时没有做好留在这里的准备,所以还是要离开的。不过我想,待到时机成熟,一定要再来大理居住些日子。到时候,想要认识些有意思的人,多看看苍山雪与洱海月,再次享受这份独一无二的自由。

Sum of Total Strength of Wizards

2022年7月26日 10:41
前两天做了一道算法题,虽然没能成功解决,但是是一道很有意思的题目。 抛开题面的包装不谈,核心内容就是给定一个数组,计算它的所有子数组的最小值与加和的乘积的总和。 (这里要注意子数组的定义,一定是连续的,如果不连续的话叫做子序列。) 比如对于 [1, 2, 3] 来说,一共有六种情况: [1]: 1 * 1 = 1 [2]: 2 * 2 = 4 [3]: 3 * 3 = 9 [1, 2]: 1 * (1 + 2) = 3 [2, 3]: 2 * (2 + 3) = 10 [1, 2, 3]: 1 * (1 + 2 + 3) = 6 最后答案为 1 + 4 + 9 + 3 + 10 + 6 = 33。

夏日午后

2022年6月21日 14:37
这将是一篇很散的散文,仅凭着一些美好的感觉动笔,没有规划,也没有大纲。之所以这么做,是因为有时意境转瞬即逝,如果过去了,就很难再找回来。 一切来自于刚刚的午后散步,不过短短半个小时。这本是一天中最热的时间,现在又是夏季,幸得在绿荫的庇护下,我反而觉得清凉。最近才搬来的这个小区面积广阔,绿植遍布,如花园一般,住的多是老人与孩子,氛围恰到好处。 我站在路边的台阶上,看着不远处三两棵高木冲着烈日而去,泻出一片阴凉在四周,几只鸽子掠起,隐入了树叶的怀抱。正好奇自己何以将鸟儿的动作看得如此清晰,一阵轻巧的凉风吹过,顿时将我带到舒适的凉意中,于是我放弃了思索,闭眼享受。良久,路过的行人给这份宁静画上了句号,我接着向前走,来到了一处小小的池塘边。水不深,但还算透澈,一条暗色的游鱼捕捉了我的注意,它不动声色地摆动着尾巴,很快消失不见。这让我开始思考矛盾作为运动基础的说法,大概不管是鱼还是人,我们要活动,就永远离不开一左一右、一屈一伸的配合。我沿着池塘边做平衡式的前进,突然想到个很好的解闷法子,那就是闭着眼像现在这般走,加上路线的弧形变化,想必要比直来直去刺激许多。虽然很喜欢自己的点子,我却没有付诸行动,因为心里并不无聊,只感到平和的惬意。 在归途的一棵树下,忽地又起了风,我自然要享受这难得的凉爽,于是驻足,仰头望去,叶子的形状比刚才看过的又都不同,它们帮我抵挡日晒,我欣赏它们的翠色欲滴。到了家里,耳中突然响起热闹的流行歌曲,我有些疑惑,想了想又觉得释然。音乐有助于改变我们的情绪,而心情又可以影响我们听到的声音。 只是一次简单的步行,写下来也不过寥寥数语。虽然文字不够生动,可即便换作语音或视频,也不足以向第二个人分享瞬间的微妙感觉。这像是一条鸿沟,造成了人与人之间的隔阂,但它也给予我们安全,让我们觉得自己是独一无二的,更感到无比的自由。

读《矛盾论》

2022年6月14日 21:52
最近读了矛盾论,颇有收获。 开篇先介绍了两种对立的宇宙观:形而上学与辩证法。什么是形而上学呢?在维基百科中这样定义: 形而上学是指透过理性的推理和逻辑去研究不能直接透过感知而得到答案的问题。 同时也有许多种不同的解释: 指关于世界构造的猜想,比如有没有上帝。(这也是我一直以来的理解) 指那些与科学相对的理论,它们没有科学的可证伪性,比如电子显微镜出现之前的原子论。 就是与辩证法相对的概念。 所以矛盾论里的形而上学其实是第三种,认为事物只会永远循环重复,过程中只存在数量的增减。而辩证法提出发展是对立的统一,在矛盾双方的作用下旧事物可能会变为新事物。 有时会听到一句话:人是不会变的。以形而上学解释,好人坏人懒人勤快人各有分布,但是天定难改,因此个体的努力也就失去了意义。辩证法则告诉我们,在内因驱动下,一个人是完全有可能改变自己的。 有内因,自然就有外因。无论是形而上学、进化论还是机械唯物论,都将外因作为事物变化的根本。但辩证法更强调内因,矛盾论里解释得很透彻: 事物发展的根本原因,不是在事物的外部而是在事物的内部,在于内部的矛盾性。任何事物内部都有这种矛盾性,因此引起了事物的运动和发展。 唯物辩证法认为外因是变化的条件,内因是变化的根据,外因通过内因而起作用。鸡蛋因得适当的温度而变化为鸡子,但温度不能使石头变为鸡子,因为二者的根据是不同的。 从另一方面看,这也体现了必然性和偶然性的关系。因为必然性来自事物内部的根本矛盾,决定着事物发展的方向;而偶然性作为表现形式,其中一定包含了某种程度的必然性。 接下来说到了矛盾的普遍性,也就是事物的发展过程中始终存在矛盾运动。矛盾是否可以作为一切运动的基础,我并不确信,但联想到生活中又觉得有些道理。 经常听人抱怨有做不完的事儿,可一旦真的闲下来了,又着急忙慌地去找工作来做。老话儿说,人不能闲着,大概如果真的消除了一切矛盾(连饭都不吃水都不喝),生命就终结了吧。这么一想,做事只是生命中矛盾运动的体现而已,没必要太过焦虑,更不要想着什么时候能把所有的事情都做完。不过这并不意味着 996 就是合理的,因为还要考虑到矛盾的特殊性。 共性中存在着个性,这很好理解。矛盾论直接从特殊性中总结出了实践经验的精髓: 具体问题具体分析 优先解决主要矛盾 对我来说,从上学起就对这两句话有印象了,尤其是具体问题具体分析。在人口众多的中国,一概而论的代价实在太大了。至于第二句,放到今天就是任务的优先级安排,主要矛盾也就意味着重要且紧急,当然应该优先解决。 最后讨论的是矛盾的同一性和斗争性。 所谓同一性,就是矛盾双方以对方为自己存在的前提,并且,在一定的条件下,向其相反的方向转化。这里的一定的条件是很重要的一点,说明只有在特定情况下,矛盾双方才会互换,但这种转换不是必然的。 比如在故事中,屠龙少年因为恶龙而成为英雄的角色,恶龙也由于村民的存在才被称为恶。屠龙一旦结束,有可能,少年幻化为新的恶龙,新生儿(恶龙转世)成为下一任屠龙者。当然,这种情形是可以避免的,所以尼采说: He who fights with monsters should look to it that he himself does not become a monster. 了解这种转换对看电影看剧是有帮助的,因为一旦出现好人上位坏人下台之后角色互换的反转,我就可以淡定地想到,由于编剧的脑洞大开,才造就了矛盾互相转化的前提条件。 矛盾的斗争性是其普遍性(或者说绝对性)的一种体现。也就是说斗争无处不在,只是表现不同。激化到一定程度时,双方会进入对抗的状态并最终使矛盾得到解决,也由此产生了新事物。 对于不同形式的矛盾斗争,要采取不同的解决办法。如果轻描淡写,问题得不到解决;但是处理方式过激,又会造成严重后果(所以不能凡事都上纲上线呀,同志们)。 其实同一性和斗争性在道德经中也有提到,只是过于言简意赅: 万物负阴而抱阳,冲气以为和。 前半句说事物都背阴而向阳,暗示了矛盾双方的统一存在,后半句指出阴阳激荡会形成新的和谐体,也就是斗争之后产生新事物的结果。矛盾论中结合实例阐述,用白话文的形式让每个人都能看懂,还是很了不起的。 那么矛盾论到了今天还有价值么?我想这一点是毋庸置疑的,因为在生活中处处都可以应用到它。 首先,要接受一个事实,就是矛盾永远存在,并且只会伴随着事物生命周期的终结而结束。因此我们追求的不应当是消灭矛盾,而是学会以游刃有余的心态处理不断出现的新的矛盾。 从个人的角度来讲,本我和超我的对立是永远存在的,这一点经常体现在我们想要一样东西,又觉得这么做不合适的时候。从矛盾的普遍性来看,前者出自本能欲望,后者由社会道德构建,出现冲突是必然的,所以没必要走极端,做一个极度任性或刻板的人。基于斗争性分析,如果是很普通的一件事,又不对他人造成影响,那么完全可以按想要的来,减少内耗;若是原则性的冲突,就需要认真思考再做决定(所以不能过于严肃,给太多事情贴上原则性标签)。这种冲突一旦爆发,那么矛盾解决,我们本身也就会发生一些新的改变,比如更加贴近想象中的自我形象,亦或是打开精神枷锁从而获得心灵的自由解放。 从人与人的关系来讲,分歧也是一直都会存在的。和朋友相处而不产生争端,是一种不切实际的幻想。寄希望于形势永远保持不变或者一直变好,只会在事态崩坏后更加无所适从。我想,关系的递进也离不开矛盾斗争的解决,通常两个人在争吵又和好之后都会觉得彼此之间更亲密了,这可能就是斗争性中对抗结束后新事物产生的一种证明吧。

关于 CORS

2022年5月17日 23:42
说起 CORS,就不得不先提到 SOP(Same-origin policy):浏览器打开的网页只可以对该网页的同源网站发起请求。注意,受约束的主要是脚本代码,不包括图片或者 CSS 等资源(字体文件是个例外)。同源的定义包括三部分,即协议、域名和端口都要保持一致。 为了缓解 SOP 带来的严格限制,有几种主流的解决方案可以选择: CORS JSONP:利用 <script> 标签来请求非同源地址的 JSON 响应,同时配合一个预先定义的回调函数来处理响应数据。 WebSocket:WS 连接并不受同源策略的约束,但是在建立连接时服务端也需要判断 headers 中的 Origin 是否可以接受。 其中 CORS 应该是最实用的一种,相比 JSONP 只支持 GET 请求,前者扩展了各种 HTTP 方法的跨域调用。 CORS(Cross-origin resource sharing),是一种跨域共享资源的机制,它利用特定的 Headers 来保证跨域请求的安全性,这些请求分为两类:简单请求和非简单请求。 简单请求,包括 GET、HEAD 和 POST,这里 POST 的 Content-Type 仅限于下面三种: application/x-www-form-urlencoded multipart/form-data text/plain 对于这些请求来说,只需要保证 Access-Control-Allow-Origin 中匹配了当前网页的域名即可,如果是 * 的话表明所有的域名都是允许的。 非简单请求,比如 Content-Type 为 application/json 的 POST,会增加一次额外的 Preflight 请求,即先发送 OPTIONS 请求给服务器,然后通过响应中的一系列 Headers 决定是否可以进行真正的请求。这些 Headers 包括: Access-Control-Allow-Methods:服务器允许的跨域方法,比如 POST。 Access-Control-Allow-Headers:服务器允许的跨域头部,比如 Content-Type。 Access-Control-Max-Age:Preflight 请求结果的缓存时间,默认为 5s。 另外,如果想在 Chrome 中查看 Preflight 请求的话,打开 Network 标签,点击 Other filter 就可以看到了。

Bottle 框架源码阅读

2022年4月22日 21:53
写这篇文章最开心的一点是终于可以用这张截图了: 相比名声在外的 Django/Flask/FastAPI,Bottle 可以说是非常不起眼了,甚至很多人并不知道它的存在。其实在很多方面,这个框架都极其优秀: 速度:截止到 2022-04-13,Bottle 在一众 Python Web 框架的测评中名列第二,要知道这可是十年以上的老前辈了。 易用性:Bottle 早在 Flask 之前就使用了装饰器来定义路由,此外还有全局可用的 Request/Response 对象。 文档:不仅将框架本身的使用讲得很清楚,还总结了很多 Web 场景下的解决方案。 代码质量:虽然为了 Python 2 做了不少兼容,但是代码很精炼,而且 Pythonic。 其他:Bottle 坚持单模块以及无第三方库依赖;仓库仍然在积极维护中。 换作几年前,我会一开始就使用并将 Bottle 研究透彻,而不是让自己淹没在 Django 浩瀚如烟的文档中。下面开始梳理 Bottle 源码的阅读理解。因为代码量不大,所以就直接看最新的版本了:0.11.1 - 5a6c620。 Web 框架的基本元素 参考 The Hitchhiker’s Guide to Python 的说法,一个 Web 框架要满足的基本功能: URL Routing Request and Response Objects Template Engine Development Web Server 从后端的角度来讲更重要的是 1、2、4 三项,其中 1 负责转发请求到对应的视图函数,2 是对 HTTP 协议元素的解析处理,而 4 决定了服务的部署方式和基础性能。 Bottle 在这几方面都做了很好的实现:路由上提供了通配符匹配和装饰器接口;请求和响应对象作为全局对象存在并保证了线程安全;Server 部署除了 Python 自带的 wsgiref 还支持绝大多数的 WSGI Server。

Python Logging 源码分析

2022年4月9日 09:52
阅读了源码之后,我对 Python Logging 模块的几大疑惑都得到了解答: 为什么 Logger 和 Handler 都有 setLevel 方法? Logging 中会出现 Race condition 吗?(感觉都是很直接的 write 操作) 正式环境中想看日志又没办法动态调整 logLevel,感觉很鸡肋。 用起来好像还不如 print 方便。 会有性能问题吗? 日常使用 首先要了解下 Logging 的用法。 1. 配置 基本上有三种方式,代码、文件和字典。先看下如何用代码设置: import logging # create logger logger = logging.getLogger('simple_example') logger.setLevel(logging.DEBUG) # create console handler and set level to debug ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) # create formatter formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # add formatter to ch ch.

关于 Pager

2022年4月2日 14:09
好久没有更新了,最近研究了下如何用 Python 实现 Pager 的功能,这里指的是 Terminal 中的 Paging 程序,比如 less。 Why Pager Pager 在大段文字的展示中很常见,比如 Linux 的 man page,而 $PAGER 就是用来指定默认 Paging 程序的环境变量。Python shell 里面的 help() 会默认翻页显示,IPython 的 ? 则更胜一筹,能够判断当前屏幕的可用空间来决定是否 Paging。 Less 应该算是最流行的 Pager 了,相比于 more,它同时支持前进和后退翻页,而且因为不需要一次性读取整个文件,它的启动速度在打开大型文件时要远远快于 vi。因此,许多 Pager 都是通过启动系统自带的 less 程序来实现。 Don’t Reinvent the Wheel 轮子总是有的,而且还很多,这里说几个比较好用的: Pydoc 的 pager Click 的 echo_via_pager IPython 的 page Pydoc 是 Python 自带的,已经稳定存在了很多年,轻巧好用;Click 的实现类似,而且支持传入一个 generator;IPython 的 page 更加强大,可以自动判断当前的屏幕大小,再结合一个 screen_lines 参数来计算最终的可用空间。 再说说这几个轮子的实现,基本思路都是上面提到的调用系统 Pager。因为要兼容五花八门的操作系统,大致上又分为三种处理方式: 理想情况下是使用 PIPE。因为打开的系统 Pager 必然是子进程,而 PIPE 通过内存中的缓冲区实现了 IPC,这样既不用一次性读取所有数据,后续的 write 操作效率也高。
❌
❌