Your description here.

今天从床上爬起来,寝室里很暗,没人开灯,因为还有其他人没醒。每个周末的早晨都是如此,我慢慢地抓住扶手从上铺下来,尽量不发出声音,然后打开书桌上的小灯,橙色的,我总觉得它比寝室的白色日光灯更舒适。

在书桌前,我像每个早晨一样,百聊无赖地查收手机里的新消息,一条一条地删掉各种应用发给我的垃圾信息。明明有一键删除的按键,我却总是习惯浏览后再删除,不是害怕漏掉什么重要消息,或许是因为早就成了习惯。

房间里安静得我听得清自己的每一次呼吸,还有床板发出的嘎吱声。没人说话,我下意识地伸出手搓揉着我的头发——有些油,或许该洗了。我走出房间,闻到了空气里潮湿的泥土的气息,大概是下雨了。我站在洗手台前,先洗去了刚才留在手上的油污,听着水流的声音思考。或许抹点散粉就行了吧,反正周末我也不会出门的,但突然又有些担忧自己的发际线,还是拿着洗发水进了浴室,顺便冲了个澡。洗完之后,我推开笨重的玻璃门,房间里还是很暗,只有两盏台灯亮着。

我从架子上抽出一片洗脸巾,把内裤和袜子扔进盆里,用水和洗衣液泡着——我总觉得光是这么泡着都会比手搓更有效。终于洗漱完毕,我坐回了桌前,坐在我旁边的室友也起了,我突然不知道该干些什么。

我拿起我昨晚睡前列好的一张清单,上面写着我最近要完成的几件事情,当然,不包括期末复习。上面写着我一月要读的一本书,书名叫做《毫无必要的热情》。我记得我当初是因为被名字和封面吸引了才买下的它,在此前我从未听过有关这本书和它的作者的事情,我想这也算是一种缘分。我翻开书,读起了序言,笔者把这本书作者的语言称作「把冷静掺杂进热情,把戏谑编织进伤感」,还说了不少有关这个作者的故事。

我没有很感兴趣,也没有觉得无聊,便继续往后读。读到了第一篇,应该是随笔,叫做「这真的是异乡」。虽然我完全不能和作者「美国留学生」的身份产生共鸣,但她的笔触很有感染力,并不强烈,像是用掺了太多水的水彩颜料,给她故事里的每一个细节都涂上了一层淡淡的灰绿色彩。

我读完第一篇就把书合上了。我没能在抽屉里找到多余的书签,便从一幅塔罗里抽出一张多余的牌放进了书里。那副牌叫做「Lunalapin」,我知道 Luna 是月亮,这副牌的主角又全是小兔子,那 Lapin 大概是拉丁语里兔子的意思。

读散文和小说有很大不同,我第一次感受到。散文没有精心编排的故事那般引人入胜,但你能在平淡的语言里感受作者的所思所想。它不会给你太多的多巴胺吸引你一直读下去,就像是在咖啡馆里遇到有一些共同话题的陌生人,各自说了一些对方都有所感触的话,然后其中一个人的咖啡做好了,也就自然而然地离开了。在这之后,两人或许会在回家路上细细回味这次谈话,但没有人会高兴得在走路的时候跳起来。

这样的阅读体验,就像是一杯泡得有点淡的茶或者蜂蜜水,没有往常那么好喝,但意外地不错。


最后一位室友也起了,开了灯,我也就把我的小灯关掉了。已经快到中午,我还是没怎么说话,我换上鞋出门,估摸着出去取个快递再买完饭,时间应该刚好。我像往常一样掏出耳机戴上,决定今天听一点不一样的歌,于是点开了「告五人」的热门歌单。

路上的闲暇时间总是很无聊,我的手机上除了朋友圈和 QQ 空间,没有我感兴趣的媒体——我总不可能在走路的时候打开 B 站看视频。我也有过好几次因为走路时心不在焉地跟朋友聊天,自己不认真的态度激怒对方的经历。再加上手上拿着东西也不方便打字,我干脆就把手机揣兜里了。用这段时间想一些事情也好,不过我总是会忘记自己走路时思考过什么。

回到寝室,吃过饭之后,想着玩会游戏,便打开了《饥荒》,花了点时间打 Boss 和装修基地,然后就下线了。时间是两点多一点,我想,以后把这段时间当作固定的游戏时间也不错。

因为是作业提交的最后一天,除了我一拖再拖的期末复习,我也没有别的事情要做了,所以我打开了 WSL 和 Visual Studio Code 开始做 C 语言作业。被指针和结构体折腾得脑袋发昏,想着这大概是因为自己头脑不太清醒,再加上另一个室友也在写代码,嘴里满是抱怨、不满、骂骂咧咧,和几乎每一个有姐姐的二胎男孩都有的一丝傲慢,总是让我打心底里感到厌恶,甚至是恶心。

写到这里我不禁想到,之前那个让我做了四年傻子的蠢货,也是他家里的弟弟,而他有两个姐姐。我不敢肯定所有的父母都会重男轻女,也不能十分幼稚地批评这些「家里最年幼的男孩」过于心高气傲,但我也不能否认,这类人的确没能给我留下太多的好印象。

我或许应该去图书馆的,不过为时已晚,我已经没了做作业的心情。反正是最后一次,而我的 C 语言老师似乎也从来没检查过作业,于是我关掉了代码编辑器,拿出昨天吃剩下的零食,接着看午饭时的没看完的《生活大爆炸》。


我有一个奇怪的习惯,我的休息时间和我吃东西的时间是绑定的,我一吃完零食,就会理所当然地把视频关掉开始做别的事情。不过今天我没什么可做,或者说,应该是没什么想做,我清单上的项目和几本没复习完的书都让我觉得没动力。

我又推开阳台的门,打开水龙头洗去留在手上的油渍,发现今早泡在盆里的衣物还没洗,于是简单地用手搓了搓,拧干净水,在被挤满的晾衣杆上给它腾了个空位。我回到房间,又拿出那本书,泡了一杯咖啡,茉莉花味的,爬上了我的床,打开床上的灯,开始阅读今天的第二篇散文。

毫无必要的热情,就和这本书一样,今天确实是冷淡的一天。我不觉得有多精彩,也没有无聊到想要把自己的头皮撕掉;我没怎么开口说过话,甚至也没有和网上的朋友聊过天。这样毫无亮点的一天,意外地值得记录。

不知不觉我又拿出之前用作书签的那张牌端详起来,拿出手机搜索,得知 Lapin 的确是兔子的意思,但不是拉丁语,而是法语。

2024 年 1 月 7 日记

去年过的实在不算精彩,整个 2023 似乎有一半的时间都完全不在我的掌控内,以至于我在重新阅读我在 2022 年写下的总结时,我几乎找不出太多不同。一个令我有些担忧的想法涌上心头——2023,我留给自己的时间实在太少。

你正在阅读一篇关于我和这个博客的年度总结,以及按照惯例的,对未来的展望。不过,除此之外,还有一个困扰了我数年的真相我需要坦白,如果你在乎的话,请读到最后。

继续阅读

我已经不记得这是自己第几次重写博客的代码,但我很确定这是(短时间内)最后一次了。无论如何,是时候给我这在自定义性、易维护性和成本三者之间找不到任何平衡点的完美主义画上一个暂时的句号了。

重写的原因

因为越来越看不惯旧博客的页面设计,我决定直接推翻重新设计。但在我这么做之前,我突然意识到我已经有好久没更新博客了,最近的更新还都是一些写得让人摸不着头脑的小说,而且大部分是直接搬运自我在另一个网站的创作——总之,我已经很久没有静下心来认真地写博客了。我认为时不时用较长篇幅的文字记录一下自己在某方面的摸索历程还是很有必要的,这和我做手帐时的日常记录有很大区别,针对事物本身而非时间的记述能帮助我在理清思路的同时加深记忆。

我不小心丢掉了写博客的这个习惯,有很大原因是更新静态博客时繁琐的操作流程。我前几次重写博客代码,使用的都是纯粹的 Next.js 或者 Svelte 框架,算是一种「无服务器」(Serverless)的应用。由于没有数据库,博客所有的文章都以 Markdown 文件的形式,和博客的源代码储存在一起。这就导致,在我需要更新博客的时候,我要先在一个 Markdown 文件里写好文章内容,还要在文件的开头编写必须的 Front Matter 用于表示文章标题、创建日期、标签等元信息(而且我每次都记不住格式和属性的命名,要先找到以前的文件,然后复制到新的文件里)。当文件准备好之后,我要把它放进 Git 仓库里对应的目录下,在本地运行 npm run dev 测试是否会产生问题,无误后推送到 GitHub 并等待 Vercel 将新的博客版本部署在生产环境中。之后,如果我还需要修改文章内的某些错误,或者进行额外的更新,我无法在移动设备上进行这些操作,我需要打开我的电脑,打开 GitHub Desktop 和 VS Code,编辑我的内容,然后测试,再推送,再等待部署。

初次接触静态博客的开发者可能会觉得这很有意思,很极客,但我很快就厌倦了,因为有的时候我只是想要写一篇文章传达一些想法或者是纯粹地记录,可我却需要打开一个光是看着就觉得自己要开始写 Bug 的界面,然后再进行一系列十分「黑客」的操作,才能发表我的文章。这简直太反人类了。

为了保留写博客的好习惯,同时不委屈自己,我决定重写一个让自己觉得更舒服的博客系统。

我的思路

我需要一个功能齐全的图形化博客管理后台,但我不想自己造轮子,也不想用市面上花里胡哨的 CMS 来「大炮打蚊子」,我只是想要一个简单、易上手的,适用于个人博客的内容管理程序。

符合这个描述的,答案当然是——Typecho

不过问题是,Typecho 是一个用 PHP 编写的,前后端一体的博客程序。对我这个已经享受过用 JavaScript 写前端是多么舒爽的人而言,回到 PHP 时代无异于现代人到山里住岩洞,我还得重新适应 PHP 并重新写一个博客主题。这实在是令我不能接受。

我既想享受传统博客傻瓜式操作带来的便利,又不愿意离开现代化前端开发的优雅和高效。那么解决方案就很明显了——使用一个无头 CMS,同时重新设计博客的前端。但问题又回来了,市面上大部分的无头 CMS 都有些臃肿,或者说是相对于我要解决的问题,它们都具备了太多我不需要的功能。不过,Typecho 虽然不能作为无头 CMS 使用,但它的量级却刚刚好满足我的需求。

那么,我只需要想办法把 Typecho 变成一个无头 CMS,一切问题就都引刃而解了。

开始实践

我很容易就找到了一个现有的插件,它能为 Typecho 提供 RESTful 化的 API。这样一来,Typecho 就能作为纯粹的后端为我自己设计的前端提供数据了,而我只需要在 Typecho 的控制台更新博客内容就行了。

接下来,我只需要把重点放在前端的设计上就好了。

选择工具

我决定使用我熟悉的 Next.js 编写前端,因为我决定把前端托管在 Vercel 上,而 Vercel 的 Next.js 的支持显然更好。

在 CSS-in-JS 这方面,我选择了最近很火的 Tailwind.css 而不是自己用 SCSS 手写每一个类。一方面,新版本的 Next.js 默认支持 Tailwind.css,省去了自己配置的时间;另一方面,有了 React 对模块化开发的支持,每个相同或相似的元素都可以被编写成组件,在 CSS 层面做到语义化就显得有些没必要了,这时候有更方便快捷的方法当然是最好的。

顺带一提,我有好一段时间没用 Next.js,上一版博客(Isla)使用的是 Svelte。新版本的 Next.js 添加了新的页面路由方法,即 App Router,与以往的 Page Router 区分开来。照理来说使用 App Router 是更好的,但刚回坑的我显然还没有反应过来,所以继续采用 Page Router 编写博客。不过,能跑就行。

像是 React Icons 图标库这样的额外工具就没必要提了。

获取文章

使用 Next.js Page Router 提供的 getStaticProps() 函数可以在页面加载之前获取来自无头 CMS 的数据。使用 fetch() 获取 API 内容,记得使用 await 关键词。

插件提供的 RESTful 风格的 API 可以直接用 json 解析,不要忘记解析时也需要加上 await 关键词。

export async function getStaticProps() {
  const res = await fetch('https://blog.guhub.cn/api/posts')
  const posts = await res.json()

  return { props: { posts } }
}

完成之后将文章列表数据作为 Props 返回给主函数即可。

不过,在这里我遇到了一个后端的问题,代码这样正常跑了数十次之后我才发现前端只展示了前五篇文章,原因是插件给 API 提供了分页功能,每页默认五篇,需要在 URL Query 中用 ?page= 标明正在查看第几页。不过我目前的设计并不需要分页功能,所以我用 API 提供的另一个方法增加了每页显示的文章数量,算是一个比较蠢的解决方案。

const res = await fetch('https://blog.guhub.cn/api/posts?pageSize=9999')

展示文章

从后端得到的数据中,重要的数据在 data.dataSet 下,里面包含了文章的标题、创建时间戳、CID、分类、Slug 等。值得一提的名为 digest 的属性,这个和 Typecho 的设置挂钩,如果设置了在首页展示完整的 $this->content()digest 就会包含全文内容的 HTML 字符串而不只是摘要。这个插件在文章列表的 API 中没有专门输出全文内容的属性,如果在 digest 只输出摘要的情况下需要获取全文,就要用 slug 或者 cid 等唯一的属性到另一个路径中获取更详细的文章信息。

这显然有些太麻烦了,于是我决定不更改 Typecho 的设置,把 digest 当作全文内容使用。不过,我仍然有在文章列表输出真正的摘要的需求,这就意味着我需要在前端截取一段摘要。

我是这样实现的:


function stripDigest(digest) {
    //删除空行和空格
    digest = digest.replace(/\ +/g,"").replace(/[ ]/g,"").replace(/[\r\n]/g,"")

    //删除标题
    digest = digest.replace( /<h.*?>(\S|\s)*?<\/h.*?>/g,"")
    
    //在文章内容中寻找 <!--more--> 标签
    // 若存在,则截取 <!--more--> 之前的内容
    // 若不存在,则截取前 150 个字符
    var moreTag = digest.search(/<!--more-->/)
    var sliceEnd = (moreTag>0) ? moreTag+2 : 150
    
    //删除 html 标签,只保留文字内容,然后执行截取操作
    digest = digest.slice(0,sliceEnd).replace(/<\/?[^>]+(>|$)/g, "") + "......"

    return digest
}

摘要应当是一段连续的文字,没有分行和空格,所以要先删去这些空白;标题最好也删去;然后是喜闻乐见的 <!--more--> 标签,这个是用来手动截取摘要的,如果有 <!--more--> 标签,就将其作为分界线截取前面的文本作为摘要;如果没有,就截取前 150 个字符。然后需要删去 HTML 字符串中的标签,只保留纯文字内容。

如果你有闲心仔细看了上面的代码,你可能会对这一段代码感到疑惑:

var moreTag = digest.search(/<!--more-->/)
var sliceEnd = (moreTag>0) ? moreTag+2 : 150

其中,变量 moreTag 用来表示 <!--more--> 所在位置的索引。如果存在,索引就大于 0,照理就应该以索引直接作为之后 slice() 方法,但我在这里加了 2,原因是——不加这个 2 的话,截取的位置就不对。

很经典的问题,我不知道为什么要写这段代码,但不写的话程序跑起来就有问题。

虽然加上了之后跑起来也不完全对,但不加的话问题更大。我一直没搞明白为什么,然后就摆烂了。现在想想,最佳的处理方式是按照 RESTful API 设计的逻辑走,直接获取服务端提供的摘要。这个问题留到之后有空再改吧。

页面设计

能够获取文章数据并展示在前端就已经完成博客的基本功能了,接下来轮到页面设计。

在之前几个版本的博客设计中,我都在刻意地追求简洁(一个已经被用烂了的设计风格)。当时的页面组成就是白底黑字,加上一些同样简单的黑色线条图标,和一些淡灰的色块简单地划分一下区域。

这样的设计确实让我在花里胡哨的网站和 App 中找到了一丝清爽的感觉,但问题在于,这种过于简单的设计很容易被「刻奇」,更准确地,是我在对这种被许多装作内行的博主广泛认可的设计风格进行刻奇。这样的风格缺乏新意和个性,现在想来,也是我想要把博客前端推翻重写的主要原因。

我已经忘记了是什么给了我灵感,但在我纠结数日后,我对新博客的外观设计有了新的构想。我想要一个简洁大方,但同时特征鲜明,色彩明显,排版富有新意的设计。在融入了一些报刊头条和拼贴的元素之后,我首先在 Figma 上做好了一个概念图。

在之后的实装过程中我又做了一些调整,加上了类似网格手帐本内页的底纹,逐渐变成了现在的样子。

RSS 订阅

在这个没什么人看博客,写博客的大多数更新也经常挤牙膏的时代,给愿意关注自己的读者一个订阅的途径,在自己终于更新的时候提醒一下读者是有必要的。

起初我觉得这并不难,因为 Typecho 本身提供了 RSS 订阅源。但问题又来了,我把后端部分(Typecho)放在了 blog.guhub.cn 这个域下,前端则在 www.guhub.cn,而 Typecho 本身并不是为前后端分离的方案设计的,所以在 Typecho 提供的订阅源中,所有文章链接都指向了 blog.guhub.cn 这个域,而不是我现在使用的 www.guhub.cn

我以为我只需要在前端把 RSS 的 XML 抓过来,然后把所有的 blog.guhub.cn 替换为 www.guhub.cn 就可以了。不过,Next.js 的设计者大概怎么也不会想到有个爱走弯路的傻子想要干出这种事情,它没有办法直接处理 XML 数据,我也没有找到直接获取页面内容的方法。这照理来说是可行的,但我不想在这一步多花时间了,于是......

npm i rss

我安装了一个 RSS 库,用我从 API 获取到文章数据重新生成了一个订阅源。

export default async function generateRssFeed({ posts }) {
    const feedOptions = {
        //...
    }

    const feed = new RSS(feedOptions);

    posts.map((item) => {
        let post = parseBlogPost(item);
        feed.item({
            title: post.title,
            description: post.content,
            url: `${site_url}/blog/${post.slug}`,
            date: post.date,
        });
    });

    fs.writeFileSync('./public/feed/index.xml', feed.xml({ indent: true }));
}

这样 Next.js 就会在需要的时候生成一个 XML 文件作为 RSS 订阅源。现在,如果你愿意的话,你可以用这个链接订阅我的博客。

其他

细枝末节的实现步骤就不在这里赘述了。我还有诸如分类、标签页面等功能没有做出来,文章列表的设计也有些过于简陋,这些会慢慢地在之后补上的。光是做这些功能就够我忙活一阵子了,我应该还不至于很快就觉得无聊然后把整个博客删掉。

另外,如果你觉得这个博客的前端看着不舒服,尤其是目前我还没有把深色模式做出来,你可以到 Typecho 侧阅读文章,那边我使用的是 Matcha 主题,也是我编写的,功能较为完善,阅读体验应该比现在的博客要好很多。

哦对,差点忘了,我把这个项目叫做 Taco,也就是把 Typecho 中间的音素拆掉一部分之后得到的单词。

备案和网站加速

因为 Typecho 侧的服务器使用的是腾讯云的国内服务器,所以我终于给 guhub.cn 这个域名备案了。不过最主要的原因还是想要使用 CDN 和对象储存这样的服务提高博客的访问速度。

ICP 备案和公安备案的具体步骤就不细谈了。CDN 和对象储存服务我使用的是又拍云,对于独立博客这种低访问量网站是性价比很高的选择了,用了半个多月只扣了不到一块钱的费用。

全国都是绿油油的感觉很舒服。


最近倒腾博客的成果大概就是这些了。

插几句题外话,如果你细心的话,你会发现目前博客还没有友情链接页面,这个我会尽快加上的。我打算重新开放友链申请,并删除一部分不常交流的友链。对博客往后的发展我也有了初步的构想。这些内容或许我都会单独写一篇文章谈一谈,在这里就不展开说明了。

好了,感谢你读到这里,希望你过得还愉快。

继续阅读

我像往常一样入眠,在一个黄色的房间里醒来。房间里昏沉沉的,我的视线也有些模糊。我揉了揉眼睛,并没有好转。我试着移动身体,虽然我看不到我的姿态,但能感受到我的身体像是卷缩着一样,以一种很不自然的方式挪动,不过好在这并没有造成太大影响。我似乎在寻找某个目的地,尽管我对这个空间一无所知,这里墙体的排列也毫无规律,但直觉为我指出了正确的方向。

这个房间似乎没有边界,我也并没有在意所谓的边界是否存在,我只是漫无目的地走着。说是漫无目的,其实也不然,我的身体似乎知道我要去哪,但我的大脑,或者说我的理智并不知道。我接受了这种本能般的倾向,似乎一直以来都是这样。

环境一直在变化,但说到底,其实什么都没有变,那些墙壁就像是被小孩子打散的积木,胡乱地分散在各处。每一处墙壁似乎都是不同的,但「不同」这一性质是没有改变的。我所走过的地方,其形式千奇百怪,但都是一致的混沌。我继续走着,那些墙壁还是一样,变了却又没有变,看不出什么差别,但我确实知道——我到了。

我走进一面墙上方正的缝隙当中,我看到了其他人。他们几乎是在同一时间转头望向我,又在同样的时间后把头转了回去,保持着原本的头向下,手臂抱着小腿的姿势,出奇的一致。到这里,房间的环境才有了真正意义上的「不同」。这实际上是一个规整的正方体房间,里面没有灯,光似乎是从我背后射进房间里的,靠门的那一侧更加明亮,靠里的那一侧则因为阴暗而显得狭小,整个房间看起来似乎是向里收缩的。然后我才意识到,我在墙壁上看不到我的影子。

我走到人群中央,看着坐在地上的颓废的人们,他们全都紧贴在墙壁上,在房间里最阴暗的角落一声不吭,像是惧怕光一样。

“是有人虐待你们吗?”,我问。

其中一个骨肉嶙峋的男人站了起了,他全身漆黑,我的脑子里浮现出「火柴人」三个字。他凑到我耳边,语气严肃地说:“你好好想想,这怎么可能?是因为我们不喝水。”

我不明白他话里的意思,惶惶不安地离开了。我走进一栋水泥建筑里,不知何时就已经坐在了一把塑料椅子上,桌对面坐着一个男人,光打在我们两人的正中间,我看不清他的脸。桌子上摆着一个瓶子,我知道那是水,他示意我喝下去。我有些害怕,但我的身体似乎并不害怕,咕咚咕咚地一瓶水就下了肚。水有些微微的甜味,喝完之后舌头又有些涩。他告诉我我刚刚喝下去的是杏仁水,似乎这都说得通了,我认可了这水的确是杏仁味的,尽管我在此前从未吃过杏仁。


天很亮,雨一直在下。雨打在建筑物的墙壁上让它们显得有些斑驳,干湿的差异清晰可见,并且这种半干半湿的状态似乎没有改变的迹象。这种斑驳和墙壁上长出的一簇簇植物交合起来,倒也显得有些可爱。

我从床上爬起来,像过去的十多个日子一样,走到玄关,打开门,拿起送到门口的水进屋,看着窗外的景色,将瓶中的水一饮而尽——杏仁味的,我这样告诉自己。我将最后一滴水咽下的瞬间,雨停了,墙壁上的植物消失了,水渍也慢慢褪去,天亮了一些——我才回想起这里的天原来是那样不真实地明亮。

我坐在电脑前,一坐就是一上午,整理着资料,把它们写成规规矩矩的文档。我隐约记得我以前是一个喜欢户外的人,如今居然能这么长时间处理繁琐的工作,我还有些佩服自己。

中午刚过,就有人登门拜访。他带着一顶礼帽,穿着黑色西装和白色衬衫,他们似乎都是那副打扮,但我还是看不清他的脸。他向我脱帽致礼,大概是察觉到了我的疑惑,还没等我说明就点破:“脸盲症还是不见好转呀?那每天得加大量了哦。”说罢,他捏着手上的石头, 不知从哪掏出两瓶水来,递给我。我接过水瓶,向他致谢,他头也不回地走了。

我坐了回去,眯着眼看着窗外,小小地啜了一口水,看着墙壁上刚长出的绿植又缩回去一点点,要落下的雨点向上飘了回去,还感受到我绻缩的身体又舒展了一些——在喝下这口水之前,我似乎都没发现我还保持着我刚起床的睡姿。我喝完一整瓶水,惨白的阳光照了进来,洒在我身上。我盯着攥在手里的另一瓶水看了好久。


我竭力保持着清醒,我不知道我身体里还有多少那些东西,但至少我成功逃走了。等他们发现的时候,他们只会在我的房间里找到一个裂开的瓶子和满地的“水”,还有一大堆未完成的工作。我的理智在现在的情况下完全失去作用了,我不知道我要去哪,我只知道我不能呆在那里继续喝水了。好在断水接近一个小时之后,我的本能似乎又开始起作用了,我跟着它走回了那个黄色的房间。

我曾听说过长期服用某种药物的患者不能随便停药,即使是痊愈了也只能逐渐减少药的用量,因为药物会促使身体形成新的平衡,直接停药就会打破这种平衡。我现在似乎就处在这种失衡的亚健康状态。我感受不到身体的形状,踉跄着总是摔跤碰壁;荧光灯的嗡嗡声忽大忽小,我本就不稳定的神智在崩溃边缘反复拉扯;我的本能忽隐忽现,我找不到路在哪里。

我也不再能像上次那样分辨出什么是「相同」什么是「不同」。如果这地方的每一处都是相同的,我会坚定不移地走下去,直到我发现了有一处不同;但现在这地方的每一处在我眼里都是不同的,我无法说服自己我走过的地方没有其他的路,我没办法沿着一条路走到底。我瘫倒在地上,在荧光灯的照射下闭上了眼睛。

直到,终于,那种熟悉的不自然的感觉回归,我发觉我正蜷缩着倒在地上,我兴奋地蜷缩地爬起,以蜷缩的姿态在这相同的迷宫里飞奔。

我很快找到了那个房间,里面的人都抬头看着我,他们没有把头转回去,我对他们说:

“我不喝水了。”


我最害怕的事情还是发生了,那些西装革履的禽兽又找到了我,他们把我从阴影里拽了出来,拿着一个漏斗想要给我灌水。我已经瘦得不成样子,蜷缩的身体根本打不过他们。还好我的同伴们都出来帮我了,我们费了好大劲才把他们逼退,不过我知道他们还会来的。我决定和他们谈判,只要把事情说清楚,这样对大家都好。

熟悉的场景又上演了,我走进一栋水泥建筑里,不知何时就坐在了一把塑料椅子上,对面坐着一个穿着西装的男人,我看不清他的脸。

他把一瓶水推到我跟前,示意我喝下去。我看着他糊成一坨的脸,竟然察觉到一丝阴险的神情,又或者只是我的想象。我坐着不动,直勾勾地盯着他模糊的脸。沉默许久后,他先开了口。

“为什么你不愿意喝杏仁水呢?我很期待你的回答。”

“因为你们都是一群窝囊废。”

我当然毫不客气,但话说出口我才想起此行的目的,我显然不能这样子交涉。既然是谈判,我就得先明确我方的诉求,这是肯定的,然后解释这一诉求的缘由。我们的诉求是不再喝水,他们已经知道了,那原因是什么?我竟然抠破脑袋也想不出来。

他不知从喝出何处掏出一个玻璃杯,从水瓶里倒出一些水来,然后像品茶一样细细地享受起来。我从来没有用透明的容器喝过那些水,这时我才看到,他们就像是掺了牛奶一样,有一些发白。我看着那些白色的水,视觉的反馈在我的舌尖形成了某种味觉的反射,我下意识地认为那些水是甘甜却带有一些涩味的。我有些渴望,但大脑又分泌出一种厌恶。

“你不是第一个了。”,他没有看向我,而是盯着他手里晃动着的水杯,举止间满是轻浮。

“你回去吧,去那个疯子才找得到的房间里和他们一起待着。”

我很快就找到了回去的路,我走进房间,他们都没有抬头。我也没有在意,走进了房间最深处,不小心踢到了靠墙堆放的一大堆纸张。太黑了,我分不清那是成册的文件还是一些废纸,更看不出它们在那有多久了。我蹲坐在房间里最阴暗的角落里,反正无论如何我都看不到我的影子。


我从床上爬起来,就像往常一样。我往水杯里倒了一些清澈透亮的水,看着窗外的高楼,回味着我记忆里残余的梦境。

我端详起手里半空的水杯,看着它映出白色的天空和人类的影子。我不能不喝水,因为我的身体需要水来运作。可如果我的身体不是人类的身体呢?如果我的灵魂转移到了新的不需要水的身体里,必须喝水才能活的这一条规则就不再适用了,我当然可以继续喝水,但那样就只是我思维的固执在苟延残喘罢了。

我总是把「本能」和「理智」划分成两个不同的领域,让两者在不同情况下分别决定我的生死。不过大多数时间都是理智更胜一筹,因为本能是以反应和感受为基础的,但理智是以事实和逻辑为基础的,所有人都更崇尚后者。

但就和喝不喝水一样,倘若我有一天从这塘中芦苇般的地球搬出,去到一个完全不同的地方,我花费数年搭建起的认知框架就会崩坏,只留下我的本能带我绝境求生。到那时,我或许就得成为一个疯子。

我喝完了手上的这杯水,坐在窗前,看着雨慢慢地停了,看着路上的行人收起了手中的伞,看着有人把楼房上长出来的杂草拔得一干二净,看着有人给老房子刷上了崭新透亮的黄色油漆。

正是夜深人静的时候,居民楼之间的巷子里除了一盏忽明忽暗的老旧电灯没有任何光源,电灯晃动的光影摩擦着砖砌的墙,墙上的涂鸦有些模糊,透露着一股八十年代的气息。电灯晃得猛了一些,一个不知从何而来的人影冲破了巷子里原本还算得上和谐的画面 —— 黑色高帽、黑色风衣、黑色皮靴,黑色的墨镜盯着巷子里堆成山的纸箱发慌。那是尹,漆黑的人形站在灯光下显得十分扎眼。

电灯又震了几震,让人害怕它会掉下来。尹来不及回头看了,他把手提箱高高地抛过箱子堆,然后自己又翻了过去。纸箱一下倾倒散落在原本就伸不开脚的巷子里,追上来的几个身形不一的男子险些被绊倒在地。尹紧紧地抓着手提箱,他的步子从来没有迈得这么大过。喘气的同时,尹回头看到那些混蛋还在箱子堆里找路,不由得高兴起来。尹在一个丁字路口转了个弯,彻底甩掉了那些人。

尹开始在心里庆幸自己的胜利。现在想想,刚才发生的一切都像是被安排好的,在险些被追上的时候遇到一个堆纸箱,逃脱后正好遇上一个岔路口,真是脱险的绝佳组合。可能是老天想保佑他吧。

回过神来,尹才发现自己已然来到一个自己从未见过的地方。当然,这还是一个巷子,就像他之前跑过的众多的巷子一样,只不过这里要干净不少,墙壁的装饰也有些欧式风格。尹对建筑学并不感兴趣,他瞥见了身旁的一个打开的通风管道,管道的盖子不见了。在一个无法确认是否安全的地方,一个不起眼的角落大概是最好的藏身地点。抱着这样的想法,尹耸了耸肩,抓住手提箱钻进了管道里。管子不大不小,刚好能容下他一个人。钻进来之后,尹才意识到通风管道里并不是一个睡觉的好地方,冷冰冰的墙壁、摸起来似乎并不结实的铁皮,还有持续不断的冷风。说真的,那些风是从哪来的?

不过既然都进来了,再掉头出去似乎会显得有些蠢,而且还有可能被抓个正着。尹干脆沿着通风管往深处爬,看看这个管子究竟通到哪里。他一边推着手提箱,一边自己用做平板支撑的姿势往前移动。尹的视线在手提箱和前方的黑暗里来回切换着,冷风不断吹过他的面部,吹得他的眼睛有些干涩。在这样狭小的空间里,尹还不得不尽可能地控制自己的动作幅度,因为他真实地感受到自己身子下的铁皮只有薄薄的一层,他往前移动一点,铁皮的凹陷也跟着往前移动一点。通风管道从来不是为了通行而设计的,这很显然,尹也开始意识到这一点。不过现在后悔已经来不及了,尹眼睁睁地看着一颗螺丝钉从原来的位置蹦了出来。

”啊——“,尹从管道里掉了下来,他听到有人失声尖叫。他迅速起身,死死地盯着眼前这个来路不明的人,左手把手提箱藏在身后,右手伸出食指竖在那人面前。眼前的这个人比尹矮了一个头,尹自认为体型的差异对对方而言还算有威慑力,但对方却直接伸出手拍落了尹伸出的手指。

“你!不怕我有武器吗?”

“你都说出这句话了,我还会觉得你有吗?”

对方拨开遮住面部的长发,露出有些狡猾的微笑。尹往后退了一步,却贴在了墙上,不知所措地盯着眼前这个人。黑色的贝雷帽,黑色的长筒靴,黑色的皮衣,背在身后的双手似乎隐藏着什么。这个人和他似乎是同行。

“你也不是这里的人吧?”,尹又向前一步,心里长长地舒了一口气。

“或许是,或许不是,但我知道你肯定不是。”,对方仍然保持着那个装神弄鬼的笑容。

“如果没什么事的话,我就先告辞了。”,尹不想再和这个不明不白的人纠缠下去。

“别走嘛,我还挺想知道你箱子里有些什么的。”,那人不紧不慢地跟了上来。

“嘿!你该不会是和那些人一伙的吧!”,尹冲着那个人大吼。

“喂,别紧张。你猜错了,我谁都不是,我手里可什么都没有。”,对方举起双手以证清白。

“那就不要妨碍我的事情!”,尹转头就要走。

“嘿!你知道这是哪吗?”

尹环顾四周,这里是一个用途不明的通道,通道的一头闪着安全出口的标识牌,而另一头是漆黑一片,他看不到路。这个时候,尹完全可以任性地往安全出口的方向出去,然后证明这个人问的问题有多么蠢,但理智告诉他,如果从安全通道离开,必定会惊扰这栋建筑里的安保人员。一个黑衣人拿着一个黑色的手提箱在深更半夜从工作通道里走出来,没有比这更可疑的了。

“通风管道被你压坏了,现在我也不好逃出去咯。”,那人有恃无恐地盯着天花板说,双手还叉着腰。

尹不做声地盯着对方,他想不明白什么样的人会在这个时间出现在这样的地点,居然还如此悠哉。

“跟我来吧。”,那人两手交叉,向安全出口的反方向走去。尹没有别的办法,只好跟着。

“所以啊,”,刚走了没几步,对方就又抛出了之前的那一个问题,“那箱子里到底是什么?”

“我不知道。”尹看向一边。

“不知道?那你拿着它干嘛?”那人的语气还是一样轻松,不紧不慢地在前面走着。

“我只是完成任务,做我该做的事情。”

“你的任务是什么?”

“不是很明显吗,我不能让这个箱子被人抢走,我要…”

“那你没什么职业素养啊,拿着这么重要的东西就跟着一个不认识的人走了。”,那人转过头来对着尹笑,“你知道我在把你往哪带吗?”

“你到底是谁?”,尹猛地往后退,“你别过来!”

“过来又怎样,你的小箱子有枪好使吗?”,那人依然不紧不慢地向尹走去。

“你到底想干嘛!”,尹把手提箱紧紧地抱在胸前。

对方突然也紧张起来,身体往左靠,突然又从右边跳到尹身前,一拳打在尹的手臂上。尹疼的叫出了声,箱子掉在了地上,对方用腿把手提箱扫了过去,捡起来扛在肩上,盯着尹不知所措的样子狡猾地笑着。

“我会还给你的,我只是想知道里面有什么。”

“不行!还给我!”,尹做出战斗的姿态,一步步往前逼近。对方也跟着后退,把手提箱藏在身后,面无表情地盯着尹。

“我可以还给你,但你先告诉我里面有什么。”

“我真的不知道!”

“那你告诉我是谁把这个箱子给你的。”

尹没有回答,但他的神情逐渐从愤怒转到疑惑。

“那你总该知道你要把这个箱子带到哪吧?”

尹仍然没有回答,他直起身,放下双手,像是失了魂一样,双眼无神地看着对方。

”我不知道…“

对方皱起了眉,他走向尹,他看见尹的眼睛里充满了不解,他感觉尹比之前要矮小了很多,似乎轻轻碰一下就会倒下。他抓起尹的一只手,把手提箱放在他的手上,但手提箱的把手从他的手里滑落,又掉在了地上。

“你这是怎么了?”

尹的瞳孔在颤抖,眼珠像见了鬼一样慢慢转过来盯着对方。那人对着尹挥了挥手,尹便整个人瘫倒在地上?

“你没事吧?怎么突然就… 你是有什么精神疾病吗?那种会突然会忘记事情的病,阿尔兹海默?”

尹双手撑在地上,脑袋向后仰,往一边偏,用侧脸对着面前的这个人,眼珠转到了视野的极限,倾斜地瞪着对方;他张着嘴,像是在喘气,又像是想要说点什么。尹以这样扭曲的姿态在地上同不存在的事物挣扎,最终从喉咙里憋出了四个字:

“我不知道——”

“喂!你在装什么疯?!”

尹突然抓过手提箱,爬起来就往安全出口的方向跑。

“喂!不要往那边…“,那人赶忙追了上去,”呃啊,真该死啊。“

尹几乎是出于本能地向着指示牌的绿光跑去,他看见白色的皮特托先生正在向他靠近,他也听到后面那人穷追不舍的脚步声,他无法分辨哪边才是正确的路,但他已经管不了那么多了,时间不允许,他的神智也不允许。

楼梯间的声控灯一盏一盏亮起,尹像一头丧尸一样在逃跑时把手抬起放在胸膛的高度,这样他能看到手里的手提箱,这样才能感到安心。接着,刺耳的警报声响起,声响再大也没有盖过后面那人的脚步和咒骂声。尹已然是一具走肉,什么样的声音都不能让停下,他必须把这个手提箱送到它该去的地方,无论是哪里。

尹逃出了楼梯间,迎接他的是黯淡的日光,还有在门口等待的警卫。尹一咬牙,横着挥起箱子,撂倒了挡路的人。他纵身一跃,跳下了门口的楼梯,翻过路障和警戒线。红色和蓝色的灯光在闪烁,马路上汽车的车灯照在她身上,斑马线马赛克般地晃动着,尹的整个世界都在摇晃。警笛声,犬吠声,汽车鸣笛声,人群的嘈杂声,不知是谁的呼喊声,这些声音一股子钻进尹的脑子里,让他近乎失聪,直到一个声音让一切都安静了下来。

枪声。

尹停下了,他愣愣地转过头,看到倒在地上的那个人和拿着枪站在尸体旁边的警察;他茫然地环顾四周,手持防护盾的特警已经将他包围,包围外的是正在哭喊的小孩,受惊的妇女和神情诡异的男人。

尹没有举起手,在众目睽睽之下,他打开了那个手提箱。

里面什么也没有。