使用 Obsidian 的 CSS 代码片段优化你的 Obsidian 体验

obsidian

我最在研究使用 Obsidian,期间更换了不少的主题,但都不尽如人意,主要的原因便是行高度。大部分主题的行高都是面向英文设计,对于中文场景下的方块字,会使得整个页面的拥挤度极大, 非常容易让你感受到挤压感。

因此,我决定使用 Obsidian 自带的 CSS 代码片段功能来优化我的体验。CSS 代码片段可以在你自己的存储库内存储一些 CSS 样式,并生效在你的 Obsidian 当中,从而为你带来优化界面的可能。

打开 Obsidian 设置,进入「外观」—「CSS 代码片段」,可以看到这里的配置。默认情况下,是没有任何配置的。你可以点击右上角的打开目录的 Icon ,进入到 CSS 存储目录,创建对应的 CSS 文件。创建完成后,回到 Obsidian 中启用这个 CSS 就可以达成你的效果了。

d2b5ca33bd970f64a6301fa75ae2eb22 6

实务

以我自己为例,这是我使用的 Obuntu 主题的默认行高,看起来不算特别差,但总感觉行与行之间的距离太近,让人略感压抑。

d2b5ca33bd970f64a6301fa75ae2eb22 5
摘录

于是,我便在刚刚说的 CSS Snippet 文件夹下新建了一个 line-height.css 文件,并在其中添加如下代码,并在设置中生效。

// 以下代码仅用作演示
*{
  line-height: 2 !important;
}
Code language: JavaScript (javascript)

Obsidian 的 UI 中的文字就会变得更易于查看了,这样就达成了我的目标。不过,我上面写的 CSS 非常的粗糙,是对所有的文字都进行了修改(包括那些本来不应该修改的),所以在真实场景下使用,还是需要自行 Debug 来进行修改。

d2b5ca33bd970f64a6301fa75ae2eb22 8

参考

2022 年 10 月月度总结

summary

Objective 1:持续获取现金流,并构建未来收益的现金牛

KR1:投资收益达到 20000 元

10 月份略有波动,但整体来说,收益不达预期。感觉需要搞更多的现金进入到投资当中,才能符合预期。

KR2 :单篇稿费突破 6000 元

无变化

KR3 :达成年度预算,支出不超预算

没啥变化,封控…疫情…大概率超预算,但应该还好。

KR4 :构建软件类现金牛业务,预期产生收益 10000 元人民币

暂无进展

Objective 2:提升生活基础设施,构建未来生活好基础

KR1:前往 6 个城市旅行

天津疫情封控。难。

KR2:进行 20 次文娱活动

没有进行啥文娱活动。不过报名了美国 AHA 协会的培训,考了个 CPR 的证书。以后万一在街上碰到了心脏骤停的人,可以帮忙施救了。

KR3:借助智能化设备,缩减在家务相关事务上耗费的时间

购买了小米音箱,把之前众筹的小米自动窗帘设备配置起来了。可以实现每天自动开关窗帘了!挺好。

Objective 3 :开拓视野,打造多元行业人才

KR1:写 15 篇书评

暂无进展

KR2:输出关于 API 的 Newsletter 12 封

10月写了两封,完整的目录见:竹白

KR3 :完成计划中的三本图书的写作

暂无进展。

树莓派镜像烧录后无法使用 SSH 的问题 Debug

9e6a931fa940bc97a9753cbfa3f2a954

最近开始玩树莓派,使用官方的树莓派镜像烧录器烧录了一个镜像到系统中。

但烧录成功后发现却无法通过 SSH 登录。但我记得自己明明是在配置时设置了「开启 SSH 服务」。

d2b5ca33bd970f64a6301fa75ae2eb22 1

经过网上搜索发现,原来这个配置并没有什么卵用。你配置完成后,需要在 TF 卡的根目录创建一个 ssh 文件夹,来开启 SSH 功能。

d2b5ca33bd970f64a6301fa75ae2eb22 4

“宗族化”与“城市化”

people standing on shore during golden hour

和堂弟相对长期的生活了一段时间后,我对于城市里的孩子和村里出来的孩子又有了新的认识 — 边界感不同。

在我看来,这种边界感的不同,是来自于各自生长的环境:

  • 城市化:城市里的孩子们往往是散居、各自独立的生活状态。家庭成员只有自己、爸爸和妈妈。周围虽然也有邻居,但往往只会在外面玩,游玩结束后,各回各家,各找各妈。
  • 宗族化:村里的孩子们由于历史的原因,经常会出现一个村子里很多户之间都有一定的宗亲关系。各家孩子可能会一起到一个孩子家里玩,甚至是吃住在这个孩子家中。

这种城市化和宗族化的差异,致使城里的孩子会更加的明确「你」和「我」的边界,「我」会维护好自己的边界,尽量不进入到「你」的边界中。这种边界感,在城市这种陌生人社会当中,如鱼得水。

而村里的孩子在村里的时候,并不会有特别强的这种边界感,初次到城市当中生活时,会更容易碰壁,并因此碰壁之后缩小到一个更小的边界范围。在这个边界范围里,继续自己没有边界感的状态。

城市化不一定是好事,因为其中隐含了「我不完全信任你」的含义;宗族化也不一定是好事,因为在默认社会下,不加选择的信任,会导致我们受到欺骗。

在我看来,一个孩子需要接受城市化的教育,也需要接受宗族化的生活,这样才能在保护好自己的前提下,尽可能多的向外释放善意,开放自己。

为什么国内的大公司普遍在北京设立分部

red and white temple under blue sky during daytime

最近在研究美国的互联网公司的时候,发现一个很有意思的事情,美国的互联网公司并不会像国内的互联网公司这样,扎堆在首府开设分部。举个例子来说,你会发现,白宫所在地并没有什么大型的企业。

如果进一步研究的话,你会发现,欧洲的很多互联网企业/软件公司也是分布在全国各个地方的。

这是一个很有意思的区别:为什么中国的互联网公司,甚至是各行各业的公司都要在北京设立分部?

我自己猜测的一个原因是中国的这种体制决定的。

中国是社会主义国家,在政治和管理方面,政府会有较强的管控的欲望和权力。这导致一个行业的兴衰可能不仅仅是看市场,还要看政府的政策(教培行业就是个例子)。在这种情况下,对于风险更加敏感的大公司自然会在北京安排相应分部,以便于 GR 团队(Government Relationship)和政府相关部门沟通,以便了解政府相关安排和动态,提前规避可能的风险。

而海外虽然政府也有影响,但远达不到中国这种程度,所以企业可以分部的更加的均匀,不需要在首府呆着。

这种模式下带来的,是中国的一线城市和三四线城市的两极分化极为严重。一线城市繁荣无比,三四线城市则萧条无比。

想了想,感觉无解。

有耐心,但做事要快

woman in black jacket sitting on chair

今年的年景不好,堂弟虽然学习了半年的前端,掌握了一些基本的前端开发能力,但依然找不到一个工作。这非常的合理,毕竟他之前没怎么学过研发,如果自学很快就能找到工作,让那些科班的同学们如何自处。

但作为求职的人来说,也必须明白,在当下这个环境下,要做到有耐心,但做事要快

有耐心,是指要明确在当前的这个大的背景下,求职并不容易,甚至可以说是非常难。环境不好的情况下,刚毕业的学生是最不容易找到工作的。毕竟作为企业,都希望招募到熟手来加快企业的节奏。在这样的大的背景下,找工作必定是一个漫长的事情。

做事要快,是指虽然在这个大的环境下,求职不容易,但我们需要明确我们做事的方法和手段,尽可能快的获取到反馈,帮助自己更快的识别问题、纠正问题,从而更早的抵达目的地。

这两者并不冲突,同时,也很难。

做让事发生的人

toddler looking at believe in yourself graffiti

在工作和生活中,我们可以选择成为「让事发生」的人,而不是「等事发生」的人。

举个例子来说,假设你需要建造一个猫窝,在资源充足的情况下,你可能马上就可以自己造一个猫窝(或者是买一个猫窝)。但现实情况下可能并不允许你马上就能造一个猫窝。

这个时候,你有两种选择:

  1. 让事发生:你可以选择先查询一下建造一个猫窝需要什么样的物料,并从现在开始,当手头的资源充足的时候,就先去购买对应的物料。直到你凑齐物料之后,再建造一个完整的猫窝。
  2. 等事发生:你可以选择先什么都不做,等待时机成熟之时,自然便有了资源来购买猫窝。

这两种选择最大的区别是「让事发生」的人投入了自己的精力和时间让事情有了发生的可能。而后者则是等待时机的成熟,被动地等待事情发生。但事情往往不能遂人愿,时机可能永远都等不到。

为了让你希望的事情发生,试着变成一个「让事发生」的人吧。

目标指引你成功

selective focus photography of an arrow

每一个人都需要一个目标,来帮助你抵达彼岸。不过可惜的是,我们的教育很少教育大家关于目标、关于理想、关于人生价值的内容。这可能是我们的教育的问题。

不过,如果你看到这篇文章,说明你至少不是一个那么普通的人 —— 这年头看独立博客的人已经不多了。

目标存在的意义并不是和很多人想象中那样的无用。每当我和别人提起,“你是否有理想?”、“你找到你的人生母题是什么了么”,大家常常会说:“我的理想就是不用上班”。

但这只是一阶回答,不上班只是表象。那么你不上班之后要做的事情,才是你的理想 —— 它可能是宅在家里打游戏(只要你能一直打下去)、也可能是周游列国,也可能是做你想做的事情。

它是什么并不重要,重要的是,你必须想清楚你的目标(至少是想清楚当下的目标),有了这个目标,你便可以在做出选择的时候,基于你的目标进行纠偏,从多个选择中,找到那个离你的目标更近的选项。

d2b5ca33bd970f64a6301fa75ae2eb22 3

有没有目标,你都有可能抵达/无法抵达终点。但有了目标,可以让你抵达终点的速度变得更快一些。

bundle audit 命令失效怎么办?

MacBook Pro on brown wooden table

我最近在使用 Github 来做 Rails 的 CI 自动检查时,发现 CI 自动检查时使用的 bundle audit 命令失效了,搜索后发现,是 Bundle 将 audit 拆为了单独的 gem ,而 CI 的模板并未更新,导致在调用的时候出现了错误。

d2b5ca33bd970f64a6301fa75ae2eb22 1

既然明确了问题,解决就变得简单了。只需要在 CI 的脚本当中,加入对应的 gem 安装命令,即可完成修复。

  - name: Install bundle audit
        run: gem install bundler-audit

通过 Code Snippet 提升效率

black flat screen computer monitor

在开发应用的时候,我们常常会借助快速生成工具来帮助我们生成一些模板代码。

相比于 JS,Ruby 干脆让很多需要手动输入的地方可以不用输入,体验会更好。Rails 更是做到了极致,大量的约定。对于一些模板化的行为,你甚至可以不用写代码,框架帮你来解析。

常见的编辑器比如 VSCode、Sublime Text 都提供了大量基于插件的 Code Snippets,方便你可以快速生成一段模板代码。

不过在实际开发过程中,他们提供的模板代码可能并不太符合我们的需求,我们往往可能会有一些定制化的需求需要满足,这个时候,就比较依赖自定义模板了。

好在各种编辑器不止可以通过插件来定义 Code Snippet,你还可以自定义自己需要的 Code Snippet。

以 VSCode 为例,你可以参考其官方文档来定义自己需要的 Code Snippet,只需要简单的配置,就可以定义出你自己所需要的 Code Snippet。它可以是你自己写代码时的 Code Snippet,也可以是你在写博客时的 Code Snippet(比如写博客时自动生成前置的描述信息)。

不过,Code Snippet 的语法很多时候比较麻烦,需要一行一个字符串,对于较为复杂的 Code Snippet,构建这个 Code Snippet 本身就比较麻烦。好在有一些第三方工具,可以帮助简化这个过程。比如 Snippet Generator 就可以非常方便的帮助生成 VSCode 的语法,你只需要将需要生成模板的代码粘贴在左侧,并填写一些基本信息,就可以生成包括 VSCode、Sublime、Atom 的 Code snippet 代码,再将其粘贴到你的 VSCode 的配置中即可。

d2b5ca33bd970f64a6301fa75ae2eb22
Snippet Generator

你还可以将其中的一部分内容替换为对应编辑器所提供的占位符,就可以帮助你更加高效的利用这个 Snippet 来完成内容的快速撰写。

其他

如何用 SSH Config 来优化你的 SSH 连接?

text

在 Windows 的时候,我一度非常喜欢使用诸如 XShell 之类的软件,主要原因是我可以将不同的服务器信息保持在同一个软件当中,不用每次都手动保存(Putty往往就无法保存)。

而到了 macOS 之后,我不再使用 XShell 这样的软件来完成我的 SSH 工作流(事实上我也找不到类似 XShell 的软件,后来在 Setapp 软件包中发现了 Core Shell,但我已经有了下面的技巧了,就没再用)。

经过一番研究,我发现对于我的诉求来说,其实完全没必要使用一款第三方软件来完成,SSH 自带的功能即可完成。

再次 Review 一下我的诉求:

  1. 我希望不要输入 IP 地址,而是输入一个短语,或者是域名来连接我的服务器。
  2. 我希望能够支持自定义端口,因为我一般会把我的服务器端口从 22 改为一个随机的数字。
  3. 我希望可以指定密钥文件,因为我有多个密钥,不通的场景可能使用不同的密钥。

这些诉求如今我的新方法都可以实现。

SSH 支持自定义 Config 文件,而默认的 Config 文件位于 ~/.ssh/config 这个文件中,你可以在其中添加自己的配置来实现自定义 SSH。

比如这里用到的就是 SSH Config 中的 Host 定义,你可以以如下的规则来定义一个新的配置。

Host 主机名
    User 登录用的用户名
    HostName 登录用的主机名,可以是域名或者IP
    Port 登录用的端口号
    IdentityFile 需要使用的密钥文件

比如下图就是一个配置的例子

d2b5ca33bd970f64a6301fa75ae2eb22 3

通过在你的 Config 文件当中添加对应的定义,你就可以用 ssh 主机名 的方式来连接你的服务器了。

比如,我的树莓派的配置的主机名是 pi 那我就可以使用 ssh pi 的方式来连接到我的树莓派当中。

d2b5ca33bd970f64a6301fa75ae2eb22 5

稀缺、抗压与升职加薪

shallow focus photography of man in suit jacket's back

用发展的眼光看待自己的工作和生活当中,我提到,不少人总是在用静态的眼光看待自己。这些人不只使用静态的眼光看待自己,也一直在使用一个相对更加低阶的身份定位来锚定自己。

很多人没有意识到,你的薪资其实和两个部分有关:

  1. 你所掌握的技能在市场上的稀缺程度。
  2. 你所能承担的责任和担负的压力。

大部分秉承着「拿钱办事」心态的人,都在这两个点上做的不够好,一方面没有自己独特的技能点和生态位,导致在市场发生剧烈波动时,很容易因为没有任何特色而发生替换。另一方面,由于心态是「拿钱办事」,自然不愿意去承担更大的压力和责任。

而对于公司来说,一个极其标准化,没有任何稀缺性的产品,自然是不会给你升职加薪的;而这个产品如果也不愿意承担责任和压力,那我是真的想象不到有什么理由来为这样的一个产品支付更高的费用。

如果你发现自己很久没有升职加薪,不妨回过头来看看,自己是否满足了升职加薪的基本条件?

用发展的眼光看待自己的工作和生活

Several white arrows pointing upwards on a wooden wall

我在生活中遇到不少对于工作理解较为简单和质朴的人 —— 他们奉行工作就是给多少钱办多少事,不愿意去做分外之事。当然,严格意义来说,这样并没有错。毕竟,我们不应该鼓励他人去当卷王。

但我想说另外一个观点:工作当中,薪酬当然重要;但更重要的是你投入了你的时间和生命来为这件事付出。如果从这个视角来看,你应该从你所做的事情中收获更多的价值,这些价值不应该只是金钱。

尝试用发展的眼光去看待我们的工作和生活,你就会发现,工作不仅仅是你当下的价值,也同样代表着你未来的可能性。你可以通过工作来提升自己的技能,你可以通过工作来为自己拓展可能性。

你必须意识到,人的一生是一个无限游戏,在无限游戏中,你需要不断的闯关。并没有一个明确的关卡是你已经完成了所有的事情,生活也好,工作也罢,总是会有更多的问题和挑战来袭。你需要在这个无限游戏中不断的提升自己、不断的让自己变得更强,才能不断的坦然面对来自工作和生活的挑战。

大部分将工作看作「拿钱办事」的人,往往是秉承着「我就是一个静态的人」的心态来看,即使他内心并不这样看,但确实做着这样的选择。但生活并不是静态的,你面临的问题也不是静态的,你唯一要做和唯一能做的,便是用发展的眼光看待问题,正视自己在做的每一件事,并通过每一件事提升自己。

在油猴脚本中实现新增按钮和按钮的点击效果

text

在油猴脚本中,有些时候,我们需要在界面当中添加一个新的按钮。这个时候我们可以使用 document.getElementById("id").innerHTML=xxx 来指定某个元素中的内容是特定的 HTML,从而实现添加一个新的按钮。

但在这个按钮上绑定事件则不是通过简单的指定 button 的 onclick 来完成的。核心原因是默认情况下,你在油猴脚本中所写的函数只运行在油猴脚本中的 Scope ,而 button 则是运行在 Document 的 Scope 下。直接绑定事件在触发时会无法找到对应的函数。

一个好的办法是为你新增的 Button 带上 ID,并通过 ID 找到对应的 Element 并添加事件绑定来实现。

参考代码如下:

// ==UserScript==
// @name         示例代码
// @namespace    https://www.ixiqin.com
// @version      0.0.1
// @description  示例代码
// @author       bestony
// @license      MIT
// ==/UserScript==

(function () {
  'use strict';
  window.addEventListener('load', function () {
    function viewAuthor() {
      // button click event
    }

    var targetElement =document.getElementById("xxx")

    targetElement[0].innerHTML = targetElement[0].innerHTML + ` &nbsp;<a id="view-author">查看作者</a>`

    var link = document.getElementById("view-author");
    if (link) {
      link.addEventListener("click", viewAuthor, false);
    }
  }, false);
})();
Code language: JavaScript (javascript)

油猴脚本不支持 Modules Javascript 导致空白脚本报错

text

最近在写一个油猴脚本时,因为懒得写 DOM 处理函数,我试图在油猴脚本当中引入 Zepto.js, 用于实现 DOM 操作。

d2b5ca33bd970f64a6301fa75ae2eb22

但在引入 Zepto 之后,发现即使是空白的脚本文件,在网页加载时依然会报错。经过排查发现,是我引入的 Zepto 文件导致的,进一步研究后发现,之所以有这个问题,是目前油猴脚本仍不支持 Modules ,因此,我引入 Zepto 就会报错。

想要解决这个问题倒是也简单,将 Zepto 替换为 JQuery 即可。本来想着用 Zepto 会轻量一点, 最后发现还是要上 JQuery。好在是目前 JQuery 提供了不含 Ajax 和 Effect 的 Slim 版本,倒是也不用担心引入的依赖文件特别的大。

拥抱湿货

灵光一闪

早年间我对于干货有着迷恋,总感觉自己需要干货来快速学习、快速成长。但随着时间的推移,我对于干货的需求越来越少,反而是愈加喜欢「湿货」。

回想自己当年,喜欢湿货大抵是因为时间不足,总想着用最短的时间,学习最多的知识,成为强者。所以能够短时间收获大量信息的「干货」就成为那个年纪的最爱。

但随着回到天津,生活节奏放缓,开始放过自己,不再追求成为强者。开始对于时间、节奏有了更多的容忍度。不再追求用最短的时间学习到最多的知识,也就对于「干货」没了那么强的诉求。

当然,更重要的是,我意识到,「干货」的好处是通过压缩信息量,让你可以最短时间获得到了最多的知识,但另外一个层面来看,也使得这些「干货」失去了执行的可能性,我们并不能直接从这些干货当中得到什么(嗯,这段话还有点追求得到的意味)。而湿货,虽然没有高度压缩的信息,但却提供了丰富的上下文,让我们可以知道一个道理、一个方法的适用场景、使用手段等一系列信息,帮助我们更好的改进我们的生活。

干货我们往往得到的是「我知道很多道理,却过不好这一生」,而湿货,却可以真真切切的指导我们的生活。

一个邮件转发服务 – Forward Email

email

我并没有自建一套邮件服务器(主要是懒得维护),但我又需要邮件转发服务,所以我选择了使用 ForwardEmai 的服务。

Forward Email 是一个开源的产品,并基于开源的版本提供了 SaaS 的产品,如果你懒得维护自己的服务器,则可以使用他们的 SaaS 产品。

在使用上颇为简单,添加域名、配置 MX 记录,设置 TXT 记录,就可以实现转发功能了,从而实现我之前提到过的 数字所有权 中的实现。对于没有技术背景的人来说,这可能是成本最低获得个人域名邮箱的方式方法了。

Github 开源地址:https://github.com/forwardemail/forwardemail.net

服务地址:https://forwardemail.net/

如何在 Gmail 当中设置使用自定义域发送邮件

email

我对外一共提供两个邮箱地址:

  • bestony@linux.com:Linux.com 后缀的邮箱;
  • hi@ixiqin.com:ixiqin.com 后缀的邮箱,可控,不失联。

不过,由于 Linux.com 仅提供了域名中转服务,所以我过去都是以 linux.com 域的邮箱作为收件邮件。最近在研究邮箱转发系统的时候,研究出了如何使用 linux.com 的域发邮件的方式。

效果

设置完成后,在 Gmail 展示效果完美。

d2b5ca33bd970f64a6301fa75ae2eb22 9
Gmail 收件效果

但在 QQ 邮箱中展示效果比较惨。如果你的通信人主要是 QQ 邮箱,还是不要用这个发信地址来发信了。

d2b5ca33bd970f64a6301fa75ae2eb22 10
QQ邮箱展示效果

配置说明

总体来说,配置需要以下几步:

  1. 生成应用专属密码:专属密码的好处是可以和你自己的密码不冲突,即使出现泄漏也可以快速止损。在任何非 OAuth 但需要输入密码的场景,都推荐你使用应用专属密码。
  2. 配置发件地址并验证:在 Gmail 的系统当中录入你的发信地址,这样 Gmail 就知道应该使用哪个地址作为发信地址了。你填写了基本信息以后,Gmail 需要验证你是否是对应的域名的持有人,只有是持有人的情况下,才会给你提供以对应的地址发信息的能力。
  3. 设置对应域名为默认发信地址(非必要):当你设置完成后,你即可以对应的邮箱地址来发信,但默认情况下还是使用 Gmail 为发信地址,如果你需要的话,可以自行设置新域名为默认发信地址。

具体步骤

1. 生成应用专属密码

Google 为用户提供了应用专属密码的能力,你只需要访问对应的应用专属密码页面,设置这个密码的对应使用场景(这个场景是为了方便你日后需要止损时,快速找到生成的密码,可以根据具体的使用场景、日期等方式来设定)。

d2b5ca33bd970f64a6301fa75ae2eb22 12

生成完成后,你会获得一个 16 位的密码。复制这个密码,并保存下来,稍后我们将使用它作为配置过程中的密码。

2. 配置发信邮件

打开 Gmail 的账户配置页面(设置-账号与导入-使用这个地址发送邮件),点击「添加其他电子邮件」。

在弹出的窗口当中填入邮箱名称和要绑定的邮件地址,并点击下一步。

d2b5ca33bd970f64a6301fa75ae2eb22 13

在新页面配置服务器时,填写服务器地址为 smtp.gmail.com,设置端口为 587。并在用户名当中输入你的邮箱的前缀(比如你的邮箱是 hi@gmail.com,这里就填写 hi)和上一步生成的应用专属密码;下方的加密方式选择「使用 TLS 的安全连接」,并点击下一步。

d2b5ca33bd970f64a6301fa75ae2eb22 14

点击完成后,系统会自动验证是否可以登录到对应的系统。验证完成后,会自动给你的邮箱地址发送一个邮件,其中包含了验证码。

d2b5ca33bd970f64a6301fa75ae2eb22 15

接下来在这个页面填写验证码并点击验证,或点击邮件中的链接,即可实现账号的确认。

d2b5ca33bd970f64a6301fa75ae2eb22 16

3. 设置默认发信邮件

当你绑定完成后,回到 Gmail 的账户配置页面,会看到多个域名,找到你打算作为发信域名的邮箱地址,并点击其后的「设置为默认发信地址」,即可完成配置。

d2b5ca33bd970f64a6301fa75ae2eb22 17

总结

在我测试这个方法的时候,我还是挺激动的。但看到 QQ 邮箱的提示以后,我还是选择了继续使用 gmail 地址作为我的发信地址(但还是使用 linux.com 的邮箱作为收信地址)。一方面我的虚荣让我继续使用 linux.com 的域作为邮箱。但同时,我也不希望收到我邮件的朋友为此感到困惑,那就这样吧。