0%

软路由

为了进一步发挥 NAS 的作用,我决定在它上面部署一个软路由。因为软路由可以更好地管理流量,部署科学上网,特别是在主路由小米 AC2100 MT7621 方案性能有限的情况下,x86 架构的软路由能够进行的加解密运算能力远远超过主路由。我的 NAS 只有板载千兆单网口,实现起来没有多网口路由器那么优雅,好在还是能够用单臂路由的方法实现软路由。

网络拓扑规划

设备一览

在规划网络之前,需要先清点一下我有哪些设备,这些设备分别有哪些上网的需求。

路由器,我有

  • 一台联通的光猫
  • 一台小米 AC2100
  • 一台小米 R3
  • 一台老旧的小米 3C(大概就不用了)

终端设备我有

  • 若干 PC
  • 若干手机

IoT 设备我有

  • 遍布房间的传感器
  • 智能插座
  • 开关

因此,我打算将光猫作为拨号终端;小米 AC2100 作为主路由,保留小米原有系统(后来我把它刷成 OpenWRT 了);小米 R3 无线桥接 AC2100,作为 IoT 的接入点(因为位置的原因,AC 2100 摆放在光猫边上,2.4G 没有办法很好地覆盖整个屋子,所以要用 R3 中继)。光猫的无线功能关闭,避免影响其他网络的速度。

拓扑规划

NAS 使用网线连接小米 AC2100。UNRAID 系统通过网桥(一般为 br0)让虚拟机和 Docker 上网,可以理解为一个二层交换机。我简单做个一个拓扑图,解释我打算规划的拓扑结构。

我的规划如图,光猫负责拨号,小米 AC2100 作为主路由处理流量,R3 通过无线中继服务 IoT 设备,NAS 虚拟化各种服务和软路由提供功能。其中,主路由的 IP 地址为 192.168.31.1,软路由的 IP 地址为 192.168.31.2。为了让所有流量在转发至公网时经过软路由处理,由 AC2100、R3 所有通过 AP 接入的设备和有线接入的设备都要以 192.168.31.2(软路由) 作为网关,而软路由要以 192.168.31.1(主路由) 作为网关。为了实现这个功能,整个 LAN 中只能由软路由一个 DHCP 服务端。即,让新加入的设备自动以软路由作为网关。

单臂软路由配置

选择系统

Read more »

NAS 该用来做什么

我打算将 NAS 定位为一个家庭用的小型多媒体平台,并作为软路由处理流量。因此, NAS 应该要能满足我挂 BT 下载的需求,并且还要能够直接读取 BT 下载的内容,以家庭影院的形式展现。经过筛选,我选择安装以下 Docker 软件

  • Transmission (BT 下载,Web UI 控制)
  • Plex Media Server (家庭影院)
  • Pi-Hole (DNS 广告过滤和自定义 Host)
  • V2Ray (公网访问内网,等于 VPN)
  • NginX (统一反代 Web UI,管理端口暴露规则)

以及,感谢 UNRAID 对 kvm 的良好支持,我还安装了

  • 黑群晖

黑群晖

群晖是一个卖软件的 NAS 硬件商,其软件十分好用,新手友好。自然,我先选择安装破解的群晖系统。实际上,装完群晖后,我几乎没有使用里面的功能,因为我还是比较倾向于用 UNRAID 自带的 Docker 完成我需要的服务。不过我在研究黑群晖安装的过程中,学习了一些经验,这里做一下记录。

安装准备

安装黑群晖的原理是安装一个第三方的、破解后的引导,来欺骗群晖系统镜像正常工作。因此我们需要下载破解的引导作为启动盘,然后去官方网站上下载安装镜像就可以了。破解的引导我推荐在 https://xpenology.club/downloads/ 下载。网站中 DSM 6.2指的是支持 DSM 6.2 的系统,引导的文件名最后一串为群晖的机型。在安装时注意下载对应系统和机型的镜像。可以在 https://archive.synology.com/download/DSM/ 下载。

由于我的虚拟机无法正常启动 Jun’s Loader v1.04b DS918+ ,这里以 Jun’s Loaders DSM 6.2 - Jun’s Loader v1.03b DS3617xs 为例。下载对应引导并解压,将引导拷贝至 NAS。我创建了一个共享文件夹 HackSynology 用于放置群晖相关文件。

Read more »

选择 UNRAID

在组装完 NAS 之后,下一步就是考虑如何将 NAS 的硬件性能高效利用。经过对群晖、UNRAID、FreeNAS 等 NAS 操作系统的调研后,我决定使用 UNRAID 作为我的 NAS OS。一是因为 UNRAID 对 Docker 和 VM 的支持较好,有庞大的社区支持;二是因为 UNRAID 的阵列功能很好用,自带的软 RAID 功能可以只用一张 Parity Check 盘完成其他所有盘的校验;三是因为 UNRAID 的 Web UI (相对)比较符合我的审美。话不多说,立刻开始破解版 UNRAID 安装。

安装

UNRAID 的官网是 https://unraid.net/ ,价格表在 https://unraid.net/pricing 。从价格上看,Basic 订阅只要 60 刀,还是比较合适的。由于我第一次使用这个操作系统,所以先从破解版入手。

安装 UNRAID 需要准备一个 U 盘作为启动盘和系统盘,并且之后整个系统就安装在这块 U 盘中。这个 U 盘在以后使用 UNRAID 时,需要一直插在 USB 口上。不能使用 SD 卡 + 读卡器,因为可能获取不到正确的设备 ID。 UNRAID 系统根据闪存的设备 ID 分发密钥。在安装之前,需要将闪存格式化成 FAT32 格式。如果 Windows 不支持格式化为 FAT32 ,可以使用 Windows GUI version of fat32format 将闪存格式化为 FAT32 格式。切记,在进行格式化操作之前,务必做好数据备份。

截至目前,最新的破解版是 UNRAID 6.8.2 ,下载地址在 http://www.hopol.cn/2020/06/1675/ 。这个安装包自带密钥计算工具,可以使用 https://koolshare.cn/thread-181253-1-1.html 提供的一键安装工具进行安装;或者按照破解版下载页面的安装方法设置 UNRAID U 盘 启动,然后再回到 Windows 进行破解密钥生成。

初期配置

点亮

先将显示器接上运行 UNRAID 的机器。在开机启动时,狂按 Del 进入 BIOS 配置页面,修改默认主板设置。我先修改默认启动引导至装有 UNRAID 系统的 U 盘上,然后打开了 CPU 的虚拟化功能(VT-d),F10 保存重启。

启动选项选择 Unraid OS (Headless) 。如果正常启动,在命令行可以看到 UNRAID 被分配到的 IP 地址。通过 Web 访问即可。默认账户为 root ,无密码。

Read more »

心血来潮

我的 surface pro 4 实在是太老了,发热也越发严重,最近甚至经常过热关机。于是前段时间花了 2k 装了台能跑现有不少大型网游的主机,装的我非常愉悦。这台主机用的 AMD 平台,鲁大师能跑24w+,目前正在逐渐成为我的主力用机。装了一台就想装第二台。我做了些简单的调研,决定用 1k 左右的预算装一台功耗较低,性能足够的 NAS。

目前我已经用 NAS 实现了单臂软路由、BT 下载、PLEX、DNS 等一系列功能。今后我会慢慢更新这块内容。

配置选择

由于给自己开了一个不算太高的预算,所以一切资源都要精打细算。首先列出我的需求

  • 占地空间较小
  • 千兆板载网卡
  • SATA 至少 4 个
  • 功耗较低
  • PCIE 能插万兆
  • 核显
  • 有升级空间

CPU

首先选择 CPU。有朋友在微博推荐 200GE 板 U 套装,这里也推荐,挺不错,只要 500,性能和价格相符,TDP 也只有 35W。但是因为前段时间已经装了一台 AMD 的机子了,CPU 就不选择 AMD 的了。经过各种对比,选择了低功耗六代 i3-6100T。原本打算考虑奔腾 G5600T,但是掐指一算发现超预算了。我是盯着天梯图和 TDP 找的。后来发现在实际使用中,不一定要买低功耗版本,因为很多情况下,Intel 只是对其做了功耗上限的限制,其他和标压版本相差无几。高性能的 U 在运行相同的计算任务的时候,理论上功耗也差不多,所以 TDP 并不是一个需要非常关注的点。

主板和机箱

主板和机箱需要一起考虑。由于我并不打算上赛扬 J 平台,ITX 的主板价格也很贵,所以就无缘 ITX 了。于是我考虑 m-ATX 的主板和机箱。机箱我看中了金河田的 预见 N1 。这个机箱非常小巧,整体只有 202 * 328 * 260mm ,支持 ATX 电源,2 个 3.5 盘位 + 2 个 2.5 or 1 个 3.5 盘位。如果电源用 SFX 或者直流,还能再装 2-4 个 3.5 硬盘。支持一个机箱散热风扇。综合考虑,我选择了这款机箱。

选择机箱后,我开始考虑主板。为了给以后升级 8-9 代 U 留出空间,根据机箱要求的主板大小(最大 230*185mm),我选择了支持 6、7 代,能刷 BIOS 上 8、9 代 CPU 的 技嘉 B250M-D2VX-SI (226 * 185 mm)。

内存和其他

内存没什么好说的,枭鲸前段时间搞活动,89 RMB 的 DDR4 2666 8G 条。希望能够长期稳定运行。

其他配件都是零零散散买起来的,有刚好或者喜欢的就买了。

最终配置单

Read more »

本文主要介绍了我在对内网集群进行管理的时候遇上的和解决的问题,包括统一控制,装机脚本,堡垒机,内网穿透等一系列问题。

突然有了内网集群

由于科研需要,实验室购置和申请了大量服务器和显卡,并申请了从超算中虚拟出来的计算节点。如何将他们统一管理成了一个很大的问题。同时,由于机器都托管在数据中心,需要 VPN 进行访问。数据中心提供的 VPN 是上古的 L2TP/IPsec with Pre-shared key,还要在注册表写信息允许弱加密才能在 Windows 10 上使用, Mac / Linux 电脑完全无法连上这批机器。同时,VPN 还严格限制同时只能一个人使用,一旦使用的人数增加,需要多次申请不同的账号,管理起来十分麻烦。为了解决一系列的问题,我开始探索方案。

统一管理:堡垒机

选择 JumpServer

俺找了有相关经验的好朋友奶鱼 ,他推荐了一套堡垒机方案 JumpServer。这是一套开源的堡垒机程序,支持身份认证,账号管理,资产授权,操作审计等管理功能,也支持批量部署,Web Terminal 等通过 Web 操作机器的功能。整体上看,非常符合我管理内网三十多台机器的需求。

开源仓库一览

前期准备

要想部署一个能够管理所有服务器的堡垒机的平台,就需要给每个节点部署一个带 sudo 权限的用户。这个用户最好在不同机器上是统一的。现有的服务器用户虽然也有部分统一,但使用一个独立的用户管理所有服务器更符合直觉。我先创建一个统一的用户 touko ,并赋予其 sudo NOPASSWD 权限。

1
2
echo "SUDO_PASSWORD" | sudo -S useradd -m touko -s /bin/bash
echo "touko ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/touko

为了安全,我创建了一组 ECDSA 算法的密钥对,然后将它的公钥导入 authorized_keys 作为登陆密钥。

1
2
3
ssh-keygen -t ecdsa -C 'jumpserver'
cd ~/.ssh
cat id_ecdsa.pub >> authorized_keys

然后,将创建的 ECDSA 私钥 ~/.ssh/id_ecdsa 备份并删除。在其他的机器上,编写脚本,拷贝私钥至脚本中,就能一键完成部署(顺便退出命令行)。

Read more »

本文使用 武汉大学 毕业论文模板。

准备写论文

可喜可贺,我终于要开始动笔我的毕业论文了。虽然论文相关的实验和理论准备已经就绪了很长一段时间,但是就是提不起精神写文章。这周其他突发堆积的事情逐渐清空,我准备忙里偷闲,开始写毕业论文。

某天,一同学在群里发了一份 武汉大学毕业论文 LaTeX 模板,我一看,巧了,老朋友写的 repository ,于是正好近期开工,把它下载下来用。

环境配置

本文基础环境是 Windows 10,使用的 IDE 为 VSCode,Linux、Mac 配置方式类似

Perl

首先我们需要安装 Windows 下的 Perl 依赖。前往官网 https://www.perl.org/get.html 我发现,有 ActiveState PerlStrawberry Perl 两种版本的 Perl ,具体使用起来差不多,所以我选择了下载起来相对方便的 草莓 Perl http://strawberryperl.com/

LaTeX

Windows 下有两种广泛使用的 LaTeX 版本,分别是 TeX LiveMiKTeXTeX Live 安装体积高达 6GB ,我立刻放弃,选择了安装体积较小,后续使用中按需下载MiKTeX https://miktex.org/download 。建议在安装时安装给当前用户,可以避免很多麻烦。

Read more »

该文完稿于 2020-03-13 凌晨

Background

最近在做一个与 Docker 相关的实验,其中需要限制 Docker 容器中应用程序的 IO,比如 NginX 的 IO。这听起来很简单,毕竟远在 Feb 4th, 2016 release 的 Docker v1.10 就在其功能中加入了限制容器 IO 的参数

Constraints on disk I/O: Various options for setting constraints on disk I/O have been added to docker run: --device-read-bps, --device-write-bps, --device-read-iops, --device-write-iops, and --blkio-weight-device.

https://www.docker.com/blog/docker-1-10/

就在一切都顺利进行,我写完包含了 NginXDockerfile ,准备满心欢喜地开始我的 1MB/s 实验的时候,一道晴天霹雳打在我心上——

1
2
3
4
[email protected]:/#$ dd if=500M.file bs=1M count=500 of=/dev/null
500+0 records in
500+0 records out
524288000 bytes (524 MB, 500 MiB) copied, 0.132448 s, 4.0 GB/s

当然问题现在已经解决了。为了重现当时的情况,我们从头开始。

Toolbox

我们简单地使用 Debian 作为测试的 Docker Image。

1
$ docker pull debian

并且使用 dd 命令生成一个 500M 的 000 文件,测试磁盘读写速度。

1
2
$ dd if=/dev/zero of=500M.file bs=1M count=500
$ dd if=500M.file bs=1M count=500 of=/dev/null

Yesterday Once More *

* Yesterday Once More – Carpenters

初次碰壁

拉镜像

1
2
3
4
5
6
7
8
$ docker pull debian

Using default tag: latest
latest: Pulling from library/debian
50e431f79093: Pull complete
Digest: sha256:a63d0b2ecbd723da612abf0a8bdb594ee78f18f691d7dc652ac305a490c9b71a
Status: Downloaded newer image for debian:latest
docker.io/library/debian:latest

找到宿主机的设备路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ sudo fdisk -l

Disk /dev/vda: 50 GiB, 53687091200 bytes, 104857600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: -

Device Start End Sectors Size Type
/dev/vda1 227328 104857566 104630239 49.9G Linux filesystem
/dev/vda14 2048 10239 8192 4M BIOS boot
/dev/vda15 10240 227327 217088 106M EFI System

Partition table entries are not in disk order.

起一个 Docker,限制对应设备的读写速度

1
2
3
$ docker run -it --rm --device-read-bps /dev/vda:1MB  --device-write-bps /dev/vda:1MB debian

[email protected]:/#
1
2
3
4
5
6
7
8
9
10
11
$ dd if=/dev/zero of=500M.file bs=1M count=500

500+0 records in
500+0 records out
524288000 bytes (524 MB, 500 MiB) copied, 0.728238 s, 720 MB/s

$ dd if=500M.file bs=1M count=500 of=/dev/null

500+0 records in
500+0 records out
524288000 bytes (524 MB, 500 MiB) copied, 0.132448 s, 4.0 GB/s

这是一个非常可怕的事情。我限制的 1MB/s 并不工作。这个实验是基于这个假设进行的,如果没有办法限制设备的 IO,实验也没有办法继续进行了。

Read more »

Introduction

我大概是从两天前开始决定使用 Hexo 的。

1
2
3
4
橙橙橙 2020-03-10 15:35:42
你现在在用hexo吗
2020-03-10 16:15:22

1
2
3
4
橙橙橙 2020-03-12 18:05:24
你觉得hexo好还是jekyll好
mxd 2020-03-12 18:12:17
我喜欢hexo

昨天我装上了 Hexo ,配置了 gh-pages ,今天我装了一堆插件用于优化浏览体验,并把主题改成了自己喜欢的样子。我还增加了 gitalk 评论系统,并接入了 Google Analytics 服务等传统艺能。

我会在这个帖子里做一些记录,关于我修改的比较重要的部分。

修改 Hexo 字体

我修改了 Hexo 全局的字体,并根据自己的审美修改了字体大小和排版。修改字体需要重写 CSS ,覆盖 NexT 原有的样式表。

NexT 的配置文件中找到如下片段

1
2
3
4
5
6
7
8
9
10
11
12
13
# Define custom file paths.
# Create your custom files in site directory `source/_data` and uncomment needed files below.
custom_file_path:
#head: source/_data/head.swig
#header: source/_data/header.swig
#sidebar: source/_data/sidebar.swig
#postMeta: source/_data/post-meta.swig
#postBodyEnd: source/_data/post-body-end.swig
#footer: source/_data/footer.swig
#bodyEnd: source/_data/body-end.swig
#variable: source/_data/variables.styl
#mixin: source/_data/mixins.styl
style: source/_data/styles.styl

由于我只自定义了样式表,所以我只是把样式表的部分取消注释。我希望修改我的网站全局的字体,所以我先通过 https://www.font-converter.net/ 将 ttf 字体转换成了多种格式,将其放在 source/fonts 文件夹下,并增加 CSS 配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@font-face {
font-family: "FZS3JW";
src: url("/fonts/FZS3JW/FZS3JW.eot"); /* IE9 Compat Modes */
src: url("/fonts/FZS3JW/FZS3JW.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */
url("/fonts/FZS3JW/FZS3JW.otf") format("opentype"), /* Open Type Font */
url("/fonts/FZS3JW/FZS3JW.svg") format("svg"), /* Legacy iOS */
url("/fonts/FZS3JW/FZS3JW.ttf") format("truetype"), /* Safari, Android, iOS */
url("/fonts/FZS3JW/FZS3JW.woff") format("woff"), /* Modern Browsers */
url("/fonts/FZS3JW/FZS3JW.woff2") format("woff2"); /* Modern Browsers */
font-weight: normal;
font-style: normal;
font-display: swap;
}

body {
font-family: "Times New Roman", "FZS3JW", "PingFang SC", "Microsoft YaHei";
}

这样,全局的字体就被修改为上述优先级了。

评论

NexT 提供了非常方便的评论接口,只需要申请对应的评论服务并把他们的 API Key 或者别的相关的东西复制过来就可以了。我这里主要记录一下 gitalk 的安装过程。

Gitalk

gitalk 是一个使用 GitHub issue 作为对话记录工具的评论,我觉得想到这个点子的人一定是天才。

首先我们需要创建一个 repo ,用于放所有的 issue (评论)。我创建了一个名为 gitalk-wasteland 的 repo 。然后我们什么都不用操作,进行下一步。

进入 GitHub OAuth App 申请页面 https://github.com/settings/applications/new ,创建一个新的 OAuth App 并设置 Homepage URLAuthorization callback URL网站首页 URL 。然后根据配置文件注释,将 Client IDClient Secretgitalk-wasteland(repo name) 等信息填入

Read more »

Syncthing Official Site: https://syncthing.net/

Syncthing Github: https://github.com/syncthing/

KodExplorer Official Site: https://kodcloud.com/

KodExplorer Github: https://github.com/kalcaddle/KodExplorer

Introduction

Syncthing is a continuous file synchronization program. It synchronizes files between two or more computers in real time, safely protected from prying eyes. Your data is your data alone and you deserve to choose where it is stored, whether it is shared with some third party, and how it’s transmitted over the internet.

Syncthing 是一个实时的文件同步程序,可以在两台以上的设备之间进行实时、端对端的文件同步。在不同设备间同步的时候,还可以对每个设备分别设置文件版本控制,保留被删除的文件的副本或者更改前的旧版本,在办公、科研、文档共享和数据共享上都有很大用处。

我将 Syngthing 安装在了学校电脑、 Surface 和远端服务器上,远端服务器有公网 IP ,方便进行快速同步。这样只要我本地的数据发生更新,远端服务器就会同步数据,并且保存文件的旧版本。

服务器安装

虽然是开源项目,但是我不建议使用源代码安装。源码安装不利于软件的升级和版本控制。

官网对文件安装的文档说明已经非常详细了,这边简单摘抄一些,并分享在安装过程中发现的问题并提供解决方案。

全平台(除了 iOS)的安装文件可以在这里找到 https://syncthing.net/downloads/

Deb 系

用户可以在两条 release 轨道中进行选择,分别是”stable” (latest release) 和 “candidate” (earlier release candidate) 。

同时强烈建议通过 HTTPS 从 apt 源进行下载。

Candidate Track 的版本升级会比 Stable Track 早大约三个星期,追求刺激的用户可以使用 Candidate Track 。

Stable Track

1
2
3
4
5
6
7
8
9
10
11
12
# Add apt https support
sudo apt-get install apt-transport-https

# Add the release PGP keys:
curl -s https://syncthing.net/release-key.txt | sudo apt-key add -

# Add the "stable" channel to your APT sources:
echo "deb https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list

# Update and install syncthing:
sudo apt-get update
sudo apt-get install syncthing
Read more »

一切的结束,一切的开始

我又搬博客了。在咕了两年零两个月之后,我终于继续找地方写我想写的东西了。
此时应该放个烟花庆祝一下。如果你的城市不能放烟花,请打开一首打上花火。

我把以前的博客封存了起来。在搬家时,我顺便翻了翻它。我发现每次搬家,都会再次发觉曾经的我的幼稚。当然人是要磨练的,在不断否定自己、改变自己后,才能在成长的路上艰难地向前挪动一步。

但我也会惊讶,惊讶于曾经渺小的自己爆发出来的强大的能量,和童言无忌口无遮拦的那些存粹的话。要是让我现在去修改以前的文章,可能要大段大段的砍掉让我现在念起来会面红耳赤的内容。我最终决定还是将他们悉数保留,也算是对我的青春的一种纪念。

鞭尸

有的文章实在值得我自己翻出来狠狠的抽自己不算厚脸皮,感受这种尴尬气氛下微妙的喉咙干燥感。以下文章全部摘自旧博客 日常 分类,并亲自附上吐槽。

  • 我与开发的故事
    我没想到当时的我竟有勇气将 Link 的内容设置为 my-way-to-developer,因为现在的我越发没有自信称自己为开发者。我觉得我自己就是个写代码造软件赚点外快的。可能这就是小孩子的勇气吧。
  • 我和typecho的第一次(
    一篇中规中矩的初级技术文章,伴随着一个自言自语式的尴尬的开场。当时的我竟然可以突破重重看不懂的代码,找到问题的核心所在,还能依葫芦画瓢写一些 “it works” 的 Apache 配置文件,实在难得。这样一个聪明的小孩,竟然没有在 SE 的道路上继续走下去,实在是可惜了。
  • 再見,我的競賽生涯
    就这点数学物理知识还是不要说自己是打竞赛的好。我感觉以前学竞赛学的那点皮毛,现在我把自己按在椅子前学两天,也能把题目做的头头是道。
    哇,竟然还爱上杭州,半年前我提着行李箱顶着烈日在没地铁的浙大西溪校区边上走着的时候肯定无比后悔曾经说过的话。不过,只身一人从杭州前往深圳、中途中转广州的经历算是很深的记忆了。虽然他们可能远不及现在的日子精彩,但作为那时的我,也是一个值得纪念的挑战。

关于旧博客的存档

旧博客我还是做好了存档,网址是 https://savepoint.touko.moe/ 。也不知道当时是为何停止维护了,明明刚开了两个项目连载,分别是 MIPS CPU 和 bot-framework,结果最后也没能继续做下去。

在考虑旧博客命名时,我和 POJO 讨论了如下几个选项。

  • archive
  • legacy
  • deprecated
  • milestone
  • pyramid
  • savepoint
  • ruin

这下可好,已经把未来数次的博客搬迁取名事宜考虑好了,以后可以尽情搬迁新博客而不用担心二级域不够用。

Read more »