-
Notifications
You must be signed in to change notification settings - Fork 0
/
feed.xml
executable file
·404 lines (260 loc) · 55.3 KB
/
feed.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.8.7">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2024-09-10T15:06:32+08:00</updated><id>/feed.xml</id><title type="html">Bingwhispers</title><subtitle>Hi there!</subtitle><entry><title type="html">Fedora 48小时初体验</title><link href="/2024/09/08/initial-48-hour-experience-with-fedora" rel="alternate" type="text/html" title="Fedora 48小时初体验" /><published>2024-09-08T22:55:00+08:00</published><updated>2024-09-08T22:55:00+08:00</updated><id>/2024/09/08/initial-48-hour-experience-with-fedora</id><content type="html" xml:base="/2024/09/08/initial-48-hour-experience-with-fedora"><![CDATA[<p>我是一个 Windows 和 Ubuntu 用户,此前一直使用 KDE 桌面环境,最近心血来潮打算体验一下其他 Linux 发行版。我的第一个选择是 Fedora。之所以选择它,是因为 Fedora 的软件包管理系统与 Ubuntu 不一样,默认的桌面环境是 Gnome,与我熟悉的 KDE 也不同,总体的使用体验会有非常大的差异。</p>
<p>本文发布时,Fedora 的最新版本为 Fedora 40,发布于 2024 年 4 月 23 日(Ubuntu 24.04 发布于 2024 年 4 月 25 日)。在安装了 Fedora 40 后,我重度使用了一个周末。在周末即将结束时,将一个周末的使用体验以博文的形式分享出来。</p>
<p>在下载安装镜像文件时,我大概浏览了一下 Fedora 的网站,了解了一些概要信息:</p>
<p>Fedora 有五个分支版本,对应五种应用场景:Fedora Workstation 针对 PC 的桌面版,Fedora Server 服务器版,Fedora Iot 针对嵌入式设备的物联网版,Fedora Cloud 和 Fedora CoreOS 是针对云计算场景的版本。</p>
<p>Fedora 通常每半年发布一个新版本,每个版本的维护时间为 13 个月。所以我可以在今年下半年更新 Fedora 41,或者在明年上半年 Fedora 40 停止维护前升级到 Fedora 42。</p>
<p>系统的安装比较顺利,但是体验并不完美。通过 LiveCD 引导的安装过程非常容易,只需选择安装的磁盘即可。重启后,进入 Inital Setup。选择“Enable Third-Party Repositorise”,点击“Next”,程序卡住。多次弹出程序无响应的对话框,点击“Wait”仍然无效。此时我打算重新启动,但电源菜单中只有“Suspend”选项,无奈我只能通过机箱的电源按钮关机。重启后,Inital Setup 程序顺利执行完毕,进入桌面。后来我在虚拟机中再次安装,遇到了相同的情况,所以这并非偶然。</p>
<p>Fedora 40 默认使用 Gnome 46 桌面环境。它给人的第一印象是“简洁、漂亮”。屏幕上方有一条非常窄的状态栏,左中右分别布置了工作空间、时间和按钮栏。默认壁纸是一副油画风格的抽象画,画中是夕阳照进树林的景色。画面两侧的树木高大,枝叶茂密。画面中间模糊的蓝色让人一时分不清是路面还是小河,配合阳光照进树林形成的丁达尔现象,给人一种宁静深邃的感觉。</p>
<p>Fedora 默认的 UI 主题以白色为主,窗口不同区域通过不同的灰度区域隔开。界面中的特殊元素大多使用蓝色表现,例如:进度条、引导性按钮、开启项和选中项等。</p>
<p>点击键盘的 Super 按键,可以看到位于屏幕底部的 Dash 栏。Dash 栏与 MacOS、Windows 11 的设计类似,居中、合并相同程序的不同窗口。Dash 栏默认不显示,只有在按下 Super 按钮后,才会显示。我都害怕有些心急的新手跳过首次启动指引,会发现不知道如何打开应用程序。</p>
<p>按下 Super 按键后,通过键盘输入也可以进行全局搜索,也可以在中间的窗口区域切换窗口或工作空间,也可以通过 Dash 栏打开其他应用程序。</p>
<p>我浏览了一遍 Setting 应用程序,设置项都非常简洁。它不像 KDE 那样在系统设置中集成非常丰富的设置内容,系统进一步定制通过 Extensions 和 Tweaks 两个应用程序来完成。网络设置非常好用。系统可以自动识别我所有的四个以太网卡和一个 Wi-Fi。我可以非常容易地给这些网卡设置静态 IP 或动态 IP,也非常容易地连接家里的 Wi-Fi。代理和 VPN 的支持也非常丰富。常见的 VPN 协议和代理模式都能很好地支持。遗憾的是,当我创建一个 WireGuard 连接时,遇到一个必现的崩溃问题。创建 WireGuard 连接时,进入 WireGuard 标签页,通过 fwmark 选项右侧的加减号修改 fwmark 选项,当次选项是 1 时,再次点击减号,Setting 程序便崩溃退出了。</p>
<p>Fedora 在显示设备方面支持地非常好。我有两个显示器,分别是 HDMI 接口的 1080P 显示器和 DP 接口的 4K 显示器。两个显示器可以正常分别使用 100% 和 200% 两个不同缩放比,而且切换缩放比不再需要重新启动桌面环境。</p>
<p>鼠标和触摸板的设置中规中居没有太多特殊点。值得一提的是,中文输入法的设置出乎意料得顺利。我只需在键盘选项中添加一个 Input Source,即可输入中文。这一点是非常大的进步,因为我知道有很多人都是在多次尝试安装中文输入法失败后,放弃在真机中安装 Linux 操作系统。虽然安装的比较顺利,但是输入法的使用体验却非常普通。首先是词语联想功能非常弱,当我打出“feichangjianjie”时,第一候选词竟然是“非常简介”。其次,我设置了每个窗口具有独立的输入源,当我以中文输入状态切换到其他窗口,在由其他窗口切换回来时,输入状态会变成英文。这实际上就变为每当我切换到一个窗口,此时的输入状态都是英文状态,完全无法保留之前的状态。</p>
<p>在 Setting 程序中,依次打开 System 和 About 选项,Disk Capacity 栏目中显示的是 Unknow,说明系统没有正确识别出计算机中的存储设备。不过这无伤大雅,我只有一个 SSD,并且所有挂载都正确,这里只是显示异常。</p>
<p>Fedora 预装的应用程序质量非常高,Camera、Contacts、Weather、Clock、Maps,这些程序简单好用,界面简单美观,让我有一种在使用手机系统的错觉。还有一些其他的程序也给了我很多惊喜:Boxes 是一个轻量级的虚拟机软件,它可以满足日常的虚拟机需求。最厉害的是,你可以在 Boxes 中直接下载各种常见的操作系统镜像,非常方便。Disk Usage Analyzer 应用程序有一个很炫的饼状图,可以非常快速直观地展现出各级目录的磁盘占用状况,所有人都值得一试。</p>
<p>这一次对 Fedora 的尝试非常成功,我见到了非常好的软件,见到了多屏多缩放顺利解决,尝试了不同于 Windows 和 KDE 风格的桌面环境。当然目前我所体验到的,仅仅是 Fedora 的冰山一角,进一步了解 Fedora 还需要更久的时间。接下来我会继续使用 Fedora,看看它在长期工作中的持续表现。</p>]]></content><author><name></name></author><category term="Linux" /><category term="Fedora" /><summary type="html"><![CDATA[我是一个 Windows 和 Ubuntu 用户,此前一直使用 KDE 桌面环境,最近心血来潮打算体验一下其他 Linux 发行版。我的第一个选择是 Fedora。之所以选择它,是因为 Fedora 的软件包管理系统与 Ubuntu 不一样,默认的桌面环境是 Gnome,与我熟悉的 KDE 也不同,总体的使用体验会有非常大的差异。]]></summary></entry><entry><title type="html">群晖 NAS 使用心得(下)</title><link href="/2022/01/27/experiences-on-synology-nas-2" rel="alternate" type="text/html" title="群晖 NAS 使用心得(下)" /><published>2022-01-27T16:46:00+08:00</published><updated>2022-01-27T16:46:00+08:00</updated><id>/2022/01/27/experiences-on-synology-nas-2</id><content type="html" xml:base="/2022/01/27/experiences-on-synology-nas-2"><![CDATA[<p> 由于 DS216j 的性能比较弱,很多服务虽然可以用,但是体验并不好。在使用 DS216j 两三年后,我逐渐有了换机器的想法。一方面是想改善现有服务的使用体验,另一方面是觊觎新功能。</p>
<p> 先说说性能问题把:用 Moments 套件打开相册,翻到较早的照片时,照片缩略图需要很久才能打开。看不到缩略图就很难快速找到想要的照片;使用 Video Station 串流影片时,解码能力有限,1080P 以上清晰度的影片最大只能以 720P 来解码;多个服务并发运行时,反应速度有明显降低;更换硬盘需要拆外壳,很不方便。</p>
<p> 新功能稍后再说,总之在 DS216j 向我报告第一块 3TB 的硬盘发生故障,需要更换后,我决定买一台新 NAS。</p>
<p> 就在几天前,我收到了这台新 NAS:DS920+。我本来想先用一周的时间体验和研究一下新机器,等它的各项配置和服务都稳定后,再把 DS216j 上的服务和资料逐渐迁移至 DS920+ 上。然而出乎我意料的是,一切配置都很顺利,包括很多新功能。所以 DS920+ 很快就“转正”了。</p>
<p> 相比于 DS216j,DS920+ 上可用的套件增加了许多。我最感兴趣的是 Docker 和虚拟化。</p>
<p> 我有一些服务平时运行在 PC 的虚拟机中,比如 beancount-fava 和此博客的 Jekyll 工程。但是每次都需要打开虚拟机,切换目录,运行程序,这样还是比较麻烦的。现在我把这些服务都放在 NAS 的 Docker 中运行,就省去了这些繁琐的操作。群晖的 Docker 套件基于标准的 Docker,完整支持 dockerhub。既有适合新手上路的图形界面,也有适合高端玩家的命令行程序。可以说,有了 Docker,只有你想不到的,没有群晖做不到的。</p>
<p> 对于个人用户来说,DSM 上的虚拟机功能比较完整。它的虚拟机可支持 Windows、Linux、DSM 和其他自定义的操作系统。创建好虚拟机,设置基础的硬件信息后,就可以开机了。显示终端被重定向到了一个 Web 页面,这一点和其他 VPS 厂商一样。虚拟机管理器中有简洁明了的存储管理和网络管理,快照、备份等常用功能也都具备。在 DSM 中再安装一个 DSM 的虚拟机听起来确实很有趣,不过除了做一些实验配置以外,我还没有想到有什么实际用途。群晖随机赠送一个 DSM 虚拟证书,每台设备可免费安装一个 DSM 虚拟机。额外的虚拟机需要购买许可。</p>
<p> 默认情况下,DSM 的虚拟机是基础版。专业版是在基础版上增加了集群管理的功能,不过专业版需要额外付费。</p>
<p> 总之,对于个人用户而言,基础版的 DSM 的虚拟化基本满足日常使用。</p>
<p> 群晖还有其他的一些优点。例如,技术支持比较快。我提过两次工单,基本都在第二个工作日解决了。文档比较详细,如果有哪些不懂得地方,大部分问题都可以在官方网站上找到资料。这些优点常常让人心里格外舒坦,并感慨其物超所值。</p>
<p> 同时,我也注意到群晖 NAS 上也存在一些缺点。关于相册服务,从最开始的 Photo Station,到后来的 Moments,再到现在的 Synology Photos,这个服务所对应的套件基本都是推倒重来。虽然每次更新,官方都宣称存储向前兼容。但我实际上每次都被强行改变了使用习惯。另外,DSM 上的套件基本上都是满足功能需求。在易用性和便捷性上,和专业的软件还有一些差距。</p>
<p> 限于篇幅,对于群晖 NAS 的使用体验介绍不能面面俱到。随着我继续使用,它也会给我的数码生活带来更多活力和新奇的体验。</p>
<p align="right">——2022年01月27日</p>]]></content><author><name></name></author><category term="群晖" /><category term="NAS" /><summary type="html"><![CDATA[ 由于 DS216j 的性能比较弱,很多服务虽然可以用,但是体验并不好。在使用 DS216j 两三年后,我逐渐有了换机器的想法。一方面是想改善现有服务的使用体验,另一方面是觊觎新功能。]]></summary></entry><entry><title type="html">群晖 NAS 使用心得(上)</title><link href="/2022/01/26/experiences-on-synology-nas-1" rel="alternate" type="text/html" title="群晖 NAS 使用心得(上)" /><published>2022-01-26T13:56:00+08:00</published><updated>2022-01-26T13:56:00+08:00</updated><id>/2022/01/26/experiences-on-synology-nas-1</id><content type="html" xml:base="/2022/01/26/experiences-on-synology-nas-1"><![CDATA[<p> 2017 年,我购买了第一台 NAS:群晖 DS216j。当时最主要的需求就是数据存储。文档资料、影音视频、家庭照片,这些资料随着时间的推移,越积越多。单纯使用 PC 硬盘管理资料已经无法满足需求了。我曾经考虑过在线网盘,但是大部分网盘产品都需要用户在存储容量、传输带宽和订阅费用三者间取舍。况且,虽然技术上,网盘能够很好地保证数据的安全性。但是仍然有很多非技术性因素,让我对网盘上的数据安全性充满担心——NAS 几乎是必然的选择。</p>
<p> DS216j 是群晖的入门级产品,价格低,最大支持两块硬盘,性价比非常高。了解群晖 NAS 的读者可能会对我的说法嗤之以鼻:DS216j 如此孱弱的性能如何称得上性价比高?这里的性价比,比的可不是性能啊。群晖“买软件,送硬件”的名号由来已久,我倒认为,用 1200 多人民币的价格,就可以用上群晖提供的绝大部分软件服务,那可谓是非常赚啦。</p>
<p> 我为什么不攒一台 NAS 呢?作为一个软件工程师,我确实可以攒一台机器,网上也有很多自攒 NAS 的教程。但是我在这方面并不想花费太多时间和精力折腾。我需要一台运行稳定、功能成熟的 NAS。我可不想三天两头折腾宕机的 NAS,所以在这方面用金钱换时间和精力是很合算的,况且数据也是无价的。</p>
<p> 群晖的上手非常容易。按照说明书安装硬盘、连接电源线和网线就可以直接开机了。系统安装和软件设置也是傻瓜化操作,跟着向导一路点击下一步即可。所有关键的设置项都有详细的说明,基本不会出现配置错误的情况,非常贴心。设置好硬盘、共享文件夹和用户账户,就可以从局域网中访问 NAS 中的数据了。从拆箱到基本设置完成,大概仅用了 15 分钟左右。</p>
<p> 群晖 NAS 中运行的是 Synology DiskStation Manager (DSM) 操作系统。DSM 是群晖基于 Linux 专为其 NAS 产品开发的操作系统。DSM 中,套件(Package)的概念类似于应用程序。但是和应用程序又有一些区别。一个套件是若干应用程序、数据和配置的集合,它为用户提供了一整套完整的功能。DSM 把各种功能以套件的形式提供给用户。从套件中心下载和安装套件完全都是全自动的,即插即用,非常方便。</p>
<p> 如果说群晖 NAS 的基础功能让我非常满意的话,那么它的套件中心则让我惊喜不已。Photo Station 可以让用户浏览存储在 NAS 上的照片、备份设备上的照片至 NAS;Audio Station 和 Video Station 分别允许用户在线播放存储在 NAS 上的音乐和影片;Download Station 允许用户使用 NAS 从网络上下载文件,实现离线下载功能;Cloud Sync 用来同步其他网络存储服务上的数据,例如 Google Drive、Microsoft OneDrive 等;Synology Drive 可以同步 NAS 和用户设备上的数据。而这些只是我常用的几个套件,群晖的套现中心中还有很多套件,实现各种各样的功能。配合各种优秀的套件,这台 NAS 摇身一变,成为了一台家庭多媒体数据中心。除了官方套件,群晖还支持第三方开发的套件,甚至还有专为群晖 NAS 开发第三方套件的社区。这大大增加了 DSM 的可玩性。</p>
<p> 家庭环境中的 NAS 往往部署在局域网内,且没有固定的公网 IP。所以使用一般手段从公网访问 NAS 非常不方便。群晖为用户提供了 QuickConnect 服务。NAS 和用户通过 QuickConnect 实现内网穿透。上面提到的各种套件,都可以通过 QuickConnect 实现在公网上访问。但是由于所有的数据都依赖 QuickConnect 服务的中转。所以访问速度比较慢。</p>
<p> 最开始,我主要是在家里通过局域网连接 NAS。后来随着越来越多的数据都保存在 NAS 上,再加上使用习惯的养成,我越来越依赖 NAS 上的服务。通过公网访问 NAS 的情况增加了,QuickConnect 已经不能满足需求了。</p>
<p> 于是我向网络运营商申请了公网 IP。在这里解释一下,由于 IPv4 地址资源有限,默认情况下家用固定宽带服务不向用户提供公网 IP 地址,而是运营商的内网 IP 地址。如果设备位于运营商的内网中,则无法通过公网访问。主动申请后,运营商则会给用户提供公网 IP 地址。目前申请公网 IP 是免费的。由于需要频繁的访问 NAS 中的数据,NAS 的上行流量就变得非常重要了。我将原来的 200M 的宽带套餐升级为 500M,上行流量则由原来的 20M 提高到了 100M。对于个人使用来说,已经足够了。</p>
<p> 要想顺畅地从公网访问 NAS,只有公网 IP 还不够,因为它不是固定 IP 地址。每次 PPPoE 拨号,都会从运营商获取不通的 IP 地址。群晖提供了 DDNS 服务。DDNS 服务可以把域名解析到动态变化的 IP 地址上。这样就算每次拨号获取的地址不通,也可以通过固定的域名访问 NAS。通过这些设置,之前的“泉眼无声惜细流”变成了“不尽长江滚滚来”。</p>
<p> DS216j 有两个盘位。最初我只购买了一块 3TB 的硬盘。随着数据增多,两年后我又买了一块 4TB 的硬盘。我并没有组 Raid,一方面是因为两块硬盘的 Raid 方案都不适合我。另一方面,我对可用性的要求并不是很高,系统出问题后,直接从备份中恢复数据即可。</p>
<p> 我将我的所有数据分为三类。第一类是重要且访问频度高的数据,例如照片和日常文档。这些数据占用空间不大(通常在 200GB 以下),但是丢失后无法恢复。对于这类数据,我每周进行一次备份,保留最近的三次备份,在硬盘和网盘中各保存一份。第二类是访问频度不高,丢失后不容易找回的数据,例如游戏、电子书和音乐。这类数据占用空间略大,通常在 500GB 至 1TB 之间。它和第一类数据采取同样的备份方法,只不过频率调整为半年至一年一次。第三类数据是访问频度低,丢失后较容易找回的数据。这类数据具有收藏属性,占用空间大,往往没有上限。我把这类数据直接存储在普通硬盘上,一旦硬盘存满,就从设备上取下来,贴上标签,断电保存。然后给设备换一块新硬盘。</p>
<p> 幸运的是,直到现在我还没有使用过这些备份,DS216j 一直在稳定运行中。不过我清楚地认识到,出问题只是时间问题,我依然要保持备份数据的习惯。</p>]]></content><author><name></name></author><category term="群晖" /><category term="NAS" /><summary type="html"><![CDATA[ 2017 年,我购买了第一台 NAS:群晖 DS216j。当时最主要的需求就是数据存储。文档资料、影音视频、家庭照片,这些资料随着时间的推移,越积越多。单纯使用 PC 硬盘管理资料已经无法满足需求了。我曾经考虑过在线网盘,但是大部分网盘产品都需要用户在存储容量、传输带宽和订阅费用三者间取舍。况且,虽然技术上,网盘能够很好地保证数据的安全性。但是仍然有很多非技术性因素,让我对网盘上的数据安全性充满担心——NAS 几乎是必然的选择。]]></summary></entry><entry><title type="html">今非昔比的书店</title><link href="/2020/05/20/bookshop-changed" rel="alternate" type="text/html" title="今非昔比的书店" /><published>2020-05-20T22:45:00+08:00</published><updated>2020-05-20T22:45:00+08:00</updated><id>/2020/05/20/bookshop-changed</id><content type="html" xml:base="/2020/05/20/bookshop-changed"><![CDATA[<p> 今天吃完午饭,我和子晨去了附近的一家书店。这家书店有一个奇怪的名字——言几又。</p>
<p> 我很少去书店,几乎所有的书都是从网上买。之所以会去言几又,是因为小珂单位发了一张预付卡。而书店又恰好离公司非常近,我就期望着多少能买几本书。</p>
<p> 刚迈进书店大门,一股书店特有的书香扑鼻而来。环顾四周,整个书店宽敞明亮,富丽堂皇。天花板上悬吊着形态各异的灯具。众多明亮的日光灯中,间或参杂着几盏外型极具特色但亮度稍弱的装饰灯。这种微弱的黄晕散发自书店的各个角落,给人以温馨舒适的感觉。高大宽阔的书架在灯光的照耀下,反射出雍容华贵的实木光泽。走廊尽头,一面大镜子完全覆盖了整个墙壁。走过去,不仔细看都不容易发现镜子的存在,只感觉置身于无尽的书海中。大厅正中间有一个巨大的旋转楼梯,通向二楼。人们沿着楼梯上上下下,又为书店增添了一些市井的热闹气息。</p>
<p> 在书店的两个角落,各有一个咖啡厅和理发厅。咖啡厅里坐了不少人,有的捧着咖啡和好友低声细语,有的靠在沙发上看书。</p>
<p> 相比起来,理发厅就冷清多了。大概是来书店逛的人们大多都还没做好理发的准备吧。</p>
<p> “这不知道比其他的书店高到哪里去了!”我这样想。</p>
<p> 逛了一小会,我就发现了一个大问题:整个书店没有明显的导览设施。各类书籍都杂乱地混合摆放在一起。我想买些计算机专业类的书籍,结果绕了一圈,连一本都没找到。问过店员才知道,书店里根本没有专业书籍。</p>
<p> 我这才审视起这家书店的藏书。</p>
<p> 书架都很高,直顶天花板。书架低处摆着新面世的书。这些书并非像图书馆中书脊靠书脊地摆着,而是直接立起来,封面对着读者。这样看起来视觉效果确实很棒,但仔细想想,这种方法的空间里用率非常低,一层并不能摆多少本书。而且,还有不少书架上摆着一些古玩字画等文创产品。很多书架的最上面几层,干脆就摆着一些假书,以充场面,就像很多健身房里的书架一样。</p>
<p> 整个书店的藏书以“励志鸡汤”、经济生活和历史文化等畅销书为主。很难找到名家经典书籍,甚至是四大名著和国外名著小说都没有。在普通书店这些书,往往都占据了相当多的书架空间。</p>
<p> 最后,我和子晨发现喝咖啡才是消费这张预付卡最合算的方法。坐在角落的卡座里,我俩一人点了一杯冰拿铁,吹着空调,悠然地享受起这优美的环境。环顾四周,我想起上次去小寨的汉唐书城。汉唐书城这两年也有了大变样,和言几又很像,都加入了更多休闲和流行元素。在电商和电子书迅猛发展的冲击下,传统图书零售业日渐萧条。为了生存,很多书店不断探索和转型。书店老板也要赚钱养家,这本无可厚非。但是书店曾是文化和知识的代表,如今却将要慢慢褪去她的深韵,加入消费领域的滚滚大军中,不禁令人唏嘘。</p>
<p> 小时候跟着爸爸去图书批发市场进货。大人们谈生意,我就在旁边找喜欢的书翻阅。最后谈妥了生意,临走时老板大多会让我挑几本喜欢的书送给我。我还能记得从书店里走出来,手里捧着书时,自己脸上洋溢的笑。然而这样的书店恐怕再也不会有了。</p>
<p align="right">——2020年05月20日</p>
<p> 周末,我和小珂再来的时候,书店以大扫除的名义暂停营业。两周后的今天,我和小珂第二次来,书店还是大门紧锁。门外有一位店员模样的人告诉我们,这家店已经半个月没有营业了,估计是要关门了。</p>
<p align="right">——2020年06月06日</p>]]></content><author><name></name></author><category term="书店" /><category term="消费" /><summary type="html"><![CDATA[ 今天吃完午饭,我和子晨去了附近的一家书店。这家书店有一个奇怪的名字——言几又。]]></summary></entry><entry><title type="html">Put my cellphone away</title><link href="/2020/05/18/stay-away-from-cellphones" rel="alternate" type="text/html" title="Put my cellphone away" /><published>2020-05-18T11:31:00+08:00</published><updated>2020-05-18T11:31:00+08:00</updated><id>/2020/05/18/stay-away-from-cellphones</id><content type="html" xml:base="/2020/05/18/stay-away-from-cellphones"><![CDATA[<p>Recently I found myself very hard to fall asleep. Yesterday I happened to see <a href="https://medium.com/memos-of-the-future/using-iot-to-optimize-your-sleep-c9747bd8633e">this article</a>. The author explains why using cellphones before going to bed is harmful to sleep in this article. What he said seems to make sense. So I left my cellphone out of my bedroom before going to bed last night.</p>
<p>At first, I was not used to lying in bed without doing anything, and unconsciously tried to find something to focus on. It took me quite a long time to relax completely.</p>
<p>This morning, I awoke much earlier than usual. I tried to get my cellphone habitually before opening my eyes. However, of cause, I couldn’t. I forgot that I had left it in the living room. I would pick the cellphone up and play around with it if I had the cellphone near me at that time. The alarm had not gone off, which means I still had some time. I closed my eyes, tried to fall asleep again. However, I became wide awake soon.</p>
<p>I felt energetic more than ever. I quickly get washed and changed, made me breakfast of eggs and milk. When I finished all this, there was still plenty of time before going to work. I did some cleanning, read some pages of a book and listened to an English audio program.</p>
<p>I extended the time of the morning by putting my cellphone away. Spending too much time on cellphones isn’t only a waste of time, but also impact the sleep quality.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Recently I found myself very hard to fall asleep. Yesterday I happened to see this article. The author explains why using cellphones before going to bed is harmful to sleep in this article. What he said seems to make sense. So I left my cellphone out of my bedroom before going to bed last night. At first, I was not used to lying in bed without doing anything, and unconsciously tried to find something to focus on. It took me quite a long time to relax completely. This morning, I awoke much earlier than usual. I tried to get my cellphone habitually before opening my eyes. However, of cause, I couldn’t. I forgot that I had left it in the living room. I would pick the cellphone up and play around with it if I had the cellphone near me at that time. The alarm had not gone off, which means I still had some time. I closed my eyes, tried to fall asleep again. However, I became wide awake soon. I felt energetic more than ever. I quickly get washed and changed, made me breakfast of eggs and milk. When I finished all this, there was still plenty of time before going to work. I did some cleanning, read some pages of a book and listened to an English audio program. I extended the time of the morning by putting my cellphone away. Spending too much time on cellphones isn’t only a waste of time, but also impact the sleep quality.]]></summary></entry><entry><title type="html">修复 Linux 中的一个噪音问题</title><link href="/2020/05/17/fix-linux-popup-noise" rel="alternate" type="text/html" title="修复 Linux 中的一个噪音问题" /><published>2020-05-17T10:53:00+08:00</published><updated>2020-05-17T10:53:00+08:00</updated><id>/2020/05/17/fix-linux-popup-noise</id><content type="html" xml:base="/2020/05/17/fix-linux-popup-noise"><![CDATA[<p> 自从安装了 Kubuntu 20.04 后,我被一个噪音问题困扰了很久。系统在播放声音前,总会发出一两声短促的噪音。然后继续正常播放声音。后来经过一些研究,我在不久前解决了这个问题。</p>
<p> 刚安装完操作系统后,我安装了媒体播放器,体验音乐和电影的播放效果。在操作过程中,我注意到系统偶尔会发出的短促噪音。在网上搜索一阵,并且尝试了一些方法后,问题没有得到解决。我便放弃了,只当是驱动程序可能有缺陷。</p>
<p> 不过我渐渐地发现了一个规律:噪音只会在一段安静时间后,再次播放声音前产生。在持续播放声音过程中,从来没有噪音。这让我猜测到了一种可能的原因:系统在播放声音一段时间后可能会关闭音频设备,然后在下一次播放前再打开音频设备。打开音频设备的过程中有可能产生电信号的突变,继而产生短促的噪音。这种设计极有可能是基于省电的考虑。</p>
<p> 于是,我以“Linux save power audio noise”为关键词搜索了一番。在 Redhat 公开的 BUG 管理系统中,我找到了2017年报告的一个 BUG:<a href="https://bugzilla.redhat.com/show_bug.cgi?id=1525104">《Bug 1525104 - Clicking noise when start or stop sound playing》</a>。</p>
<p> 这个 BUG 所描述的问题和我的相同,并且 Jeremy 似乎给出了解决问题的办法。</p>
<blockquote>
<p>Jeremy Cline 2017-12-13 18:06:49 UTC</p>
<p> Can you pass snd_hda_intel.power_save=0 on the kernel command line and see if that resolves your issue?</p>
<p> Thanks</p>
<p>Riku Seppala 2017-12-13 18:25:50 UTC</p>
<p> Yes, that seems to resolve this for me.</p>
</blockquote>
<p> 这个方案虽然可行,但需要通过修改 grub 的配置来修改内核命令行参数。即有风险又麻烦,普通用户不好操作。我决定找一个更容易操作的方法。</p>
<p> “snd_hda_intel.power_save=0”看起来是把“snd_hda_intel”内核模块的“power_save”参数设置为0。那么问题应该是出在这个内核模块上了。于是我下载了 ubuntu 的内核源码,找到了这个内核模块。经过一番搜索,找到了这部分代码(linux-source-5.4.0/sound/pci/hda/hda_intel.c):</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#ifdef CONFIG_PM
static int param_set_xint(const char *val, const struct kernel_param *kp);
static const struct kernel_param_ops param_ops_xint = {
.set = param_set_xint,
.get = param_get_int,
};
#define param_check_xint param_check_int
static int power_save = CONFIG_SND_HDA_POWER_SAVE_DEFAULT;
module_param(power_save, xint, 0644);
MODULE_PARM_DESC(power_save, "Automatic power-saving timeout "
"(in second, 0 = disable).");
static bool pm_blacklist = true;
module_param(pm_blacklist, bool, 0644);
MODULE_PARM_DESC(pm_blacklist, "Enable power-management blacklist");
/* reset the HD-audio controller in power save mode.
* this may give more power-saving, but will take longer time to
* wake up.
*/
static bool power_save_controller = 1;
module_param(power_save_controller, bool, 0644);
MODULE_PARM_DESC(power_save_controller, "Reset controller in power save mode.");
#else
#define power_save 0
#endif /* CONFIG_PM */
</code></pre></div></div>
<p> 阅读这段代码后,我发现 power_save 参数并非简单地开启或者关闭省电模式,而是一个超时时间。增大超时时间可以降低进入省电模式的频率,从而减少噪音产生的次数。设置0可以直接关闭省电模式。于是问题就变得简单了,我的台式电脑似乎并不那么在乎功耗,所以我决定关闭音频设备的省电模式。用这条命令可暂时关闭省电模式。系统重启后失效。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo echo 0 > /sys/module/snd_hda_intel/parameters/power_save
</code></pre></div></div>
<p> 若要永久关闭设备的省电模式,在/etc/modprobe.d/中添加一个“disable_snd_hda_intel_power_save.conf”文件,在文件中添加这一行:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>options snd_hda_intel power_save=0
</code></pre></div></div>
<h3 id="一个更深入的问题">一个更深入的问题</h3>
<p> 为什么 Linux 中有这个问题,而 Windows 操作系统中没有?</p>
<p> Linux 的文档中有一个章节:<a href="https://www.kernel.org/doc/html/v5.4/sound/hd-audio/notes.html">More Notes on HD-Audio Driver</a>。这一节中介绍了 HD-audio 设备的大致结构。这里引用其中一段:</p>
<blockquote>
<p>The HD-audio component consists of two parts: the controller chip and the codec chips on the HD-audio bus. Linux provides a single driver for all controllers, snd-hda-intel. Although the driver name contains a word of a well-known hardware vendor, it’s not specific to it but for all controller chips by other companies. Since the HD-audio controllers are supposed to be compatible, the single snd-hda-driver should work in most cases. But, not surprisingly, there are known bugs and issues specific to each controller type. The snd-hda-intel driver has a bunch of workarounds for these as described below.</p>
</blockquote>
<p> 这里说:HD-audio 组件由控制器芯片和解码芯片组成。Linux 提供了控制器芯片的驱动程序。在 snd_hda_intel 模块中,我找到了解码芯片的省电模式的驱动代码(linux-source-5.4.0/sound/pci/hda/hda_codec.c):</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>static void codec_set_power_save(struct hda_codec *codec, int delay)
{
struct device *dev = hda_codec_dev(codec);
if (delay == 0 && codec->auto_runtime_pm)
delay = 3000;
if (delay > 0) {
pm_runtime_set_autosuspend_delay(dev, delay);
pm_runtime_use_autosuspend(dev);
pm_runtime_allow(dev);
if (!pm_runtime_suspended(dev))
pm_runtime_mark_last_busy(dev);
} else {
pm_runtime_dont_use_autosuspend(dev);
pm_runtime_forbid(dev);
}
}
</code></pre></div></div>
<p> 原来音频设备的低功耗是通过控制解码芯片来实现的。于是我猜测电脑主板上应该有这样一个解码芯片:在省电模式中断电,在工作模式中供电。</p>
<p> 我使用的是华硕 B85M-F 型号的主板,在华硕的官网中搜到了此主板的<a href="https://www.asus.com/au/Motherboards/B85MF/specifications/">规格说明</a>。此主板搭载了 Realtek® ALC887 8-Channel High Definition Audio CODEC 音频解码芯片。我又在网上找到了这个芯片的数据手册,里面有它的长相和引脚定义。它长这个样子:</p>
<p><img src="/assets/linux-popup-noise/ALC887.png" alt="debugger" /></p>
<p> 我在电脑主板上找到了这个芯片,然后把 snd_hda_intel 模块的省电模式打开,用万用表在它的供电引脚上量到了电平的变化。正如我之前猜测的一样:播放声音一段时间后,停止供电。播放声音前,恢复供电。</p>
<p> 最后,我抱着试试看的态度,换了一块硬盘,装上 Windows 10。经过半个多小时的测试,这个音频解码芯片的供电始终没有被切断。看来,Windows下的驱动并没有在低功耗方面理会此芯片。</p>
<p> 到此,这个问题不再扑朔迷离。然而这个问题引发了我更深地思考:当此问题初现的时候,我的第一印象是 Linux 在这些细节上处理的还不够成熟。然而经过以上研究过程,我认为是 Linux 的开发人员追求极致的风格导致了这些琐碎的问题。上文提及的2017年报告的 BUG,到现在依然被开发者们追踪并修改,我为这些开发者们的精神所折服。</p>
<p align="right">——2020年5月17日</p>]]></content><author><name></name></author><summary type="html"><![CDATA[ 自从安装了 Kubuntu 20.04 后,我被一个噪音问题困扰了很久。系统在播放声音前,总会发出一两声短促的噪音。然后继续正常播放声音。后来经过一些研究,我在不久前解决了这个问题。]]></summary></entry><entry><title type="html">2020年的新年碎碎念</title><link href="/2020/01/02/30-years-old" rel="alternate" type="text/html" title="2020年的新年碎碎念" /><published>2020-01-02T19:50:00+08:00</published><updated>2020-01-02T19:50:00+08:00</updated><id>/2020/01/02/30-years-old</id><content type="html" xml:base="/2020/01/02/30-years-old"><![CDATA[<p> 昨天晚上,我和小珂出去吃饭。等餐的时候,和小珂闲在聊中谈到一年的变化。事后细想,感慨颇深。</p>
<p> 2019年对我来说很是丰富多彩。我做了很多有意义的事情,也有了很多真心想去做的事情。</p>
<p> 这一年夏天,我和小珂领了结婚证。冬天,我们举办了婚礼。一切都顺顺利利,妥妥当当。到现在,我仍然没有明显地感觉到婚前婚后的变化。这确实是我期望的。这一年,我和小珂相互关心,相互谦让。这样的生活让我很放松。结婚后,我们买了一套一百平的房子。虽然因为首付借了不少钱,而且今年的房价还有下降趋势。但是总体来说,这件事还是让我对未来充满了期待,十分开心。</p>
<p> 九月份,我和小珂去欧洲旅行了。古人说:“读万卷书,行万里路。”在遥远的异国他乡,我们走过罗马斗兽场旁的幽幽小巷;仰观富丽堂皇的圣母百花大教堂;沉浸于柔美的莱茵河与天边灿烂的晚霞。我深切地领会到“过秦、汉之故都,恣观终南、嵩、华之高,北顾黄河之奔流,慨然想见古之豪杰”的那种情怀。旅行确实激发了我内心的浩然之气。</p>
<p> 这一年,我在公司有一半多的时间投入在节点代码重构上。以前的代码充满了不同逻辑模块间的耦合关系,稍作改动都会引起一些潜在的问题。因此工程师十分抗拒修改代码。年初,我在“户外防潮型表面温度”项目中完成了 MSP430 平台上的重构工作,把这些耦合关系都基本消除。年中,我开始了带显示屏的室内环境监测终端产品线的开发。在这个项目中我基本解决了 STM32 + FreeRTOS 的开发问题。比较有意义的是 Bootloader 和低功耗问题的解决。后半年,我在部门中逐渐引入 Git Flow、持续集成、自动化单元测试等技术。年底,依托这些基础设施的提升,我参照敏捷开发和 CMMI,制定了部门内的研发流程。这一流程在部门范围内弥补了研发部流程执行不顺利的问题。</p>
<p> 我家的盆栽植物已经有大大小小21盆了。除过一盆金钱木,其他的盆栽都长势喜人。这盆金钱木也是命途多舛。我本来一直都控制着浇水,它也一直都健健康康的,还分出了三四个旁枝。谁知一次降温突然来临,叶子被冻黄了几片。刚开始我以为是冬天干燥,缺水造成的,所以多浇了几次。结果把它浇烂根了。好在我及时把根挖出来,凉了两天,再重新植回盆里,才把它挽救回来。不过现在的叶子都快掉秃了。希望过了新年它会有新气象。</p>
<p> 2019年也有一些遗憾。</p>
<p> 10月份,我去三星面试嵌入式软件工程师一职。技术面试毫无悬念地通过了,但是人力资源面试没过。回顾整个过程,我觉得最有可能出问题的地方是薪水要求太高了。今年有机会的话还想再试一次。为什么我如此想去三星呢?说实在的,步入三十岁,我慢慢开始担心中年危机的到来。这使我在换工作时更倾向于稳定的环境。</p>
<p> 原本计划要在2019年多看些书,结果达成度并不令我满意。我看了《思考,快与慢》和《Harry Potter and the Philosopher’s Stone》。一年两本的阅读量明显偏少。并不是我没有足够的时间阅读,而是在一些无意义的休闲上浪费了太多时间。今年我给自己定了看10本书的目标。这是一个量化的目标,并且切实可行。通过读书,一方面我可以拓宽知识面,另一方面可以锻炼自控能力。</p>
<p> 2020年也会像2019年一样快快地过去。也许2020年不会像2019年一样精彩,但是2020年一定会比2019年有更多收获。</p>
<p align="right">——2020年1月2日 晚</p>]]></content><author><name></name></author><summary type="html"><![CDATA[ 昨天晚上,我和小珂出去吃饭。等餐的时候,和小珂闲在聊中谈到一年的变化。事后细想,感慨颇深。]]></summary></entry><entry><title type="html">使用 IAR Embedded Workbench IDE 做单元测试</title><link href="/2019/12/20/iar-unit-test" rel="alternate" type="text/html" title="使用 IAR Embedded Workbench IDE 做单元测试" /><published>2019-12-20T20:00:00+08:00</published><updated>2019-12-20T20:00:00+08:00</updated><id>/2019/12/20/iar-unit-test</id><content type="html" xml:base="/2019/12/20/iar-unit-test"><![CDATA[<h1 id="一欢迎">一、欢迎</h1>
<p> 很高兴你能看到这篇文章,我将在这篇文章中介绍如何使用 IAR 做单元测试。</p>
<p> 大部分嵌入式开发者一般都按照“编码——编译——运行——调试”的循环完成开发工作,这很可能只会用到 IAR Embedded Workbench IDE(以下简称“IAR”)极少一部分(同时也是最常用的)功能。实际上,IAR 为开发者提供了很多丰富的功能,使我们能做更多事情。</p>
<p> IAR 集成了“IAR C-SPY Debugger”,IAR C-SPY Debugger 里面又提供了“C-SPY Simulator”功能。它通过软件完整地模拟了目标处理器,使目标处理器的代码可以脱离硬件环境运行。这样就可以随时做单元测试而不必等待硬件环境就绪。对单元测试而言,这是一个极大的便利。顺便提一下,我使用的 IAR 版本是 IAR Embedded Workbench for ARM 8.32.3.20228。</p>
<h1 id="二创建工程">二、创建工程</h1>
<p> 创建一个名为“test”的 C 语言模板工程,然后打开工程选项菜单,在”General Option”选项中的“Library Configuration”选项卡中,按下图所示配置。</p>
<p><img src="/assets/iar-ut/semihost.png" alt="debugger" /></p>
<p> Semihosting 是 ARM 处理器独有的特性。它能使 ARM 目标机通过调试器和主机通讯,或者使用主机的I/O设备。此功能可以单元测试程序使用 printf 等方法输出测试信息。非常方便。其他类型的处理器也会有相应的机制完成此任务。</p>
<p> 接下来,在“Debugger”选项中将调试驱动选为“Simulator”。如下图所示:</p>
<p><img src="/assets/iar-ut/debugger.png" alt="debugger" /></p>
<p> 打开 main.c 文件,修改其中的代码。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/*main.c*/
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
</code></pre></div></div>
<p> 这时候可以按“Ctrl+d”启动调试。进入调试界面后,选择“View”菜单的“Terminal I/O”,打开终端输入输出窗体。按“F5”继续运行代码,可以看到“Hello World”输出信息。这样,一个简单的工程就创建完成了。</p>
<h1 id="三添加单元测试框架">三、添加单元测试框架</h1>
<p> C 语言的单元测试框架很多,在这里不一一详述。我选择了Unity,项目地址见文末参考资料。下载“Unity-2.5.0.tar.gz”并解压。分别从“Unity-2.5.0/src”、“Unity-2.5.0/extras/fixture/src”和“Unity-2.5.0/extras/memory/src”中找到下列文件,并复制到 test 的工程目录中。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>unity.c
unity.h
unity_fixture.c
unity_fixture.h
unity_fixture_internals.h
unity_internals.h
unity_memory.c
unity_memory.h
</code></pre></div></div>
<p> 在 test 工程中添加以上的所有“.c”源文件,然后新建一个“foo.c”源文件作为待测文件。在 foo.c 中添加如下内容:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/*foo.c*/
int add(int a, int b)
{
return a + b;
}
</code></pre></div></div>
<p> 再次修改 main.c,使用 Unity 框架,为 add 函数添加两个测试用例。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/*main.c*/
#include <stdio.h>
#include "unity_fixture.h"
extern int add(int a, int b);
static void run_all_test(void);
int main()
{
const char *arg = "test";
return UnityMain(1, &arg, run_all_test);
}
void run_all_test(void)
{
RUN_TEST_GROUP(add);
}
TEST_GROUP(add);
TEST_SETUP(add)
{
}
TEST_TEAR_DOWN(add)
{
}
TEST(add, case1)
{
TEST_ASSERT_EQUAL(2, add(1, 1));
}
TEST(add, case2)
{
TEST_ASSERT_EQUAL(-3, add(-1, -2));
}
TEST_GROUP_RUNNER(add)
{
RUN_TEST_CASE(add, case1);
RUN_TEST_CASE(add, case2);
}
</code></pre></div></div>
<p> 运行程序后,可以看到终端输出信息。这两个测试用例已经全部通过了。</p>
<p> 如何设计测试用例不在本文的讨论范围内,感兴趣的读者可以阅读 James W. Grenning 著的<a href="https://www.amazon.com/Driven-Development-Embedded-Pragmatic-Programmers-ebook/dp/B01D3TWF5M">《Test Driven Development for Embedded C》</a>。这本书从各个方面讲述了在嵌入式领域如何进行测试。</p>
<h1 id="四拓展">四、拓展</h1>
<p> 在 test/settings 路径下,有这么几个文件:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>test.Debug.cspy.bat
test.Debug.cspy.ps1
test.Release.cspy.bat
test.Release.cspy.ps1
</code></pre></div></div>
<p> Debug 和 release 表示配置,bat 表示 Windows 批处理程序,ps1 表示 Powershell 程序。在终端执行这些脚本可以调用 IAR C-SPY Debugger 运行程序,并且将结果输出至终端。这有助于自动化运行单元测试,我们以后还会详细讨论。</p>
<p> IAR 还提供了在终端中构建项目的工具,更多内容请参考<a href="https://www.iar.com/support/tech-notes/general/build-from-the-command-line/">这里</a>。</p>
<h1 id="五参考资料">五、参考资料</h1>
<ul>
<li>https://github.com/ThrowTheSwitch/Unity</li>
<li>http://www.keil.com/support/man/docs/armcc/armcc_pge1358787046598.htm</li>
</ul>]]></content><author><name></name></author><category term="IAR" /><category term="Unit Test" /><summary type="html"><![CDATA[一、欢迎 很高兴你能看到这篇文章,我将在这篇文章中介绍如何使用 IAR 做单元测试。]]></summary></entry><entry><title type="html">微光</title><link href="/2018/07/07/glimmer" rel="alternate" type="text/html" title="微光" /><published>2018-07-07T22:00:00+08:00</published><updated>2018-07-07T22:00:00+08:00</updated><id>/2018/07/07/glimmer</id><content type="html" xml:base="/2018/07/07/glimmer"><![CDATA[<p> 今天已经是我到内蒙古赤峰市出差的第四天了。工作进行得并不顺利。下午设备故障,工程师维修了很久才解决问题。最后完成工作时,天已经黑了。</p>
<p> 赤峰市位于内蒙古的东北方,夏天的夜晚来的要迟一些。晚上九点多,我们才启程返回。</p>
<p> 我们乘坐的是一辆面包车,大概能坐十一二个人。车厢中间的过道上,凌乱地堆放着各种器械和背包。上车没过一会儿,同行的朋友们就在昏暗的车厢中睡着了。有的歪着脑袋靠在车窗上;有的低着头,随着车身的颠簸一起一伏;还有一个最舒服,他横躺在最后一排,把工作服叠起来,枕在头下。司机师傅在我们干活的时候在车里养足了精神,这会儿正聚精会神地开车。</p>
<p> 我见副驾还空着,便小心翼翼地挪过去,坐下。本想和司机攀谈几句,免得他也生出睡意。可是寒暄两句后,却没有了话题。</p>
<p> 我望向窗外。路边的树木唰唰得飞过,树影连在一起,看不清轮廓。尽管已经是九点多,不过天空还有微弱的亮光。不远处是连绵起伏的小山丘。山丘上的葱郁树木在昏暗中显得朦朦胧胧,分不清枝叶。衬在天边的亮光下,似娉婷的少女的背影。枝叶仿佛是她秀美的长辫,垂在腰间。</p>
<p> 我喜欢这样的夜。内心在宁静的环境中慢慢安定下来,思绪在头脑中漫游,心中的牵挂一点点变得清晰。</p>
<p> 转过一个弯,地势突然变得平坦了。山丘背后竟然钻出一丝微光。此时天已经完全黑了,窗外除了这一丝微光,什么也看不到。那微光时隐时现,穿过车窗显出淡淡的黄晕。</p>
<p> 黑夜本没什么可怕,不过这微光的出现竟让我生出一些不安。我猜不出它是什么,也不知道它有多远。这微光竟变成我心里的一份期望,想要接近它,一探究竟。</p>
<p> 车又转过一个弯,正对着那点微光前行。道路笔直,四周无物。车渐渐加速,我的心也加速跳起来。只要路的方向不变,我一定可以接近它。</p>
<p> 恍惚中,我好像睡了过去。</p>
<p> 梦中也有微光,它在我眼前渐渐放大,最后充满了整个视线,无比耀眼。之后那娉婷的少女背影出现在光源中心。</p>
<p> 她摆动长发,慢慢地转过头来。</p>
<p align="right">——2018年7月7日 夜</p>]]></content><author><name></name></author><summary type="html"><![CDATA[ 今天已经是我到内蒙古赤峰市出差的第四天了。工作进行得并不顺利。下午设备故障,工程师维修了很久才解决问题。最后完成工作时,天已经黑了。]]></summary></entry><entry><title type="html">说看就看的日出</title><link href="/2018/02/21/sunrise-on-emei" rel="alternate" type="text/html" title="说看就看的日出" /><published>2018-02-21T01:12:10+08:00</published><updated>2018-02-21T01:12:10+08:00</updated><id>/2018/02/21/sunrise-on-emei</id><content type="html" xml:base="/2018/02/21/sunrise-on-emei"><![CDATA[<p> 当我爬起床时,还不到凌晨三点。匆匆忙忙地穿好衣服后,我就出发了。</p>
<p> 前一天,我已经从峨眉山的万年车站爬到了雷洞坪。天黑之前便找了个落脚的地方,住了下来。今天我的目标便是在登顶看日出。说来真是好笑:大过年的,从我产生去成都的念头到买到车票,只用了半个小时。接着,从产生去峨眉山看日出的念头到坐上车,也只用了半个小时。当真是说走就走的旅行,说看就看的日出。</p>
<p> 初春时节,半山腰上的夜晚用春寒料峭形容再贴切不过了。即便穿上了厚厚的羽绒服和冲锋衣,也能感觉到细细的风就像一双魔手,划过脸颊,然后生生地,一点一点地将皮肤上的热量拽走。我打了个冷战,往山顶望了望,迈起了步子。</p>
<p> 峨眉山并不像华山那样陡峭,但是战线却拉得很长。从半山腰的万年寺到金顶有差不多三四十公里的路程。道路蜿蜒曲折,千回百转。抬头看,远处一闪一闪的亮光,稀疏得装扮在半空中。再仔细看,能分辨出缓缓移动的是登山者发出的灯光。而那些静止不动的就不知道是休憩的人还是星光了。</p>
<p> 从雷洞坪到金顶有大概两小时的路程。虽然不远,但是却非常难走。一方面是因为夜晚行进,另一方面是因为前一天爬了大部分的路程,休息一晚后虽然恢复了精力,但是整个小腿肌肉酸疼,十分难受。</p>
<p> 周围很安静,西风“嘶嘶”地细声吹过,卷得四周的草木“哗哗”地低语。四周黑洞洞的,手电筒照过的地方偶然会惊扰到一些小动物。不过他们在我发现之前就“哗啦”一声逃之夭夭。有的甚至反而把我吓一大跳。</p>
<p> 渐渐地,有人从我身边经过。有的还惊奇于我独自一人,停下来攀谈两句,相互叮嘱谨慎小心,然后继续前行。我有时候也从别人身边经过。一路上,能遇到形形色色的各种人。年轻的情侣们大多是男孩负重,同时还一路护着女孩;年长一些的大叔大妈们大多低头不语,看起来身手矫健,行进速度一点也不输年轻人;还有一家三口手牵手的,孩子看起来还睡眼惺忪,被爸妈一步一拽地往前走。有三五成群,欢声笑语的;有两人结伴,细声细语的;唯独不见有像我一样,茕茕孑立,形影相吊的。</p>
<p> 金顶是峨眉山的顶峰,上面有一片平地。当我到达金顶时,天还没有任何一丝要亮的痕迹。不过这里已经聚集了不少等待观看日出的人。我又往回走了一些,坐在了一个石头上,远离了大部分人群。不知是天还没亮,还是大家都期盼着日出,诺大一片地方,如此多人,竟然不觉得喧嚣。</p>
<p> 没过多久,天边就泛起了一丝鱼白,天空顿时被分作上下两半。渐渐地,细细的鱼白往上扩散、延伸。橙色的云霞也慢慢地从天地分界线中爬出来。从刚开始的模糊一片,慢慢地越来越清晰。到最后现出了云彩的轮廓。</p>
<p> 一不留神,天边已经亮堂了。远方天地相接的地方形成了明显的反差。上面的天空是一片浅蓝,下面则是昏暗一片。</p>
<p> 在一个毫不起眼的瞬间,太阳悄无声息地在云层中间探头探脑。人群中顿时引发一阵骚动,人们都在叫嚷着:“日出了,日出了!”随后,所有人仿佛是商量好的一般,又迅速安静了下来。</p>
<p> 太阳一点一点升起来,从一丝丝身影到红彤彤的圆球。天际越发明亮,太阳越发清晰。</p>
<p> 我以为我会很平静地欣赏日出,然而我分明感觉到我心里的弦越绷越紧。</p>
<p> 太阳不断升高,云层似乎再也无法束缚住它。从红彤彤的圆球中渐渐迸发出明亮的黄色光亮。太阳正不断地展示出它惊人的生命力。远远望去,太阳周边的天空也被它带着抖动了起来。很快,太阳便彻底从云层中脱身,蒸腾而上。阳光一下子洒在了山顶所有人的脸上,人群中充满了欢呼声。不远处的情侣激动得热情拥吻。</p>
<p> 这一刻,我觉得生命里一切付出都是值得的。我仿佛换了一个人一样,发自内心的开心。我好像突然重新认识了世界,对事物有了更深的理解。不知这是不是孟子所说的“浩然之气”,但是我确实感觉到内心的宽厚宏博,充乎天地之间。</p>
<p> 美好的东西真的能够让人深陷其中,流连忘返。下山的路上,我一直在问自己:上山是为了什么,下山又是为了什么?</p>
<p align="right">——2018年2月21日 凌晨</p>]]></content><author><name></name></author><summary type="html"><![CDATA[ 当我爬起床时,还不到凌晨三点。匆匆忙忙地穿好衣服后,我就出发了。]]></summary></entry></feed>