bookmark_border九月二十八

我想了很多题目,不是想要深刻或者有意义,只是想平淡的概括这整整一年发生的事情,但是从开始的失去到最后婚姻,我很难用简单几个字把他们连接起来。索性用日期来当锚点了。

我最可爱的墨儿是在2024年9月28号清晨结束了自己的故事,我想讲的故事也是从这个时候开始。我和我最亲爱的人是在2025年9月28号开启了我们婚姻的新旅程,一整年的故事结尾也是在这一天。

我和女朋友在宠物医院里从7点哭到了10点,当两个人都很伤心的时候,相互安慰是没有用的,需要有一个人平静下来开车回家,也需要和朋友打电话取消晚上的聚会,如果需要的话,也还要完成紧急的工作任务。

我不记得当天晚上我是如何平静地躺在了床上,只是记得十几天后的某个夜晚,我抱着女朋友说:我们结婚吧。她没有回答我,只是悄悄地和我讲,她也想墨儿了

除了在身边的好友,我很长一段时间只和我的一位朋友讲了这件事情。这是一种真的很难形容的情感,我不具备去谈论这件事情的能力,这其中有害怕,有不知所措,有逃避,甚至有羞于启齿的情感。我不知道这是不是一种共性,但我无法说服自己去克服。时至今日,当我已经不惧怕快速上翻手机相册,可以自然的说出他的名字的时候。我还是在不知道这件事的朋友面前,当他们提起的时候,假装一切都还好。

我在九月末回了国,定的次日的机票,女朋友也在两天后飞去了欧洲。我被迫给了父母一个惊喜,整整7天我都陪在了家人身边。返程回美的飞机上,我和我最亲近的两个人讲了这件故事。

我们在刚搬来洛杉矶的第一个月双双离开,逃避,又回来。或许花了两个月,又或许花了三个月,从某一天开始我们习惯了关门睡觉后,我开始不期待早晨会被踩醒了。

洛杉矶朋友的狗开始肆无忌惮的在地毯上留下自己的气味,湾区的朋友们特地在万圣节的时候集体跑到洛杉矶过节,在走错过几次10号公路的匝道后,我和女朋友开始了我们的新的三年计划。

纽约三年,湾区三年,我们照例要在洛杉矶也停留三年,我们盘算三年结束的时候正好是奥运会,我们要是有幸赚到钱买了房,可以出租房间给远渡重洋来看奥运会的游客们。我们保留了在湾区无聊时创作的陋习,在没有活动安排的周末跑去看各种各样的open house,洛杉矶很大,我们莽撞地在各个区域游荡,认真地分析房产的价值,然后抛之脑后再也不想。

后来洛杉矶烧了一场大火,点燃了我钓鱼的热情,也为我们的爱情续上了火花,我们安排了回国父母的会晤,开始考虑每次剪发要尝试的发型,也许秋天是一个完美的季节,特别是洛杉矶的秋天。在来到洛杉矶的三四个月后,开始了我们为期半年有余的备婚计划。

我曾经开玩笑的和一个朋友讲,婚姻的开始是因为爱情的难以维系,爱情衰变的产物有两个,一个是亲情,一个是旧情。但当我们和婚礼场地签完合同确定时间之后,婚姻的实感和不可逃避才开始慢慢迫近。

我们是相爱的,这是无疑的,我们经历的种种让我们看到了,爱情是伟大的自由,而非只有相互的妥协。但向金钱和时间的妥协在备婚过程中是避无可避的。个中辛苦,不亚于高考冲刺。

从国内回来之后,我开启了成年之后的第一次减肥,颇有成效,送走了一些多余的体重的同时也迎来了两只猫咪。短暂暂停了半年多的生活模式又衔接回来了。为了让小猫们可以干饭自由,我被迫只能多次出海捕捉渔获,不辞辛苦在岸边日夜挥杆。顺便跨入了30岁

婚姻和在纳斯达克敲钟在很多方面是一样的,都需要经年累月的准备,在某一天,一群人聚在一起,共同见证这个时刻,有些名气大排场大,有些籍籍无名,但敲钟肯定是快乐的,后续股票的发展和前景,至少在当下没有那么重要了。只是最近几年钟声频频,反倒像是提醒自己,身边的朋友都在押注婚姻,再不入场会不会就晚了。

婚礼日期的临近并没有特别让我感到焦虑,唯一让我不适应的是,这是一场以我为主角的活动,我的人生中很少出现这样的场合,该怎么处理和享受这一天反倒是在最后几天一直困扰我的问题。所幸一切都顺利,我们的婚礼按照计划进行,遗憾肯定会有,但作为一向把意外放在预期里的人来说,能在意外之外还有的惊喜反而是始料未及的。

9月28日,天气多云转晴,我们在一些好友和亲属的陪伴下度过了一天,还有一只一闪而过的黑猫。

我妈妈在我上大学之前请大仙算过,说我30岁会发大财,或许吧,在来来往往的30岁。

bookmark_border沙漠(三)

“当你走近一片沙漠的时候是,从某种意义上来讲,你也在离开沙漠”

上面的这句话目的不是在讨巧,又或者嘴硬一些说,从拓扑结构的角度看,他确实成立。但感性的来说,其可能更像是我们的生活的一种映射,映射到我们日复一日重复的事情上。

我回到自己的那片沙漠的时候,街变了,路变了,仓库也变了,就在房产证上的名字也要快变的时候,我才想到了要回来。夹在生活的时间线中间的那些琐碎小事,没有让生活变得丰满且充满张力,反而在无形中割裂了生活,也吞掉了一大半的时间。但也就是在我又一次打开仓库的门的时候,才发现有些东西确实是没变,当然不是每个月照发不误的账单和毫无入账的银行户头,而是面前沙沙作响的沙子。他们存在的时间或许是太久了,以至于没有人会去考虑,沙子会变吗?沙子他们就像纽约的警察一样,你不会去想:他们从哪来的,又在朝向何方远行,他们只是成群结队的来,带着让人心悸的压强呼啸而过。你站在一旁静静地看着,你知道他们与你无关,又或者说,当它们与你有关的时候,就是你真正踏入沙漠的时候。

我羡慕这个世上任何没有生命的东西,时间像是奴役生命的农场主,娱乐生死却还能备受礼待。索性我现在面对的是一片自由的沙漠,他们从巴丹吉林来,却从来不属于任何地方。
 

在我坐在我的老地方放空自己的时候,突然听到了门口传来了敲门声,我起身去开门。门开,站在门外的是两个穿着制服的大哥,我脑子里飞速闪过每年的税单和消防检查结果,除了大众点评上那个一星评论以外,我想不到有什么原因能够让两个阿sir在此蹲守我几年。

“我保证以后不会只卖红色尖叫”,“你这地方还真没倒闭”。我和其中一个大哥同时说道。

“什么红色尖叫?”他愣了一下问道。

“差一点就倒闭了,这不是还想抢救一下”我故意岔开了话题,毕竟因为只进打折饮料而导致自助售货机里只有红色尖叫这事,放在什么时候都会引起世人的愤恨。

“我们俩巡逻这附近快5年了,隔壁牛肉面都从兰州的升级成和府的了,这地方像是保留地一样,门都没开过”另外一个大哥笑着说。

“不过故事我们倒是没少听说,你这里面还真的藏了一个沙漠啊,我周末得带我家姑娘来瞧瞧。”他又接着说到。

“欢迎欢迎!来了提我名字我给你打折。”我如释重负的同时也开始了胡言乱语。

又随便聊了几句,门口也慢慢有一些路过的人停了下来,不少人都伸着头想看看铁门后面究竟是什么。我乘机把大门打开了,虽然铁门只有三米宽,20毫米厚,但当阳光和目光自由地穿过大门的时候,这片沙漠又出现在了这座城市里。

桌游和剧本杀的市场分析里提到说十八个月就可以让一座城市里的消费群体更新60%以上。我留足了余量,时隔五年,这座城市里应该有99%的人都对这个店毫不知情。所以在我重新营业的前两个星期,竟然开始有人在门口排起了队。原因也很简单,我记得刚恢复营业的前两天,在小红书上刷到了一个帖子:《打卡小撒哈拉|沙漠风OOTD》,我顺手花钱给这帖子买了个热门。

(3)另一个绿洲

又两个星期过去,到今天最后一批客人离开后,我已经完成了连轴转一个月的成就。我照常从隔断后面拿出来打扫的工具,昨天网购的大号猫砂铲也给我放到了清洁车的侧兜里。我想破脑袋也想不到一个抖音视频就能够让一大堆人带着他们的猫来体验“特大号猫砂盆”。最夸张的一次,一只猫还没有熬到出恭结束,另外一只猫就已经开始先声夺人地挖坑埋沙,等到它结束之后扭头一看,反复确认后,抬头之后眼里看起来充满了无助和不解,也只能象征性的刨了两下就跑走了。

打扫完之后我回到了在角落里专属我的绿洲,打开了电脑照常看了眼大众点评和百度地图的评论,评分从4.7突然变成4.8。我欣慰地看了眼门口并排摆着的两个自助售货机,果然顾客还是更愿意自己来做选择,不过就是可惜了那几箱过期三年的饮料了。

突然我在众多评论里看了一条充斥着粗体和下划线的留言:

【我们‘需要’绿洲!真正的绿洲!没有‘绿洲’的沙漠就像没有酸笋的螺蛳粉!】

我又往下看了下,这条评论竟然有三十多个赞,还有一条回复:

(20.2521850, -13.0877350)

回复的人是一个匿名用户,我一开始以为又是什么新型的机器人发言,后来还是忍不住复制了放到搜索引擎里搜了一下。

半个小时后,我从抽屉最下层翻出了一个电话号码,接着就拨通了过去。电话响了两声突然被接了起来。

“你好,我是小爱电话助手,请问您找机主有什么事情,我可以先记录下来,他会在有空的时候给您回拨过去。”

“转人工”我下意识的脱口而出。

“我的主人正在忙,您可以和我讲……”

“转人工”我又说了一遍。

“正在为您转接。”

我刚准备再说一边,突然被这个电话助手的转接弄得不知所措了。

“奇了怪了,我不是开了游戏模式吗,怎么还能打进来电话”我听到电话对面传来了熟悉的声音。

“滴……”电话被挂了。

我还没来得及说一句话,对面就挂掉了。我又拿起来名片确认了一遍:《皮皮虾我们走搬运公司》客户经理 盛窦𨭉。

我一度以为这个电话可能已经易主了,毕竟这么多年过去了,当年帮我把这些沙子搬过来的公司会不会还活着都不好说了。不过幸运的是第二天早上九点半,我接到了回电。对方早就没有了我的手机号,但是听到我说之前有过合作搬过一次沙漠,对面陷入三十秒的沉默,我听到对面好像有一段急促的脚步声,接着是开门声和椅子滑动的声音。

“皮皮虾我们走搬运公司竭诚为您服务!我是盛窦𨭉”我被突然的自我介绍吓了一跳。

“你好,我想再搬一个绿洲来”我也没有藏着掖着,直接说出了我的需求。

又陷入了一段时间的沉默,对方清了清嗓子“没问题,这次我们从哪搬?”

“我等下发你坐标,虽然有点远,不过你克服一下。”我语重心长的说到。

我把之前的坐标发了过去,没过几秒聊天框上就变成了“对方正在输入…”,我又等了几分钟,还是没等来确认,正当我准备确认一下对方到底可不可以接单,一条消息发了过来:

“收到”

一切都很顺利,两个月后盛窦𨭉在凌晨打电话给我,说货送到了,让我去验货。我赶到的时候,盛窦𨭉坐在打头的第一辆半挂车里,后面还跟着几辆车。我把门打开之后又交代了几句。又匆匆跑回家补觉了。

第二天到店门口从旁边绿化带里把钥匙挖出来,我迫不及待地打开了门。我冲到了最近的沙丘上,在不远的沙漠的最中心,一个不大不小的湖和湖边的矮树丛像被画在两个沙丘形成的摇篮里。我拿出手机快速地拍了两张,在日照灯的加持下,两张照片几乎可以直接挂在点评和地图里面了。

在我编辑到一半的时候,每天的营业的提醒又响了起来,今天恰好又是一个公司团建的包场,我还记得当时联系我的人事负责人。两天前他突然走进店里,说要预定包场,在我还在介绍价格的时候,他不停的在转着自己的工牌,突然打断我问到:“沙漠里有狼吗?是不是沙漠里的狼,狼性更强啊?”说完又自言自语道“好,这次活动就叫沙漠之狼!”

“好名字!我们这边也提供横幅制作业务”我恰逢其时地开始尝试推销店里的新业务。

“不用了,我肯定要走采购流程的”他低着头回了一句,手机上在不停地按着计算器。“你们包场多少钱来着?”他抬头看着我。

“上午400,下午500”我回道。

他又加了400在计算器️里,紧接着又乘了1.3。看到结果后不自觉地点了点头。

“你们可以把环境模拟更恶劣一些吗?”他收起手机同时满意地看着我。

“可以,风雨雷电我们都可以。”我回答道。

我突然回过神,发现时间不多了,他们应该用不了多久就会到了。我赶紧拿出手机,控制店里的风扇和喷水器打开。不一会风就由小风变成了大风,我转身盯着大门,感受着沙漠里的风暴。甚至有那么一瞬间,我开始幻想,自己也变成了沙漠之狼,孑然独立于沙丘之峰。不过没站一会,因为正对着风向,我也慢慢从沙丘顶部滑了下来,我扭头准备重新爬上沙丘,刚到顶部,听到背后门口传来那个人事负责人的声音:

“今天我们战胜了沙漠,我们就是大漠的狼王!明天我们战胜自己,我们就是王中王!成功的路上不需要绿洲,我们顶峰相见!”

我听完之后摇了摇头,看到一群人朝着我这边冲了过来,我便打算抓紧时间回到我自己的绿洲去。可就当我扭头准备从另一个方向回去的时候,我突然发现刚刚在两个沙丘之间的,我耗费巨资打造的绿洲已经不知所踪了。

等我缓过神来的时候,已经回到了我自己的工作区,透过监控摄像头,我看到已经有不少人冲到了沙丘的顶部,虽然风暴还在持续的推动这沙丘移动,但他们像是清晨赶海的人一样,稍有变化,他们就一起冲着一个方向,一拥而上。没过一会,我看到在他们脚下的不远处,刚刚绿洲里的矮树的树冠漏了出来,但也只是出现了一会,一阵风吹过,又被埋了起来。

我的目光从监控上移开了,正好落在了桌子上的名片,我又一次拨通电话。滴了两声:

“你好,我是小爱电话助手,请问您找机主有…”
 

“我要搬走沙漠。”

(完)

bookmark_border右转 下坡

“0.4英里后右转下坡,请提前…”导航刚播到一半,“嘭,嘭”接连两声闷响,李三虎回过神来,意识到这是被追尾了。没有犹豫,打开双闪,减速后慢慢靠右停到了路肩,又朝左前方的后视镜望去,一辆本田SUV也打着双闪停了下来,后面还跟着一辆尼桑轿车。解开安全带,又在手机App上点了几下,果断取消了马上要去接的订单。

这不是第一次在405号公路上被追尾了,上次是被开着自动驾驶的特斯拉撞了,修车修了三天,好在对方的保险给赔了误工费。李三虎从支架上拆下手机和充电线,确认了后方没有来车之后打开了车门走了下去。

“Lo siento, lo siento mucho”

本田SUV上下来一个中年女性,连声道歉,说着流利的西语。说完又回头看自己车的后座。尼桑车上也下来了一男一女,看起来二十多岁,正是谈恋爱的好年岁。李三虎拿出手机开始问ChatGPT这种情况该怎么办,好在追尾本该是后面两个车主的责任,作为被追尾的,李三虎现在成了最镇静的人。

“妈妈,我们会进监狱吗?”

“哇—— 哇——“

密密麻麻的小孩叫喊声从本田车上传出来,墨西哥妈妈转身去安抚她的孩子们,后面的小情侣也开始仔细打量自己的车和本田SUV车的损伤情况。接着又拿出手机开始拍照。李三虎在等待AI回复的同时,也走到了车屁股后,下午5点的晚高峰车子本就开不快,车子肯定是没有报废,但后保险杠被撞了一个拳头大的坑,同时左后方的灯罩也还是不幸遇难了。AI的结果出来了,李三虎拿着分别翻译好的版本给后面两位车主看了一下。还没看完,手机突然开始震动,李三虎收回手机看到有人打过来电话,顺手接了起来。Uber平台的电话,询问为什么他突然取消了Uber black的订单,又说顾客刚刚投诉到了平台,这一单可能会需要他来赔偿,李三虎想都没想直接说自己出了车祸,没办法去接客人了,平台客服听到之后假惺惺地关心了一下他的安全,然后说会向主管说明情况。挂掉电话,看到墨西哥妈妈和尼桑车上的年轻男孩在急切地说着什么,自己也不好插嘴,于是点了根烟靠在了路边的护栏上。

手机上的AI回答很简单,只需要知道是谁先撞了谁就可以了,事情就是这样,总得分个前后。只是很多事情,做不到客观,更分不清。李三虎又拿出手机开始翻找朋友圈,打从昨天晚上第一次刷到林知夏的朋友圈后,他已经记不起这是今天第几次刷新朋友圈了。想起大学毕业前在西门小吃街吃的散伙饭,没有喝酒也没有说再见,所以没办法借着酒劲去把故事讲清。更何况大学里的故事本就最简单但也最难讲得清楚,时至今日,李三虎再想去追究到底是谁先喜欢谁的这件事,然后去划分拒绝捅破窗户纸这件事的责任是在谁,但他自己也知道这其实毫无意义。

她坐的飞机应该已经落地了,昨天上飞机前发的朋友圈,从国内飞到洛杉矶的飞机他如数家珍,落地,滑行,过海关,取行李,这些流程是李三虎每天接机听客人讲的最多的,接着他们可能会去向酒店,也有一些会选择直接去景区打卡。李三虎又开始琢磨为什么林知夏不来找他问一问攻略什么的,他虽然朋友圈发得不多,但是多多少少带定位的一年还是有几条的。她又为什么选择了洛杉矶作为美国旅游的第一站。越想越乱,索性退出微信,想了一下连后台一起关了。

墨西哥妈妈拿着手机向他走来,示意他接电话,对面是一个男人,说是对方的老公,问李三虎想怎么处理,李三虎还没回答,他又问李三虎说他的车还能开吗?因为他老婆说自己撞了一辆豪华奔驰,所以有一点着急,但是如果李三虎车还可以开,那可以留下保险公司的信息之后让保险公司来沟通。李三虎又抬头看了眼车尾,车是肯定可以接着开的,大概率和之前的车祸一样,找相识的修车厂修一下就好了。他和电话那头拿到了对方的保险公司信息,又听电话里的男人抱怨后面尼桑车没有保险,他们自己的本田车可能要自己出钱来修了。

李三虎把电话还给了墨西哥妈妈,又绕到本田车的另一边,透过打开的车窗看到了车里的三个小孩,他朝着里面看起来最年长的小女孩笑了笑,和她讲说你们不会进监狱的,不然警察早就过来了。小女孩似懂非懂地点点头,又开始抱起弟弟安慰起来。他比手势告诉墨西哥妈妈一切都OK,然后回到了车上。拿出手机,Uber App发来了一条新消息,点开来看,让他更新车的外观照片。提示在上传审核完成之前,他暂时无法接单了。

李三虎知道一定是刚刚那通电话惹的祸,他告诉平台自己出车祸了,平台为了照顾高端专车用户的体验,一定不会让他开着外观破损的车去接单的。他无奈地关掉App,又鬼使神差地开始刷新朋友圈,只不过这次他如愿以偿地等到了林知夏更新的朋友圈,定位是在Santa Monica。李三虎身体往前探了一点,抬头看天,透过车窗,今天的夕阳不太好看,有点灰,他心想不是最美的夕阳也挺好,能够看到同一片夕阳已是不易,最好的可以留到下次一起看。

被迫收工回家,正好遇上下课回家的室友,室友叫王四海,还正在读社区大学,他们租住的房子离市区有30英里,虽然李三虎总是自称混在山鸡城,但换算成上海的话,他大概已经住到了昆山。李三虎前脚停下车,王四海后脚就跟着把车停在了背后,还没开门就听到他开始咿咿啊啊地喊起来了。打从第一天中介带着李三虎来看房的时候,王四海就虔诚地问李三虎,开这辆车出去跑Uber black,一定赚得盆满钵满吧。王四海盯着车尾看了一会儿。像是看见了一只突然不下蛋的鸡。他又一脸愁容地看向李三虎。

“卧槽,哥,这咋又被追尾了,这不是耽误我哥发财嘛。”王四海问道。

“我也愁啊,这麻绳单挑细处断,厄运专找苦命人啊。”李三虎靠在车边又点了一根烟。

“还真是,我今天Crypto又爆仓了,哥你先替我垫一下这个月的房租,和上次一样,等我爸妈打钱过来就还你。”王四海自觉地顺了一根烟给自己点上了。

“行吧,你也催一催,我这两天没办法跑Uber,估计得苦两天了。另外你上次修车用的胶带放哪了,借我用一下。”

拿胶带胡乱粘了一下后车灯。李三虎回到房间躺在床上,听着隔壁王四海给爸妈打电话,从AI产业升级聊到投资移民,最后落脚在2000美金的生活费上,他无奈地拿出手机,又打开微信朋友圈刷了起来。他其实昨天晚上就计划好了,既然林知夏不来问他,那他就只能制造偶遇了,明天正好没办法接单,那他就蹲在洛杉矶景点周围,靠朋友圈来定位偶遇的机会。有了计划,李三虎想着在家也没事做,就打算开去修车行让修车师傅先估个价了。

“师傅,什么叫没有这个保险公司?” 李三虎问。

”什么叫我自己保险公司也不会赔的?“ 李三虎又问。

”什么叫最少5000美金?“ 李三虎还在问。

李三虎望着红色尾灯的灯光透过黑色胶布,给墨西哥大姐发了一条短信,问是不是保险公司信息给错了,iMessage显示已读,但等了十几分钟还没有收到消息。

开车回家的路上,李三虎突然想起来前两天为了让客人能认出来自己的车,恰好拍过几张车的外观照片,想着靠着这几张照片,说不定可以蒙混过关。计划有变,如果照片审核通过了,他打算明天早起去跑两单,下午再去蹲偶遇。Uber审核很快,刚提交不到半个小时,审核就通过了,同时发来的还有20美金的罚款通知。

再次回到家,他重新开始粘尾灯,好在车是黑色的,连着黑色的胶带看起来反倒不那么突兀了。折腾了一个多小时,回家顺路买的In-N-Out也已经冷掉了,边吃边刷手机,又刷到一条朋友圈,林知夏的照片里,两个In-N-Out的汉堡加一盒薯条,配文:”第一顿,汉堡薯条!”

第二天一大早,李三虎抹了比往常更多的发蜡,又专门带了一身休闲服在后备箱。临走前正好撞到熬夜熬穿了的王四海出来上厕所,又被他借走了200美金现金。说是今天要和昨天一起通宵玩游戏的网友见面,可能可以修成正果。

今天是周末,才跑了两个小时,接到了几单全家一起出来旅游的大款,有一单甚至收到了50美金的小费,李三虎不自觉地哼起歌来。

“我们寻找着在这条路的中间”

“我们迷失着在这条路的两端”

”每当黄昏阳光把所有都渲染“

”你看那金黄多耀眼“

临近中午,李三虎打算最后再接一单,结束后就找个快餐快速解决一顿,然后执行昨天的偶遇计划。不一会接到了新的一单,终点是格里菲斯天文台,这里本来也是计划里的景点之一,不过现在还有点早,一般游客会选择接近黄昏的时候去,可以看红日落入远方的大海,夕阳照在好莱坞的地标上,在城市的高点看整座天使之城慢慢点亮。

这一单又是家庭出游,一家三口从Los Cabos来,男人讲一口流利的英语,说自己在Los Cabos有三家餐厅,接待的10个游客里有4个是从美国的加利福尼亚来的,这么久终于有机会来洛杉矶了。李三虎顺带就当起了导游,在路上给他们介绍起了洛杉矶的景点。在等红绿灯的间隙,李三虎抽空刷了几次朋友圈,到现在还没有任何新动态,可能是在倒时差吧,李三虎想。

一路很通畅,不到12点半就到了天文台,快到的时候,男人和李三虎商量说让他在天文台停车场等一下他们,他们怕等下打不到车从天文台回去,李三虎又刷了一次朋友圈,看到还是没有更新,索性答应了在停车场等他们,反正在哪里等都是等。男人也答应一定在下午2点之前离开天文台。

一个小时过去了,在李三虎孜孜不倦地刷朋友圈的努力下,林知夏终于更新了,定位在LACMA。看到这条朋友圈,李三虎开始后悔答应在停车场等了,但是离2点还剩半个小时,所以他还是决定遵守约定再等一会。1:58,李三虎拨通了乘客的电话,等了一会,男人接了电话,说他女儿在看一个天文台的电影,可能还需要15分钟,并承诺会额外给100美金的小费。2:13分,李三虎又一次拨通了他的电话,这次承诺给300美金,但是需要等他女儿吃完午饭。2:43分,李三虎发了短信给他,说最多再等5分钟,一分钟后,李三虎收到Uber提醒,乘客在上一单Uber的小费里添加了500美金。3:15分,李三虎终于在停车场看到了他们,2分钟前林知夏出现在了星光大道。李三虎和他们商量将他们送到山脚下容易打车的地方,不再收他们任何车费,男人看到李三虎坚定的眼神,同意了在山脚下放下他们再去打Uber。

车从停车场驶出,盘山公路蜿蜒向下,但不巧的是,所有人都想赶在日落前到天文台,上山和下山的路已经堵死了。李三虎无力地靠在座椅上,手机突然响起了,陌生的号码,他接了起来,对方说明身份,说是昨天追尾车祸里的尼桑车主,要求李三虎赔偿他的修车费用,因为本田车主坚持是因为李三虎突然刹车才导致的车祸,尼桑车主的保险公司让他联系李三虎,他的保险公司不给赔付。李三虎一时语塞,前车的刹车灯透过车窗照着李三虎,李三虎突然觉得有点热。随后一句话没说挂掉了电话。

又一个小时过去了,车只往前挪动了几米,李三虎无声地趴在方向盘上,小女孩要上厕所,妻子20分钟之前带着她回天文台上厕所,到现在还没有回来。太阳慢慢落下,今天的夕阳很美,红透了天,更甚,一切都被夕阳染成了红色,包括李三虎。

李三虎已经接近20个小时没有吃饭了,他看到越来越多的人开始沿着山路往天文台走,大家把车子停在路边,选择步行走到天文台,没有人愿意错过难得一见的日落和日落大道。李三虎放弃了刷朋友圈,他索性和男人开始聊天,他讲他大学的时候特别喜欢桂花,因为男生宿舍和女生宿舍之间种了几棵桂花树,开花的时候风从女生宿舍吹过来,充满了桂花味道。他讲他在洛杉矶很少闻到桂花味道,真真想到不行的时候,会去喝一杯桂花乌龙奶茶。他讲在中国有14亿人,所以他能遇到一个人的概率是14亿分之一,洛杉矶只有一千万人,他遇到一个人的概率,是不是应该是中国的140倍。他讲他昨天被追尾,现在车尾灯还贴着胶带,Uber怕胶带影响乘客的体验,但是他今天所有的乘客根本没有一个人注意到车尾的胶带。

他说着就要男人和他一起去看车尾的胶带,他把车挂入P档,下了车,站在车后,对着尾灯滔滔不绝,说不相信被追尾了还要自己出钱,说不相信换这个破灯要5000美金。正说着呢,风从山上吹了下来,他闻到了一阵桂花味,循着味道扭过头去。

林知夏站在他背后,是什么时候的事情,这一瞬,他脑子里只有一个念头:她站了多久?一分钟?十分钟?还是十年。

林知夏没有说话,指了指李三虎手上的手机,又有一个未知电话打过来了,李三虎看也没看就挂掉了电话。

”好…好巧….好久不见“李三虎说

“是啊,没想到你竟然在洛杉矶。”林知夏笑了笑,“这是你的车吗?”她指了指车屁股。

“是啊。” 李三虎看着车灯上的胶带,突然不知道该说些什么了。

“感觉车牌号很熟悉,好奇怪。”,林知夏像是在找话题,又像是真的在想自己在哪里见过一样。

“你先上去吧,马上落日了,晚了就赶不上了。” 李三虎说完就后悔了。

“好啊,你微信还是之前那个吧,那我们晚点再联系。“ 林知夏指了指自己的手机。随后就转过身接着朝天文台走去了。

”爸爸——“ 小女孩边喊边迎面冲了过来。

林知夏好像顿了一下,又好像没有。

手里的手机又响了,这次李三虎接了起来。

电话那头是律师,说自己代表昨天追尾车祸里的本田车主,要求李三虎支付车主孩子的健康检查费用和之后可能存在的治疗费用。

李三虎挂了电话,他忽然想起什么,打开了Uber,昨天那张20美金罚单还在。他只能看到乘客的姓。

Lin

李三虎回到车上,看样子前面堵车已经好多了。导航重新响起:

“路线重新计算”

“已为您切换到更快路线”

“前方1英里,右转下坡”

bookmark_border我们总是忘记在机场要拥抱

我大概是在看到床上叠好的衣服的时候开始哭的,这是我人生中最与众不同的四十天。在距离家上万公里的地方,在一个我租来的家里,我们一家在一起住了四十天。

起初只是哽咽,再是抽泣,最后竟也哭出了声。平凡这个词向来听起来不是一个好的形容词,但当有一个“平凡”的父母在以“平凡”的方式一直爱着你时,这无疑是世界上最伟大的事。我与父母三年有余未见,也是我从出生至今,自己不依赖父母过得最长的一段时间了。平复心情后来讲,这三年绝构不上艰辛和痛苦,在人生过得最快的几年里,我颇有逃离意味地在异乡度过了三年,反观父母在每次与我的视频里,在每次微信聊天里,却从未谈及这三年里,他们的生活与工作。便是最基本的关心,我都轻易地拿工作忙的借口帮自己搪塞过去了。

故而在这一起相处的四十天里,我,一个第一次做儿子的人,和我的父母,第一次当父母的两个人,不出意外地在不停地拉扯。这种拉扯我不知道是好是坏,但却是让我一瞬间就感受到穿越回万里外家乡的感觉。这种拉扯包括但不限于日常琐碎的争吵,一言不发的奉献,千叮咛万嘱咐和无法言语的感情。这种拉扯,在某种意义上来说,就是系在我和父母身上那永不可磨灭与忽视的绑带,是跨越了空间和时间的,无法用这世间任何度量单位去衡量的绑带。

当飞机延着跑道起飞,我沿着高速公路回到家里,我打开了家里所有的灯,一盏一盏的比较着,我渴望找到那盏色温最暖的灯,可今天的家里格外的冷,我或许该要去把空调打开了。

bookmark_borderMongoDB index with multiple filters

Recently, my current project has faced some loading issue with mongodb, to be specific, documentdb from AWS. We have mid-level instance and a lot of collection for data seperation purpose. For some of collections, it store more than millions data.

Our data structure like this:

type Course struct {
    ClassType int
    Prerequirement []*Course
    Teacher string // should be a Teach but for simplicity using string here.
    BuildNumber int
    
}

type Student struct {
    Grade int
    AdmittedAt time.Time
    StartedAt time.Time
    GraduationTime time.Time
    CoursesJoined []*Course
}

The data structure is just a mock, to clarify the function of indexes, we will consider some scenario later.

Before we jump into the index, we should know the basic index concept and when/where/how to create an index which is an index strategy.

I will skip when and where here, but want to emphasize ‘How to create an effective index’

The ESR (Equality, Sort, Range) Rule

Equality

“Equality” refers to an exact match on a single value. The following exact match queries scan the cars collection for documents whose model field exactly matches Cordoba.

db.cars.find( { model: "Cordoba" } )db.cars.find( { model: { $eq: "Cordoba" } } )

Index searches make efficient use of exact matches to limit the number of documents that need to be examined to satisfy a query. Place fields that require exact matches first in your index.

An index may have multiple keys for queries with exact matches. The index keys for equality matches can appear in any order. However, to satisfy an equality match with the index, all of the index keys for exact matches must come before any other index fields. MongoDB’s search algorithm eliminates any need to arrange the exact match fields in a particular order.

Exact matches should be selective. To reduce the number of index keys scanned, ensure equality tests eliminate at least 90% of possible document matches.

Sort

“Sort” determines the order for results. Sort follows equality matches because the equality matches reduce the number of documents that need to be sorted. Sorting after the equality matches also allows MongoDB to do a non-blocking sort.

An index can support sort operations when the query fields are a subset of the index keys. Sort operations on a subset of the index keys are only supported if the query includes equality conditions for all of the prefix keys that precede the sort keys. For more information see: Sort and Non-prefix Subset of an Index.

The following example queries the cars collection. The output is sorted by model:

db.cars.find( { manufacturer: "GM" } ).sort( { model: 1 } )

To improve query performance, create an index on the manufacturer and model fields:

db.cars.createIndex( { manufacturer: 1, model: 1 } )
  • manufacturer is the first key because it is an equality match.
  • model is indexed in the same order ( 1 ) as the query.

Range

“Range” filters scan fields. The scan doesn’t require an exact match, which means range filters are loosely bound to index keys. To improve query efficiency, make the range bounds as tight as possible and use equality matches to limit the number of documents that must be scanned.

Range filters resemble the following:

db.cars.find( { price: { $gte: 15000} } )db.cars.find( { age: { $lt: 10 } } )db.cars.find( { priorAccidents: { $ne: null } } )

MongoDB cannot do an index sort on the results of a range filter. Place the range filter after the sort predicate so MongoDB can use a non-blocking index sort. For more information on blocking sorts, see cursor.allowDiskUse().

Please keep these three words in your mind until you find a job that completely is irrelated to development, of course, until you win the power ball as well.

So we can start to think about several cases:

We want to find all students that are in Grade 1 and admitted in past 6 weeks, then sorted by start date descending.

at this case, we know Equality is grade, and Sort is the start time, the time range is based on admitted time, so we can easily create an index

{grade:1, admitted_at: -1, started_at:-1}

But the requirement changed a lot. For some reason, the principal wants to know all school students instead of Grade 1, because of the index prefix mechanism in MongoDB (https://www.mongodb.com/docs/manual/core/index-compound/#prefixes) without grade, this index won’t be hit when searching only by admitted time and start time.

In this case, we may want to change the index to

 {admitted_at: -1, started_at:-1, grade:1}. 

But for the same reason, it will request every query need to contain a prefix to take advantage of the index.

We want to find all students that have Type A course and That course’s teacher is Weihao and admitted in past 6 weeks, then sorted by start date descending.

In this case, cause we have a subdocument in our data structure, we need to create an index for the subdocument as well. So the index will looks like

{courses_joined.class_type:1, courses_joined.teacher:1, admited_at:-1, started_at:-1}

We still try to use a compound index to fulfill the requirement, which is good for extensibility but also bad for extensibility. Imagine one more scenario, what if someday the product manager asks you when the department of education has issued a new law that doesn’t allow searching students much specific. So you have to change the AND relation between course_joined.class_type and course_joined.teacher to OR relation. Then you find out the index is not hitting anymore as OR aggregation requires both fields have an independent index.

In this case, we should create multiple indexes and use MongoDB index intersection

{admited_at:-1, started_at:-1}
{courses_joined.class_type:1}
{courses_joined.teacher:1}

Other MongoDB article:

bookmark_borderCaltrain的终点站是下元

从SFO 飞到 JFK的航班要5个半小时,我记得在上次回国的飞机上,我洋洋洒洒写了几千字,只为探究我是在哪一个时区跨过了2019年和2020年。现在想想那时是天真的可爱,转念一想当时的记录也算弥足珍贵了。可惜的是后来我发现找不到那篇文章写在哪了。原来2019真的回不去了。

网络上有人在一年前把当时称作“后疫情时代”,罗列了20年和21年漫长的疫情时间线,并盖棺定论般地说:当时处在“后疫情时代”的我们,会永远铭记这漫长历史上沾满冠状病毒的两年。或许是结论下的太早的原因,后来又将“后疫情时代”改成了“中疫情时代”。

说来惭愧,竟是不知不觉滑到了中年人的行列,倒真不是年龄的累加在身后催促,反而是因为在不知不觉中发现自己开始享受晚上8点窝在沙发上看电视,同时不用担心错过提交的作业。起初会咬牙切齿恨每天的日子会不经意被各种事情充斥,甩也甩不掉,做了也不会有成就感,后来不论是说释然了还是妥协了,但总算搞明白了的是:成就感这个东西,远比不上赌博和情爱的快感。与其说成年人是无聊无趣的,究其根本是比赛刚进入了白热化,作为选手的你却发现自己没报名而已。会看着远处的骄子们痛心疾首,也会和给你加油的朋友打气说重在参与。

回到这架目的是约翰肯尼迪机场的飞机上,如果这世上有人总结过,每一次出行的路上都是最好的内省时机。我必定跨过时间和空间的限制,去和他/她拥抱一下,然后问问,后半句是不是:在路上的内省深刻且准确,但是到达目的地后就会置之脑后。

因为工作的变动,之前和人打交道的生活变成了和摄像头打交道,当然不是指无休止的居家办公和Zoom meeting,而是挂在你背后天花板角落的那个黑色监工。工作的变动无可厚非,毕竟没有哪个工地能搬一辈子的砖,在哪里敲代码不是敲代码,写bug亦同,debug亦同。真正让人唏嘘的是看到自己慢慢拼凑起来的产品有一天再和自己毫无瓜葛,颇有一种霸王别姬的气质,唯一区别可能是楚霸王自刎于吴江边,我则是搭着江上的小舟去找下一个姬了。反倒是我的虞姬活了下来,成了那个独自面对这个喧哗世界的人了。坦白来讲,能够做出一个被数十万人使用的产品,可以和赌博和情爱并列了。

飞机总会遇到气流,上上下下晃来晃去,没想到我在离开母亲肚子二十多年后,还是会因为飞机的晃动产生困意。说起母亲,大概算来也有约834天没有见面了,最近视频的次数愈来愈多了,不知是她开始想我了,还是我开始想她了。该死的疫情!竟成了最好的借口,竟能压过无时无刻不在的思念,不知母亲有没有后悔数年前在海底捞排位时,轻易答应我出国的请求。在茂业百货的顶楼,我不知道那家海底捞现在还在不在,只记得他们的等位区竟是连美国的都不如,厚重的帘子还是挡不住太原的冷风,没有吹醒本就愚钝的我和一时失神的母亲,可没想到连头脑一向冷静的爸爸也一并同意了。该死的海底捞!

如果生活像起飞的飞机一样就好了,在起飞的时候,唯一的目的就是降落在目的地。时常会辗转反侧,原因也无他,挣扎于目的地而已,别人都在爬升的时候,还在盘旋的人却已经在考虑降落了,不知道是谨慎还是他们的苍穹太低了。

记得小时候去二姨家,要先穿过院子,再横跨12车道的迎泽大街,在省人大坐上1路公交车,投币一元,刷学生卡只要两毛五,约莫十站后,终点站下元到了,转乘摩的,我被夹在妈妈和摩的师傅之间,摩托在下元的人流里穿梭,几分钟之后就会把下元远远的甩在身后。与此同时,1路公交调转车头,始发站下元,终点站太原火车站,投币一元,刷卡七毛五。