Header logo.
极北人工智障
主页逐年标签自述RSS

搬家后续

搬到新家的时候,需要去一个保管钥匙的公司取钥匙。那天是 4 月 1 日。

我正在取钥匙的地方排队,接到房屋公司的电话说,检查了新家的卫生,认定不合格。问我想自己打扫,还是公司请清洁工来打扫。我前一天刚刚打扫了之前的房子,心想打扫卫生我可是够了。于是让他们请清洁工返工。

第二天清洁工来的时候,我不在家,而且打电话跟我用瑞典语说了几句话,只明白了「拿不到钥匙」(事后我才有了 l'esprit d'escalier)。于是第三天我就在家等着清洁工来。下午 2 点多,我听到有人试图开门,所以主动打开了门。清洁工大姐站在门外手里拿着另一枚钥匙。

我跟她说我是专门等到她来。她道谢。之后我就跑去宜家看家具之类的。房子这时候基本上还是空的,墙上有一些明显的坑、钉子孔、还有一些黑色的印子。之前的住户家里有猫,所以地板有很多猫的抓痕。之前来看房的时候铺着地毯,所以始料未及。我特地指了一下,抽油烟机的滤网是脏的,卫生间的排风口也明显是脏的。发现对方是菲律宾人之后用英语闲聊一阵,就自己去宜家了。

在宜家买了些东西,大概花了两个小时。要结账出门的时候,刚巧清洁工大姐打来电话说,你在宜家的话,我们开车接你吧。我一开始还怪不好意思的,但东西确实很重就拜托人家过来。聊了一路,比如她 30 年前来瑞典,一直做清洁工。现在住在城外的独栋房子里,手下有几个菲律宾兄弟姐妹,也都住在房子里。于是我就快乐地到家了。

结果发现确实干净了很多,墙上的黑印也都白净如初。但也发现,抽油烟机的滤网还是脏的。卫生间的排风口也还是脏的。(卫生间的排风口的问题可能是够不着,回想起来那两位姐姐都不太高。)

再然后,卫生间的门和卧室的门各有一个看起来像是拳头打的坑。这件事可大可小,心想将来找我麻烦可不好,于是在房屋公司的网站留言,还上传了照片。初衷是至少留个证据,如果能修就修,不能修我就挂两幅画遮上。

报修之后隔了几天,发现房屋公司的网站更新了状态,「门需要刷漆」。(我很困惑,刷多少漆才能盖住拳头洞啊。难道不应该是换门吗?)又隔了几天,有个大叔给我打电话。他努力把瑞典语说得很慢,我也努力练习瑞典语造句。大概得到的信息是,第二天他们会来解决门的事情,让我把家门钥匙留在门上的某个地方。这才意识到会不会是在讲门的内侧倒扣着的黑色「塑料杯」,于是追问「是不是那个黑色的塑料的玩意」(“den där svart grej i plast”)。对方说,没错的,就是那个啦。

门的外侧,塑料杯的外侧有一个另外的钥匙洞。想来是维修工可以用另一个专门的钥匙打开,取出预留的正门钥匙,进门维修。这才明白清洁工大姐一开始讲的是这个。(这一点之前没有任何人跟我交代过,摊手。)

于是第二天我离开家之前,把钥匙留在「塑料杯」里。心想刷漆也就几小时的事情吧,以为晚上到家之后能见到奇迹。

晚上到家以后真的发现了奇迹……

维修工把门卸下来,搬走了……

这是很多天之前的事情了,所以近一周来卧室和厕所都没有门……

搬家

又搬了一次家。

扔了一些用了很多年的旧东西。新房子没有想象中新,但还算干净。买了升降办公桌、餐桌、洞洞板 (Skådis)、地毯、床,之类的东西。钱比我想象中花得多一些。

未来几个月应该还需要陆陆续续添置一些东西。

不经意间想起

脑袋里偶尔会冒出一些想法,可能只是只言片语,感觉还蛮有道理,检索一下就会想起出处。

比如刚刚想起「故事的结构」,人物在一个「故事线」(story arc) 的开始,有一个状态 (state)。在故事线的结尾,这个状态一定会变化,产生另一个状态。故事线的曲折造成了人物状态的变化。

想了一下出处是 Robert McKee 的 “Story”。其实当时都没看完,看过的部分也没写笔记,但这个片段就一直记得很清楚。

如果活用一下这个「原理」,每一件事发生之后,对比开始和结束的状态,自己的状态、心态、做法总该有些变化吧。

現れる、訪れる

脑子里的词越来越乱,记新东西也越来越难。日语的问题是汉字贼多,读法还都挺怪怪的,所以就更加记不住。

于是就问 ChatGPT 有什么记忆小窍门 (“mnemonic devices”)。于是学到了如下两条:

有东西冒出来的时候,感到震惊呀,于是「あら!哇!」所以 現れる 是读作 あらわ れる

訪れる 的记忆窍门非常出人意料。ChatGPT 告诉我: “Oh! To zoo! Rare visit!” 还附送了几个动物的 emoji。所以所以是 おとず れる。不过它每次给的答案都不一样,又问了一遍就很中规中矩了。

最近

春节之前,查了一下日历应该是腊月十七,我爷爷去世了。

隔了一两周之后得知,在他去世之前一天或者两天,姑妈想用她的手机给我打视频,让爷爷跟我说说话,但是没打通。我有个「古代」的「国内」微信,但在另一个手机上,那个手机已经很久没开过了。

不知道这两件事有没有关联。

2024

2024 年最大的事情可能是中间失业了一个多月。

在上一年(也就是 2023 年)年底的时候,就感觉公司有奇奇怪怪的问题,CEO 自己因为签证的关系回不了瑞典,公司好像没钱了,但似乎是在找投资人谈。当时就在想要不要开始找新工作,但是一方面有拖延症,另一方面又觉得这样的节点撂挑子不太好。

接着到 2024 年初,我开始一边练习 Elixir,一边盘算投简历(实际并没有投多少)。这段时间 CEO 还表现得像往常一样,时不时地跟我们开会,时不时地甩来一些思路混乱的设计让我们实现。终于到 3 月底,公司宣布没钱了,要让我和另外一个码农离职。

中间涉及了一些法律问题,工会介入。于是公司在 4 月初的时候取消了 3 月底的解雇,重新走程序解雇了一遍……实际的效果是 5 月、6 月照常工作,7 月是所谓的「花园假期」(garden leave) 不必工作但是工资照付。其实这几个月也没多少事情,而且也知道即使想推动大的改动,时间也不够了(另一个码农当时在家看孩子,工作时间减半;何况公司的气氛也不对),所以捣鼓了一些 OpenAI 的 API,用 streamlit 写了一个聊天机器人;了解了一下 DDD;还看了一些讲「成功的产品团队如何运作」的书,比如 Inspired

之后 7 月份闲着也是闲着,给公司用 AnythingLLM 搭了一个 LLM + RAG 的小聊天机器人。部署之后一直不稳定,可能是它里面的 parser 不够稳健吧。

7 月底之后,按道理工会给发 80% 的薪水。但第一步是要在劳动局网站登记失业,我当时精神有点崩溃,晚了两天才去登记。所以那两天的钱拿不到。我登记之后隔了几天,劳动局的大姐打电话问我有什么工作经验、会做什么。讲完之后,大姐如释重负地说:「太好了,你这情况,不需要我局提供培训、指导。」

领钱之前又遇到了小小的阻碍。工会说查了我的纳税记录,中间缺了几个月,所以不能确信我申报的工时是准确的。找老板聊了一下,她又找了会计,隔了一两个星期改正了错误,又通知了工会,这才在 8 月下旬拿到钱。

而且实际的钱是按周发放的,每周需要在工会的失业金网站填「本周无业的天数」,每月在劳动局网站填至少 6 个申请的岗位。

那段时间一直很忐忑,改了简历的文本(还让 ChatGPT 润色了一番),好好捯饬了一下 LinkedIn。同时还不停地写码,作为手艺人,手不能停。这段时间总共投了 38 个岗位,只拿到了两个面试。但 9 月初入职的这家公司并不是投简历拿到的,而是 2022 年聊过一次的公司。公司做的事情刚好也是 LLM + RAG 的系统,玩 Streamlit 和 AnythingLLM 的经历意外地起到了帮助。


2024 年年初的时候是给自己定了一些目标的。比如开始打羽毛球、攀岩,隔天跑步。只有跑步大体坚持了下来,但是也并没有频繁到隔天跑一次。要学开车,但并没有。要瑞典语流利,但并没有投入多少时间和精力。要打开社交圈子,但下半年变得无比自闭。要进一家更好的公司,这一点倒是做到了。

2024 年年初还列了几个想做的小产品,年中还拍着胸脯说要帮朋友写一个她能用到的小工具。但一件都没做成。

第一个错误是 mission creep。打比方说,想做一个凤凰,但是发现做凤凰好难,于是想不如先做一个大雁练手。如此一来,实际动手做的只是一个鹌鹑,但连鹌鹑都没做完。继续沿用这个比喻的话,更好的做法可能是先做凤凰的爪子,而不是放弃凤凰,去做大雁。

另一个错误是企图在做东西的同时学新技术,企图一石二鸟。能一石二鸟固然好,但如果同时有两个目标,人一犯懒就会优先做简单的那个。相对于「做新东西」,学习,也就是临摹已有的东西,显然更容易。虽然宣称是在用 Elixir/Phoenix 写东西,但实际上是花了很多时间学 Elixir 和 Phoenix。(写 Elixir 的手感毫无疑问是美妙的。但是怎么用 Elixir/Phoenix 写出自己实际想要的效果,却需要重新拧一遍脑袋里的螺丝,相当伤脑筋的。)优先做困难的事情比较好。


始料未及的事情是今年又读了一大堆励志文献。比如 Cate Hall 的文章「如何更有主观能动性」(How to be More Agentic),比如 Shreyas Doshi 的「要提高主观能动性」(High Agency),再比如「高效能人士的七个习惯」。更始料未及的是,意识到里面的道理都还挺对的。

另外一本很重要的书是许成钢的「制度基因:中国制度与极权主义制度的起源」。我还没看完,但是这本书的框架实在太厉害了,推荐大家都看看。

静态网站生成器

这个 blog 一直是用自己写的静态网站生成器 (Static-Site Generator),从一堆 Markdown 文件里生成 HTML,再用 git 推到 Cloudflare Pages 上。

之前的生成器是 Python 写的。本来一直能用,然而去年有一天,一个 dependency 不知怎么回事坏掉了。(有可能是因为电脑上有几个版本的 Python 在打架吧。)不是什么大问题,创建了一个新的虚拟环境,重新装一下 Markdown 的库就又能跑了。又过了一阵子,生成 feed 的库里面有一行代码开始报错说「缺一个参数」。奇妙的是我这段时间根本没动过那写代码。

于是大过年的,决定用 Go 写了一个新的。其实还是有一些小问题的,比如 CSS 什么的。

上一版的 blog 生成器花了一星期。这一版的用了 3 天时间,但是实际写码的时间只有 11 个小时。中间用了很多 GitHub Copilot。

试图直接把一堆 Python 甩给 Copilot 让它「翻译」成 Go,但是它只是生成了一个简单的文件夹结构和一些并不重要的函数。

但是很多具体的功能,很多时候写个开头,一路按 tab 就行了。比如排序、regex、读写文件,都是它直接生成的。

该选哪些库也是 Copilot 教我的,比如用来解析 Markdown 的 goldmark,用来生成 feed 的 gorilla/feeds。这两个库实际用起来感觉也比 Python 的两个库更舒服。

而且我心想,既然都重写了,比如干脆加上语法高亮和 Mermaid 的支持,幸好 goldmark 的扩展都有现成的。

我之前一直用中文的楷体来表示强调,因为斜体汉字太难看了,手段是手动加 CSS。所以这次还试图写一个新的 goldmark 扩展,找个特殊符号,在解析的时候替换成 <span class="kai">。但是有点复杂,Copilot 提示的做法都不能用,直接跑去读 goldmark 的代码对照,好像 Copilot 生成的一些函数用法已经 deprecated 了。于是后来放弃了。

Go 本身写起来就挺舒服的,再加上 Copilot 的助推,整个过程相当 pleasant。不过,虽然确实需要检查生成的代码,看它是不是在做正确的事,但在脑袋里形不成什么深刻的印象。