我是一个 Windows 和 Ubuntu 用户,此前一直使用 KDE 桌面环境,最近心血来潮打算体验一下其他 Linux 发行版。我的第一个选择是 Fedora。之所以选择它,是因为 Fedora 的软件包管理系统与 Ubuntu 不一样,默认的桌面环境是 Gnome,与我熟悉的 KDE 也不同,总体的使用体验会有非常大的差异。
鼠标和触摸板的设置中规中居没有太多特殊点。值得一提的是,中文输入法的设置出乎意料得顺利。我只需在键盘选项中添加一个 Input Source,即可输入中文。这一点是非常大的进步,因为我知道有很多人都是在多次尝试安装中文输入法失败后,放弃在真机中安装 Linux 操作系统。虽然安装的比较顺利,但是输入法的使用体验却非常普通。首先是词语联想功能非常弱,当我打出“feichangjianjie”时,第一候选词竟然是“非常简介”。其次,我设置了每个窗口具有独立的输入源,当我以中文输入状态切换到其他窗口,在由其他窗口切换回来时,输入状态会变成英文。这实际上就变为每当我切换到一个窗口,此时的输入状态都是英文状态,完全无法保留之前的状态。
在 Setting 程序中,依次打开 System 和 About 选项,Disk Capacity 栏目中显示的是 Unknow,说明系统没有正确识别出计算机中的存储设备。不过这无伤大雅,我只有一个 SSD,并且所有挂载都正确,这里只是显示异常。
先说说性能问题把:用 Moments 套件打开相册,翻到较早的照片时,照片缩略图需要很久才能打开。看不到缩略图就很难快速找到想要的照片;使用 Video Station 串流影片时,解码能力有限,1080P 以上清晰度的影片最大只能以 720P 来解码;多个服务并发运行时,反应速度有明显降低;更换硬盘需要拆外壳,很不方便。
2017 年,我购买了第一台 NAS:群晖 DS216j。当时最主要的需求就是数据存储。文档资料、影音视频、家庭照片,这些资料随着时间的推移,越积越多。单纯使用 PC 硬盘管理资料已经无法满足需求了。我曾经考虑过在线网盘,但是大部分网盘产品都需要用户在存储容量、传输带宽和订阅费用三者间取舍。况且,虽然技术上,网盘能够很好地保证数据的安全性。但是仍然有很多非技术性因素,让我对网盘上的数据安全性充满担心——NAS 几乎是必然的选择。
DS216j 是群晖的入门级产品,价格低,最大支持两块硬盘,性价比非常高。了解群晖 NAS 的读者可能会对我的说法嗤之以鼻:DS216j 如此孱弱的性能如何称得上性价比高?这里的性价比,比的可不是性能啊。群晖“买软件,送硬件”的名号由来已久,我倒认为,用 1200 多人民币的价格,就可以用上群晖提供的绝大部分软件服务,那可谓是非常赚啦。
我为什么不攒一台 NAS 呢?作为一个软件工程师,我确实可以攒一台机器,网上也有很多自攒 NAS 的教程。但是我在这方面并不想花费太多时间和精力折腾。我需要一台运行稳定、功能成熟的 NAS。我可不想三天两头折腾宕机的 NAS,所以在这方面用金钱换时间和精力是很合算的,况且数据也是无价的。
群晖的上手非常容易。按照说明书安装硬盘、连接电源线和网线就可以直接开机了。系统安装和软件设置也是傻瓜化操作,跟着向导一路点击下一步即可。所有关键的设置项都有详细的说明,基本不会出现配置错误的情况,非常贴心。设置好硬盘、共享文件夹和用户账户,就可以从局域网中访问 NAS 中的数据了。从拆箱到基本设置完成,大概仅用了 15 分钟左右。
群晖 NAS 中运行的是 Synology DiskStation Manager (DSM) 操作系统。DSM 是群晖基于 Linux 专为其 NAS 产品开发的操作系统。DSM 中,套件(Package)的概念类似于应用程序。但是和应用程序又有一些区别。一个套件是若干应用程序、数据和配置的集合,它为用户提供了一整套完整的功能。DSM 把各种功能以套件的形式提供给用户。从套件中心下载和安装套件完全都是全自动的,即插即用,非常方便。
如果说群晖 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 的可玩性。
家庭环境中的 NAS 往往部署在局域网内,且没有固定的公网 IP。所以使用一般手段从公网访问 NAS 非常不方便。群晖为用户提供了 QuickConnect 服务。NAS 和用户通过 QuickConnect 实现内网穿透。上面提到的各种套件,都可以通过 QuickConnect 实现在公网上访问。但是由于所有的数据都依赖 QuickConnect 服务的中转。所以访问速度比较慢。
最开始,我主要是在家里通过局域网连接 NAS。后来随着越来越多的数据都保存在 NAS 上,再加上使用习惯的养成,我越来越依赖 NAS 上的服务。通过公网访问 NAS 的情况增加了,QuickConnect 已经不能满足需求了。
于是我向网络运营商申请了公网 IP。在这里解释一下,由于 IPv4 地址资源有限,默认情况下家用固定宽带服务不向用户提供公网 IP 地址,而是运营商的内网 IP 地址。如果设备位于运营商的内网中,则无法通过公网访问。主动申请后,运营商则会给用户提供公网 IP 地址。目前申请公网 IP 是免费的。由于需要频繁的访问 NAS 中的数据,NAS 的上行流量就变得非常重要了。我将原来的 200M 的宽带套餐升级为 500M,上行流量则由原来的 20M 提高到了 100M。对于个人使用来说,已经足够了。
要想顺畅地从公网访问 NAS,只有公网 IP 还不够,因为它不是固定 IP 地址。每次 PPPoE 拨号,都会从运营商获取不通的 IP 地址。群晖提供了 DDNS 服务。DDNS 服务可以把域名解析到动态变化的 IP 地址上。这样就算每次拨号获取的地址不通,也可以通过固定的域名访问 NAS。通过这些设置,之前的“泉眼无声惜细流”变成了“不尽长江滚滚来”。
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.
原本计划要在2019年多看些书,结果达成度并不令我满意。我看了《思考,快与慢》和《Harry Potter and the Philosopher’s Stone》。一年两本的阅读量明显偏少。并不是我没有足够的时间阅读,而是在一些无意义的休闲上浪费了太多时间。今年我给自己定了看10本书的目标。这是一个量化的目标,并且切实可行。通过读书,一方面我可以拓宽知识面,另一方面可以锻炼自控能力。
大部分嵌入式开发者一般都按照“编码——编译——运行——调试”的循环完成开发工作,这很可能只会用到 IAR Embedded Workbench IDE(以下简称“IAR”)极少一部分(同时也是最常用的)功能。实际上,IAR 为开发者提供了很多丰富的功能,使我们能做更多事情。
IAR 集成了“IAR C-SPY Debugger”,IAR C-SPY Debugger 里面又提供了“C-SPY Simulator”功能。它通过软件完整地模拟了目标处理器,使目标处理器的代码可以脱离硬件环境运行。这样就可以随时做单元测试而不必等待硬件环境就绪。对单元测试而言,这是一个极大的便利。顺便提一下,我使用的 IAR 版本是 IAR Embedded Workbench for ARM 8.32.3.20228。
二、创建工程
创建一个名为“test”的 C 语言模板工程,然后打开工程选项菜单,在”General Option”选项中的“Library Configuration”选项卡中,按下图所示配置。
Semihosting 是 ARM 处理器独有的特性。它能使 ARM 目标机通过调试器和主机通讯,或者使用主机的I/O设备。此功能可以单元测试程序使用 printf 等方法输出测试信息。非常方便。其他类型的处理器也会有相应的机制完成此任务。
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 的工程目录中。
在Linux man pages中,命名管道被称作FIFO。管道和命名管道都提供了单向的进程间通信的通道。管道有一个读取端和一个写入端。数据从写入端写入,从读取端读取。由于管道的特点和创建管道的方法限制,导致管道只能用于具有亲缘关系的进程之间。命名管道(FIFO)和管道非常类似。只不过它在文件系统中有唯一的文件与之对应。读取端使用O_RDONLY标志打开,而写入端则是用O_WRONLY打开。管道和命名管道只能发送无格式的字节流,并且其容纳数据的缓冲区大小是受限制的。
管道的相关API:
pipe():创建并打开匿名管道
mkfifo():创建命名管道
unlink():销毁命名管道
管道的读写操作和文件操作基本一致。不过需要注意的是,以阻塞方式打开和读写命名管道时,阻塞方式和普通文件有所区别。具体情况请参考Linux man pages。
System V实际上指的是Unix System V。这里V是罗马数字五,读作“System Five”。1983年,UNIX System V是第一个发布的商业版的Unix操作系统。随着Unix操作系统的成功,Unix中的各种特性成为操作系统界的事实标准。后来直接使用“System V”来指代此标准。而POSIX标准虽然起源于1988年,但是直到2001年才被IEEE标准委员会所接纳。Linux的初版于1991年发布,所以最早支持了System V标准。不过由于POSIX在很多地方都优秀于System V,所以POSIX标准也逐渐被大部分人接受。
按照Linux man pages的说法,System V是比较古老的接口,有很多设计不合理的地方。POSIX吸取了很多经验,提供了更加友好的接口设计。但是由于POSIX比较年轻,有些平台并没有完整的实现,尤其是比较古老的系统。
按照《UNIX, Third Edition: The Textbook》上的说法,POSIX的进程间通信是线程安全的,而System V的不是。我还未对此作验证。