Skip to main content

· 3 Minutes to read
Allen Ma

虽然 Windows 的文件管理器原生支持添加 WebDAV 文件夹,但是体验很一般。反应慢、延迟高,还仅支持 https 链接(想用 http 需要修改注册表),有时候拖拽个文件到网络文件夹都要卡上半天。

相比用原生的文件管理器、通过浏览器访问,使用第三方 WebDAV 客户端显然是一个更好的选择。有一款名为 NetDrive 的软件支持将网络文件夹映射到本地,体验就相当不错。唯一遗憾的是这款软件价格不菲,并从 NetDrive 3 开始转为订阅制。有些网盘服务本身免费,却要花费不少费用购买一个客户端,心理上难免有些不平衡。

在我犹豫是否订阅之际,RaiDrive 出现在了我的面前。

https://cdn.sspai.com/2018/11/15/7c3ea806ac878ecf0a639e531bf18a16.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

与国内用户熟知的百度云管家不同,RaiDrive 并不在独立的窗口中管理文件,而是直接将网盘映射为网络硬盘,在文件资源管理器中显示,与本地硬盘无异。这么做的好处很明显,不会占用本地空间,与软件的兼容性高,体验更友好。

只要网速足够,你可以在文件资源管理器中按习惯的方式直接管理文件;可以用 Word、Excel、Photoshop 等软件直接打开和编辑文件;可以直接查看图片、播放视频……最重要的是不必忍受官方客户端的种种限制。让云存储更贴合使用习惯。

在 RaiDrive 中添加网盘也非常方便,点击「添加」按钮,选择服务,然后登录账户就能完成添加。WebDAV 则需要输入地址、用户名、密码。

https://cdn.sspai.com/2018/11/15/43e9e682eb5295c10daed8f8b1bb7500.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

RaiDrive 支持 WebDAV、FTP、SFTP 这些开放协议,支持 Dropbox、Google Drive、OneDrive 等云盘服务。国内支持 WebDAV 的网盘数量比较少,只有坚果云可以用。如果你购买了 NAS,也可以配合 NAS+WebDAV 或是 FTP 一起使用。此外,RaiDrive 还允许添加 Google Photos 的只读映射。

作为一款第三方软件,安全性也是一个不容忽视的问题,RaiDrive 基于开源项目开发,承诺不保存用户的账号密码。RaiDrive 目前功能已经足够日常使用,而且完全免费。

你可以 RaiDrive 官网 免费下载,支持简体中文。

· 19 Minutes to read
Allen Ma

Calibre 是一款 Windows 和 macOS 端的电子书本地管理工具,在电子书方面,只有它做到了一站式的服务。

关于 Calibre 基础操作先可以看这一篇 @sainho 写的《最强大的本地电子书管理工具:Calibre 使用指南》。其中讲到了电子书的基本管理、信息修订、阅读清单等基础功能,这里总结一下——

  • 基本管理:导入、管理、编辑电子书和电子书内容。
  • 信息修订:从豆瓣、Open Library、Amazon 等网站下载抓取电子书信息,补全作者、出版社、评分等信息。
  • 阅读清单:建立虚拟书库,将想阅读的内容(包括没有的图书)制作成一份清单。

这些功能在 Calibre 中都可以轻松实现,让 Calibre 足以承担「管理电子书」这一重任。其实 Calibre 在电子书的处理方面同样完成的很棒,本文要讲的是「处理图书、优化格式、推送图书」这三个部分的内容。

处理图书

电子书的获取途径有很多,因而图书本身的质量并不能得到保障,往往会出现图书信息不全、内容排版差、不包含目录等问题。利用 Calibre 就能为原本质量低、排版差的电子书进行信息补全和重新排版。

补全图书信息

抓取电子书信息是 Calibre 的基础功能之一,默认可以从 Amazon.com、Open Library、Google 这些数据源中获取数据。

https://cdn.sspai.com/2019/10/15/a8e398d1573c444b8128cf73b08446c7.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

下载图书信息

为了提升中文书籍的检索质量,我们可以再添加一个豆瓣源,它在 Calibre 中被默认关闭。

在「右键图书 - 下载元数据和封面 - 配置下载参数」中,启用「Douban Books」后确认,再「下载数据与封面」。就能为大部分图书添加图书信息。

https://cdn.sspai.com/2019/10/15/0ad170c78581624e85a95fc4f1081b7c.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

添加豆瓣源

小部分无法被直接添加的图书,可以利用图书的 ISBN 码(国际标准书号)在豆瓣上进行搜索,来获取更为精准的书籍信息。

小知识:ISBN 码是什么?

凡是 2007 年之后出版的书,你都可以在实体书条形码位置上方看到一个 13 位的数字(之前的是 10 位),这就是 ISBN 码。

https://cdn.sspai.com/2019/10/15/d3161c281e59234d611380bdf07ea081.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

10 位的 ISBN 码 / 来自 Wikipedia

国际标准书号(英语:International Standard Book Number,缩写为 ISBN),是国际通用的图书、独立出版物的代码。一本书每发行一版,都能申请到一个新的国际标准书号(即使是平装版和精装版也不同)。你可以把 ISBN 码看作是每本书在全球范围内的身份证。

如果你在书店看到了某本感兴趣的书,就可以拍照记录下这本书的 ISBN 码,回家后再到网上寻找它的电子书购买渠道。

繁简互转插件

有时候一本较新的英文著作可能被先翻译成了繁体中文版本,而简体中文尚未出版。我们可以先购买繁体中文版的电子书,对其进行简体转换后阅读。

方法一书伴提供了一种方法,可以将一本繁体书通过查找和替换的方法转换为简体书:《电子书繁体字转简体字》,其中采用的方法是通过词库规则(查找和替换)来实现新字词、繁简对换、修改规则、重排、全词库去重。发布该方法的原贴在 2015 年就不再更新了,不过转换质量依然很高。

https://cdn.sspai.com/2019/10/15/35c26234bfd620a74afc26332f2e07c4.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

通过替换实现的繁简转换

方法二:这里要介绍的是另一种较新的方法,即通过繁简转换插件:Chinese Text Conversion 来实现。这一方法需要 Calibre 的版本在 3.37.0 以上。

首先在 Github 下载 Chinese Text Conversion - TradSimpChinese 插件的最新版本,不用解压缩。然后在「Calibre - 首选项 - 插件 - 从文件加载插件」,来加载这一插件的 zip 压缩包。

https://cdn.sspai.com/2019/10/15/adc168d5da7638d43f98f3df5fd72a72.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

通过插件实现繁简转换

安装完毕后,「右键图书 - 编辑图书」,进入编辑图书的界面。界面上方的最右侧会出现一个「文」的图标,点击图标就会显示这一插件的界面。

https://cdn.sspai.com/2019/10/15/2d250f9ac57e1f18ec58f302a23b3e29.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

插件包含多种转换方法

插件的选项分别对应繁体转简体、简体转繁体、繁体转繁体等。针对香港、台湾的繁体还有特定的优化,还能将所有的引号 “ ” 转换为直角引号「」。最后一项要选择 Entire eBook 来转换整本书,转换完成后关闭窗口即可。

https://cdn.sspai.com/2019/10/15/aeb7e8bacde24b9d8bcd31a9acd5f881.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

支持引号转换

这样就可以完成繁体简体书的互相转换,两种方法都能很好地实现。第二种方案较新,更推荐一些。

优化样式

Calibre 的格式转换功能也非常强大,能够将常见的 epub、azw3、mobi、docx、txt、pdf 等格式的电子书互相转换。这一点在很多文章中都有提及。

不过在默认情况下只会对格式进行转换,不会对内容、行间距、目录等内容进行优化。我们可以通过一些手段来获得更好的阅读体验。这里主要讲讲目录的添加和图书的样式。

添加可跳转的目录

上面添加了图书信息,就相当于为这本电子书添加了封面和简介。但这还不够,我们需要为电子书的内容进行一些改进。

最典型也是最原始的电子书有不少是 TXT 格式,由于纯文本格式的限制,通常不包含内容之外的其他信息。行间距、显示效果之类的倒是还在其次,毕竟可以用阅读软件进行调整。而目录的缺失则是一个严重的问题,毕竟没有目录就不能跳过某些章节,只能手动翻页。

https://cdn.sspai.com/2019/10/15/0a46fc21eb07102d091a968c4f7a2e54.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

查看标题规律

为了解决这一问题,我们需要先找到书内标题格式的一些规律,比如——

  第一章  夏洛克·福尔摩斯先生
第二章 演绎法
第三章 劳瑞斯顿花园街的惨案
……

因此,我们可以使用正则表达对这些章节号进行替换,但在 Calibre 中无法直接编辑 AZW3 或 EPUB 格式以外的格式,而我们又想借助 Calibre,为 TXT 文件添加目录,这应该怎么办呢?

思路也很简单,Calibre 在转换格式时能够识别特定的 HTML 标签,将其作为目录 TAG。最简单的自然是 ### 这类 Markdown 中用来表示一级二级目录的符号,Calibre 会将其识别为 h1、h2 标签。因此只要在每一章标题的前面加上这些字符,就能让 Calibre 完成自动添加目录的工作了。

首先我们需要一款支持正则表达式替换的编辑器,代码编辑器可以很好的胜任这项工作,比如 NotePad++、Sublime Text 等(尽管 Calibre 提供了正则搜索替换功能,但无法保证输出结果是正确的,在编辑器中修改最直观)。

https://cdn.sspai.com/2019/10/15/695fe0bb6330534aca635d52124caecc.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

正则表达式转换

以 NotePad++ 为例,首先按下 Ctrl + H 打开文本替换工具,界面中启用「正则表达式」。然后进行以下操作——

  • 查找目标: ^第(.*)章
  • 替换为: ## 第\1章

然后点击「全部替换」,就能将 TXT 内所有以「第X章」开头的文本,替换为「## 第X章」。其中 X 即为 (.*) 的内容;\1 指的是「第几个(.*)的内容」,如果有多个,则依次是 \2\3……

以此类推,如果文章中还有「第一卷」之类的一级标题——

  • 查找目标: ^第(.*)卷
  • 替换为: # 第\1卷

或是「第一卷 第二章」之类的长标题——

  • 查找目标: ^第(.*)卷(.*)第(.*)章
  • 替换为: ## 第\1卷\2第\3章

用这些方法实现替换后,我们就为 TXT 添加了目录 TAG,接下来要做的事情就简单很多,把处理完毕的 TXT 添加到 Calibre 中,然后「右键图书 - 转换图书 - 逐个转换 - 目录内容」。选择右上角的输出格式,通常选择导出为 Epub 和 mobi 格式。

https://cdn.sspai.com/2019/10/15/d7ad3cb193370550681713ff72225142.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

Calibre 中添加目录

然后点击右侧的图标,选择需要匹配的 HTML 标签名为 h1、h2,对应为一级标题和二级标题,然后转换。(这里 Calibre 采用的是 XPath 查询语言,更具体的用法可以在《Calibre 的 XPath 教程》中学习。)

确认后点击确定,就可以为电子书添加可供跳转的目录了。

https://cdn.sspai.com/2019/10/15/cd65a8bc39d59e0add4eb203640e6980.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

可供查看、跳转的目录

优化图书样式

搞定了图书的目录,接下来就想想怎么把图书做得更美观吧。要知道,有不少电子书并没有考虑到读者的感受,把字排列的密密麻麻,看一眼都让人犯困。

首先选中图书,「右键图书 - 转换书籍 - 逐个转换」,进入 Calibre 自带的格式转换界面。我们需要进行这些调整——

  1. 勾选「界面外观 - 文本 - 规范标点」。
  2. 分别勾选「界面外观 - 布局 - 删除段间空行」「在段落间插入空白行」,右侧的缩进宽度、行间距可以略高一些,比如 2.0 em 和 1.0 em。
  3. 在「界面外观 - 样式」中,为电子书加上 CSS 样式。把 CSS 文本直接复制进文本框即可。

https://cdn.sspai.com/2019/10/15/3445b408e62e559044c025e153ff8dc3.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

  1. 除了排版糟糕之外,还有一些网络小说可能会出现无故换行、无故空格、标题不规范等情况(TXT 常见)。那可以在「启发式处理」中启用「智能处理」,看看能否解决这一问题。

https://cdn.sspai.com/2019/10/15/f124fd29b0fe451503cdc1162692267f.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

未经优化、优化后的样式

CSS 样式部分其实灵活性非常高,因为它可以控制书中几乎所有的元素和显示样式。关于 CSS 样式的选择,这里要推荐一下 @Minja 的 《简单又好看,你的 Markdown 文稿也能加上个性化主题》,提供了五种好看的 CSS 样式,本文使用的就是其中的「少数派经典 CSS」,点击可以直接下载。

如果你不满足于现有的 CSS 样式,还想修改字体,可以看看@PlatyHsu 的《无需越狱,中英混排的 Kindle 电子书也能拥有好看的排版》。

还有很多文章中提到了要选择「输出配置文件」,但其实这一配置文件主要是针对屏幕大小对图片进行缩放,除非是 PDF 文件,否则多数情况下几乎没有必要刻意修改它,也不必为不同的设备区分配置文件。

推送图书

完成了内容的处理和格式的转换,接下来就应该将电子书发送到各种设备上了。

将电子书推送到 Kindle

Kindle 是专用的阅读设备,Calibre 提供了两种方法将图书发送到 Kindle。

方法一:通过邮件。Calibre 提供利用邮件发送图书的功能,在上方选择「连接/共享」。我们需要对其进行一些设置,上方填写 Kindle 的接收邮箱,下方填写用于发送图书的邮箱。邮件服务器的配置信息各不相同,你需要在各大邮件服务商的说明中寻找。

以 Outlook 邮箱为例,主机名为 smtp-mail.outlook.com 端口 587 加密类型:TLS ,然后测试邮件推送,如果提示「邮件已发送」说明推送成功。

https://cdn.sspai.com/2019/10/15/2e7c7a520ea632805a8f1e6239dc5b73.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

邮件推送设置

方法二:通过数据线。数据线传输更是方便,在将 Kindle 连接到电脑后,Calibre 上方会出现一个「发送到设备」的按钮,点击即可将电子书发送到 Kindle。

值得注意的是,Kindle 不支持 epub 格式的图书,这给我们多少带来了一些麻烦。因此在发送之前要注意将图书转换为 mobi 格式。

将电子书分享到局域网

在 Kindle 之外,iPhone、iPad、Android 等设备对网页、局域网支持良好,不必通过邮件、数据线等方式实现。除了使用方法一样的数据线法以外,Calibre 还可以用内容服务器的方法,在移动设备上获取电子书。

在 Calibre 中「链接/共享 - 启用内容服务器」,会得到一个 IP 地址和端口,比如 192.168.1.188:8080

在移动设备上打开浏览器,在浏览器中输入192.168.1.188:8080,就可以看到由 Calibre 创建的分享页面。

https://cdn.sspai.com/2019/10/15/aa61458f88d86f55a4278dd907be190f.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

通过内容服务器分享

将电子书批量传输

以上两种方法都依赖于 Calibre,其中第二种内容服务器的方法只适用于少量图书的分享,不能批量操作,是个比较麻烦的问题。

因此这里给出第三种方法,那就是通过手机端的第三方应用开启 WebDAV 服务,再将图书批量上传到手机端。这一方法在手机端的 Documents、多看阅读(被称为 WiFi 传书)中均能实现,主要操作是找到软件中的 WebDAV 服务设置,将其开启后,在电脑端浏览器中打开这一链接,输入相应的账号密码,就能对应用中的文件进行上传和下载。

这在《用好 WebDAV,我是如何在 Windows 和手机之间传输文件的 | 工作日志》中有较为详细的说明。

https://cdn.sspai.com/2019/10/15/3529cee6a470f67b31441cecdf365c5d.jpg?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

通过 Documents 传书

在传输时可能还会遇到另一个问题:无法直接从 Calibre 中拖拽图书。这是因为 Calibre 对图书的组织形式不同,你需要首先在 Calibre 中选中你想要传输的图书,「右键 - 保存到磁盘单个目录」,这样才能一次性将特定格式的电子书传输到手机中。这样书籍的名称会正常显示中文,而不是显示拼音,因此这一方法也是比较推荐的方法。

总结

本文介绍了电子书处理的整个流程——处理图书、优化样式、推送图书。每个步骤中都有一些能将任务完成得更好的小技巧,比如繁简转换、为 TXT 添加目录、批量传输到手机等。

Calibre 本身功能非常强大,但由于界面设计的原因,很多功能被藏在了软件的背后,一些有用的设置也未被标记出来,经过这些调整之后,可以解决不少电子书处理方面的问题。

· 27 Minutes to read
Allen Ma

很多读者提到过一个问题:如何在各个设备间传输文件,但是无论讨论多少工具,这类话题往往会被「微信」和「QQ」给终结。为什么专业的文件传输工具却比不上两款聊天软件?究其原因,这两个聊天工具胜出的原因有两点——常驻后台、内外网通用。

但实际上这两款工具有不少的限制,微信发给手机的文件大小不能超过 100MB,QQ 上传大文件的速度也比较慢。而且从安全和隐私的角度来讲,在外网传输文件时会经过腾讯的服务器,一想到自己的文件也许在不经意间向服务器上留了一份档案,总觉得有点不适。

在使用微信和 QQ 之余,能不能有什么方法,起码在内网实现安全快速的传输呢?macOS 和 iOS 环境下,内网有 AirDrop,外网有 iCloud,本身的体系足够完善;Windows 环境下也有 OneDrive 作为文件存储服务,但近距离分享、内网分享文件就稍显逊色,需要借助一些第三方的工具才能实现。

https://cdn.sspai.com/2019/04/09/84b6600cc8e99d7053ab9a6f378658dc.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

今天就来讲讲我在 Windows 和手机之间的文件互传方案,实现更快速更高效,且不限容量的内网传输方法。当不在局域网内时也能用云盘实现文件双向同步。

在这些方法之外,还需要注意的是文件的传输逻辑,临时处理一下的文件、需要保存在手机上的文件、需要自动同步的文件,我会讲讲我是如何理解这些文件传输方案。最后给出一些在 Windows 上优化 WebDAV 使用体验的方法。

注:下文讲解的方法将以 Windows + iOS 为例,但同样适用于 Windows + Android。

传输文件的思路

在不同的设备上传输文件的软件有很多,传输思路可以分为两类:无线传输有线传输。无线传输分为蓝牙、局域网、广域网,有线传输则可以通过 USB 直传、软件传输、U 盘传输。

对于 iOS 设备而言,有线连接需要安装 iTunes、驱动、第三方软件,否则 USB 直传只能传输照片。无线传输方面,蓝牙不能直接传输文件(AirDrop 除外)。所以这些方式不作考虑,最方便的方案当属无线传输方案了,分别是——

  1. 局域网传输:在同一个路由器下传输文件。优点是传输速度快,信号好时可以达到内网满速传输(取决于路由器);缺点是两个设备必须在局域网内才能传输。
  2. 广域网传输:QQ、微信、iCloud、各种云盘都属于这一类工具,文件通过服务商搭建的服务器,传送到另一个设备上。优点是随时随地可以传文件;缺点是会经过服务器,速度由这些工具决定,不适合传输大文件。

https://cdn.sspai.com/2019/04/09/e585806a21f3511b6460d84d50e59223.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

这 2 种方法有各自的优势和缺点,相比之下,广域网传输并不可靠谱,而局域网传文件则没有那么普及,本文就来讲讲我通过局域网 + WebDAV 传输文件的方法,顺便讲讲如何通过支持 WebDAV 的网盘实现相对稳定的双向同步。

如何用 WebDAV 传文件

局域网传输文件的方法其实有很多,通过 WebDAV、FTP、SMB 等传输协议都可以传输。其中 WebDAV 协议是在移动设备上最易于使用的一种。不仅启用和关闭很方便,在另一台设备上只需一个浏览器就可以访问,不需要安装多余的应用。自然成为了首选。

想要通过 WebDAV 传输文件,需要让一台设备搭建 WebDAV Server 变身为「服务器」,让另一台设备访问它。这样,两台设备就能建立连接,相互传输文件了。

这里有两个要点:如何搭建 WebDAV Server、如何访问它。看上去很麻烦,实际上这两个步骤已经有不少工具可以替我们做到了。

选择支持 WebDAV 的工具

由于 iOS 自带的文件管理工具 Files 并不支持 WebDAV 等文件传输协议,所以我们需要安装一个可以提供 WebDAV 的工具。如今已经有许多应用已经支持在应用内启用 WebDAV Server 了——iOS 的文件管理器 Documents by Readdle、阅读应用多看阅读、视频播放器 nPlayer 都可以实现在手机上一键开启 WebDAV Server。开启后,局域网内的其他设备就可以通过 WebDAV 访问到它。

https://cdn.sspai.com/2019/04/09/c6d78a3d63d8d33b12668750fd6df32e.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

传输文件的方式

接下来我们以 Documents 为例,来讲解三种通过 WebDAV 进行文件传输的方法。

Documents 本身是一款功能强大的文件管理器,能够实现解压缩、添加云端设备、下载文件等操作。在传文件方面提供了多种文件传输方式:启用 WebDAV Server 传输、扫码传输、网盘双向同步等。

手机开启 WebDAV Server、扫码匹配

Documents 提供了两种内网传输的方式,在设置中启用上面提到的 WebDAV,并在 PC 端访问设备的 IP 地址,就可以连接到 iOS 设备上。

https://cdn.sspai.com/2019/04/09/25b560c622d4cbf244ac05ccb88fabf0.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

具体操作:

  1. 在 Documents 的「设置 - WebDAV」中设置用户名和密码,点击「开始 WebDAV」启用 WebDAV Server。

https://cdn.sspai.com/2019/04/09/c66bc8b518dce9e080cfd7d436dbb60f.jpg?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

  1. 启用后会出现该设备的内网 IP 地址:192.168.XXX.XXX。在 PC 设备上输入该设备的 IP。
  2. Documents 会有一步特殊的验证步骤,需要填写验证码,确认是本人操作。就可以访问到 Documents 中的文件了。

https://cdn.sspai.com/2019/04/09/b8eb052c30aea5c8bd2dec6de02578d8.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

除了手动启用 WebDAV 在另一台设备上访问,Documents 还提供了另一种快捷的方法来建立内网连接,那就是扫码匹配

具体操作:

  1. 打开 Documents 的「服务 - Wi-Fi 传输」功能。
  2. 根据提示,在 PC 端访问 https://docstransfer.com 这个网址,用手机扫码后就会在两台设备之间建立连接。

https://cdn.sspai.com/2019/04/09/27f4957dbbfd6c94b82c5a8efc217473.jpg?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

通过扫码连接后的地址,我们会发现其实仍然访问到了内网 IP。网站上的二维码是一串以 rdwifitransfer:// 开头的 URL Scheme,我猜测后面的代码是加密过的 PC 设备 IP,从而让这两台设备建立起连接。思路有所不同,但实现的结果是一样的。

PC 搭建 WebDAV Server

既然能在手机上创建 WebDAV,那能不能在 PC 端创建 WebDAV Server 来让手机访问呢?当然可以,而且 Windows 内置了这项功能。只不过操作起来比较麻烦,多达 11 个步骤,需要开启 IIS,并手动设置、分配权限。

https://cdn.sspai.com/2019/04/09/8934df099801e0bc091bb77bd503e72a.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

具体步骤:

  1. 在 PC 设备上,打开控制面板,进入「程序 - 启用或关闭 Windows 功能」。
  2. 找到「Internet Information Services - Web 管理工具」和「万维网服务」项。启用其中的「IIS 管理服务」「 IIS 管理控制台」「Windows 身份验证」「WebDAV发布」「目录浏览」这五项,并确定安装。
  3. 完成安装后,你会在开始菜单的「Windows 管理工具」中找到新增的「Internet Information Services」工具,打开。
  4. 在 IIS 管理器中,右键「Default Web Site」,打开「添加虚拟目录」界面。选择一个路径,并命名一个别名。访问时别名会作为 URL 的一部分。
  5. 选中虚拟目录,进入「WebDAV 创作规则」,在右侧选择「添加创作规则」,直接确定。
  6. 选中虚拟目录,进入「身份验证」,启用「Windows 身份验证」。
  7. 选中虚拟目录,进入「目录浏览」,在右侧点击「启用」。
  8. 选中「Default Web Site」,进入「WebDAV 创作规则」,在右侧选择「启用 WebDAV」。
  9. 右键「Default Web Site - 管理网站 - 重新启动」。
  10. 在 PC 端浏览器中输入 http://127.0.0.1/虚拟目录名称http://localhost/虚拟目录名称/ 就可以访问 WebDAV服务器中的内容了。
  11. 想通过手机端访问,你还需要在命令行中输入「ipconfig」命令,来查看 PC 设备的内网 IP。然后在手机端的 Documents 访问 http://内网 IP/虚拟目录名称,比如 http://192.168.1.109/虚拟目录名称 来建立连接。

https://cdn.sspai.com/2019/04/09/95abc6bf43861187e0ca0c53771253e3.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

步骤中有一步是「添加虚拟目录」,实际上就是让你选择「需要通过 WebDAV 共享的文件夹」。

由于这一套流程是固定的,为了不让图片占据太多篇幅,这些步骤你可以在 @Vasilisyl 的 CSDN 博客 找到更详细的图文版。搭建完毕之后,局域网内的其他设备都可以通过 WebDAV + IP 地址的方式来访问 PC 设备上的「虚拟目录」文件,只有当 PC 开机时才能访问。

在 iOS 设备上添加 WebDAV 服务器的步骤下面就会提到。

双向同步:像 iCloud 一样用 WebDAV

iCloud 一直有一个令人羡慕的功能:让桌面、文档文件夹在多个设备之间同步。其实这并没有太大困难,只要有了对应的工具,我们也可以很容易做到。

这一步用到了外网传输,需要其他网盘提供商为我们提供中转服务。iCloud 是苹果提供的功能,Windows 设备无缘享受,我们可以用微软的亲儿子 OneDrive 来实现。如果要在一众网盘中挑选,我比较推荐的两个服务是 Dropbox 和坚果云。坚果云除了自己的客户端之外,还可以通过 WebDAV 来串联各种服务。

https://cdn.sspai.com/2019/04/09/a30ed37535ff9a534b775d1bb405be42.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

以坚果云为例,首先需要让 PC 端的文件夹实时同步到坚果云中,然后在手机端用 WebDAV 建立起同步连接。这样就能实现文件的双向同步。

连接之前,要先到「坚果云的网页版 - 账户信息 - 安全选项 - 第三方应用管理」中,创建应用授权码,来保证账号安全。然后将桌面文件夹设置为同步文件夹,等待文件上传到服务器。再进行下面的操作。

具体操作:

  1. 在 Documents 中的「服务 - 添加账号 - WebDAV 服务器」中输入坚果云的 URL、用户名、授权码,建立起连接。
  2. 进入服务器,选择桌面文件夹后的「…」,点击同步,就能让两边的文件通过坚果云双向同步。

https://cdn.sspai.com/2019/04/09/77110a8c787875fe49de10775453a161.jpg?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

这套操作也适用于 OneDrive、Dropbox、Google Drive,以及任意一款支持 WebDAV、FTP、SFTP 的网盘工具。比如我自己就是用 NAS 开启 WebDAV Server 来实现多个设备同步的。

我的文件传输逻辑

学会了上面几种通过 WebDAV 传文件的方式,再来看看我对文件传输的理解。

在多个设备上管理文件时需要有一个基本认识:将主要存储文件的设备作为主要设备,其余设备均为附属品。文件在发送到附属设备上时,最好在主要设备上保留一份。这样,当你在附属设备上将文件处理完毕后(包括处理完毕后发送回主要设备),就可以没有后顾之忧地删除这份文件。

传输临时文件

在 PC 和手机设备的关系中,我们倾向于将 PC 作为主要设备,手机属于附属品。在这套逻辑下我们不必在手机上建立一个完整的文件管理系统,只需要「能够处理文件」即可。平板设备亦然。

在这层关系下,不必考虑文件的后续留存,只希望以最快的速度将文件从一个设备复制到另一个设备,处理完毕后及时发送回来即可。这套流程是「传输、处理、回传」,内网传输就是一个方便的途径,扫码传输是我的首选

https://cdn.sspai.com/2019/04/09/a875570841c077efa7575a1a2c02f07b.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

比如当我想对一份 PDF 进行手写签字时,我的第一反应是打开 PC 端的文件传输页面,并打开 iPad 的 Documents 进行扫码(传输)。等 PDF 传输完毕后,在 iPad 端进入 GoodNotes 签字(处理)。之后把文件重新发送回 Documents,PC 端下载这份签完字的文件(回传)。此时 iPad 起到了一个「签字板」的作用。

再比如我想在 iPhone 上截图并套壳后发送到 PC,我会先在 iPhone 上完成截图、套壳处理(处理)。然后到 Documents 中启用 WebDAV Server,用 PC 访问后就可以直接看到 iPhone 中的相册并下载截图(回传)。

凡是需要一次性传输就可以删除的文件,压缩包、视频、图片、PDF 这些都可以算作属于临时文件。适用于这套「传输、处理、回传」的流程。

传输存储文件

除了上面这种把移动设备作为纯粹处理工具的做法之外,还有一种是需要留存到移动设备上的。比如希望在 iPad 上读书、做笔记,阅读完毕之后再将笔记发送到 PC 归档。这种情况下,传输文件的思路是否有所变化呢?

主要文件的传输思路是「传输、存储、处理、回传」。这里看上去只是多了一个「存储」的步骤,但为了实现这一步,让我们传文件的思路也发生了一些改变。

在 PC 和 iOS 设备的关系中,iOS 的文件管理格局和 Windows 是有很大区别的,应用文件的不互通,让用户难以将所有文件很好地组织起来。所以,如果你希望将 iPad 作为主要设备,就应当避免同类型的文件分散在多个应用中,需要在 iPad 上确立几个主要文件类型的处理工具

https://cdn.sspai.com/2019/04/09/8fd60b985d7377f68e4513b6c25a16fe.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

比如查看、编辑 PDF 文件,我会选择只用 GoodNotes 一款工具,而不会想着同时用 PDF Expert 和 Notability 几种工具混合使用。视频文件只用 nPlayer、阅读器只选多看阅读……以此类推,给常用的文件类型都找到一个合适的查看编辑工具。在这些确定好的工具中存储数据。这样在希望回看某个类型的文件时能够方便地找到它。

这些主要文件类型的处理工具,除了本身需要有很高的质量,还需要挑选那些支持 Wi-Fi 传输的应用,比如 nPlayer、多看阅读这些工具吸引我的一点就是支持 WebDAV 传输。

那些不支持 Wi-Fi 传输的工具,也应当选择支持「导出到其他应用」功能的应用,比如 GoodNotes 支持多种格式导出、多看阅读支持将笔记导出到印象笔记。

像 iBooks 这类苹果自家的应用则几乎不支持导出书籍和笔记,这类应用希望将你捆绑在它的生态圈内。除非没有替代品,我一般不会考虑使用这些应用。

此时,传输文件的操作就分散在了不同的应用之中,比如用 nPlayer 传输视频,用多看阅读传输书籍……他们都是使用 WebDAV 作为协议的,使用思路和前面没有太大的区别,你仍然可以在这些应用中顺畅地传输文件。

自动同步文件

自动同步文件这种情况比较实用,在两台设备上协同处理文件。因为我们没办法做到每时每刻都记得要传什么文件到手机上。比如在家里写了一半的文稿就去赶火车了,往往会懊恼忘记把文稿传到手机上继续写。

这种情况就要用到上面提到的「双向同步」了,将文件通过网络存储到服务器中,在手机上同步下来编辑,接着自动同步回服务器,下次打开电脑时就会自动更新文档了。

https://cdn.sspai.com/2019/04/09/01b179e823c8296d216e2dbe6bc8a7c3.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

这个操作在云盘服务商的 App 中就能够实现,但我使用的是 NAS 自带的 App,其中无法直接编辑文本,所以我选择在 Documents 中使用 WebDAV 进行同步操作并编辑文本。这个操作也属于我文件传输逻辑中的一环。

当然,你也可以使用「Windows 上搭建 WebDAV Server」的方法,但由于只能在局域网内生效,需要在 PC 开机状态下,打开手机上的 Documents 来同步一次文件。否则双脚迈出了家门就无法同步了。

识别内外网的传输工具

最后这类是以 Send AnyWhere 为首的文件传输工具,它的优点在于通过 PIN 码自动识别内外网设备。实现不同网络下采用不同的方式传输。但由于通过外网传输时,国内传输速度被限制的很严重,往往需要上传很久,在 PC 端下载时也需要下载很久。出现了「外网传输速度慢,内网传输用不上」的尴尬局面,所以我在尝试了一段时间之后还是放弃了。

但这类工具的未来是很有市场的,因为这样的工具不需要用户搞清楚什么是内网外网,什么是 WebDAV,什么是传输协议,只要上传和下载就完事了。只是目前的市场还不足以孕育出国内的 Send AnyWhere,最接近 Send AnyWhere 的竟然就是 QQ(能做到内外网识别),所以也应该正确看待 QQ 的传输功能,将其作为传输体系的一部分。

PC 端体验优化

最后的这部分是 PC 端的优化,这是为了在 PC 上传输文件时能有更好的体验。

当我使用局域网传输临时文件时需要访问浏览器。Documents 提供了一个网页版的交互界面,只是在浏览器中操作并不方便,不支持拖拽修改文件,复制粘贴也不太符合 Windows 的逻辑。不同的应用有不同的网页交互界面。

https://cdn.sspai.com/2019/04/09/8c572535958e1a42c42913e88c00a865.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

由于 WebDAV 是标准传输协议之一,既然应用自己做的网页版不方便,那我就用一些工具,将 WebDAV 改造成一个本地硬盘。我们可以用一款免费的磁盘映射工具 RaiDrive 来管理手机上的文件。

这里还会遇到一个问题,由于多数路由器会采用 DHCP 来分配内网的 IP 地址,手机每次接入 Wi-Fi 时,它的 IP 地址都会改变。

https://cdn.sspai.com/2019/04/09/e1a6e81bb139e7cb86fbbcdde4bb640e.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

在路由器中绑定 IP 地址

为了解决它,我们可以在路由器中将 iOS 的 MAC 地址和内网 IP 绑定,使得手机的内网 IP 地址保持不变,比如固定为 192.168.1.103。

最后,在 RaiDrive 中设置手机的 WebDAV 的路径:192.168.1.103:80(http 的默认端口为 80,https 为 443)、用户名、密码。在需要传输文件时就可以一键连接到手机,并在文件管理器中像处理本地文件一样对手机上的文件进行处理。同样,你可以给 iPad 也设置一个固定的内网 IP。

https://cdn.sspai.com/2019/04/09/7f28168d4f1869c5ec5e54d783299f64.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

不过这个方法不适用于照片管理,Documents 用了特殊的方法让用户能够在浏览器中直接管理手机照片,这不属于 WebDAV 的一部分,想管理照片还是得去网页版。

总结

微信、QQ 这类社交工具占据了绝大多数工作场景。小文件用微信传一下似乎变成了一种不言自明的默契,尽管大家都知道微信的桌面版有多难用,但为了避免发送接收双方的麻烦,还是不得不用。 偶尔会有朋友向我抱怨用 QQ 上传一个文件为什么这么慢。我认为,很多人用 QQ 和微信可能并不是觉得它们最好用,而仅仅是因为「方便」和「不折腾」,在传输小文件时,使用这种方法无可厚非。

但在局域网环境下,文件传输体验还是有优化空间的。通过本文给出的方案,每个人都能轻松实现更快的传输速度、更好的传输体验。作为 QQ 传输的补充。

别看文章这么长,实际操作部分其实可以概括成「下应用、开 WebDAV、开浏览器」这么简单。重要的是文件传输的思路,为何要传输到移动端,怎么传输更快更好,传输后怎么管理,这才是本文的重点。

· 26 Minutes to read
Allen Ma

NAS 通常被称作家庭存储服务器,全称是 Network Attached Storage(网络附属存储),它的作用是让本地文件获得网络的加持,从而将「存储」与设备分离,起到扩大设备容量的作用。「家庭」二字更多的是 NAS 适用的场景,而不是它最初的含义。

人们在介绍时为了简单起见,通常会把 NAS 和网盘进行比较,以突出它的种种优势:又是私有云,又是个人数据中心,又是家庭影音中心……光看描述早就把网盘甩开了几条街。

但在购买 NAS 之后,很多人发现 NAS 好像不是「网盘」那么回事,NAS 在日常体验上与网盘有所差异,在高级功能上也需要做不少配置;而那些网盘自带的功能,在 NAS 上又有着截然不同的实现方法。总之在实际使用时,NAS 与网盘的用法相去甚远

https://cdn.sspai.com/2019/11/26/9e61392151faf10b27a9b27524b55ab1.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

NAS 并非十全十美

其实 NAS 的基础功能很纯粹,就是通过网络存储文件,其次才是更高级的定制功能,也没有网上吹的那么神。这就回到了很多人在购买 NAS 之前提的问题:「NAS 和网盘有什么不同?」

今天就结合实际,来给大家讲讲 NAS 具体和网盘有哪些不同,不夸大 NAS 的真正作用,也不贬低网盘的实用性,为还在考虑购买 NAS 的朋友排排雷。

NAS 打破网盘的订阅形式

我们从购买 NAS 之前开始讲起。

购买 NAS 和购买网盘服务不同,NAS 动辄上千元的机器加上数百元的硬盘,如果折算成网盘订阅费用,至少能购买 3 年以上的国内网盘会员。从性价比的角度考虑,并不划算。那为什么还是有人愿意购买 NAS 自己折腾呢?

许多购买 NAS 的用户通常是不愿意忍受网盘的种种限制,比如容量限制、速度限制、分享限制、功能限制等等,但无论是国内还是国外的网盘,这些限制往往都可以通过购买更高级的套餐解决,Dropbox 是这样,百度网盘也是这样。而国内厂商在前期画的饼太大,为了给 VIP 用户提供更好的服务,就只能尽可能压榨免费用户的体验,限制种种功能。

另一个选择 NAS 的原因在于网盘的不确定性。网盘的运营势必需要大量的服务器来维持,因此绝不可能提供买断制,只能以订阅的形式进行付费。但网盘不同于普通工具,时间越长,迁移所需的成本就越高。举个例子,微云前段时间停止对超过 10 GB 的免费用户服务,逾期还会冻结账号,我想把当初保存的数十 GB 的陈年老照片下载回本地都花了几天几夜。如果哪一天你不再续费正在使用的网盘服务,文件恐怕就不再是自己的了。

https://cdn.sspai.com/2019/11/26/5376bdfc3f6b227817e90303cc2635e7.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

如果拿买软件类比,购买 NAS 机器更像是一种「买断制」,你存在 NAS 中的每一 Bit 数据都能被你掌控,NAS 本体和数据永远属于你自己。当然,买断硬件会比订阅贵上许多。

可以说,NAS 和网盘走了两条截然相反的发展路线,NAS 和网盘之间的分歧其实在一开始就出现了。

NAS 容量带来的消费升级

接下来的一个重要节点,是下定决心购买 NAS 后

原厂 NAS 通常不配备硬盘,需要单独购买。购买硬盘实际上就是购买容量,以目前市场价 1 元 5~10 GB 的机械硬盘价格对 NAS 的容量进行提升,提升至 3 TB 需要 350 元左右,比大多数网盘一年的订阅费要贵(这还没算上机器本身的费用)。

有了 NAS 之后,你会变得更愿意把大型文件存进 NAS,并且更热衷于下载文件、备份文件,再加上内网传输效率的提升、版本控制的加成,容量的消耗速度会比网盘快得多,不久之后,你可能就需要购买第二块甚至第三块硬盘了。NAS 还有盘位限制,如果想为插满了盘的 NAS 升级,还得替换掉其中一块,成本会进一步提高。

https://cdn.sspai.com/2019/11/26/eaef9ef373f9686149d0a015bab52c21.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

这么一算,你在获得更大容量的同时也在以更高的价格存储文件,这就是 NAS 带来的消费升级。因此想通过购买低价 NAS 来省网盘订阅费的朋友恐怕要打消这个念头了,毕竟无论多便宜的 NAS,加上一两块硬盘后都会比网盘更贵。

不过这并不是在贬低 NAS,相反,尽管价格比网盘贵了不少,但你也因此获得了远超网盘的存储空间,NAS 的使用寿命也就越长,这就是 NAS 的优势。

所以结论是,为 NAS 扩容所需的消费可能比网盘更高,但能获得庞大的容量

NAS 与网盘的功能异同

在完成机器和硬盘的购置后,你一定满心欢喜,想让 NAS 变得无所不能,研究各种离线下载、影音中心、远程控制、智能家居、博客搭建……这些功能都属于 NAS 的功能范围之内,网盘显然不能完成这些工作。这就是它们在功能上的区别。

直观地说,NAS 的使用逻辑是「需要什么就自己配置」,网盘的使用逻辑是「需要什么功能,等我给你做」。因此可扩展性成为了 NAS 不可或缺的标签之一,但也让用户承担了更多的学习成本

NAS 本身是一个类似服务器的服务端设备,虽然多数 NAS 为零基础的用户提供了易于使用的可视化界面,但在权限管理、套件安装、服务配置方面仍然需要花一段时间摸索和理解。

https://cdn.sspai.com/2019/11/26/1dd82cdde01ec5c16356d2d041828e74.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

举个例子,仅从文件管理的角度来看,群晖提供的文件管理服务:Drive,它提供的桌面客户端,更像是一个 Dropbox、坚果云式的「同步客户端」,而非百度网盘式的「网盘客户端」,这增加了普通用户的理解成本。在使用 Drive 之前,你还需要在服务端手动安装这一套件,牵扯到「为文件夹分配权限」「设置用户配额」「让特定用户组可以访问该文件夹」等等操作,更别提 NAS 提供的 SMB、NFS、AFS 协议,以及 FTP、SFTP、FTPS 之间的区别……这些还只是基础中的基础,为了达到最好的体验,你可能还需要了解这些传输协议哪个最快、哪个最安全、哪个兼容性最强、哪个适合外网传输……最后实现的效果,可能和坚果云在「我的电脑」里创建的快捷启动图标没有太大区别。这增加了用户的学习成本

但这一切都是有意义的,因为配置完成后的 NAS 能让你在局域网内满速传输文件,也能让你时时刻刻满速同步文件,还能保存超多的历史版本。但配置不佳时,仍然存在不稳定、不安全的因素。所以在辛苦但有价值的折腾之后,你获得的回报便是远超普通网盘的体验。

其实在 NAS 上搭建的每一种服务都是这样,像是影音中心这种功能在市面上少有替代品,利用 NAS 就能为你提供更好的服务。而离线下载、RSS 阅读等功能如果配置不好,不仅费时费力,最终体验可能还不如市面已有的服务。

NAS 给你提供了更自由的配置方案,而网盘提供了更成熟的解决方案。

NAS 在 iOS 上的表现不佳

NAS 的功能是极度依赖 NAS 厂商和第三方软件开发商的,如果 NAS 厂商做得好,第三方开发商就会愿意为它开发服务端工具,NAS 可用的配套应用也就越丰富。但 NAS 的应用更新总是比网盘要慢一些,用户也只能等待官方修复问题或增加功能。

我曾一度想在 iOS 上实现 NAS 的文件夹同步功能,这样我就能在 iPhone 上写稿,自动保存到 NAS 后同步到 PC 端继续写作了。然而这类似 iCloud Drive 的方案却被 iOS Files 应用的机制无情打破了。因为 iOS 的 Files 缺乏文件夹同步功能,这导致了许多原本可执行的想法无法继续进行。

尽管 Files 允许你通过 Drive 应用读取 NAS 中的文件,但在打开 *.md 文件时,就会跳转到能够打开文件的应用,比如 Ulysses 和 AIWriter。但在第三方应用中编辑稍久一些,大概率会出现无法存储的情况。

反过来尝试一下,如果在 Ulysses、MWeb 等应用中打开外部文件,再选中 NAS 中的文件夹保存,一样会出现无法存储的情况。如果你想把 NAS 中的某个文件夹作为文档库时,多数应用也会告诉你不支持添加该文件夹(包括坚果云等网盘)。因此在 iOS 设备上,iCloud Drive 可能是唯一的选择。

https://cdn.sspai.com/2019/11/26/f73f1acc682e0314cb29ba6c2786fdd5.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

经过多番尝试,我找到了目前最接近「同步」体验的功能,那便是 Readdle Documents 的「同步」功能,通过 WebDAV 可以将某个文件夹设置为同步文件夹,并进行双向同步,属于体验比较好的方法之一。

反观网盘,网盘的开发商就能及时更新功能,比如坚果云为了解决这一问题,推出了独立的 Markdown 编辑器,可以实现我想要的小功能——直接打开 *.md 文件进行编辑。

而 NAS 配套应用的更新周期长,无法像网盘开发商一样及时更新,自然也没有其他解决方案。体现在 iOS 上,就是 NAS 的应用支持不够完善,这方面只能期待 iOS 和 NAS 厂商们未来再做更新了。

NAS 更易受网络环境的限制

在使用 NAS 的后期,很多人都会折腾「外网访问」,因为局域网环境带来的限制实在是太大了,习惯了网盘的使用方式后,很难再重新适应局域网。

而网盘的最大优点就在于能让用户随时随地访问到自己的文件,并保持不错的速度——这正是 NAS 的缺点,由于国内网络环境特殊,不仅无法直接通过域名访问到 NAS,甚至连常用的 80 端口都被运营商封禁。

你可能需要自己研究如何配置路由器、配置 NAS,了解内网穿透是什么、端口转发又是什么。实现外网访问之后才发现自家的上传带宽根本带不起随时随地看电影,连下载几个小文件速度都令人捉急。

https://cdn.sspai.com/2019/11/26/7866d1da8e6dda1970eeebc4ce1b880c.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

当然,NAS 厂商也并非毫无办法,群晖的 QuickConnect 功能,已经在尽可能减少外部访问时的麻烦。只要你不是教育网、宿舍网等特殊网络,就可以以比较方便的方法实现外部访问。

总之,外网网络的配置是 NAS 的弱项,用户不得不花费大量精力,在 NAS 上实现网盘厂商提供的基础功能。

NAS 好在哪?

上面讲到的这些是不是和你原先想的不太一样?是不是让你想购置 NAS 的心凉了下来?但其实这些问题都是在购置、配置阶段产生的,只要完成了这些功能的配置,接下来的使用体验是非常棒的,一切都是值得的。如果你能完成这些内容的学习,NAS 的使用体验就会远超网盘。

https://cdn.sspai.com/2019/11/26/2f18c00df08ca451ca497dce0236e249.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

给我感受最深的是 NAS 和各种网盘的使用方式都有不同。我觉得 NAS 的使用方式是很值得一讲的,我们不应该拿用网盘的方式来使用 NAS,它能做的远比网盘要多。

这部分是本文的重点,我想讲讲 NAS 和网盘之间的共同点、NAS 的灵活性,以及如何用好灵活性。

NAS 和网盘的共通点

访问 NAS 文件的方式多种多样,每个 NAS 系统都会有自家的文件管理应用。以群晖的 DSM 系统为例,光是通过官方软件就有三种应用可以访问 NAS 中的文件:

  • File Station:通过网页版、手机 App 访问 NAS 的全盘文件。类似百度网盘、微云等。
  • Cloud Station:通过本地软件、手机 App 对文件进行同步。类似坚果云、Dropbox 等。
  • Drive:通过网页版、手机 App 访问;也可通过本地软件对文件进行同步;支持版本控制。属于综合能力最强的方案。

NAS 提供的服务大致分为存储型、同步型、综合型三类,这三类都各有一些网盘的身影。这些网盘往往不能兼顾容量和同步速度,而 NAS 的优势就在于此。

尽管在更新速度上,NAS 厂商略逊网盘厂商。比如群晖 Drive 的「按需使用」功能,就是在坚果云推出「云桥」功能的一年后才正式上线的。但在实际使用时,我完全不会顾及某些文件是不是太大,是不是不适合通过网盘同步之类的问题。这样的优势,让赛场上第一次出现了全能型选手。

https://cdn.sspai.com/2019/11/26/f2f22f294e3d7ed22dc802976cdf25bc.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

NAS 灵活性更强

NAS 和网盘之间最大的不同在于,NAS 支持多种文件传输协议,这让不同的设备、服务都能接入 NAS,读取其中的文件,这是网盘无法企及的领域。

大家最熟悉的协议之一是 WebDAV,不仅可以用来传输、备份文件,还能够用于 Enpass、OmniFocus、2Do 等软件备份配置文件,获得各种第三方应用的加持。

像 SMB、AFS、NFS 这些适合在内网传输的协议,分别对 Windows、macOS、Linux 有较强的兼容性。开启 SMB 后能在 Windows 原生文件管理器中直接连接,无需用户做任何配置或安装软件,非常适合在办公室等地使用。

我之前讲过一些基于 SMB 和 WebDAV 的实际应用:

这两篇都是在讲我如何在 Windows 与 iOS 设备之间传输数据,这两种方案的思路都是「将一台设备作为服务端,另一台作为客户端」,然后进行文件交换。而每次连接时,开启服务其实属于比较麻烦的一步,如果能省去这一步,那就能随时随地传输文件了。NAS 就可以同时开启多种文件传输协议,在有了 NAS 之后,这项工作就可以交给 NAS,手机和电脑只需作为客户端,不再需要每次使用都开启服务。

https://cdn.sspai.com/2019/11/26/2b1d7f0d0405a38ff470142f631fe435.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

光上面提到的这些,就已经有 3 种官方客户端、4+ 种常见传输协议、无数种第三方客户端了。而传统网盘通常只有 1 种官方客户端、不提供任何传输协议、不提供第三方客户端,两者高下立判。

我如何用好 NAS 的灵活性

NAS 的灵活性让存取文件的形式也发生了变化,不再仅停留在上传、同步、下载这些基础步骤上。

如果说常规的网盘允许你打开几把锁取出箱子里的文件,那么 NAS 就是允许你在箱子上开个任意门,以最快的方法取出文件。

光这么讲大家可能不容易体会,我结合几个自己的实际案例来讲讲,为什么 NAS 的灵活性那么重要——

Eagle 是我常用的素材管理工具,我有两台设备需要用到它的素材库,但是随着时间的积累,它的大小已经超过 20 GB,如何同步它就成了一个大难题。存储类的网盘(百度网盘)不便同步文件、同步类的网盘(坚果云)容量太小、大容量同步盘(Dropbox)访问速度又慢。我有段时间真的是把 Eagle 的素材库存在移动硬盘上,哪台电脑需要就插上。而有了 NAS,才让大容量文件同步成为了可能,Drive 的按需同步也能让 20 GB 的素材库仅占少量硬盘空间,需要时再下载需要的部分。

https://cdn.sspai.com/2019/11/26/7fdafa2f9e84eea17f4b00fe4ec886f5.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

Eagle 素材库同步

我认为密码保管在自己手上才是最安全的,因此支持 WebDAV 同步的 Enpass 成为了我的密码管理工具。iOS、Android、Windows、macOS 的所有 Enpass,只需第一次使用时配置一遍 WebDAV,就可以让密码库在多个设备之间进行同步,传输都是经过 HTTPS 加密的。这是 NAS 在 WebDAV 协议上的优势。你在 KeePass 等依赖数据库的密码管理工具中,也能实现类似的效果。

https://cdn.sspai.com/2019/11/26/d1fdd486e6838a19b5fe417af3f7ef2a.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

通过 WebDAV 同步数据库的 Enpass

SMB 则更是有用,我有时需要帮别人修电脑、重装系统。但系统镜像、Office 完整镜像这些东西实在是太大了。于是我把 Win 7、Win 10、Office 2019 等镜像文件都放在 NAS 上,需要时就通过文件资源管理器中的「网络 - NAS」以 SMB 协议的形式直接获取。这样不必在别人的电脑上安装任何网盘客户端,同时下载速度也能达到局域网中的满速。

其实在我写下这几段案例时,才发现用到了这么多不同的方式,在真正使用时并没有考虑「我应该用什么协议完成这一任务」。就像先铺草坪再修路一样,多多尝试不同的方法,自然会归纳出最方便的道路。

诸如此类的场景数不胜数,所以在使用 NAS 时,不能按照传统网盘的思路去使用它,也没必要去强行挖掘某个协议,「怎么方便怎么来」。NAS 提供的一切协议和方式方法都是为了「方便使用」而服务的,有需要自然会用到。

总之,在使用文件的方式上,当你完全理解了 NAS 各种协议的使用方法并正确配置客户端之后,网盘就彻底输给了 NAS。

总结

本文一共提到了 NAS 与网盘的六大异同:形式、容量、功能、应用、网络、使用。

总结一下 NAS 的真正优势,NAS 不再需要你长期付费、容量可以自由叠加、功能需要自己研究、使用体验远超网盘。而网盘的优势,在于厂商能提供体验更好的客户端、有着无需配置的网络环境。在具体使用就会出现文中的种种情形。

因此,NAS 的真正价值在于它让用户取回了数据的掌控权,在这过程中将配置服务的麻烦也一并取回。随着网盘限制越来越多,NAS 的用户群也会越来越大。但在这过程中,NAS 的作用被过分夸大了,不是每一台 NAS 都无所不能,也不是每一个网盘都一无是处。只有正确认识自己的需求,理性看待 NAS,才能让两者发挥各自的最大作用。

· 19 Minutes to read
Allen Ma

Calibre 是一款强大且易用的电子书本地管理工具,可以在 Windows、macOS 和 Linux 平台集中整理各种格式的电子书……

等等!本地?管理?现在人手一部智能手机或者 Kindle,习惯了在亚马逊、多看等平台,实现从购买到阅读的一条龙体验。特别是 Kindle Unlimited 服务,使得电子书变得像流媒体音乐一样,唾手可得(即凯文﹒凯利所谓的「流化」)。你真的还需要一款「本地」电子书「管理」工具?

Calibre 不只是一款「本地电子书管理工具」,「管理电子书」不是我们真正的需求。Calibre 带来的,是我们靠依附于电子书平台,无法带来的完全自由而又完善的电子书使用体验

让 Calibre 成为你的私人书库

曾经我对自己未来书房的终极幻想之一,就是用 Dieter Rams 设计的 Regal 606 System,放上满满一面墙的书籍。但随着购买电子书的比例碾压实体书,只能用 Cover Flow 的方式聊以慰藉。

https://cdn.sspai.com/2018/03/27/303ce39f4c740b5a766ff70d46570435.jpg?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

Regal 606

当然 Kindle、多看等平台还是提供书库模式的,不过也就真的限于看看封面过过眼瘾。除了书名作家,其它信息——类似出版社、版本——一概不知。书库中的数据也不能编辑,想给电子书加上标签,通过作品类型整理藏书自然不可行。至于添加其它平台的图书,怕是痴人说梦。

故而长期以来,我的电子书分散在 Kindle、多看和自己的 Mac 本地硬盘中。

导入图书

而 Calibre 可以导入几乎市面上所有的电子书格式,将它作为我唯一的书库再合适不过。

常见的PDFePubmobi自不用说,亚马逊独家的azw3和最新的kfx格式也支持完美导入。对于 Kindle 而言,最方便的是利用 Kindle for Mac 下载自己所有购买过的书。图书文件会显性地保存在硬盘中。利用 Calibre 的「从目录添加书籍,包含子目录」功能,就能一次添加所有书籍,不用一个个选中文件。

https://cdn.sspai.com/2018/03/27/a171b2e65d78b0aa5071d999428a5e5a.gif

导入 Kindle for Mac

如果你之前习惯了用 Kindle,把所有图书都保存在了 Kindle 上,用同样的方式就可以一口气添加书籍。

多看这个平台比较难办。它既没有 Mac 版客户端,即使用 iMazing 等工具打开 iOS 应用的文件夹,也看不到图书文件。所幸官方支持在 Kindle 上刷多看系统,算是一点小缺口,可以像 Kindle 一样将图书导入进 Calibre(不过也仅仅能导入,下文会解释原因)。

编辑图书信息

完成来自所有平台的电子书导入后,你会发现你的 Calibre 书库光秃秃的,简介、作者、出版社等信息全是未知或者空白。如果我告诉你,你现在应该给每本书手动添加信息,这样才能体现热爱图书的真诚。恐怕你会立马关了这篇文章,然后把 Calibre 卸载掉了。

Calibre 的设计者当然想到了「自动完善图书信息」这个需求,而且是一次性给书库中所有图书添加图书信息。选中所有图书(快捷键⌘Command + A)后,点击「编辑元数据 - 下载元数据和封面」(快捷键⌘Command + D + ),就可以批量下载图书信息。Calibre 会从亚马逊、谷歌和豆瓣等平台抓取图书的相关信息。

https://cdn.sspai.com/2018/03/27/bdcc6a37c647eed2e682cc009acfa350.gif

下载元数据

下载所需要的时间可能会稍长,只要看到右下角的圆圈一直在转动,就说明 Calibre 正在辛勤地搜索和下载中,不要担心它已经罢工了。

搜索的过程中 Calibre 可能会报错,提示下载元数据失败,通常的原因都是现有的数据实在太少。如果连书名都不告诉它,怕是很难找出正确的图书信息了。此时就只能在 Calibre 中手动编辑元数据,添加一些基本的信息,类似书名。

https://cdn.sspai.com/2018/03/27/2d5c26433cb7edfa7e375c86805ea513.gif

利用 ISBN 添加图书

不过根据我的经验,更有效的方法是在豆瓣中搜索图书的 ISBN(使用 Alfred 的朋友可以利用这个 Workflow 快速找到图书的豆瓣页面)。书名可能因为版本或者语言关系不易搜索,但是对于 ISBN 的信息却是和图书一一对应的。

https://cdn.sspai.com/2018/03/27/417f55b5481fc723fce8cd96049801e9.gif

下载封面

不过可能因为无法获得亚马逊中国的数据, Calibre 对于中文图书信息的抓取还是不够完美。例如封面,经常抓取到一些老版本图书的封面,此时就只能手动编辑元数据。在「编辑元数据」的窗口可以再次尝试搜索封面,或者用本地下载好的图片作为封面。在这个窗口也能修改所有相关的图书信息,例如给图书加上文学、社科等标签。

经过导入和编辑图书信息两步,私人书库也就搭建完成。你可以在搜索栏中随意根据作家、丛书或者「推理小说」等标签,找到自己接下来想看的书。可以说既实现了实体书架的展示功能,又发挥了电子书便于整理的特性。

把 RSS 新闻变成电子书

除了书籍,RSS 新闻也是很多爱读书的人的信息来源。市面上已经有很多工具,可以把 RSS 信息源转换成电子书,再通过邮件推送的方式发送到 Kindle。作为你唯一的电子书书库,Calibre 又怎么能少的了这个功能呢。

不过如果直接把 RSS 源中的新闻全部转为电子书,我想很多人都难以读完所有新闻,况且 RSS 中并不是所有的新闻都值得放在 Kindle 中精读。

我个人习惯的方式是将在 Reeder 中扫一遍 RSS 中标题和开头,将想要认真读的文章发到 Instapaper 中。Instapaper 有个不为人知的实用功能,在网页版上可以导出每个文件夹的 RSS 源链接(其实也可以在网页上直接下载 ePub)!这样既可以解决新闻数量过多的问题,又能实现在手机上利用碎片时间筛选,在 Kindle 上专心精读的 Workflow。

https://cdn.sspai.com/2018/03/27/017ef69da7fb3d44cfdd03e1ebcf6995.gif

获取 Instapaper RSS 源

获取 Instapaper 的 RSS 源链接后,在 Calibre 中选择「抓取新闻 - 添加或编辑自定义新闻源」,将 RSS 链接添加进去即可。此外还可以设定定期下载的时间。不过需要提醒的是,下载完成后最后去 Instapaper 将文章存档或者删除,否则下次下载时会重复下载老文章。

https://cdn.sspai.com/2018/03/27/79f685a3a64d03ff2507f3200e9ef92c.gif

利用 RSS 生成电子书

当然你也可以直接添加 RSS 源。除了一个个添加 RSS 链接,更高效的操作是从 Inoread 或者 Feedly 导出自己已有的 RSS 源的 OPML 文件,再在 Calibre 中导入,就可以一口气添加所有已有的 RSS。

让看电子书变的自由

图书的载体从纸张变成比特后,理应变的更便于我们自由选择喜欢的设备来阅读。而现实的情况却是,Kindle 只能打开有限的图书格式,不支持像 ePub 这样常用电子书格式。好在 Cailbre 提供了格式转换的功能,让我们可以将手上的电子书转换成 Kindle 支持的格式。

选中书籍后在工具栏选中「转换书籍」就能打开转换界面。在右上角的输出格式中,选择你希望输出的格式。可以看到其实能选择的格式极其丰富。

https://cdn.sspai.com/2018/03/27/210964a8e9f33be9256d1adbf60b2268.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

转换图书格式

不过光是转换就太小看 Calibre,左侧一竖条的工具,可以在转换的过程调整电子书的方方面面。

例如在「界面外观」中选择自己喜欢,但 Kindle 又不提供的字体,在「页面设置」中调整「输出配置文件」,选择之后要阅读的设备,保证转换后的电子书能完美的在设备上显示。不过这里提醒一句,如果你不完全明白这些设置的含义,还是尽量选择默认设置,免得转换过程中出现问题。

https://cdn.sspai.com/2018/03/27/4da2f9001903aa27d8190ab31a3939da.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

选择字体

像 iTunes 一样传输图书到设备

早年使用 oppo mp3 播放器听音乐的时代,就非常歆羨 iPod 用户,可以在电脑端用 iTunes 整理好音乐后,一键与 iPod 同步,不用手动拖拽文件,或者在播放器磁盘再手动整理文件夹。而利用 Calibre 传书到 Kindle 等设备也是有着媲美 iTunes 的体验。

将 Kindle 连接电脑后,Calibre 会自动调整工具栏,显示出「设备」窗口。在「设备」中可以查看 Kindle 中已有的图书文件。此时在书库中选中想要推送到图书选择「发送到设备」即可。完整的图书文件和信息,就会显示在「设备」窗口中。

https://cdn.sspai.com/2018/03/27/9e6ab1882c29f90ac29ce43e9cac3e63.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

推送到设备

转换图书格式后,Calibre 会智能的将两种格式的图书,同时保存在书库的同一条目中,但通常没有必要把两个不同格式的文件都发送到 Kindle 或者设备上。其实只要选择「发送特定格式」到设备即可。

https://cdn.sspai.com/2018/03/27/2761960a42288a059c493bfa8c6c5ce5.gif

推送特定格式

虽然 Calibre 能兼容市面上大部分的 E-link 阅读器,但难免会遇到电脑能识别,但是 Calibre 无法识别设备的情况。此时不用「发送到设备」功能,而是选择「保存到磁盘」,将目标磁盘选择为阅读器的文件夹即可。

制作属于自己的阅读书单

如果是常年使用豆瓣读书的书虫,想必也和我一样,习惯用「想读」来标注暂时还没空读的书。Calibre 能完美的管理已经购买的书,至于那这些想读的书,如果也能用 Calibre 来整理就更省事了。

已购买的书可以导入电子书文件,如果没有购买,就要另想它法把图书导入 Calibre。所幸 Calibre 可以在书库中,添加一本没有实际电子书文件的条目。点击「添加图书 - 根据 ISBN 号添加图书」(上文已经介绍过如何获得图书的 ISBN 号),记得在右侧给图书加上「想读」标签。导入后 Calibre 会自动询问你是否要下载元数据。完成导入后的条目,除了没有真正的电子书文件,其余和 Calibre 中的其它书是完全一样的。

https://cdn.sspai.com/2018/03/27/9379cc1143289de5b68ccb25a8b4db0b.gif

添加ISBN

但我们不希望把已购买的和想读的书,一直混在同一个界面,这样会不好区分哪些是已购买,哪些是已读。虽然能通过搜索「想读」标签来筛选,但毕竟不是优雅的解决方案。

这时就可以用到 Calibre 的「虚拟书库」功能。抛开技术细节,「虚拟书库」可以理解为基于现有书库创建一份独立的书单。点击「虚拟书库 - 创建虚拟书库」,Calibre 会让你设置名称和搜索表达式。我们之前为想读的书都打好了「想读」标签,此时只需要基于这个标签来筛选即可。

https://cdn.sspai.com/2018/03/27/15dc6e4a27483523a96c819aea261555.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

虚拟书库

这样一个虚拟书库创建后,就可以一键切换到它,把它当作想读书单。比豆瓣的想读更方便的是,可以随意根据作者、风格等条件在书单中筛选,找到下一本想买的书,而不用在网页上来回翻页。

不过使用豆瓣想读还有一处便利,就是可以把想读加入购书单,能在多个购书平台进行比价。Calibre

也有类似的功能。在工具栏选择「获得图书」,根据条件搜索图书后,就会显示多个平台的信息。不过这个功能对中文图书平台支持十分不好,连亚马逊中国都不能搜索,只适合习惯在外国购书平台的用户。

分享你的书库

Calibre 作为私人的藏书库,在功能上已经无可指摘了。而虽然它的数据结构是基于本地硬盘的,但开发者还是给它加上了网络书库功能,方便我们将电子书分享出去。

Calibre 提供了不止一种共享图书的办法,有内容服务器、无线设备共享和电子邮件共享。不过经过体验下来,内容服务器是最稳定和便捷的方式。

https://cdn.sspai.com/2018/03/27/0ea719c225dc3b8d0d3694e5eadac786.gif

在 Calibre 的「连接/共享」窗口中打开内容服务器,软件会提示一个 IP 地址和端口,假设 IP 地址是 123.456.789.987,而端口是 8888,将两者以123.456.789.987:8888格式在浏览器中输入,就能在网页端打开你的书库。朋友可以随意下载你书库中的书籍到他的电脑中。

一定要注意的是,因为 Calibre 的内容服务器是用的非加密通道,一定不要将自己的 IP 地址和端口随意公布到网上,否则你的电脑将极不安全。在给朋友分享完后,一定记得停止内容服务器。

当我们谈论电子书时,我们在谈论什么

过了 2017 年,在互联网上已经基本听不到传统 CD 、mp3 和流媒体音乐的讨论了,即使是最发烧的 CD 或者黑胶爱好者,也不再拒绝流媒体的听歌体验。而电子书和纸书之间的讨论,市场的争夺,还处于胶着的状态。

是纸书的体验无可替代了吗?不,是电子书的体验还没真正的达到让人放弃纸书。尚不谈论硬件上的差异,光是买书、看书、管理电子书的场景的割裂,就足以让每个爱阅读的人身心俱疲。

而 Calibre 的价值,就在于给了我们一个机会,在一人独处的角落,打理自己所有心爱的书籍。一如曾经的沾了些许尘埃,却又让你不禁来回抚摸的书架。

所以,我要用 Calibre,来管理一辈子看过的电子书。

你可以在 Calibre 官网 下载到 macOSWindows 32 位64 位Linux 版本,以及 绿色版

· 11 Minutes to read
Allen Ma

除了备份存储数据,很多人购买 NAS 的目的是搭建家庭媒体中心。群辉 NAS 提供了一些第一方的软件来实现这个功能,比如管理数字音乐可以使用 Music station,而管理本地下载的视频、电影或者是剧集,则可以使用 Video Station。

https://cdn.sspai.com/2020/05/21/3eccd3925c5485b705df7767b509783a.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

不过,Video Station 也有一些自己的问题:一方面近期 Video Station 用来刮削媒体元数据的工具突然失效,下载的视频无法正常显示媒体数据;另一方面则是群晖的 Video Station 对音轨格式有所限制,无法直接播放 DTS、EAC3 等音轨格式的视频。

以往要解决这个问题,唯一可行的办法是将 Video Station 版本降级,再安装第三方的解码器。但这种方式有一个缺点——不能更新套件。我们需要更加直接的解决方案,一方面解决刮削器无法正常获取媒体元数据的问题,另一方面则是让新版本 Video Station 可以直接播放 DTS、EAC3 等音轨的视频。

第一步:将你的群晖 NAS「root」

要想充分发挥 Video Station 的潜能,就要从系统层面「动刀」。这就需要提权,通过超级用户进行操作,好在群晖并非像 Android 手机那样麻烦,而只需要通过开启终端,正常获取权限即可。

首先用浏览器登录你的局域网里面的群晖 NAS,在 DSM 的「控制面板」中「终端机 和 SNMP」,勾选「启动 SSH」功能,然后将端口号修改为非 22 端口(为安全考虑) ,然后点击应用。

https://cdn.sspai.com/2020/05/21/4e8149d6b83aab601bebb68547d54f56.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

然后在你的电脑上使用 SSH 工具(Windows 上可以用 Windows Terminal,macOS 上可以用终端)来登录你的群晖 NAS。IP 选择当前局域网下群晖 NAS 的 IP(就是你登录 DSM 后台的地址),然后端口号选择刚才修改的端口(我使用的是1022),账号是你登陆群晖 DSM 的账号,密码也是登录 DSM 的密码。

https://cdn.sspai.com/2020/05/21/86db7ae567bd9a03322c2a5a00825924.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

使用 SSH 工具,用用户名和密码登录你的群晖 NAS 之后,默认并不是 root 权限,在终端窗口中输入sudo -i,然后再输入一次密码,就可以正常切换到 root 账户了。

https://cdn.sspai.com/2020/05/21/225788d90067c5c7d6623a59982c3d32.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

不过目前这种临时 root 在每一次操作时都要进行提权,考虑到后面需要在 root 权限下进行比较频繁的操作,因此最好的办法是直接开启永久的 root 权限(以下操作在 DSM 6.2.2 下测试成功):

首先还是在当前的 SSH 终端中,使用 cd /etc/ssh 切换到 SSH 目录下。

https://cdn.sspai.com/2020/05/21/786ae7cf079b7a00951fc16f542bb2ac.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

紧接着给配置文件赋权:chmod 755 sshd_config

https://cdn.sspai.com/2020/05/21/433443cfcd1e86582393200264334e5c.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

然后输入 vim /etc/ssh/sshd_config ,在终端中使用 vim 打开配置文件,然后在英文输入法下按键盘上的i键进入编辑模式,然后方向键移到 #PermitRootLogin prohibit password,然后将其改成 PermitRootLogin yes,改完之后按键盘上的ESC键退出编辑模式,然后输入:wq保存编辑。

完成之后,手动在 DSM 界面中重启 NAS。

之后再次用 SSH 工具登录,并且再次切换到临时 root 权限,然后输入 synouser --setpw root [你的密码] 来设置你的 root 账户密码,如下图

https://cdn.sspai.com/2020/05/21/f9b1c9de759f444b8911ef3283fcad3a.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

回车之后关掉 SSH 终端,然后将当前的 SSH 账户信息修改一下,将用户名改为root,然后密码改成刚才设置的 root 密码,然后保存并登录,看到终端出现 # 符表示已经获得永久的 root 权限。

https://cdn.sspai.com/2020/05/21/1f2a3383c233514b2cffeb0abb5dbb4f.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

第二步:让你的 Video Station 正确获取元数据

从今年开始,几乎所有下载的影视剧在 Video Station 的显示信息都变成空白一片,原本的视频元数据也无法显示。导致这个问题的原因是其中元数据刮削器目前无法在中国大陆正常使用。

解决方式是以 root 权限修改群晖的 hosts 文件,重新指向刮削器可以正常访问的 IP 地址即可。首先先用 SSH 工具以 root 权限登录群晖。然后输入vim /etc/hosts打开 hosts 文件

https://cdn.sspai.com/2020/05/21/ecb587cd6594b4b90e61a6a13c8950df.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

英文输入法下在键盘上按下i键进入编辑模式,然后添加以下内容

13.226.238.76 api.themoviedb.org
13.224.161.90 api.themoviedb.org
13.35.7.102 api.themoviedb.org
13.225.103.26 api.themoviedb.org
13.226.191.85 api.themoviedb.org
13.225.103.110 api.themoviedb.org
52.85.79.89 api.themoviedb.org
13.225.41.40 api.themoviedb.org
13.226.251.88 api.themoviedb.org
13.225.89.239 api.thetvdb.com
13.249.175.212 api.thetvdb.com
13.35.161.120 api.thetvdb.com

然后按键盘上的ESC键退出编辑,再输入:wq 保存并退出编辑器。

https://cdn.sspai.com/2020/05/21/84158bf177461b40adbf55ef3c4db23e.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

这时候在浏览器上登录群晖 DSM,打开 Video Station 的设置,在「视频库」中找到对应的视频目录,然后点击「再次搜索所有视频信息」让刮削器重新启动,等一会儿 Video Station 中的视频元数据就会被成功下载并正确显示了。

第三步:让 Video Station 正常播放带专利音轨的视频

根据群晖的说法,在 Video Station 上播放的视频中,音轨必须不含有专利编码,只能正常播放带有 AC3 、DD5.1 或者 AAC 的音轨。而如果视频音轨采用 DD+ 或者 DTS 这样的音轨将无法正常播放,如果在电视上使用将会跳转到第三方软件,至于 Web 端或者 iOS 端则直接显示为无法播放。

以前我们的做法是降级 Video Station 并安装第三方解码器来解决(缺点是套件不能升级)。今天要介绍的方法则一劳永逸——使用第三方解码器通过 root 权限来替换 Video Station 的内置解码器。这样无需降级,即使升级到最新的 Video Station 套件也可以正常播放。

首先,我们需要在 DSM 中的「套件中心」中打开「设置」,在「套件来源」选项卡中新增一个社区套件源 synocommunity:

http://packages.synocommunity.com

https://cdn.sspai.com/2020/05/21/bb9ed391d12e08d6e1feb2ec0332cfcf.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

之后在「常规」选项卡中找到信任层级,选择「任何发行者」后点击确定,完成社群源 synocommunity 的添加。

https://cdn.sspai.com/2020/05/21/c38bc326ba27f9140e94da038c70de0f.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

之后在「套件中心」-「社群」中找到套件「ffmpeg」,然后点击安装。由于 ffmpeg 本身比较大,所以安装时间会比较长。

如果你无法正常通过套件中心下载并安装 ffmpeg ,也可以手动安装 spk 来解决(需要信任「任何开发者」),不过由于群晖的处理器架构比较多,因此首先你需要在 这个地址 查询你的群晖设备的架构以及对应的包版本,然后再到 这里下载 对应架构的 ffmpeg 安装包,而安装方式则是在「套件中心」右上角选择「手动安装」即可。

接下来打开 SSH 工具,使用 root 权限来登录群晖,我们需要做的就是将原先 Video Station 的视频解码库中的配置代码注释掉,换成我们自己安装的社区源 ffmpeg 中的视频解码库。

https://cdn.sspai.com/2020/05/21/9018044b38b9ee256472be2c2f906e76.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

(接下来都是代码了,注意输入或者复制的时候不要出错)

首先修改 ffmpeg 包里的相关文件权限(SSH 终端里逐行输入回车)

chmod +s /var/packages/ffmpeg/target/bin/ffmpeg

chmod +s /var/packages/ffmpeg/target/bin/ffprobe

chmod +s /var/packages/ffmpeg/target/bin/vainfo

然后备份原来中 Video Station 内置的 ffmpeg(SSH 终端里逐行输入回车)

sed -i'-old' -e 's/eac3/ZAAP/' -e 's/dts/ZAP/' -e 's/truehd/ZAPZAP/' /var/packages/VideoStation/target/lib/libsynovte.so

mv /var/packages/VideoStation/target/bin/ffmpeg /var/packages/VideoStation/target/bin/ffmpeg-old

mv /var/packages/VideoStation/target/bin/ffprobe /var/packages/VideoStation/target/bin/ffprobe-old

mv /var/packages/VideoStation/target/bin/vainfo /var/packages/VideoStation/target/bin/vainfo-old

下面就是更改调用 ffmpeg 脚本(SSH 终端里逐行输入回车)

echo "H4sICEoigl4AA2ZmbXBlZwCtU8tOwzAQvO9XLEmkPlAwrRCHVokqBOILOEUVctN1YtE8FFumEvDvOA9KSQInfEhsZ2ZnPN64F2wnc7bjKgWws8ChI8XIDK9YyeMXnpBiQmQlJUzzKiHd4NsdB8DF+4e7p0egOC3Q8TYOhiEynZUd5OpQJACWqILpDF5TeSCMIvRc9BON17jdwr6AmCuy7IWDMge0wzdlVQgLnjVLO1Qqhf5a1PUug6njH5e3Nx3SaQqc8Ot1V0iMl3CNCLxpZ9sKv6OiPfqEE3veosq4DnKzWF7NVcwP9Gw4LyU7nyeTDu2x1RmBTU56jUyXT7cciGoi9Hk/sf9zAz/ttNJGrDDyjNiO3lY/YyPqaO1zkK0cjzYrjKSgPuCgluzdUi+e1l7Lj7zm/afHzsh81hfqdQIpHkPrcV/kBKBIo+9bL281I9psP/q97Nk2/7WhG8TI/jdpGYaDv8A9fYZPjqtrMXcDAAA=" | base64 -d | gunzip > /var/packages/VideoStation/target/bin/ffmpeg

ln -s /var/packages/ffmpeg/target/bin/ffprobe /var/packages/VideoStation/target/bin/ffprobe

ln -s /var/packages/ffmpeg/target/bin/ffprobe /var/packages/VideoStation/target/bin/ffprobe

最后解决原来有专利音轨的屏蔽,然后再调整权限(SSH 终端里逐行输入回车)

sed -i'-old' -e 's/eac3/ZAAP/' -e 's/dts/ZAP/' -e 's/truehd/ZAPZAP/' /var/packages/VideoStation/target/lib/libsynovte.so

chmod +x /var/packages/VideoStation/target/bin/ffmpeg

chmod +s /var/packages/VideoStation/target/bin/ffmpeg

chown root:VideoStation /var/packages/VideoStation/target/bin/ffmpeg

操作完成之后我们可以找一个带有专利音轨的视频播放一下。如果未来套件更新导致可能的无法正常播放,重新从「调用 ffmpeg 脚本」的部分再操作一次即可。

https://cdn.sspai.com/2020/05/21/c6c8151654f5ab6206689a0c718c7af2.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

参考来源:

  1. 利用第三方 FFMPEG 解码器让群晖的 Video Station 完美支持 DTS、EAC3、TrueHD
  2. FFmpeg EAC3 and/or DTS support in Video Station for DSM 6.x

· 15 Minutes to read
Allen Ma

作为一个 IT 技术人员,我时常需要通过远程控制公司 PC 来进行一系列的 IT 运维操作。目前能实现远程控制操作的大多数工具都需要另外付费(商业或者企业环境),免费版本也存在相当多的限制,例如远程控制的带宽有限制,文件传输的稳定性也大受影响。

因此,如果能利用现有的一些资源和开源工具,实现商业软件才能实现的远程控制功能,对我来说会方便不少。在经历了一番探索后,我利用 frp 这样的内网穿透工具,组合目前电脑本身自带的工具,实现了诸如远程桌面控制,远程文件传输,远程 CMD 等一系列的操作,基本上代替了商用的远程传输工具。

frp:将内网机器通过公网 IP 连接起来

frp 是一个可用于内网穿透的高性能的反向代理应用,可以作为两个内网机器通过公网 IP 进行桥接的桥梁。通过其支持各种服务和传输协议,我们就可以实现一系列远程控制操作。(frp 的 Github 主页上也用结构图解释了具体的工作原理,感兴趣的话可以前往了解。)

https://cdn.sspai.com/2020/06/06/583c28eaa88fe5b22f9b404f54e6610d.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

实现下面所有操作的前提是:你需要拥有一台有公网 IP 的云服务器。而经过我的测试,即便是带宽仅为 1M 小水管的云服务器也可以支撑几乎后面的所有操作。我接下来的操作中,被控目标主机 PC 操作系统是: Windows 10 v2004,云服务器为 CentOS 7.8。控制端为 Windows 10 v 1909。

首先,我们需要对拥有公网的云服务器进行设置,根据云主机的系统版本从 frp 的 GitHub 中下载最新版本的运行包,对于 Linux 版本,我的策略是下载到本地,然后通过 7zip 完全解压,之后将其中的 frps 以及 frps.ini 这两个文件通过 SFTP 工具(比如 WinSCP 或者 Xftp )传输到目录 /etc/frp 。

https://cdn.sspai.com/2020/06/06/fa26dc0815150621d3ffcb79bfbc62ff.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

接着,使用 SSH 工具进入到该目录,通过 Vim 打开 frps.ini。

https://cdn.sspai.com/2020/06/06/bf71a000e0dd5134db1cb30a422c5f42.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

默认的监听端口是 7000。如果希望更换端口,可以按键盘上的 i 键开启编辑,将其中的 bind_port 中后面的端口改为你想要的端口,然后按 ESC 关闭编辑模式,最后输入:wq保存编辑。

我们需要开启 frp 的服务端,对于 Linux 主机,可以执行这一条命令来将其作为进程放到系统后台运行:

nohup /etc/frp/frps -c /etc/frp/frps.ini & &> /dev/null

执行后,我们可以通过 netstat -lnp|grep 7000看一下进程是否正常运行。到这里,云端服务的操作基本上就完成了。如果你使用的云服务商的主机绑定了安全组,需要手动登录服务器的云控制台,在网络安全组中将 7000 端口设置为进站出站的放行策略。

使用 frp 内网穿透实现 RDP 远程桌面

在针对 Windows 系统的远程控制中,兼容性最好的当然是 RDP 远程桌面——无需安装第三方软件,非常简单容易进行设置。微软也在其他系统平台上推出了微软远程桌面客户端,让你几乎能在所有的主流平台上实现远程控制 Windows 主机。

首先,我们需要设置一下被控 PC 端(也就是希望被远程控制的设备)在 frp 的 GitHub 下载页面 中下载对应的执行包,这里因为内网目标被控主机是 Windows 10,因此需要下载 Windows 版本。

解压缩之后,将其中的 frpc.exe 以及 frpc.ini 拷贝到 C:\ftp 这个目录下面,然后使用编辑器对 frpc.ini 文件进行编辑。

https://cdn.sspai.com/2020/06/06/278e0a56bcc3b9455b5610f3404e60b5.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

frpc.ini 文件中主要分为两个部分,最上面[common]是和云端服务器通信的部分,因此server_addr填写的是对应的云服务器的 ip 地址,而下面这个server_port则是刚才我们在服务端所设置的bind_port,两者需要保持一致。

https://cdn.sspai.com/2020/06/06/b52f583c87330c96d807834b08b253e3.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

下面部分是针对需要内网穿透的服务,比如针对 RDP 的代码写法如下:

[RDP]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7002

其中local_ip 指的是本机处于内网的 IP 地址,如果你是自己使用,只需要写 127.0.0.1 即可,而 local_port 指的是对应的服务端口,RDP 服务端口就是 3389。

至于 remote_port 就是远程用来映射的端口,最后根据原理,如果想通过远程桌面控制当前内网主机,其对应的地址就是:

[server_port]:[remote_port](公网服务器 IP:映射的端口号)

完成之后点击保存,接着我们需要对电脑的远程进行设置。右键点击「此电脑」-「属性」,找到「远程设置」,在「远程桌面」中勾选「允许远程连接到此计算机」,同时取消「仅允许运行使用网络级别身份验证的远程桌面的计算机连接」的勾选,然后点击「确定」。

https://cdn.sspai.com/2020/06/06/80ed59d21c625ce11fda8fa1efc64c62.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

最后,我们需要打开 Windows 防火墙给以上服务予以放行,在控制面板\所有控制面板项\Windows Defender 防火墙\允许的应用中点击「更改设置」,然后在下面找到「远程桌面」和「远程桌面(webSocket)」并分别勾选上「专用」和「公用」。

https://cdn.sspai.com/2020/06/06/ed222b6297bdbb46798b567490b8f2f3.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

之后我们打开c:\frp目录,按住键盘上的shift键后右键选择「在此处打开 Powershell 窗口」,执行以下命令来开启 frp 客户端:

.\frpc.exe -c frpc.ini

如果下面的终端输入显示有[RDP] start proxy success 则表示实际上服务已经成功开启,使用控制端的「微软远程桌面」应该就可以实现远程控制了。

https://cdn.sspai.com/2020/06/06/bff6ede0799cad2258b589b6a17b3411.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

接下来我们就可以用控制端的 PC 测试一下,打开「远程桌面连接」,然后在「计算机」这一栏中输入云主机的公网 IP 后映射的端口号,比如我设置的 7002,然后点击连接。

https://cdn.sspai.com/2020/06/06/c15eb673683538baddd1b17dd65076b9.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

然后在弹出的警告中选择「是」。

https://cdn.sspai.com/2020/06/06/6e3d7ed61f649ff00c4877b3d7f0fe31.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

输入远程主机的登录用户名和密码之后,你就可以通过远程桌面来控制内网中的被控主机了!

除了正常的操作之外,你还可以实现一定程度的文件传输,比如说你可以从控制端的 PC 中复制文件并在远程桌面点击粘贴来实现文件传输,其实这个操作和那些商业远程控制软件非常类似,传输的速度和云服务器的公网带宽有关。

https://cdn.sspai.com/2020/06/06/1970311016bf0b958a6d809b24a34999.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

虽然这样实现了远程控制,但 frp 的客户端运行却需要一直在前台开启 Powershell 终端。其实,完全可以使用更加高效率的做法:将可执行文件打包成系统服务,然后让服务在后台自动运行。

这里我们通过这个 winsw 小工具来实现,在其 GitHub 的 releases 页面中下载 对应 .net 运行时的版本,如果你使用的是 Windows 10 那么可以直接下载「WinSW.NET461.exe」这个文件,同时需要下载「sample-minimal.xml」这个配置文件,然后将两者下载到 frp 对应的 C:\frp 这个文件夹,分别改名为「winsw.exe」和「winsw.xml」。

https://cdn.sspai.com/2020/06/06/37f0dbb3616234f7029faa31430adda8.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

使用代码编辑器打开「winsw.xml」,将配置文件修改为:

<service>
<id>frp</id>
<name>frp</name>
<description>frp service</description>
<executable>frpc.exe</executable>
<arguments>-c frpc.ini</arguments>
<onfailure action="restart" delay="60 sec"/>
<onfailure action="restart" delay="120 sec"/>
<logmode>reset</logmode>
</service>

点击保存之后,在 powershell 终端中按下ctrl + c 结束此前的 frpc 进程,然后输入.\winsw install 来安装服务,然后再输入.\winsw start 来启动服务,期间如果弹出 UAC 点击允许即可,这样 frp 就被安装成系统服务在后台默默运行了。

https://cdn.sspai.com/2020/06/06/c13b624864a60c08d38a40505d919b60.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

更高效的文件传输:使用 frp 实现 SFTP 文件传输

虽然使用远程桌面可以覆盖远程控制中大部分的使用场景,但如果遇到需要传输文件的场景,远程控制简单的复制粘贴效率就比较低了。

通常远程文件传输可以通过 FTP 服务来解决。但 FTP 在服务配置上相当麻烦,一方面需要安装额外的第三方软件,并不能使用系统现成的软件来实现;另一方面服务相关的设置上都相当复杂。Windows 10 从 v1809 开始原生支持 OpenSSH,这让文件传输有了新的选择——通过 SSH 协议实现文件传输,无论是功能实现还是操作都变得既简单又高效。

首先我们需要在 Windows 10 上安装 openSSH 这个组件,打开 「Windows 设置 - 应用 - 可选功能」,点击「添加功能」找到 「OpenSSH 服务器」和「OpenSSH 客户端」点击安装。

https://cdn.sspai.com/2020/06/06/6d167dfc191c7a72ac8c93bb651c605d.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

之后打开「控制面板 - 管理工具」中「服务」,找到「OpenSSH Authentication Agent」以及「OpenSSH SSH Server」两个服务,都将其修改为「自动」并立即启动。

https://cdn.sspai.com/2020/06/06/a523d5d400582ed88ebd7ce13e44b54e.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

之后再次打开防火墙设置控制面板\所有控制面板项\Windows Defender 防火墙\允许的应用,找到「OpenSSH Server」看是否已经勾选了「专用」和「公用」,之后重启 PC。

https://cdn.sspai.com/2020/06/06/024f24fb44ebe7610c2d53652feec737.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

重启之后,打开 PowerShell 并进入 c:\frp 目录中,输入.\winsw stop 暂停服务,使用编辑器打开 frpc.ini,添加有关 ssh 的映射配置:

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

这里远程的映射端口为 6000,更改完成之后保存,并使用 PowerShell 输入.\winsw start 重启 frp 服务。至此被控端的 SSH 映射就已经配置完毕了。

下面我们来实验一下,从控制端 PC 打开 ssh 客户端(举例客户端为 Xshell),在新建会话中的「主机」一栏输入公网云服务器的 IP 地址,在端口号处输入此前设置的映射端口号 6000,点击「连接」。

https://cdn.sspai.com/2020/06/06/6dea6c0d63877bfa2b8470e281f99da7.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

在弹出的对话框中,输入被控电脑的登录账户和密码(如果绑定了 Microsoft ID 就输入此 ID),完成连接之后你就可以看到终端显示为被控主机的用户目录。我们通过 SSH 协议连接到了被控主机的 Powershell 终端中,这也间接说明 SSH 服务已经开启成功了。

https://cdn.sspai.com/2020/06/06/305cc971b71e45acbfedea6b426a249a.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

既然已经可以通过 SSH 连接,那么使用相同的协议传输文件也是顺理成章。点击 Xshell 功能栏中的 Xftp 就可以直接打开对应的主机文件目录,然后我们可以输入诸如/D:/这样的路径来进入到不同的存储空间中,文件传输也和传统的 FTP 客户端无疑,只需要选择文件或者文件夹后点击传输即可。

唯一需要说明的是,如果右侧目录是被控主机系统文件夹,则无法从控制端将文件传输过去,原因是权限不够(这牵涉到 Windows 和 Unix 下用户权限上存在差异)。

https://cdn.sspai.com/2020/06/06/b67e9b918dc3847db27bf43c28845b7c.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

结语

本文中,我们使用 frp 这个内网穿透工具以及一个拥有公网 IP 的云服务器。成功实现了一系列商业远程控制软件的功能,需要额外安装的软件都是免费软件或者是开源软件,甚至只是开启系统自带的功能而已。如果你不希望为远程控制功能再额外花钱,不妨按照本文的步骤操作一番。

· 3 Minutes to read
Allen Ma

前情提要

在准备过程中 DSM 突然出现了 “由于系统可用存储空间不足 您将无法登陆”的提示在这里插入图片描述

教程开始

首先科普一下群晖的系统储存空间在哪,重装过DSM的朋友肯定都知道,就是每一块群晖磁盘的第一个2.4G大小的分区,这个分区里储存了一些系统基础数据,但是套件的数据并不在这里。既然是系统储存空间满了,那群晖自带的文件管理器肯定无法管理。这个时候就得祭出 SSH 了,在群晖控制面板里进入 终端机与SNMP ,开启SSH。

用SSH登录到服务器后发现是群晖的系统盘爆掉了。。

  1. 进入SSH界面,填入群晖的用户名与密码。(密码不会显示)
  2. 使用 sudo -i 提权为root。
  3. 然后使用 df -h 指令,看看磁盘使用情况。 (我这里系统盘/dev/md0塞满了)在这里插入图片描述
  4. 使用 du -sh /* 指令查看根目录(根目录就是系统目录)下的各个一级文件夹大小。在这里插入图片描述我发现我的 /volumeUSB1 文件夹居然有1.3G,肯定是这里了!
  5. 使用 cd /你发现的大文件夹名 进入你发现的大体积文件夹 再用 ls 列出文件。在这里插入图片描述
  6. 正常的外接U盘文件应该放在 /volumeUSB1/usbshare1 里,但我的之间放在了 /volumeUSB1 里,使用 rm ./文件名 移除即可。(一定要确认!命令输错或者是对象错误会导致数据丢失!!)

接下来重启,恢复正常!!

故障原因分析

我在使用Download Station下载完windows镜像后找不到外置U盘,于是直接使用了SSH移动,没想到移错了文件夹(/volumeUSB1挂载在 / 下,需要把文件移动到 /volumeUSB1/usbshare1里),于是就出现了开头的一幕。

· 2 Minutes to read
Allen Ma

After half a month's battle in the first half of December, the results of the competition were not satisfactory, but as a first-time participant in such a formal competition, I have learnt a lot and the time was not wasted. I refactored the code I had written, referring to the open source code and feature ideas of one of the 17th ranked contestants, and documented the process, which I think will help students who do not know how to write competition baseline code.

In the process of refactoring the code, I learnt a lot and also made some corrections to my previous ideas of extracting features for the competition, which led to a lot of improvements in the offline results; for example, I was able to achieve an offline result of 1.7929 using only two files, t_user.csv and t_loan.csv, and during the competition I heard that I could achieve 1.80, 1.79 using only these two tables I had heard during the competition that it was possible to achieve 1.80 and 1.79 using only these two tables.

Explanation of functions in refactored code and naming of feature variables.

gen_train_feat.py : Scripts for extracting features from the training set (data from August, September and October)

gen_test_feat.py : Script for extracting test set special crossings (data for September, October, November)

util.py : Some of the helper functions used

train.py : Training scripts

The source code and dataset for this project is referenced at Click here Alternative links Password:AllenMa

· 4 Minutes to read
Allen Ma

Case (5) Analysis of specific financial data

Project II.

Case details

Company A is a public fund management company headquartered in Guangzhou. Among all the fund products issued by the company to the public, there is a fund named "New Financial Equity Fund", which has an investment strategy of selecting A-share market financial stocks with core competitive advantages, sustainable growth potential and relatively reasonable valuation levels. As at the end of May 2020, the fund's long positions include Pudong Development Bank (600000), China Merchants Bank (600036), Haitong Securities (600837), Huatai Securities (601688), Ping An of China (601318) and China Taibao (601601). Assume you are a fund manager's assistant at Company A. Your daily job is to assist the fund manager of the New Finance Equity Fund to track and analyse the stocks invested. At the request of the fund manager, you are required to complete 3 programming tasks in Python.

Programming tasks

(1) Obtain the closing prices of the 6 stocks for the period from 1 January 2014 to 31 May 2020 and calculate the daily return, annualised average return and annualised return volatility for each stock, using the natural logarithm for calculating the daily return. (2) For the six stocks, construct a portfolio, generate a random array including the allocation weight for each stock (the weights total 1), and calculate the annualised average return and annualised return volatility for the portfolio allocated with that weight. (3) For 6 stocks, randomly generate an array of 2,000 different stock allocation weights, and use this to calculate the corresponding 2,000 different annualised average portfolio returns, annualised return volatilities, and plot them as scatter plots on an axis with annualised return volatilities in the horizontal coordinate and annualised average return in the vertical coordinate.

Start programming.

# -*- coding: utf-8 -*-
"""
Created on Wed Sept 23 8:59:40 2020

@author: mly
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['KaiTi']
mpl.rcParams['axes.unicode_minus'] = False
stock_price=pd.read_excel('期末案例二.xlsx', sheet_name= "期末案例",header=0,index_col=0) #Importing external data
stock_price=stock_price.dropna()
#(stock_price/stock_price.iloc[0]).plot(figsize=(9,6),grid=True) # normalize the stock price to 1 for the first trading day of 2014 and visualize
stock_return=np.log(stock_price/stock_price.shift(1)) #Calculating the daily return of a stock
stock_return=stock_return.dropna() #Delete the row with the missing value
return_mean=stock_return.mean()*252 #Calculating the average annualised rate of return on equities
print('2014年至2020年5月的日收益率\n',stock_return.round(6)) #Retain 6 decimal places
print('2014年至2020年5月的年化平均收益率\n',return_mean.round(6)) #Retain 6 decimal places
return_volatility=stock_return.std()*np.sqrt(252) #Calculate the annualised return volatility of a stock
print('2014年至2020年5月的年化收益波动率\n',return_volatility.round(6))

#Task 2
x=np.random.random(len(return_mean.index)) #6 random numbers from 0 to 1 drawn at random from a uniform distribution
w = x / np.sum(x) # Generate an array of random weights
return_cov=stock_return.cov()*252 #Calculate the covariance between the returns of each stock
print(return_cov)
return_corr=stock_return.corr() #Calculate the correlation coefficient between the returns of each stock
print(return_corr)
Rp=np.dot(return_mean,w) #Calculate the annualised rate of return of the portfolio
Vp=np.sqrt(np.dot(w,np.dot(return_cov,w.T))) #Calculate the annualised return volatility of the portfolio
print('用随机生成的权重计算得到投资组合的年化收益率',round(Rp,6))
print('用随机生成的权重计算得到投资组合的年化收益波动率',round(Vp,6))

#Task 3
x_2000=np.random.random((len(return_mean.index),2000)) #A random number of 0 to 1 in 6 rows and 2000 columns drawn at random from a uniform distribution
w_2000=x_2000/np.sum(x_2000,axis=0) #Generate an array containing 2000 sets of random weights
Rp_2000=np.dot(return_mean,w_2000) #Calculation of 2000 returns for different portfolios
Vp_2000=np.zeros_like(Rp_2000) #Generate an initial array of 2000 different return volatilities for the portfolio
for i in range(len(Rp_2000)):
Vp_2000[i] = np.sqrt(np.dot((w_2000.T)[i], np.dot(return_cov, w_2000[:, i])))
plt.figure(figsize=(9,6))
plt.scatter(Vp_2000,Rp_2000)
plt.xlabel(u'波动率',fontsize=13)
plt.ylabel(u'收益率',fontsize=13,rotation=90)
plt.xticks(fontsize=13)
plt.yticks(fontsize=13)
plt.title(u'投资组合收益率与波动率的关系', fontsize=13)
plt.grid('True')
plt.show()

Presentation of results

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述