Naiwen's bloghttps://naiwen.ccHi, I'm Naiwen. Nice to meet you!en-us我的 2023 年1709424000000https://naiwen.cc/post/wo_de_2023_nianhttps://naiwen.cc/post/wo_de_2023_nian该写年终总结了,再不写就到年中了…

工作

对于我来说,今年在工作上是很特殊的一年。2023 年元旦,正式收到了前司友好和平的分手通知,双方整个过程没有任何摩擦。如此顺利,都因前司财大气粗。其巨大的体量和潜力,和一万个我分手,都算毛毛雨。这也是在大公司工作的好处之一吧。

之后,休息了两个月,和老婆小舅子,进行了一次成都到昆明的川西自驾游。

后来开始陆陆续续进行尝试。

首先是找国外的 remote,主要是欧洲的公司。投了五十家左右,收到面试通知 0 家。是的,没有一次面试机会。也问了推上有成功经验的网友,说要做好 99% 被拒的可能。但我还是没坚持下去。

这应该不是履历的原因,往宏观层面说,应该是中国和国外脱钩的缩影。。几年前,X 上能看到挺多在德国工作的人在活跃,让人觉得德国公司,对肉身还在中国的候选人,是比较愿意花时间和精力去考虑的。

但几年后的几天,这种态度我个人感觉是慢慢消失了。当然这是对于愿意搬家到国外工作来说。对于 remote 来说,除了这层面,还有政策原因。比如支付工资估计也是麻烦事。

国外 remote 无望,但还是想再试试国外的公司的面试,又陆续找了亚洲的公司来面,主要是日本和泰国。

Agoda

泰国其实就 Agoda 一家,也是我最接近拿到 Offer 的一家,进行到了四面。第四面是和 Manager,大多是 BQ 问题,也会从 BQ 问题延伸出来技术问题。虽然准备了,但因为英语能力还不够好,面对意料之外的问题,显得手足无措。在面试中,我就已感到没啥希望了。

后来 HR 还联系我要不要试一下和其他部门的 Manager 进行第四面。想到也不太可能去曼谷,就作罢了。

Paypay

日本的职位,通过 japan.dev 和 tokyo.dev 两个网站了解。发现 Paypay 岗位挺多的,于是就投了。流程是 HR 会有 30 分钟的 Phone Screen,了解一下我的意愿和现状。日本的公司很在乎候选人愿不愿意搬家过去。

后来是第一面,不是算法,只是 technical preview,主要是就着简历项目聊一下。我猜想,通过这一轮,面试官也可以直观感受到候选人语言和技术上是否胜任工作。

面试官看不出来是哪里人,估计是有英语国家生活经历的亚洲人,英语和母语者水平差不多。

第一面就失败了,还是英语问题,也是提前准备太不充分,整个沟通英语非常稀烂,过程中已知无望。

Hennge

另外一家日本公司,做网络安全相关的。

流程是先做一个 homework,昨晚了贴到 GitHub Gist 上,把链接发给 Hennge,之后会安排面试。

一开始也会有 HR 做 Phone Screen,是个英文非常地道的亚洲姑娘。我面对英语非常好的人,会有莫名的压力。临场发挥也很不好,大多时间都是这位姑娘在口若悬河的介绍 Hennge 这个公司。我觉得有点形式化了,但也不好意思打断。

本以为 Phone Screen 就会挂,但没想到也收到了面试邀请。

面试官有两人,马来西亚小哥和日本大叔。日本大叔英语不是很好,大叔和我甚至都被自己的渣英语逗笑了。可能也因为如此,我的心态挺放松的。

马来小哥的英语不错,所以主要是他问问题。我觉得回答得都不错。但和 Paypay 一样,他们直接了当的问,你决定好搬来日本没。我回答是不确定,要和家人商量。

后来几天后就收到拒信了,猜测和我无法确定去日本有关。

国内公司

除了刚分手的老东家,陆陆续续投了一些大中小厂。具体就不细说了,好几家到了三面,就一直被拖着。猜想是就业市场现在是买方市场,公司们并不缺候选人,自然也不着急决定。

另外一个感受是,面试国内的公司体验不是很好,感受到不被尊重的机率比较高。最常见的表现是,不先做自我介绍,或者我在自我介绍时,不认真听,忙着翻我的简历看。最过分的一位,我在回答他的提问,他居然忙着看消息,然后笑了,应该是被消息逗笑了……

无论如何,最后选了一个可以正常上下班,薪资又还可以的工作。

新工作

新工作需要和新加坡、印度的同事打交道。真正到工作的时候,才发现我的渣渣英语简直不够用。同时,也深感神奇,新加坡和印度同事的口音我一开始都都不懂,靠着 live caption 支撑,但他们两方却能无缝交谈。

同时,新东家的同事也很注重准时下班,会议快开到下班时间还没完,就有人提出要下班了,非常健康。

关于英语能力,现在说短句还是 OK 的,一个主句加个从句也 OK,但是多个长句子,然后再各种连接词和转折,很快就会晕了。如果再混入不同时态,简直会瞬间失去语言能力。

关于提高英语?继续还是走 Stephen Krashen 的 Input Hypothesis 路线。坚持 Input 强度,然后希望我的大脑可以潜移默化的学习英文吧。

生活

23年发生了很多事情,减肥和健身、放弃移民等等。

健身

因为失业时长高达半年,所以我尝试了健身。从一开始学着网上用弹力绳,到后面用哑铃。在 Logseq 上记录每天各个动作的重量、组数等等,坚持了两个月左右。体重从 155 减到了 145,10 斤左右。看着脸不再肿肿的,四肢也变得紧绷,整个人变得灵活清爽了。

放弃移民

一开始想移民,最大的原因还是来源于,对于平庸的程序员,35 岁之后的危机。次之是,某个伟人很多的国度,一直在发生匪夷所思的事情,特别是疫情两年。

但最终,我还是因为害怕退却了,我觉得很难离开家人,去到飞行时间 13 消失的大洋彼岸。另外一个原因,和老婆算了一下资产,也只够去那里烧两三年的。万一不成,还得回来重新开始。

也理解了,移民最大的问题,其实是决心问题。有了决心,硬着头皮也能继续走下去。患得患失,终会陷入进退两难,两头不沾。

放弃的过程很不容易,给了老婆太大的期待,还记得和她说不去了时,她愤怒的把手里的签证资料摔到地上的情景。

这也是她一直想去的地方,或者是我们很想逃离到的地方。但不管怎样,决定留下了。

其他

读书

不再纠结读了几本书了,渐渐觉得这并不重要。现在对于读书的态度也变得随意了一些,经常跳去自己关心的地方看,迅速解决疑问。现在觉得这才是对的,像个乖孩子,从头读到尾有什么意义呢?

最终还是为了解决疑惑,或者有新的体验,并不是像愚蠢的圣徒,按部就班完成仪式,以期有什么若有若无神圣的改变。

目前仍然是心理学相关的通俗书籍会比较吸引我,今年发现了《不原谅也没关系》。 陆陆续续读完了英文 《Hobbit》,生词很多,但我却渐渐丢失了每天过一遍 Anki 卡片的习惯,导致无太多词汇累积。

不知道自己想要什么/无热爱之事

在我的儿时记忆里,常常出现父母无聊到不知道做什么的场景,最终他们会屈服于麻将。打麻将对于他们来说,是一件乐趣近乎消磨殆尽,但为了打发时间的无奈之举。

我和老婆也经常感慨,不知自己想要什么,觉得生活没有意义。工作时不开心,空闲下来也不知道如何寻找开心。这可能和进入 30 岁后有关。20 岁时,觉得一切无所谓,因为人生的进度条刚开始,充满了只要我怎么怎么样就能得到啥啥啥的希望。

但现在发现自己因为性格原因,也无法做到多努力,自然也只是一位“差不多先生”。而且,又有了不可失去的东西要去守护,不禁充满希望的景象没了,而且害怕向下掉落了。

或许得重读一下弗洛姆的《逃避自由》。

职业规划

也有想过,自己其实不太适合做技术,但我又能做什么呢?又回到不知道自己想要什么的问题上了。

那在技术上,我唯一能做的,就是把技能点尽可能摊平。在需要某个点进行深入时,就捡起来,往前走几步。

另外,英语还是需要继续提高,保留接触海外就业市场的能力,以缓解国内就业市场存在的年龄歧视。

2024 展望

把写日志的习惯捡回来,写日志就好像给自己打 log,以后基于此写个 RAG 应用,应该也挺有趣的。

把英文 Input 强度保持住,希望一两年后,自己的口语能更上一层楼。

技术技能点变得更广,这其实也是探索,也许也是在解决不知道自己想要什么的问题。

发现自己开始对历史题材的书感兴趣了,还是多读点,不希望知道多少,只希望在众人疯狂时,自己能保持清醒。

希望家里的老人们都身体健康,家人们都平平安安,我的工作可以稳定个两年。

对于这个国家,希望一切别坠落得太快,伟人们别因为安全感不足,开始发疯。

]]>
A Second Language Acquisition Theory1708041600000https://naiwen.cc/post/a_second_language_acquisition_theoryhttps://naiwen.cc/post/a_second_language_acquisition_theoryEnglish, the language which gave me lots of pain when I was a student in the education system of China.

When in high school, English is one of the three main subjects a student must take. Even then in university, English was still a subject that have to take.

Unsurprisingly, the thing we put the most attention on is grammar. We emphasized grammar so much during that period, I thought being good at grammar was the only way to master English.

Then, until a few years ago, when I tried to search for how to learn English on YouTube again, accidentally found a video from a Professor whose name is Stephen Krashen. In case you are eager to watch the video, here's the link.

At the beginning of the video, the professor gave a powerful statement:

There's only one way to acquire a language and we all do the same. We learn a language by getting comprehensible input.

Comprehensible Input

Comprehensible input means the input you can understand. The input can be a picture, a piece of voice, video or text. Eventually, the part of your brain that is responsible for language, will gradually learn the language.

The statement is intuitive. Just try to recall how you mastered your native language in the early years of your life. You were just an infant, lying on the bed and listening to the meaningless voice that came out from the mouths of people surrounding you.

But somehow, you was able to say "Mama" or "Papa" for the first time in your life. And then, more simple words and sentences you started to speak. Then, more complicate sentences and your parent started to worry about you using inappropriate words.

During the whole process, I believe nobody tried to teach you grammar of that language. Instead, people around you just tried to speak to you and you just tried to listen.

But, when you speak, there's always words and sentences that are already in your mind. They show up there unconsciously so that you feel effortless.

So to get comprehensible input, a lot of it, if you want to learn English or other languages.

Affective Filter Hypothesis

In the video, the professor also mentioned another important thing called the Affective Filter Hypothesis. You may heard the funny phenomenon that when a family moved abroad, the children are always able to learn the language in the country very quickly, while the parent often struggle to learn.

The Hypothesis explains the phenomenon very well. When we try to get comprehensible input. There are factors that will influence the efficiency that our brain learn the input.

The first one is Motivation, students with more motivation will do better in language acquisition.

The second one is Self-esteem, more self-esteem is good for acquisition.

The third one is Anxiety, the lower the anxiety, the better the language acquisition.

The hypothesis also explains why we should watch or read the material that we feel interested in. More interesting the material is, the lower anxiety we will have. If we can totally forget that we are learning a language by watching or reading things, that would be the best.

Some other resources

The theory paves us a solid ground. But when it comes to practice, there are still a lot to answer.

For example, I want to speak English fluently, how much comprehensible input do I need to get?

How much input should I get before starting to output?

What is the best type of input for learning language?

Those questions are difficult to answer. At the moment, I only can give you some links and videos to check out:

  • antimoon: A website includes a series of article that explain how to learn English effectively which is based on the theory of Professor Stephen Krashen.
  • @mattvsjapan: A YouTube Channel about learning Japanese, the youtuber also explain lots of practices and methods on getting comprehensible input.
]]>
Review 《不原谅也没关系》1703030400000https://naiwen.cc/post/review_bu_yuan_liang_ye_mei_guan_xi_https://naiwen.cc/post/review_bu_yuan_liang_ye_mei_guan_xi_这本书的中文译名容易被误认为是鸡汤书籍,但英文名其实是 Complex PTSD: From Surving to Thriving。精确很多,至少让人感觉这是一本实在的自助书籍。

得知这本书是在纵横四海播客,对于这本书,我注定会多读几次,原因是它的内容不仅仅关于 Complex PTSD 的概念和成因,也关于自我疗愈的指导。

对于已经有宝宝的家长来说,这本书也可用来帮助认知,父母要怎么对宝宝,才会让他有坚实的自我。

当然,以下内容只是我自己对于本书的理解,如果你想以此来对自我下结论,我觉得这是危险的。请亲自阅读这本书后,再下结论。

PTSD 和 Complex PTSD

对于 PTSD (Post-traumatic stress disorder),我的理解来源于书中对退伍老兵的描写。想象一个经历过战争的老兵,走在大街上,听到旁边的哈雷摩托车嘈杂的引擎声,应激反应的扑到在地,浑身颤抖。Wikipedia 对此的定义为:

Post-traumatic stress disorder (PTSD)[a] is a mental and behavioral disorder[7] that develops from experiencing a traumatic event, such as sexual assault, warfare, traffic collisions, child abuse, domestic violence, or other threats on a person's life or well-being.

我对此的理解是,对于 PTSD 来说,遭受的事件和后果之间的联系是非常清晰的。

Complex PTSD 和 PTSD 相比,多出来了 Complex。我对此的理解是,成因是复杂的,无法直接关联的。Wikipedia 对此的解释是:

Complex post-traumatic stress disorder (CPTSD) is a stress-related mental disorder generally > occurring in response to complex traumas,[1] i.e. commonly prolonged or repetitive exposures to a series of traumatic events, within which individuals perceive little or no chance to escape

如果在 Wikipedia 的页面往下看,还能看到:

There exist strong relationships between CPTSD and repetitive adverse childhood experiences,[7][8] especially among survivors of harmful foster care.

即 CPTSD 和童年经历强烈相关。写到这里,我想起一句不知出处的话:不快乐的童年,需要用一生去治愈

当然 CPTSD 有轻有重,目前这是否算是一种心理疾病,尚无定论。上面的那句话也相对模糊,不快乐的童年到底如何治愈?不快乐的童年是否就一定会导致 CPTSD?我感觉自己有点问题要处理,感觉自己不太对劲,对自己不满意等等。

这些问题多少都可以从本书得到一些解答。

四种行为类型

书中开篇对一个家庭进行了描写,一孩是个大哥,二孩是二姐,三孩是三妹,四孩是四弟。

父母经常联合大哥欺负二姐,二姐逐渐沦为了家庭的受气包,重来得不到父母和大哥的喜欢,只有贬低的辱骂。

二姐为了消化被欺负的情绪,经常家务做得飞快,以为这样就可以避免挨骂。甚至,让人更悲伤的是,没家务做时,二姐还是非常的不安,就在院子里绕圈跑,让自己至少有事做。

后来三妹出生了,父母和大哥同样对三妹侮辱和伤害。但和二姐不一样,三妹渐渐变得麻木呆滞,主动把自己和现实世界剥离,以抵挡这些伤害。

四弟出生了,也许是父母老了,骂得没这么狠了,四弟慢慢学会观察和满足父母的需求,甚至在他们还没意识到自己需要什么时,四弟就已经把东西准备好了。

后来,四姐弟长大了,前面三个小孩都各自有了自己的生活,四弟还留在父母家里。

大哥结了婚,但他的每一场恋爱都像一场征服,对伴侣的控制和贬低很严重,但他认为自己是完美的,错误都来源于伴侣。这是战类型

二姐走入职场,经常在晚上陷入无止境的焦虑循环,担心自己的工作无法又好又快的完成,导致失眠。这是逃类型,通过大量快速的工作,让痛苦和自己解离。

三妹经常自己呆在房子里,渐渐的她更不愿意出去见人了,沉迷于小说和社交网络,隔绝在这个空间里,才能让她感到舒服,这是僵类型

四弟住在家里,母亲越来越依赖他了,甚至表示他是自己最爱的孩子。四弟也觉得,可以一直这样关心母亲,让他感觉很好,这是讨好型

对于没有 CPTSD 的人来说,四种行为类型都是存在的,且可以灵活应变。比如,受到伤害时,可以视情况选择战斗或者逃跑,实在打不过,还可以选择讨好等等。

CPTSD 的问题在于,在我们还是儿童的时候,反复暴露于同一种伤害下,重复采用单一的行为模式去应对伤害,导致行为模型的固化。用书中的话来描述,就是本该健康发育的能力,受到了限制。显现出来的症状常常是,社交回避、缺乏进取心等等。

对于 CPTSD 幸存者来说,这四种行为并不单一出现,常常两种类型会融合。书中讲述了如,战讨好类型,战僵类型等等。

书中关于行为类型的内容中,还有一处非常触动我内心的描写,大意是:还有一种最让人伤心的伤害是,CPTSD 的幸存者常常失去了自我驱动的能力和进取的心,他们不知道自己想要什么,没有努力的决心

这让我想起了,我无数次的自我批判,似乎都在围绕这一点进行。

接下来还有一句,这些能力的缺乏,似乎和发怒的能力受到压抑有关。让我即醍醐灌顶,又倍感伤心。

闪回、批判者、情绪

对于 PTSD 患者来说,激发应激行为的因素也许相当明显,当事人应该也可以知道自己在害怕和躲避什么。但对于 CPTSD 幸存者而言,情绪突然急转直下时,却往往说不清自己到底怎么了。

往往这种时刻,说明当事人经历了闪回。除了闪回,当事人往往还会有内在批判者的声音出现。比如自我否定甚至辱骂。也会有外在批判者的声音出现,比如对身边的人开始变得刻薄和进行批评。

批判者的形成,按照书中的描述,和超我代替自我有关。自我就是本身,但随着自我无法获得父母的肯定,渐渐就开始有完美主义倾向。但最后会发现,无论如何完美,也无法获得肯定,父母的声音逐渐变成了超我,逐渐的代替了本来的自我,最后就会内化成批判者。

能识别自己出于闪回当中,是疗愈的第一步。从我个人角度来说,当自己莫名情绪不好时,尝试回忆触发点,然后把那时候的情况,归类为闪回,可以给我很大的 relief。

但目前,我仍然无法确定,自己是否真的出于闪回中。书中并没给出一个权威标准去判断。似乎这件事情,自己认为是就是,不是就不是。但至少给了我合理化情绪变化的理由,这不意味着任由情绪的肆虐和伤害他人,而是说,这一步对于抵挡住内在和外在批判者的出现,相当的有效。

另外一个有用的认知是,情绪是无法控制的。另外一个角度也可以说,情绪的变化是天然的。试想如果人可以控制自己的情绪,恐怕会让自己一直开心吧。

但如果一个人可以一直开心,那开心就失去了意义。开心应该也会陷入内卷吧。小确幸不够了,要大笑,然后狂欢,然后灭亡……

突然觉得用阴阳来比喻是比较恰当的。有难过才会有开心。有争吵,才会有亲密。只在允许自己在情绪另外一端的人,逐渐也会丧失感受另一端情绪的能力。

再另外一个非常重要的认知是,正能量和负能量,或者快乐至上的认知是错误的。其实这点是建立在情绪是无法控制的认知之上的。之所以重要,是现在的文化、周围环境、亲人无时无刻不在强调寻找快乐的重要性。仿佛一丝阴郁都容不下。

但这个认知告诉我们的是,能容下让人不快乐的情绪,是非常非常重要的。只有可以经历风雨,才能见彩虹,说的应该就是这个意思。

另外提一句,我见过无数长辈,通过恐吓和侮辱,来停止小孩的哭泣。从这个角度来讲,这是多么悲伤的事情啊。

疗愈之路漫漫

哪怕是作者本人,在严重的 CPTSD 后,走了这么长的路,成为心理咨询师,写了这本书,也无法完全隔绝闪回和内在批判者。于是书中明确提到,做好终身疗愈的心理准备

这又和前文提到的,不快乐的童年,需要用一生去治愈,对应上了。

疗愈分为几个阶段,但不太记得了。这是我要下次重读时,重点关注的部分。

虽前路漫漫,但好在这不是一个零和一的游戏,不意味着要到终点才能尝到最终的果实。书中说道,也许只是一些情况的好转,就可以使你的亲密关系获得全新的体验和提升。

我相信,到了那些时刻时,一定会觉得这条路是值得的,且充满希望的。

最后

看完本书后,我仍有些疑惑:

  • 如何判断处在一个闪回当中?
  • 如果无法找到和闪回关联的记忆,闪回还成立吗?该怎么办?
  • 如何应用正念(mindfullness)去疗愈?

人的内心这个话题非常的庞大,这本书有点像一个地图,在书的最后,作者专门用一个部分去索引值得推荐的书籍。

我明白,很多人在感觉不舒服时,会使用自然习得的方式去排解,比如出去走走、吃一顿好的、寻求一些刺激的快乐、尝试自我分析和复盘。但从我的经验来看,不舒服和自我排解的循环,似乎永远都在转动。

我想,这也是为什么本书会吸引我的根本原因,不想永远在循环里,希望看书能带来新的视角。

所以,像本文开头说的,注定会重读多次这本书,现在就写到这里。

]]>
Review <Tears of the Kingdom>1691020800000https://naiwen.cc/post/review_tears_of_the_kingdomhttps://naiwen.cc/post/review_tears_of_the_kingdomI came across the final boss Ganondorf completely by accident.

I just set a goal for myself: Reach every lightroot to completely unlock the map of Depths.

After transferred to the central lightroot, I founded the place is surrounded by mountains and no way to take off my little plane. The only way is a tunnel that goes down to the deeper underground.

Half way through, I already felt something unusual. The background music became spooky. More and more monsters appeared. I had missed my goal. I decided to go deeper.

If it really is the Demon King, let's just finish it and end the game.

Not as joyful as I thought at the beginning

Setting a goal in a game is not something I usually do. But in Tears of the Kingdom, I need the mechanism to prevent myself from getting lost and bored.

Where did the feeling come from? Well, I guess that is because I was laid off not long ago.

Every time I turn on the game, I feel a little complicated. On the one hand, I haven't figure out my next job. That weight is always on my shoulders.

Another reason is that I had high expectations for this game. I expected it to bring me great joy, like The Breath of The Wild did.

But the truth is, even though there're many new categories of items, the surprised feeling I had with The Breath of The wild never came back.

First of all, I didn't use Zonite devices much. Before you got a bigger battery and the AutoBuild ability, build a device can be painful. Therefore, I just used devices that don't require composing.

My most frequently used device is springs. I use them to bounce myself to a high place for saving climbing time. Fuse a spring to a shield also has a bouncing effect to purse the attack from monsters. The skill saved me many hearts.

I also accidentally entered Depths when I had no idea where it was. I spent at least 2 hours there trying to build a plane to fly me back to the surface. But in no doubt, I failed.

When I was on the surface, Visit shrines also isn't funny. You have to solve the puzzle to collect the sprint orbs.

The Skyview towers? I already known what it is!

And finding the sages is the most boring part. Although the boss of every temple is different, but the plot, the damn plot is just awful.

After I beat the first boss of the four temples, I already known what next plot will be. But I still had to experience the similar story of every ancient sage again and again!

Things start becoming joyful again

After finish all quests of sages, I started to feel bored again and found myself picking mushrooms without any anticipation. My lovely horse inherited from The Breath of the Wild also rushed down a cliff and died. Before that, I didn't even know a horse can die!

Anyway, why do I still play a game when I have been bored? But I can't just give up the game and put my money in vain. This is where I started setting goal for myself.

My first goal is getting 12 hearts. This goal was hasty and just from a whim. But turned out it made the game more joyful.

In order to find the shrines, I needed to go to Skyview towers to bounce to the sky. Because from the sky, I could easily find shrines. But later I found that I actually can transferred to the shrines that locate on the sky islands!

The discover completely changed the way I explored Hyrule. Before that, every time I tried to get to a sky island, I bounced to the sky and glided to one. Oh, I was so stupid!

And then, I found that the dragons can be ride! You can't control the dragon, but you can land and travel on its back. There're even those little spikes that can be fused with weapons. After riding the light dragon from Surface to Depths and back to Surface again, I felt Depths was not that scary! It means I also wanted to explore Depths as well.

Then, following the main quest, I went to the floating Hyrule Castle. There were so many monsters. More importantly, there were so many powerful weapon. I never seen a bow with a lethality of 50.

Anyway, I started loving the game again!

After exploring Depths became easy

Then I spent more time on the underground world.

At first, I followed the quest of the Yiga Clan and discoverd getting Zonaites is easy and funny.

To improve my battery capacity, I conquered the monster traits without mercy!

And more surprisingly, the Autobuild ability makes composing my little plane so easy!

The plane receipt is on the Autobuild menu automatically. All I need to do is just collecting the needed units.

Considering there are always some units near lightloots, traveling by planes is almost free.

Let's end the game

As I mentioned on the beginning of this post, I accidentally went to where Ganondorf is.

The reason I decided to just end the game is, at the moment all the discoveries mentioned above happened, I had spent almost 100 hours on the game. That's lots of time!

Besides, the spooky music makes the exploring solemn and exciting.

I still failed many times before I got used to the battle with Ganondorf.

Ganondorf can learn and use the furry rush as Link did. Ganondorf dodge the attack during a furry rush and then immediately perform his own furry rush. Therefore, you have to perform a second furry rush! This made the battle even more interesting.

At the end, the battle became ugly. Due to the nervous, I didn't manage to come out a furry rush again.

What I did was gambling the hearts the exiles I had could survive Link the attacks from Ganondorf. Without dodging, I rushed to Ganondorf and attacked as fast as I could. And I won!

The End

Now I can put down my Switch and shift my focus to the other things. There are still many things in Hyrule are unknown to me. But I won't pick the game at least before I settle my next job.

I definitely would open it again in the future.

The beautiful sunset with a dragon flying on the sky The moment I got the master sword Destroying the secret stone of Ganondorf When Zelda woke up

]]>
My 20211644364800000https://naiwen.cc/post/my_2021https://naiwen.cc/post/my_2021Please note that this post is a bit pessimistic. It may affect your emotion. And most of things I have written below are lack of fact.

They should be regarded as personal feeling.

Work keep burning out

I am failed again to get a good work-life balance. I still need to stay in the office longer than 8 hours every day.

It does sound sad, but if I want to make as much money as possible and keep my resume glossy, working for a big tech company in China is my best option.

So yes, I changed my job from a small company to a big company which is quite famous. Before I am able to work for the so-called big company, it has been my goal for a long time. Anyway, I finally overcame some mental obstacles. Working for big tech companies of China are not a goal anymore.

But, after I start working in the company, I soon realize the problem of burning out is worse than before. People get to the office very late and also leave very late. Because you can't leave early while other guys are still in the office and might have something needing you to help for.Seems the only way to break this is everyone changes their clock to come and leave earlier.

Anxiety about the future

Speaking of job alternatives, I always think about where my future is.

Everyone around me always talks about money, cars, marriage. People who have children would also talk about education, however, it's always considered as a financial issue in the end.

People start to hide their feeling and stop talking about themself. Without feeling expression, the relationship become fragile and fake. Everyone is lonely.

We are trapped by an anxious atmosphere. Every time I think about the future, I keep touching the anxiety. I think the anxiety may come for two reasons.

Firstly, the working time is too long. There is actually a labor law in China. Of course, China has! But I don't understand why it never protect the employee from burning out.

Programers still need to stay in the office until 9 pm or even 10 pm. Food delivery workers are even worst, they need to work until midnight. No one dares to fight back for the right of 8 hours working hours!

The second one is age discrimination. As employees are getting old, they are getting less and less popular in the job market. Many companies prefer to hire young people even old people don't demand more money.

Some companies have gone even further. They fired employees whose age is older than 35 with poor compensation or impose a rule that nobody over a specific age should be nominated as manager.

These two problem mentioned above actually cannot solve easily, it's a mixture of economic and political. Maybe there's a balance which is carefully kept by the government.

If the gov enforce the labour law, the market would shrink rapidly. If the gov does nothing, people just keep suffering.

The world is divide into two parts

When I want to know about something about China, there are always two versions of it. The first version is reported by the west media, such as NYT, The Guardian. Another version is reported by the government sponsored media in China. The difference is so huge that you couldn't tell which one is the truth!

The arguments between China and other countries also became more aggressive. What I can do just to ensure that information is coming from different sources, and try to figure out what is really happening.

But it's so hard to keep doing that. It costs you lots of reading just for a little fact. Anyway, I agree with Li Wenliang: A healthy society shouldn't have only one voice.

The two parts may be preparing to say goodbye to each other. I don't want the situation to go that way.

The first-year living in our new house

In December 2020, we finally moved into our lovely new house. It's a small apartment with two rooms. Although it's small, my girlfriend has tried her best to make sure every corners is being used.

We have a drying machine first time. It's amazing how quickly it could dry the clothes no matter what's the weather outside. Also, we have a dishwasher. There's no more quarrel about who should wash the dishes!

We also buy a Rinnai water heater which doesn't meet my expectation, for its noise is so loud that we have made two repair appointments. You can't help to think if there is something wrong with it.

Life in the new house is not peaceful. We have gone through some turbulence. But I'd be better to stop here, for it's quite personal.

On June 30th, 2021, my girlfriend became my wife!

Hopefully, I could love her a little bit more day by day.

Looking forward to 2022

It looks like that Covid pandemic would hopefully end in 2022, for some countries have decided to lift restrictions.

I wish I can go to several beautiful places for vocations, and get more healthy in work-life balance.

Also, I make a list of OKRs(it may change ).

Finally, I wish you also have a great year! Thanks for reading.

]]>
《饥饿的盛世》读后1643414400000https://naiwen.cc/post/_ji_e_de_sheng_shi_du_houhttps://naiwen.cc/post/_ji_e_de_sheng_shi_du_hou得知《饥饿的盛世》这本书,应该是看到网友分享的摘抄,大概在说:

吴英,是乾隆年前一个老秀才,六十多岁还没中举,一肚子的才华无处发挥,想出一个方法,自己去写关于当今国家的情况和相关政策的见解,送到乾隆面前,就被处死了,家人也受到了牵连。这是在乾隆时期,只能当一个顺民的缩影。

这本书也没有让人失望,它让人读得停不下来。其实这是我第一次认真了解,关于自己生活的土地上的历史。

说说感受最强烈的几个点。

盛世下的饥饿

本书开头,就先写了英国使团进入中华大地之后,见到的触目惊心的景象。 首先入目的,是遍布整个社会的饥饿。被安排伺候使团的人,抢着英国人不要的茶叶或者剩食。因为皇帝给了太多食物,英国人的船装不下了,把死掉的畜牧扔到河里,岸边的人会争相跳入水中打捞。由此可见当时民众的物质匮乏程度。

乾隆年间,外忧内患都被很好的解决,人民生活还算稳定,所以人口开始爆炸性的增长,但农业的技术却没有进步,人口压力越来越大。但这却只是原因之一。

权利的泛滥

使团也有另外一个惊讶的发现,矗立在地面的房子大约只有两种。一种是普通人的房子,常常是泥砖加草棚搭成,看起来贫困潦倒。另一种房子整齐大气,涂着油漆。使团的惊讶在于,这个世界似乎只有阶级的两端,贫困和富贵,没有中产。

有使团成员精辟的总结,这片土地上,只有统治者被统治者。这里的财富都靠权利夺取。

文字狱

乾隆是一位完美主义者,他的志向是当历史上最伟大的皇帝,在他统治下,江山要千秋万代的稳定。以过人的胆略、残暴的策略平定准噶尔之后,他的敌人慢慢变成了言论自由。

在文字狱大兴年间,全国上下的官员都被乾隆鞭策成审查机器,把全国上下翻了好几翻,人心惶惶,不敢多言,就怕不小心说错话,被别人举报,招来杀身之祸。

各种诸如宗教、讲学之类的聚众事件,都被禁止和打压。历史上数不清的珍贵书籍文献,凡是被乾隆定位策反忤逆的,都被焚毁。不仅是被缴回紫禁城英武殿前日夜焚烧,更是被每个人自我审查,私自焚毁。

戏曲是清朝非常受欢迎的表演形式,类似于今天的影视作品。乾隆是骨灰级爱好者,可以编写剧本和配乐。他创新的想到,戏曲能在群众中造成这么大的“精神危害”,那反过来,也可以利用戏曲传播“正确的思想”。于是,组织了一群学者,将知名戏曲里的忤逆之词,去其糟粕,补以“精华”。

渐渐的,戏曲都变成了,形式华丽大气,但内容空洞的无聊形式。千篇一律在歌颂盛世、歌颂皇帝、歌颂光明伟大正确。

乾隆晚年的堕落

如果把乾隆的智商和情商,移植到一个现代人身上,他肯定能成就一番事业。如果一个人可以极度自律,几十年如一日的早睡早起,控制饮食,精力旺盛的投入事业中,不可能不成功。

他的自律和完美主义,在仍处盛年时,把官僚系统打造成了高效的机器。高级官员都是实干家,极少贪腐,国家一度井井有条。

但到了老年,之前精力的过渡消耗,只会更快的显现出来。乾隆花钱越来越多,接受大臣上供越来越无限制。上供仍无法满足,和珅就发明了议罪银制度。大臣可以用钱来赎过自己犯下的过错。渐渐的,他变成了整个国家的吸血鬼。他吸一口,官僚阶层要从普通百姓身上吸十口。

鸦片战争的隐忧

乾隆晚期对待那次著名的英国使团访问,非常的看重。英国人也非常的看重。但双方的出发点完全不同。乾隆想向英国人展示大清国威,让他们顺从。英国人想揭开东方神秘国度的面纱,想看清它到底是强盛无比,或只是一片幻影。

但事实证明,乾隆越想证明大清国威,却只会越让英国人看到,大清的虚弱。说白了,是仍处于冷兵器的大清,和已进入热兵器时代的英国的一次碰面,是古代和现代的差距。

一路上,英国人在沟通、思想、礼仪上碰的壁,也让英国人越来越倾向于,只能推翻清政府的统治。另外一个非常非常重要的原因是,清政府的闭关锁国,让英国人无法打开中国的市场。中国可以卖给英国人大量茶叶,但英国人却卖不给中国人什么有效的货物,导致英国只能不停从世界各地开掘银矿,做成银子,送到中国去换取茶叶。

总结

单轮乾隆此人,绝对是一个及其厉害的任务,拥有超高智商和情商的同时,也拥有超强的体力和精力,更令人的惊叹的是,他还拥有超强的自律和自控能力。仿佛一台有自我意识的强劲发动机,高速运转的同时,还懂自我保养,把大清王朝推到了可以称为盛世的阶段。

但他终究只是一台专制王朝下的政治机器,一生只为贯彻完美的政治利益最大化。大清王朝在他的统治之下,虽然强盛一时,但最后还是变成了没有灵魂的巨大躯壳。在他之后,清王朝迅速跌落,因为这个民族的脊梁已经被打断了,官僚阶层变成钱权奴隶,普通百姓变成鱼肉和骡马。

但于此同时,西方世界却在快速发展,除了经济之外,更重要的是政治体制、法制精神、公民意识的发展。当西方的人们,已经可以无忧无虑的探索世界,思考问题,发表言论时;东方的劳苦大众,却仍在被专制鞭打,生命财产得不到最基本的保障。

其实很多现象,今日仍可见其身影,很多话语,仍不敢随便说出来。只好在朋友圈发了一句,乾隆时期掀起的波澜,可能今日仍未平息

]]>
可视化编辑工具开发回顾 part3 - 周边接入1591142400000https://naiwen.cc/post/ke_shi_hua_bian_ji_gong_ju_kai_fa_hui_gu_part3_zhou_bian_jie_ruhttps://naiwen.cc/post/ke_shi_hua_bian_ji_gong_ju_kai_fa_hui_gu_part3_zhou_bian_jie_ru有了编辑器还不够,最大的问题是,如何方便的接入组件到编辑器中去?

我们是基础部门,最终目的还是要让业务部门去接入组件。但好在让业务部门正式接入之前,我们需要开发一些基础的内置组件,如图片、视频这些。这让我们有机会从组件开发的角度去体会,怎样才能方便的开发组件。

基础能力封装

在开发组件的过程中,最烦恼的是还要去管以前需要管的事情,比如发送请求、请求客户端的 bridge 等。

从编辑器的角度来看,每个组件的能力都要管控,将其能力限制在一个隔离空间,让组件没办法在运行时一不小心就搞了一个大新闻。另外,尽量封装掉共通之处,使组件的基础行为统一起来,减少开发负担。

从编辑器的接入来看,需要提供统一的方式给组件接入和提供信息。比如一个组件接入编辑器,需要表明它的名字、分类,暴露出来的可编辑配置。

我们把这些需要提供的能力封装成了 SDK,组件开发的过程中所要用到,大部分都可以在这里面找到 ,它的大致结构如下:

Untitled-2020-05-22-1813

接入编辑器

这一部分其实在上面也有提及,sdk 对业务组件提供了类似叫 registe 的方法,由组件通过这个方法去传入自己的信息,大概长这个样子:

registe({
  category: [
    CATEGORY.FORM
  ],
  usage: {
    name: '组件例子',
    desc: '这个组件的用途介绍,
    thumbnail: 'foo.png' // 组件缩略图
  },
  componentName: 'your-component0name'
})

当组件加载下来的时候,编辑器就可以读到组件的信息,按照分类去显示,也会去显示 usage 里面的信息。

但其实这样做不是很好,组件的说明性信息不应该和代码混合在一起。只需要通过 componentName 把组件和说明信息连接到一起就好。说明性的信息可以另外在别的地方维护。

脚手架工具

为了可以快速开始开发组件,基于 create-react-app 自定义了自己的脚手架工具。只需要运行 npm run start 就可以看到组件在编辑器里面的预览效果。有点像这样子:

Untitled-2020-06-03-1329-2

组件发布和注册

开发好了组件就直接发布到内部的 npm,但是还要让编辑器知道要不要去使用这个组件,于是我们另外开发了一个后台,去注册组件。

编辑器启动的时候,会从后台的接口去拉取已经注册过的组件,得到所有的组件包名。

页面自动发布

所谓发布页面,其实只有两个步骤,构建和上传文件。为了达到目的,我们配套了一个 web 服务。当用户完成页面的编辑后,编辑器产出的代码只是初步的 vue single file component,还需要经过构建成最后的静态资源。

在这里有个值得注意的地方,为了节省每次 npm install 的时间,我们把所有页面打包需要用到的工具和资源都预装在配套的 web 服务里。比如服务启动的时候,就拉取目前所有的组件下来,这是一个一举两得的事情:

  1. 这些组件可以提供给编辑器使用。
  2. 组件可以提供给页面打包使用。

所以现在页面构建只需要通过 node 服务去 npm run build 即可。打包出来的资源,直接上传等待 CDN 回源。

但是这样的缺点也很明显,要拉取所有的组件下来,那如果组件成百上千个怎么办?随着接入的组件数量日渐增长,这是很有可能的。而且随着某个页面里面使用的组件增多,其构建时间也肯定变长。

有什么办法可以避免 npm install 组件和构建组件吗?

如果组件发布之后,就直接放到 CDN 了呢?有点像 unpkg.com 那样子。这样子组件发布上去之后,就可以在编辑器和生产环境的页面直接引入 JS 使用。既不用安装,也不用打包了!

最后

其实这不应该是最后,但是这暂时是目前我们的最后了。我们做到的也只是目前这个程度,回头去看,也只能算是无代码工具的玩具产品吧!相比现在火热的低代码和无代码平台,真的是没法比啊。

但眼下我们能优化的地方还有很多。既然已经涉及到了页面发布,那势必涉及到权限的问题。还有弹窗等『折叠的空间』如何进行拖拽操作?又或者能不能完善数据收集,做一个大盘出来,暂时每月的热门组件,和页面的发布次数冠军?

嗯,总之还有很多可以扩展。

]]>
可视化编辑工具开发回顾 part2 - 编辑器1584144000000https://naiwen.cc/post/ke_shi_hua_bian_ji_gong_ju_kai_fa_hui_gu_part2_bian_ji_qihttps://naiwen.cc/post/ke_shi_hua_bian_ji_gong_ju_kai_fa_hui_gu_part2_bian_ji_qi其实对于编辑器的构思是比配置更早的事情。因为在还没有开发过『可视化编辑』工具的时候,一想到这类工具就觉得很厉害。因为它可以脱离程序员,交给运营人员来操作,不停的生产页面。

所以编辑器该怎么做呢?再真正开始动手之前,我们毫无概念,好在找到了这些文章:

上篇文章说到一个页面的核心其实是一份配置,回顾一下配置的结构:

    {
    	"instance_id_1": {
    		"key": "instance_id_1",
    		"componentName": "",
    		"slots": { // 父子关系
    
    		}
    		"data": {
    			"propsData": {},
    			"style": {} 
    		}
    	},
    	"instance_id_2": {} // 另一个组件的结构
    }

这些配置应该如何修改呢?最简单的就是暴露一个输入框,让别人把 json 配置填进去了,直接放到配置上面的相应位置就可以了。哈哈,这当然是开玩笑,但却涉及到一个问题,我们该暴露什么样的交互让用户修改配置?

编辑插件

比如在 propsData 里面的属性,都是一些静态属性,颜色文案之类的。不同的字段类型对应不同的组件。比如:

  • 文案:输入框
  • 布尔值:switch 开关
  • 数字:滑杆
  • 颜色:拾色器

当用户选中一个组件,编辑器马上可以根据那个组件的 id,拿到相应的配置,映射成相应的可视编辑组件。大概长这个样子:

Xnip2020-03-14_18-22-33.png

图中的组件有这些属性暴露出来供编辑:

  • 最小高度 → 数字 → 滑杆
  • 背景颜色 → 颜色 → 拾色器

当用户进行一个编辑操作,数据流是这样的:

用户发生了交互,这些组件提交修改后的值,编辑器找到当前编辑的组件节点,把值修改到 propsData 下相应的字段。整个流程如下图:

excalidraw-2020314183129-2.png

但只有这些交互还不够,为了更适用于内部业务,还需要更多的编辑组件。比如上传图片。或者其他和业务强耦合的组件,比如搜索某个用户,获取其头像展示在页面上等。

从上图中可知道,不管用户发生了什么交互,编辑组件提交了什么值,到编辑器这里,都只是一个值,然后放到配置里面。也就是前面的交互是编辑组件范畴内的工作,编辑器只关心结果,也就是编辑组件提交给编辑器的那个值

它们的关系如此松散,这些编辑组件完全可以独立于编辑器之外,或者把它们叫成编辑插件更合适!

当然,除了接受编辑插件提交的修改值外,编辑器还要去渲染这些编辑插件。渲染的前提是,编辑器要认识这个编辑插件,之后才能根据不同的配置类型,渲染不同的插件。

在我们基于 vue.js 的实现里,给了每个插件一个 name 属性,大概长这个样子:plugin-type-string。编辑器可以根据最后的 string,知道这个插件是主管什么类型的字段的。

所以编辑器和编辑插件的关系是这样的:

excalidraw-2020314183129.png

渲染器

既然是可视化工具,编辑了配置之后,肯定要实时渲染。有了配置,其实这一步就容易了。但在这里需要考虑一个问题:渲染器是用 iframe?还是挂载在相同 dom 树?

一开始,我们把渲染器挂载 dom 树下面,这样有一个好处,是因为在同一个 dom 树下,做各种修改都很方便。

但后面遇到了 CSS 样式冲突之类的问题,或者组件里面有人搞了大新闻,一下子把整个 dom 树干掉之类的。

转到 iframe 之后这些问题都不存在了,因为是独立的环境了。但隔了一层又导致了其他问题,比如拖拽的处理之类的。好在这些问题都不难解决。

放到 iframe 里面还有一个额外的好处,就是渲染器的运行时框架和编辑器可以完全分离!

渲染器需要接受的只是编辑器传过来的页面的完整配置,而怎么渲染是渲染器的事情。只要能解析配置并渲染即可。

组件

编辑器里可以被用户编辑的单元叫做组件。组件的结构是这样的:

excalidraw-2020314183129-2 1.png

component logic 就是组件本身的逻辑,编辑器不 care 这一部分,只要别把搞大新闻就行。编辑插件那部分说的,组件的 propData 里面的字段会根据类型对应不同的编辑插件。但是编辑器又不智能,它没办法知道这个 prop 该对应什么编辑插件。

谁知道?当然是开发组件的人!组件的构成里,除了自身的逻辑,还有一份配置表。这个配置表就是把组件对外暴露的属性和编辑插件对应起来。

那结构图里面的自定义编辑插件是什么?如果组件的开发者找不到可以满足其需求的编辑插件怎么办?或者编辑插件的交互很复杂,涉及到业务的各种接口怎么办?

编辑器在读取一个组件的配置表时,如果发现某个属性对应的编辑器是 custom 的,并且附带了 editorComponent 字段,就会把这个 editorComponent 渲染出来。如前面所说的,编辑器并不管编辑插件里面如何运作,到最后把编辑的值提交上来就行。

编辑器

说了这么久,编辑器的职责到底是什么?目前所知:

  1. 对于编辑插件而言,它大概暴露了一些接口出来,供提交修改值。
  2. 对于组件而言,在组件被编辑的时候,它帮渲染编辑插件,并把修改维护到页面配置的相应节点上。
  3. 对于页面配置而言,编辑器就是它的容器或者加工厂,读取配置,然后修改配置,最后导出配置。
  4. 那对于用户而言呢?他们看到的编辑器是什么样子的?

如下图:

excalidraw-2020314183129 1.png

左边,是所有被加载进来的组件。

**中间,**是渲染器,用户可以从左边的组件列表,通过拖拽放到渲染器那里。渲染器同时也承担了画布的角色。

**右边,**是编辑插件。组件被选中后,其暴露出来的属性对应的编辑插件也显示了出来。用户在这里进行组件的某个属性的配置。

所以编辑器承担了:

  1. 组件的加载,及其编辑插件的渲染。
  2. 相应的组件属性的修改,和维护页面配置。
  3. 相应页面配置的变化,交给渲染器去实时渲染。

可以说,编辑器是一个整合者,围绕在它身边的是组件、编辑插件;它的内部是面向用户的拖拽交互、配置的维护。

最后

如前面所说,围绕在编辑器周边的组件和编辑插件。所以可视化工具并不是一个编辑器而言,还有这些围绕周边的组件和插件如何接入的问题。

因为笔者所在的业务属于基础业务,所以编辑器就是基础业务在维护。但更重要的是,要让其他的各业务部门有接入的动力。其他业务在这里就是围绕着编辑器的组件。

这关系就好像国际空间站和飞船一样。国际空间站需要有降落的位置,飞船才能来来往往。这也是下一篇要说的内容,会涉及到组件的开发环境、组件的维护和版本发布等。

]]>
可视化编辑工具开发回顾 part1 - 基本配置1582243200000https://naiwen.cc/post/ke_shi_hua_bian_ji_gong_ju_kai_fa_hui_gu_part1_ji_ben_pei_zhihttps://naiwen.cc/post/ke_shi_hua_bian_ji_gong_ju_kai_fa_hui_gu_part1_ji_ben_pei_zhi在公司内部的可视化页面编辑工具运行了挺久了,这么长的时间里,趁着开发的感悟仍在,又看到了这个工具在内部造成的影响,写下这一篇记录吧。

可能东西比较多,篇幅较长,那就分成一个部分一篇吧。这是第一篇,关于基本配置的。

配置结构

在没接触过这类工具之前,感觉很复杂,现在回头看,感觉剥皮抽骨之后,其中核心,其实是一份配置。图形界面上的所有操作,都是在编辑这份配置。最后产出的也是根据这份配置生成的代码。

虽然只是一份配置,其结构设计又是很重要,打好了基础,就可以走的更远。而现有的这份配置很简单,就是一份扁平的 key, value,key 是组件 id,value 就是组件的各种数据。为了直观,配置的格式可简化为这样:

{
	"instance_id_1": {
		"key": "instance_id_1",
		"componentName": "",
		"slots": { // 父子关系

		}
		"data": {
			"propsData": {},
			"style": {} 
		}
	},
	"instance_id_2": {} // 另一个组件的结构
}

需要说明的是**,目前我们的做法是以 vue 为基础,vue component 作为一个配置的节点,**所以上面的 instance_id_1 就是代表一个 vue component 的配置。

很容易看到, slots, propsData 这些关键词,代表着父子嵌套、属性传递这些功能。即一个页面其实是由各种 vue component 组成 ,他们会有嵌套、事件通信、属性传入。

嵌套

注意看上面的 slots 字段,这个字段到最后可能是这样的形态:

"slots": {
	"default": ["children_instance_key_1", "children_instance_key_2"],
	"footer": ["children_instance_key_3"]
}

在 vue.js 里有一个概念叫 Named Slot,所谓 slot 就是一个个插槽。这份配置的意思就是描述了在哪些插槽放置哪些子组件这个关系。这解决了嵌套问题。

属性传入

负责属性传入的是 **propsData,**propsData 下的属性多是静态属性,比如 margin-left,margin-right 之类的。这些属性最后都会固化到 vue 的模板上,大概长这个样子:

<MyComponent :marginLeft="30" :marginRight="40" />

事件通信

事件也是基于 propsData 去实现。在这次项目里的事件通信的范围是同一个页面里面的 component。只是简单的点对点、点对多点、多点对一点的触发和监听,比较简单的事件机制。

看一个例子,假设有 2 个 comp,如下:

<CompA key="comp_a" :listener="['comp_b']" />
<CompB key="comp_b" :trigger="['comp_a']" />

这三个组件传入了 listener 这个属性,在组件里,它们大概是这样写的:

// CompA
import { triggerEvent } from 'sdk'

export default {
	mounted () {
		triggerEvent("a_event_type", this.listener, {msg: 'hello'})
	}
}

// CompB
import { onEvent } from 'sdk'

export default {
	mounted () {
		onEvent("a_event_type", this, function (data) {
			console.log(data.msg) // => hello
		})
	}
}

这里的代码示例出现了 **sdk,**它是用于开发组件的一套工具库,这个后面再说。

从示例来看,用户通过图形界面去标记哪些组件该监听哪个组件的事件,编辑器会把关系记录下来。等组件的逻辑在 runtime 运行起来时,通过传入属性值到 triggerEvent 里,就能知道事件触发的目标是哪些组件了。

在监听事件的时候,onEvent 传入 this,即传入 vue 的组件实例,这样事件触发时,也能知道自己该不该接收到这个事件了。

总结来说,sdk 内部维护一份映射关系,统一管理事件的监听和触发。

但这样的缺点也很明显,接收者不知道自己将会接收到什么样的 data,不知道是 string 还是 number,如果是 object,也不知道结构是怎样的。目前的做法是,在开发组件时,只处理本组件需要的数据,如果数据类型和结构不符合,忽略就好。

最后

配置是扁平的,但是里面的 slots 记录了父子关系,到最后生成代码的时候,扁平的配置会变成嵌套的 vue component html 模板。

propsData 里的数据,也会写到每个 vue component 的 上面。

除了属性,propsData 还承担了 event 触发者和监听者的记录功能。除了在 propsData 里记录,sdk 里面也会维护一份映射,并统一管理事件的触发和监听。

至此,这份配置的功能是什么,以及如何据其得出一个页面的,大致流程就是这样了。

可是用户该以何种交互方式来修改这些配置?sdk 这个开发工具库里需要提供什么,才能更方便的开发组件?前者涉及到状态的管理和交互的开发,后者涉及到了可视化工具的组件接入。这些都是后面继续要去讨论的。

]]>
科比 R.I.P1580083200000https://naiwen.cc/post/ke_bi_riphttps://naiwen.cc/post/ke_bi_rip今天一早看掉这个消息,不敢相信是真的。看到 Twitter 上面各路明星都在缅怀科比,仍然觉得不真实。中央电视台也播了科比的消息,还是感觉不真实,仿佛处于另外一个平行世界。

或者是心里在拒绝承认这个事实,就算此刻我敲下这行字,也仍然觉得不真实。今天看到 NBA 官方在 YouTube 上面放出来了一些片段,每一场球的开始,双方都不攻,站在那里等待 24 秒违例,以此怀念科比。看到很多年轻的球员都双眼红通通的走进球场。

科比的影响力真的这么大吗?在我看来,就真的有这么大。因为只有他,能象征着『**只要努力刻苦,就会成为厉害的人』**这件事情。只有他,能让我有这种感觉。

所以一个象征,一个努力的人,一个一路熟知的人,为什么要这么不幸?这种现实的冲突和不公真的让人很难受。

本来还有很多事情在等着他,比如今年的名人堂,比如他最寄篮球希望的二女儿的未来……

R.I.P

]]>
我的 2019 年1579996800000https://naiwen.cc/post/wo_de_2019_nianhttps://naiwen.cc/post/wo_de_2019_nian时间真快,一转来到了 2020 年,仿佛和《New Boy》里唱的一样:

是的我看见到处是阳光

快乐在城市上空飘扬

新世界来得象梦一样

让我暖洋洋

一个新时代真的来临了吗?

去年目标回顾

去年说过要少花不该花的钱,特别是在各种数码产品上。除了买了一个二手的 Bose QC 30,和若干 Switch 打折太厉害的游戏,其余一点数码产品都没买!

可惜没有拿到驾驶证,年底赶项目,没时间去练科目三。但是目标也完成了一大半了,因为科目二已经过了。

多攒了一些钱,每个月按时打钱给家里领导,自己就留生活费用。因为没买其他乱七八糟的东西,所以今年攒钱算是成功啦。

坚持跑步?这个倒没有。下好了 Keep,准备学一下跑前拉伸的,后来就没打开过 Keep 了……每次下完班都已经八点多了,身上充满了『下班已经很晚了,不想再动』的糟糕感觉。明明试过几次下班很晚了也去跑,跑完感觉也不错,但仍无法缓解不想动的感觉。

阅读

今年读了 18 本书。本来去年的目标是读 20 本,还差一点。但渐渐觉得纠结数量并没有意义。匆匆读过,很容易就忘记了,不知道能不能留下些什么。

It doesn’t have to be crazy at work

就算没读这本书,也略有耳闻国外的程序员的下班时间会早于国内很多。

可是到底是为什么呢?这本书可能会带来一些有用得信息。

还有一些职场观念的问题,10x 程序员真的很好吗?也许不,工业时代以来生产效率提高了很多很多倍,资本家真的满足了吗?欲望是永无止境的,所以努力工作,更高效的产出真的很好吗?也许没有那么好。

邻人之妻

让我知道了开放性关系社区的存在。在里面可以自由的选择性伴侣,没有道德和伦理的束缚。里面有很多婚姻不幸福的人,也有很多婚姻幸福的人。

所以婚姻到底什么才是支柱?我越来越觉得是夫妻二人的友情和各自处理事情的能力更重要些了。

悉达多

听说黑塞很久了,但它的那本《荒原狼》没能看下去,知道又薄又出名的《悉达多》后,就拿来看了。

和《爱的艺术》类似,当一个人学会爱其他的人甚至物,他也就能脱离自然而又能独立于世,也就是作为人类最大的问题「孤独」,就消失了。

这又和最近在看的《依恋与亲密关系》的观点类似。大自然留给人类克服孤独的只有爱,而爱的牢固程度在于两个人之间的感情联结。

其他的还有乱七八糟的书,但比较印象深刻的就是这三本了。

旅游

今年去了两个国家,印尼和日本。

印尼 - 美那多

四月份随公司去了一趟印尼美那多。

第二天醒来,看到窗外的蓝色海洋心情还是很激动的!

第一次看到这么清澈蓝色的大海和火山。以及第一次看到异国的生活,印尼的人都很诚实,有信仰的人都会很诚实。买水果从来不会骗称。

那里的山竹太便宜了,两三块钱一斤。那里的美那多榴莲也很便宜,才五六块一斤。

深潜的教练人也很好,带我下去的时候,偷偷摸了水草和海龟!我真的摸到了海龟!然后看着它慢悠悠的朝深海游去,直到视野之外。

Xnip2020-04-26_23-46-15

在火山口表演的当地人。

Xnip2020-04-26_23-46-51

潜水结束,返回酒店。

日本 - 大阪/京都/奈良

女朋友一直吵着去旅游,然后就定了中秋去日本。

第一次日本,就是自由行。感受到日本不愧为发达国家,每个人都过得非常体面。从年轻人到老年人,都有在化妆品店试妆的。他们应该觉得这是非常习以为常的事情了。

后面就是去到京都岚山脚下,会经过一片居民区。不知道是不是我们走的路不对,没有碰到国人,一路上只有骑车经过的外国人,或者出门的本地人。非常惊叹于这里的美丽,每家每户的小院都打扮得如此精致,各具特色。配合一尘不染的马路,静谧的环境和万里无云的天空,觉得这里太美好了,这里的居民太幸福了。

再往上走就是京都比较出名的岚山景区了,各种寺庙分布在山上。这些寺庙我倒没有太深的印象。但是路过一个很冷门的寺庙的时候,有一家三口骑车自行车路过。那个时候很安静,只有我和女朋友两个人在路上走着。只见有个小孩用日语很萌的咿咿呀呀的问着他爸爸什么,他爸爸总是很耐心的回应他。配合着那时候的风景,再次觉得这里的生活太美好了。

可惜这一次时间太短了,整个游玩的时间只有五天,一天还贡献给女朋友买化妆品 🤪。京都是一个要慢悠悠的逛才好玩的地方,可惜没有这么多时间。实在可惜。

Xnip2020-04-26_23-41-13

奈良,若草山顶的小鹿。

Xnip2020-04-26_23-44-21

岚山某寺的枫树下。

工作

去年说过大量的工作时间贡献给了面试。今年情况缓解了,面试官多了好几个人,我不用再这么辛苦了。但是公司内部的业务调整,2018 年下半年去到了基础组,今年是第一个一整年都在基础组的年份,其中过程,并不顺利。

工作方向的迷茫

这种迷茫感来自于基础组离业务太远了,这让工作的方向不确定。业务组有自己的业务方向,基础组却没有,基础只能根据业务组的方向总结出自己的方向

但紧接着如何验证自己的方向是否有价值,又是另外一个不确定性。能非常明显的感觉到自己的视野不够宽广,只能在效率上面,就着内部已有的问题去开发一些类库和工具。这种工作相当于『贴地飞行』,也就是贴着业务方来做。

解决了方向的问题,又会有另外一个问题,业务方为什么用基础提供的东西呢?GitHub 上面大把开源的,凭什么用你的呢?相对于社区,最大的优势就是熟悉自己的内部情况了。

这给根据业务定制化开源工具留下了空间,这片空间也是目前基础组的竞争力所在了。因为重复造轮子的成本太高,何不直接站在巨人的肩膀上呢?

Web 前端技术分层困难

Web 前端在公司内部的角色是脱离业务主线的,App 仍然是核心的前端,Web 前端更像是锦上添花,更多是开发常驻的内嵌页面和活动页面。

长期的内嵌页面更新很少,大量的开发工作在活动页面。但是活动页面的问题在于每次的页面都是重新设计,布局样式都不一样。上游的设计无法形成规范化,下游也难以形成组件库。也就是基础组无法形成一层基础层区支撑业务。

这也造成了上面方向迷茫的原因之一吧。

最后的成果

业务开发上难以形成基础层,只能贴近业务开发一些工具:

  • 活动页面拖拽工具,基于 vue.js 开发,运营和产品也可以自己生产和发布活动页面了。
  • 前端发布平台,解决前端发布就是上传一下静态资源,没有发布版本历史的问题。顺便还做了前端的配置中心,可以把静态的文案和媒体文件扔上去。

还有其他的,比如脚手架工具、后台界面配置工具。但是上面两个我贡献代码最多了。

但是问题仍然存在,渐渐的容易看到的事情都做完了,必须去开辟新的未知的领域了。

其他

当然还有其他各种各样的体验。

我终于慢慢的确信自己只是一个普通人了,感觉到一些可能性正在缓缓的关闭,但自己却又无力阻止。

我慢慢相信爱其实是存在于两个人之间的,就算感情很不好的夫妻之间,这份爱都可能会复燃。只是很多人之间的沟通本身就有问题,而且不自知。我能缓缓的感受到身边的父母之间的沟通节奏和规律。但是觉察自己身上的就比较难,比如我和女朋友之间的沟通,就时不时出问题,情绪一上来了,理性就被压制了。任重道远。

也开始怀疑某些歌颂和胜利、宏大的叙事、不求回报的艰苦奋斗。

最后

2019 年到底是怎样的一年呢?我也不知道,也许人类用来分隔时间的单位对我来说逐渐机械了,更愿意相信时间一直在流动,世界和自己都一直在变化。

所以,一个新时代并没有来临。

]]>
《It Doesn’t Have To Be Crazy At Work》读后1565136000000https://naiwen.cc/post/it_doesnt_have_to_be_crazy_at_work_du_houhttps://naiwen.cc/post/it_doesnt_have_to_be_crazy_at_work_du_hou

是 BaseCamp 的 CTO 和 CEO 合作写的书。

整本书提到的最多的就是 Calm,很多内容都在讲公司和工作上如何做才能更冷静。从一个中国程序员的角度来看,BaseCamp 这种强调冷静的文化,真是求而不得的理想世界。

下面就说说我比较感兴趣的几个点吧。

安静连贯的专注时间

现在的职场有了很多款即时沟通工具,而且大多数人(包括看这本书之前的我)都认为在通讯工具上问别人事情,立马得到回复是理所当然的事情。

但是这个其实不实际的,如果被问的人每次都是立马回复,意味着时间就被切得零零碎碎。大脑很难胜任多线程的任务,一旦专注力被打断,想切回来是很费力的。

BaseCamp 里的每个人都会有自己的专属咨询时间。比如可以用下午四五点这段效率不高的时间专门回答别人的问题。如果大家都能接受这个前提,没有得到即时回复,在心里也能理解吧。

扁平化座位安排

不知何时互联网公司开始流行所谓的扁平化,也就是所有人都有一张大桌子,无论 CEO 还是普通员工都只有相同的办公条件待遇。

不幸的是我厂也是这种扁平化座位安排,导致很多讨论都是就地讨论,非常的吵,走到我们的办公区来看,应该百分之六七十的人都带着耳机吧。

BaseCamp 针对这个问题执行图书馆条例。把整个办公区当成是图书馆,在里面的人都自觉保持安静。那讨论的时候怎么办呢?他们在办公区中央建了一个透明玻璃的隔音会议室,要讨论都去里面好了。

这一条我觉得太难了,首先我厂已经完全丧失了这个基因,我自己有时候也没有意识到自己的讨论会影响旁边的人,其他人的情况和我差不多。

不要在周末上线

不要在周末上线,如果下周一感觉也不好,也不要上线。那什么时候上线?自己感觉很 Calm 的时候再上线。这种 Calm 是怎么得来的呢?我想应该是走完了完备的流程之后,得到的确认结果吧。首先就不能急,也不能赶。

如果非常赶非常急,那可能就要连续上十二天班了。即周五上线,周末加班修 bug,然后第二周又上五天班,一共十二天。

在很急的压力下,人会非常焦虑和紧张,这个时候效率反而会低,工期会场,导致加班,遂陷入继续很急的死循环。

招聘的新角度

一般招人就是一轮轮的面试,面试中就是回答问题和手写程序之类的。这意味着面试者和面试官都要抽出时间。我体会过那种虽然下午只有一场面试,但导致下午连贯时间被切碎的滋味。如果有两场面试,基本整个下午就 over 了。

BaseCamp 的角度比较新颖,他们会派给面试者一个真实的项目,限定时间,并且付给面试者临时薪水。面试者完成工作后,再让面试官来评估最终的完成程度。

这是一个异步的过程,面试者和面试官都不需要受制于面试时间,面试者能充分发挥自己能力的同时,面试官也有充足的时间去评估。

Work Life Balance 不是耻辱

不知从何时,我心里开始觉得不拼命的完成尽量多的工作就不是好员工。这意味着要在公司呆尽量多的时间,像一台不知疲倦的机器,每天精准高效。

我也被同事问过,现在走会不会太早?大家甚至会互相开玩笑,这么早下班?看来工作不饱和哦?

但追求 Work Life Balance 就不是好员工吗?是何时开始,这种早点走的压力无形中弥漫开来的呢?又何时开始,尽量多的产出才是正确的呢?

结语

BaseCamp 是一家在我看来简直是世外桃源一般的存在。工作就是工作,生活就是生活,同事才不是一家人,更不是刘强东说的兄弟,我们就是聚在一起开发产品而已。

]]>
记 2017 款 MBP 扬声器维修史1548547200000https://naiwen.cc/post/ji_2017_kuan_mbp_yang_sheng_qi_wei_xiu_shihttps://naiwen.cc/post/ji_2017_kuan_mbp_yang_sheng_qi_wei_xiu_shi2018 年 4 月购入 MBP 2017 款 15 寸。

2018 年 6 月 18 日晚上,电脑就在桌面上摆着,也没放声音,突然左边扬声器发生尖锐的啪啪爆裂声,持续了 10 秒有余。吓得我赶紧凑近看看有没有冒烟,确认机器是否还能操作。一个星期之后,送去修,同时在网上查到很多相似案例。心里祈祷,修了这一次,别再来第二次了吧。

2018 年 9 月中旬,下班回家,电脑刚从书包拿出来,掀开屏幕,就开始啪啪啪……屏幕都还没亮呢。拖到国庆放假,10 月 1 日赶紧送去天才吧修。

2018 年 10 月上旬,没错,就是上旬,距离上次修完还没隔两个星期,扬声器再次啪啪啪。送去修的时候和工作人员说能不能直接换新。工作人员说这才第三次不行,等再坏一次就可以了。

2019年 1 月底,这次扬声器坚持了两个多月,搞得我有点紧张,因为距离一年保修期就剩两个月了,如果再坏就麻烦了。但是就在春节放假前不久,扬声器终于坏了。为什么说「终于」,因为我是很高兴的,终于可以换新的了。

选了一个周末,杀到天才吧,态度强硬的要求换新,工作人员也不多说什么,直接说帮申请了。但是让我把在用的机器带回家去,说等待申请的时间可能比较久,你先用着。

等待申请的时间最后为 10 天,天才吧就打电话过来说换新的电脑到货了,抽时间过来拿,嘱咐要尽量带齐现在电脑的所有配件,有的都带上。

换机现场

到真正换机的时候,工作人员其实只回收了电脑本机和电源适配器,保修凭证都没拿。最后给我的也只是电脑本机和电源适配器,盒子和保修凭证都没给我。

临走时,和工作人员确认了,新电脑的保修期会重新算。至此,差不多折腾了一年了,电脑也终于换掉了。对了,最后苹果给我的是一台 2018 年款同等配置的机器。不得不说,苹果这种处理方式还是很良心的,我也很开心,算是免费升级了。

希望新电脑别出问题了。

]]>
通过伪 SSR 降低白屏时间1547251200000https://naiwen.cc/post/tong_guo_wei_ssr_jiang_di_bai_ping_shi_jianhttps://naiwen.cc/post/tong_guo_wei_ssr_jiang_di_bai_ping_shi_jian

参考了美团白屏优化思路,通过直接输出页面静态 HTML,达到降低白屏时间的目的。

公司的前后端分离方式是通过在 nginx 那里分流 client 静态资源和 web 服务接口实现的。

这种方式的优点很明显,http api 和前端开发互不干扰,有了文档就可以两头并行开发。

缺点也明显,web 服务完全不管 view 这一层了,所有页面都是 CSR 渲染模式。输出的 html 文档大概都长这个样子:

<head>
    <meta charset="utf-8" />
    <link rel="manifest" href="/static/vod_h5_ceremony_snapshot/manifest.json" />
    <title>React App</title>
    <link href="/main.6d8bc2c7.chunk.css" rel="stylesheet" />
</head>
<body>
    <div id="root"></div>
    <script src="vendor.js"></script>
    <script src="common.js"></script>
    <script src="app.js"></script>
</body>

虽然通过懒加载,可以缩短头部 CSS 和 JS 的加载解析时间,但是在 app.js 成功被执行之前,页面都是白屏一片。

那么能不能在 <div id="root"></div> 中间塞进去一些东西以降低白屏带来的不适呢?

比如弹出 loading 菊花、显示页面占位轮廓。**既然都能塞菊花和占位图,为什么不能拉线上渲染好的 html 结构塞进去呢?**这就是开头提到的美团提供的思路了。

预渲染的基本流程

首先我们需要有线上可访问的页面,然后把 html 结构拿下来。但如果页面没上线怎么办?这时可以退一步想,渲染一个线上的 html 文档需要什么条件?其实就是两个:

  1. 线上的数据,即线上的接口。
  2. 线上的 JS 逻辑。
  3. 读取 html 文档的客户端。

关于第一点,一个页面如果要上线了,那线上的接口必然已经准备好。在本地搭建一个服务,把接口代理到线上去即可。

第二点,可以就着构建好的静态资源启动一个静态服务器,等待预渲染的客户端来获取。

第三点,那要通过什么工具去获取静态服务器的 html 文档呢?最好的选择应该就是 headless Chrome 了。Google 已经有了一个很好的封装,叫 Puppteer。

其实第一点和第二点完全可以放在同一个 web 服务去实现,第三点就直接使用 Puppteer。

整个流程其实已经比较清晰,大概如下:

  1. 构建项目的静态资源到某个目录,比如是 dist 目录。
  2. 启动 web 服务,静态资源的请求就响应 dist 目录里面的资源,api 的请求直接代理到线上。
  3. 启动 Puppteer,根据路由配置依次请求各路径,获取 html 文档保存。

Puppteer 的处理

上面第三点其实很粗略,Puppteer 的逻辑里还有很多不明了的问题:

  1. 路由配置从哪里获取?
  2. 获取的 html 文档要怎么保存?
  3. 直接把获取来的 html 文档保存是否会有问题?要做额外处理吗?

路由配置

为了读取路由配置,我们的做法是约束路由配置的写法。因为 react-router 的路由可以写得散步各处,所以必须要求把所有路由都声明式的写在一个文件里。

加上所有路由的配置其实都长得差不多:

const routes = [
  {
    path: "/sandwiches",
    component: Sandwiches
  },
  {
    path: "/tacos",
    component: Tacos,
    routes: [
      {
        path: "/tacos/bus",
        component: Bus
      },
      {
        path: "/tacos/cart",
        component: Cart
      }
    ]
  }
]

很容易通过正则匹配解析出来。

HTML 文档保存位置

文章开头说的,我厂的前后端分离方式导致了 web 服务完全不管 view 层了。为了用户直接打开某个路由的时候,能返回预渲染好的 html 文档,单页面应用的路由模式必须要改为 history 的。

**但是在没有 web 服务的情况下,怎么做到 history 模式呢?**突然想到了 hexo 之类的静态站点生成工具的做法。比如我写了一篇日期为 2019-01-01,题目为 test 的文章。

hexo 的做法是帮我生成了这样的目录:

2019
└── 01
    └── 01
        └── test
            └── index.html

最后这篇文章的访问路径就是:/2019/01/01/test/ 。同理,单页面应用里每个路由也可以生成这样的目录,预渲染的模板就放在最里层的目录里,比如:/foo/bar 路由,那就可以生成:

foo
└── bar
    └── index.html        

HTML 文档的保存内容

一开始我也没多想,直接抓取线上的 HTML 保存就完事了。后来跑了一下 Lighthouse,发现首屏渲染时间反而比没有优化的时候变长了。

这时才醒悟,其实很多项目都会用到按需加载。按正常流程构建出来的文档可能只会链入必须要加载的 JS。但是等到线上的文档完全渲染好了之后,按需加载的 JS 的 script 标签 也会出现在 DOM 树里了。

直接抓下来,就导致了异步加载的 JS 也变成同步加载的了。还有 CSS 也同理。所以head 标签和 body 尾部 script 标签,只取构建产出的,而不是线上的。

除此之余还发现另外一个问题。那些内容很多很长的页面,就只是 html 的体积也相当可观,有的有个几百 KB。真的有必要把所有内容都抓取下来吗?其实这些预填的内容只是起到过渡的掉过而已,性质就类似于菊花和骨架图。

我们的做法是以最长屏幕的设备为准,只取第一屏的 html 文本

所以一个路由的预渲染模板最后的内容由 3 部分组成:

构建产出的 head
     +
  第一屏 html
     +
构建产出的 script

最后把整个 dist 目录丢到 CDN 上,第一次路由的请求就会直接到某个预渲染的模板了,之后的路由变换就由前端来接管了。

缺点

想法虽然美好,但是却有不少问题。

最明显的就是,路由只能是静态的,动态路由是没办法创建目录和保存模板的。

还有就是模板闪烁的问题,比如现在预渲染的是网易云音乐上七里香这首歌的信息详情。之后不管是发如雪,还是青花瓷,用户都会先看到七里香闪烁一下。当然后面还附带着浪费流量这件事情,用户看到七里香,那意味着七里香的专辑封面之类的静态资源已经加载过了,但是它其实不需要的。

可能的最终形态

这个方案还在继续探索中,有一天还和同事开玩笑,这玩意儿的最终形态大概就是一个自动骨架图工具吧…

20190426 补充

项目经过一段时间的停止,最近又开始开发。方向也最终确定到「自动骨架图工具」上面,调研到了饿了么的这个 Webpack 插件:page-skeleton-webpack-plugin

它的思路是在本文的基础上做了「自动化骨架生成」这一步。

概括来说是获取到了页面渲染完毕的 html 之后,注入一段 JS 和 CSS 到 puppteer 页面中,这段 JS 会操作 DOM,把各种节点转为骨架图结构,再把这个骨架图结构导出,存到项目目录。

最后构建目录的时候,把骨架图结构结构插入到 html 模板中,得出最终 html 文件。

可是自动生成的骨架效果不保证绝对适合,怎么办?这个插件还提供了骨架预览功能和骨架代码编辑能力。如果对骨架图不满意,自己编辑骨架代码就是了。

综合来说,就是提供了自动生成骨架的能力,也保留手动修正的余地,这个思路很好。

]]>
我的 2018 年1546300800000https://naiwen.cc/post/wo_de_2018_nianhttps://naiwen.cc/post/wo_de_2018_nian装备

今年花了不少钱去买东西,现在的装备有:

  • Nintendo Switch
  • Macbook Pro 15 inch 2017
  • iPhone XR

其中最满意的是 Switch,带来了太多快乐了。那种随时随地拿出来玩的感觉很爽,不再有以前 PS4 每次都要等开机的苦恼。

MBP 2017 则一般般吧。4 月份女朋友说想换一台电脑,和她一起在京东上看来看去,好一点的 Windows 笔记本也不便宜。如果想将就买一台便宜的,却又重又厚的,长得也不好看,加上刚好有高中同学在澳门读书,索性就把一直在身边的 2013 Late 的 MBP 给女朋友来用了,我就咬咬牙买了一台 MBP 15寸。

虽说 MBP 2018 后来到了八月份才推出,但是仍然悔恨自己为什么要 49 年入国军。但既来之则安之,这台电脑也陪伴了我八个月了,都挺好的。

再就是 iPhone XR,双十一看到苏宁直接降价 900 元,手持用了三年多的老 iPhone 6 实在是不淡定。买了之后发现拼多多才是最狠的,降了一千一。不过微微心痛之余也并不后悔,最让我满意的就是续航功能,终于有那种一天都不用担心没电的踏实感了。

粗边框带来的感觉就像是屏幕上发现了一个坏点吧。注意到的时候会皱一下眉头:如果没这个缺点该多好。这是唯一不满的地方了。

其实后面还买了 Dyson v8 Fluffy,家里两只猫毛太多了,搞得我终日在幻想如果能有一台 Dyson,吸一下,整个世界都清净了多好。但用下来发现现实没那么美好,那些粘在衣服上的毛、鞋子上的毛、飘在空中的毛、缝隙深处的毛……仍然无可奈何。不过看到哪里脏了,拿过去吸一下就好了,比拿扫把去扫轻松多了。

游戏

今天记忆中 PS4 就没开过机吧。所有的游戏都是在 Switch 上面玩,偶尔陪女朋友玩一下王者荣耀。

  • 塞尔达 - 荒野之息
  • 空洞骑士

如果两个游戏非要选一个最爱的话,我会选择「空洞骑士」。这个游戏让我重新找回了以前玩超级玛丽和魂斗罗那种跳跳跳,不停闪躲的乐趣。每一块子地图又是不同的世界,风景不同,配乐不同,怪物绝大多数也不同。而且里面的对话似乎一直在串联着一条故事线,但是隐藏太深了,只知道是某种可怕的东西被打开了,酿成了灾祸,但那到底是什么东西?为什么要去打开?现在我打到的进度还无法得知。

现在在 Switch 上玩空洞骑士的时间已经到 65 小时了,整个游戏散发出来的孤独、萧条、冰冷、恐怖的混合气息仍然很容易让我沉浸下去。

但是这个游戏的缺点也很明显,初期入门曲线之陡峭令人发指。好友丛爷就和我说,我连那个扛着一根木棍的大虫子都打不过。

大虫子就是刚进入游戏地图不远处的一个小 boss,初期武器和血量都很弱,只能经过多次死亡之后摸到节奏,逃亡间抓住时机砍一刀,慢慢把 boss 耗死。

但其实并不需要打这个大虫子,还有另外的路可以走,但是找路又是一番折磨,熬不过前期这些煎熬很容易就想放弃了。这游戏才刚开始啊,你就给我来这个?

我觉得这个和《血源》的开头有的一拼了,尤记得赤手空拳是打那头堵在门口的饿狼,结果一次次被咬死的恐惧……

阅读

《亲爱的安德烈》- 龙应台

最后关于孩子独立成长的部分,让我震撼了。我突然意识到,从小缺乏的是什么?是那种宽松自由的氛围啊。可以说,在安德烈的对面,我窥见了一个所谓好学生的身影。

遵守纪律、被压制的自我表达、脆弱的自尊。

野火集 - 龙应台

有了多党制就有了民主吗?才发现其实民主的基础是群众,群众有了独立各异的精神才会有好的基础。

所以中国人为什么这么怕事?为什么这么自卑?

北方的空地 - 杨柳松

讲述了作者独自一人推着自行车,用了 77 天,穿过一片两千多公里的新疆无人大荒地的故事,

作者在刚开始深入荒地时提到,走到这里而已,如果想回头就还能回头。但是如果走到中间了呢?回头可能是死,前进也是死,怎么办?可是越深入,作者在想的都是怎么继续往前多一点了。

荒地里的熊、狼、阵阵狂风、暴风雪、自行车爆胎等等各种困难,最让抓心口的描写是手指被割了一个很深的伤口,作者惊醒第一件事是看看手指还在不在……

这才真的是一场心灵洗礼,没有强大的心理,肯定早早绝望了。

习惯的力量 - [美] 查尔斯 · 杜希格

看这本书让我想起了一门 MOOC 课程,叫《Learning how to learn》,记不太清了,大概也讲到了僵尸的这个问题。所谓僵尸,就是我们进入了一个无意识行为的状态。比如出门锁门,有时间走到楼下在猛然一想,我到底锁门没有,对锁门这个行为的记忆完全空白。在做锁门的行为的时候,我们就进入了僵尸模式。

读了《习惯的力量》才知道,大脑里最原始的脑组织在负责习惯相关的行为。里面有个例子,是说一个脑损伤的人,记忆功能尽失,但是却还能找到回家的路。如果你问那个人,你是怎么回到家的?他自己也说不知道。这就是深层的脑组织在发挥习惯的力量。

这本书的后记值得一看,整本书都讲了很多理论上的事情,后记却有不少实际的建议。

其他读的书还有:

《暗时间》、《南极》、《局外人》、《Grokking Algorithm》、《非暴力沟通》、《活出生命的意义》、《红拂夜奔》、《神们自己》、《绝代双骄》、《1984》

工作

今年重度参与到了招聘的工作当中。招聘真的是一件非常耗费精力的事情。我比较容易被影响节奏。下午一个四个小时工作时间中途插了一个小时面试,那之前的半个小时和面试后的半个小时是没法工作的。

为了提高对面试的认识,听了两个知乎的 Live,《如何做好面试官》前端们,贺老 Live 面试你了!。第一个 Live 很实用,据此我列了一版面试礼仪规范,比如和面试者呈 90 度落座之类的细节都让我眼前一亮。

最后自己的主观感受其实是很重要的,一个人技术好,但是聊下来就是不舒服,让人觉得头顶着一朵乌云。另外一个让人能感受到对生活的热爱,但是技术没那么好,你倾向于哪个呢?我会倾向于选择后面的那个人。

也发现了具备产品思维的重要性。接到一个需求,如果它就是一个需求,而不去了解与之相关的,更全局性的信息,那它就相当于富士康的一个流水线一般,只管做好这一部分就完了。但是到最后,整台 iPhone 成品后的质量和你没太大关系,也不知道一个 iPhone 的其他部件是干嘛的。

或许你会有一个疑问,我知道其他部件干嘛呢?我的感受是,这些长期局部性的重复的工作,会慢慢腐蚀对一件事情的热情和好奇。当我们在流水线上如此机械的装配数年配件之后,我们就真的越来越难对整部 iPhone 的构成失去兴趣了。

还有就是,了解全局性的东西也会反助于做好装配自己领域配件的这件事情。

身体

今年下半年懒惰了起来,但是反而胖了十斤。继而发现自己的投篮突然准了。

上半年的时候带球都是浮着的,头球也是飘着的。所以对于篮球进入了正循环,感觉大学时候的热情就回来了。

2019 年目标

  • 希望能读 20 本书,并且都在好读书笔记。
  • 多学一门语言,接触一个新的领域。
  • 拿到驾驶证。
  • 多攒一点钱。
  • 压制数码产品占有欲,不必要的东西不要再买。
  • 坚持跑步。
]]>
《如何面对亲密关系的困境和冲突》知乎 Live 记录1520812800000https://naiwen.cc/post/_ru_he_mian_dui_qin_mi_guan_xi_de_kun_jing_he_chong_tu_zhi_hu_live_ji_luhttps://naiwen.cc/post/_ru_he_mian_dui_qin_mi_guan_xi_de_kun_jing_he_chong_tu_zhi_hu_live_ji_lu

这是听了知乎 Live 《如何面对亲密关系的困境和冲突》 的笔记整理。

内容表达的背后是关系

每一句话的沟通,其实都包含两个层面的内容,第一层是内容层面的,第二层是关系层面的。

举个例子,如果吵架了说『分手就分手,谁怕谁!』。内容层面就好像表达出来的一样,表达的是自己不惧怕和你分手。而关系层面则是,你伤害了,那我也要伤害你。

所以,当接受到伴侣说过来的话时,特别是伤害性的话语,如果就着内容的含义去理解,会容易被蒙蔽。但如果基于当前的关系去理解表达的内容,就会知道她到底在想什么。

如上面的例子,『分手就分手,谁怕谁!』,她觉得自己被你伤害了,然后想反过来伤害你。所以这时要想想自己为什么伤害她了,她现在被伤害了的心情会是怎样的。

关系层面无法直接表达

我理解的是,关系层面的东西更多是脑海里的考虑和理解。直接表达出来的样子可能和真是语境格格不入,甚至导致对方一脸懵逼。所以应该试图用内容层面的方式把自己的感受表达出来。但这种表达应该是以『我们』为角度,要看到的是我们一起做了什么事情。这种沟通以我们完成什么,到底发生了什么为目的的沟通,叫做元沟通

但是有时候,关系就好像绷紧的弦一样,根本无法跳出来,进入元沟通的情境。这时候我们需要理解两种关系类型,以及它们相互之间的联系。

关系类型及其联系

对称型沟通

上面的『分手就分手,谁怕谁!』的对话就是一种对称型沟通。此时,两人在关系里面的位置的平等的。这种位置平等时发生的沟通叫对称型沟通

要注意的是,这里用了 『此时』 这个词。对称型沟通也好,或者其他类型沟通也好,并不是一种对人格或者对沟通的定性。也就是说沟通类型因为沟通的不同表现是会切换的。并无好坏之分。缺点是,这种沟通有可能会引发更激烈的从同等位置发出的回应。用上面的例子来说,有可能回应的就是『那分啊,现在就分!』。也就是说,这种你来我往的平等沟通可能会导致军备竞赛一般的愈演愈烈,最后一发不可收拾。

互补型沟通

那如果女生说出了上面那句『分就分啊,谁怕谁!』之后,男生立马认怂,陪着笑怂着头接连道歉说,『宝贝我错了,真的错了』,那刚才的愈演愈烈的僵局就被打破了。此时的沟通里,女生处于高位置,男生处于低位置。一个表达情绪,一个接受并消化情绪。甚至极端的说,一个施虐,一个受虐。这种关系就是互补型的。

缺点是,一个施虐一个受虐,会让双方都可能在这段关系里丧失掉自己存在的价值_(原文原话忘了,这只是自己的理解)_。

两种关系之间的联系

首先有个很重要的观点,单纯处于一种关系里面是不健康的,能在两种关系中来回切换才是健康的

譬如说,有一对夫妻,男方经常对女方家暴,而女方只是默默忍受。过了很多年之后,女方终于无法忍受,决定起来反抗。在那一刻,互补型关系变成了对称型关系。

又拿上面的例子,女生说『分手就分手,谁怕谁!』,男生说,『宝贝我错了』。此刻,从对称型转为了互补型。但如果下次男生生气了,说出了这句话,女生如果也能说『宝宝我错了』。又再次切换。这样关系僵局就得以解决。

所以能在两种关系之间来回切换,才是健康的状态。

但说起来容易,做起来却需要勇气。就拿家暴那个例子来说。决定起来反抗,却下了很长时间的决心。切换时会害怕当前位置的失去。比如平等切互补,会害怕以后都变成弱势一方;互补切平等,会觉得自己没法平等。

但其实,除去很不健康的关系,状态是会切换的,位置也可以改变,就好像上面说的,这不是永远的,而只是那次沟通里面的双方的位置。

能理解在困境时的沟通关系之后,如何进行元沟通?

元沟通

首先明确主语:我们。沟通的目的是为了知道我们一起做了什么事情。

研究表明,亲密关系里,每个人都会觉得自己是受委屈的一方。但亲密关系里面其实无法证明对错。所以更有意义的是讨论,我们做了什么。

打破僵局

理解了关系,但不代表困境就消失了。有时候我们需要打破僵局。Live 里面说了三种方法:

  • 使用不同语言:比如平时聊天用方言,严肃起来之后,就用普通话。
  • 使用信号:比如约定好无论吵什么架,都必须今天睡觉之前吵完,明天就不能再计较。
  • 中间人信号:找绝对中立的人_(不能和任一方结盟),由他去尝试理解你们背后的感受,引导进行沟通。(通常心理咨询师是好的选择)_

然后 Live 里面貌似没有提及到底如何进行元沟通。可能这又是一个很大的话题吧。但是尝试改变现在的沟通关系类型,然后基于关系去考虑伴侣表达内容背后的感受,总是不会错的。

]]>
docker 的 nodejs 开发环境折腾记录1507303823000https://naiwen.cc/post/docker_de_nodejs_kai_fa_huan_jing_zhe_teng_ji_luhttps://naiwen.cc/post/docker_de_nodejs_kai_fa_huan_jing_zhe_teng_ji_lu目的
  • db 和 redis 都跑在容器里,避免在本地直接安装。
  • 前端和 nodejs 代码编译也跑在容器里。

Docker 入门

参考文章: https://docker-curriculum.com/ 官方文档

Docker Compose

docker compose 是把多个 docker 管理起来的工具。包括统一启动、关闭、打印输出、标注依赖等。通过 docker-compose.yaml 文件配置。

参考文章: Using Docker Compose for NodeJS Development 官方文档

对于本文想达到的目的来看,需要:

  • webpack 的 container。
  • nodemon 和 babel 的 container。
  • mysql 的 container。
  • redis 的 container。

docker-compose.yaml 直接贴出来,可能一下子看不懂,有点被吓到了,但别急,我们慢慢来解释。

version: '3'
services:
  web:
    image: "dev-node"
    command: ["npm", "run", "dev"]
    ports:
      - "5858:5858"
      - "3000:3000"
    volumes:
      - /Users/xxx/xxx/nodeapp:/app
      - node_modules:/app/node_modules
    depends_on:
      - fe
      - db
      - redis
  fe:
    image: "dev-fe"
    command: ["npm", "run", "dev:fe"]
    volumes:
      - /Users/xxx/xxx/nodeapp:/app
      - node_modules:/app/node_modules
  redis:
    image: "redis:alpine"
    ports:
      - "6379:6379"
  db:
    image: "db"
    environment:
      MYSQL_USER: test
      MYSQL_PASSWORD: test1234
      MYSQL_ROOT_PASSWORD: test1234
    ports: 
      - "3306:3306"
volumes:
  node_modules:
    external:
      name: node_modules

version 就是使用第 3 版本配置文件格式的意思,这个忽略吧,不重要。

再看其他最外层的字段,首先看 volumes,这个字段定义了要用到的 docker volumes。上面的配置就定义了一个叫 node_modules 的 volume,通过 volume 下的 external 设置它外接一个已有的叫 node_modules 的 volume。可以把 volume 看作移动硬盘,以后的 node 模块都会安装到里面,安装了之后,就可以即插即用了。

另外一个重要的字段是 services。在这个字段的下一级,定义了四个字段,看字面意思应该都知道其作用。值得注意的是 volumesdepends_on 字段。

volumes 字段的值是上上段文字里提到的最外层的 volumes 下定义好的 node_modules/Users/xxx/xxx/nodeapp:/app。后者是直接把本机目录映射成容器里面的一个目录,可以达到在容器里直接访问代码目录的效果。

depends_on 是把这一切串联起来的关键,标注好依赖后,只要运行 docker-compose up 就可以把 web 以及其依赖容器 fe, db, redis 一起启动起来。

这个但是如何互相访问这些串联在一起的容器呢?这已经被 docker-compose 考虑得很周到。docker 会给上面的 service 名字设置 host。比如,上面的配置有一个 service 叫 db,里面运行的是 mysql,那就可以这样访问:mysql://db:3306

参考:Networking in Compose

vscode debug

node 程序跑在 docker 里面之后,只能用 attach 的方式去 debug 了。配置如下:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "attach",
            "name": "Attach",
            "address": "localhost",
            "localRoot": "${workspaceRoot}/src/app",
            "remoteRoot": "/app/src/app",
            "sourceMaps": true,
            "restart": true,
            "port": 5858
        }
    ]
}

启动 node 程序的 npm script 里面这样写:

nodemon --watch ./src/app --delay 1.5 ./src/app --exec babel-node --inspect=0.0.0.0:5858 --out-dir ./dist/app

注意 --insepect 参数的值 0.0.0.0:5858,必须是 0.0.0.0 加上端口,原因位置,也许和容器以及宿主的网络连接方式有关。

参考:这个 GitHub Issue

最后

容器如何划分的思路来源于慕课网的这篇利用Docker容器搭建高效的Node.js开发环境

总结来说,前端构建、node 代码检测编译和重启、db、redis 分别在四个不同的容器。之间的链接都走 docker-compose 自动配置的 host。debug 就走 attach 模式。

]]>
《最好的告别》读后感1494892800000https://naiwen.cc/post/_zui_hao_de_gao_bie_du_hou_ganhttps://naiwen.cc/post/_zui_hao_de_gao_bie_du_hou_gan

本文为草记,大多凭记忆写下,难免遗漏。还是推荐去阅读《最好的告别》

身体机能下降的标志

摔倒

因为身体机能的下降,会慢慢出现摔倒的危险。而且每次摔倒的伤害都很严重,几乎摔倒一次,身体状况就可见性的下降一次。

老人面临的危险

来源于独居或者独自行动时,身体机能下降导致的危险。

摔倒,导致受伤。 记忆衰退,导致忘了关煤气等,甚至走失。 身体衰退,驾车发生意外。

老人何处去

因为老人安置场所或者方式的名称太多,以下名称不必在意,但需在意概念的不同

老人院

对老人进行统一管理,统一穿衣服、吃饭、关灯睡觉、起床、活动。环境恶劣,没有私人空间,只保证老人的基本生存,但却是没有尊严的个人价值的生存。老人会觉得痛苦,被抛弃。

老人社区

环境更好,有自己的小房间,但是同样是以老人的安全为重,逼迫老人放弃已有的习惯,服从命令。私人空间被侵入,个人被监控,管理者只为了让老人的子女满意,不以老人为本,导致老人自我价值缺失。

老人辅助社区

环境也许会更好,会有自己的私人空间,充分老人自身,努力让老人在新的地方保持自己的小世界。

唤醒老人的生活意义

在一个死气沉沉的传统老人院里,一个医生决定发起一场改革。引进了两只狗四只猫一百只鸟。让老人负责照顾,并要报告情况。任务感让老人的生活开始唤起的意义感。意义感一洗老人院死气沉沉的模样,老人双眼开始变得有神,精神也开始变好。

直接的结果是,呼叫救护车次数、服用各种药物、医药费用都降低了。

老人生活社区

在辅助社区的基础上,按照性别和性格,阻止数个老人住在一个社区里,拥有自己的世界的同时,还形成了社区。管理者弱化了医生和监护的身份,更像是老人的生活伙伴。

老人的生活价值

追求超出自身的理由,并献身于此。如果只停留在满足于自身生存,就会被各种本能欲望牵着走,剩下的只是折磨。

不惧怕死亡的唯一方式,就是知道自己属于更多团体的一部分,这个团体可以是国家、社区、家庭。

要以最好的状态活到最长的那一刻

医生的类型

  • 家长型:帮患者看病,帮患者作出选择。有 A 药,B 药,不会告诉患者太多,只会告诉患者你用 A 药就行,那个对你好。没有去关心患者的担忧和真正需求。
  • 咨询型:列举 A 药、B 药、C 药……仅扮演提供资料的角色,选择会让患者自己作出。但患者往往不是医生,根本无法通过这些『资料』知道作出的选择对自己的真实意义。
  • 伙伴型_(原文叫解释型)_:耐心交流,引导或者协助患者弄清除自己的真实需求,根据患者的真实需求作出选择。虽然是治病,但是为的是让患者更好的生活。

现代医学治疗的问题

默认选项,已经变成了一直治疗。而不是帮助患者更好的生活。 预估过于乐观,脱离患者真实需求,对于现代医学太过乐观自信,导致最后和患者真实需求背道而驰的结果。 害怕做得太少,医生会害怕做得太少,导致犯错误。但因此而做得太多,有时候却是错的。 明确责任,不是为了治愈患者,而是为了帮助患者更好的生活。

故事的结尾

姑息治疗

帮助患者走过最后一程,尽量减少痛苦,实现最后想做的事情。

结尾很重要

纵然故事很长,但是故事时间线上突出的几个点才会被大脑记忆记录下来。这就是为什么如果自己喜爱的球队正常表现很好,但是到最后崩盘败北,会让观众觉得一切都搞砸了,包括前面表现很好的时候。

有一个平静安宁的结尾,对在死亡赛道上的主人公很重要,那是他一生的故事的突出点,最后的结尾。

对守候在其身旁的家人很重要,那也是他们一生中的故事的突出点。

]]>
GDG Google IO 2016 Redux 感受1468108800000https://naiwen.cc/post/gdg_google_io_2016_redux_gan_shouhttps://naiwen.cc/post/gdg_google_io_2016_redux_gan_shou今天第一次去参加 GDG 的分享会,也就是谷歌开发者社区广州分社区吧。这次主要是 4 位嘉宾分享在 Google IO 举办期间的见闻和参会感想。

1

第一位嘉宾是 CashLee,之前有听说过他的名字,好像是在 Qcon 的网站上看过他写的一篇文章,然后在 V2EX 上也见过他的回帖,再好像是在知乎上也见过踪迹 —— 圈子真不算大啊……

他分享内容里印象最深的有:

  1. WWDC 的参会者中居然有不少六七十岁的老程序员,而且仍然保持着旺盛的创造欲。其中有个例子就是,有个老伯想利用 iPhone 的前后摄像头把 iPhone 变成一台全景相机。起因就是老伯的孙子特别喜欢看他拍的照片,然后做出来后只需要转动一圈手机就能得到一张全景图发给孙子看了…
  2. 硅谷那边的人想做一个东西,大多出发点都是 **1)**这个东西做出来好不好玩;**2)**这个东西做出来能不能帮到人。多么简单啊。

2

第二位嘉宾是做 UC 浏览器 UI 方面的开发者。分享了一些关于安卓上面 UI 和交互的新技术。其实听不太懂,毕竟没搞过安卓。但听到他用了挺大的边幅去说 UI 方面的 Vector Drawing 的新特性中的 SVG 性能问题,我就问了个问题:这方面的技术演进是否是受到了设计趋势的影响?比如说 Google 的 Material Design 和 iOS 的扁平化设计。

但其实我问的原因是想知道具体受到了设计多大的影响。然后得到的回答是有两方面因素促使了 SVG 技术开始被用到安卓上:

  1. 设计趋势,SVG 很适合单色或者简单图形,所以在图片上有很广的应用场景。而最大优势是不用再去根据屏幕尺寸匹配不同的 Bitmap 图片。
  2. 硬件水平提高,SVG 的解析其实是很耗性能的,但是硬件水平提高能弥补这一点。

这让我想到 Web 端其实应该和安卓也一样,设计趋势和浏览器性能提高,也会导致 SVG 越来越多的被用到。比如,图标、动画等。可以预见这是一个趋势。

3

第三位嘉宾是做 UC 浏览器内核的。他分享的大多是属于浏览器底层的东西,吐槽了 Chromium 的性能以及 Google 的浏览器团队多么不了解第三世界国家的网络情况之类的。听起来很让人爽快和流畅,估计是一位内力很深厚的大牛,要不然怎么这么挥洒自如啊,好像能有说不完的内容。其中他提到 UC 在东南亚和印度的占有率已经到了百分之六十以上,这让我很吃惊,也有点暗暗佩服。原来只是自己很少用 UC 浏览器所以不了解情况而已,UC 已经在海外有了这么厉害的成绩。

他说的两点比较让我兴奋:

  1. JavaScript 和 Native 的融合:前不久阿里发布的 Weex 框架已经使用了一些他们的技术,然后 UC 内部也在慢慢的补充相应的原生 UI 组件。一直有人在讨论这两者的优劣,但现在已经开始出现融合之势。估计这已经成为一条主要的发展道路。
  2. 内核开发者和 Web 前端开发者的关系转变:内核开发者会更着眼于前端开发者的反馈和应用场景,把前端开发者当客户看待。然后还说在 UC 内部还拉了前端和内核开发者的交流群,这氛围听起来真不错。

4

第四位嘉宾是来自微信团队的大数据开发者。说的内容比较散乱。但总之就是为了告诉我们,AI 不是一个可怕的怪物,它在突然火然后被大众熟知之前,其实已经被广泛应用到很多领域。比如说内容阅读的个性化推荐等等……其实并不能说服我,我总觉得连 Bill Gates 和 Musk 都说要警惕沉睡的恶魔的东西肯定不会那么的简单。

最后

还因为提了问题获得了15年的 Google Cardboard,点赞!回家就迫不及待的试了一下,虽然配戴起来不是很舒服,但初次体验 VR 感觉的我真的被那种沉浸感震住了。好期待那些真正的 VR 是一种什么体验!

]]>