<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2025-07-07T13:38:14+08:00</updated><id>/feed.xml</id><title type="html">Bingwhispers</title><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="language-plaintext 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="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo echo 0 &gt; /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="language-plaintext 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="language-plaintext 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 &amp;&amp; codec-&gt;auto_runtime_pm)
		delay = 3000;

	if (delay &gt; 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="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/*main.c*/
#include &lt;stdio.h&gt;
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="language-plaintext 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="language-plaintext 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="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/*main.c*/
#include &lt;stdio.h&gt;
#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, &amp;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="language-plaintext 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>