为高效学习神器 Anki 部署一个专属同步服务器
Anki 介绍
Anki 是一个辅助记忆软件,其本质是一个卡片排序工具--即依据使用者对卡片上的自定义内容进行主动测试、自我评判后,其内部算法根据评判结果更改每张卡片下次测试时间的排序工具。
所谓的卡片,专业说法叫 Flash Card(抽认卡或闪卡),是一小块纸片,分为正反两面,将问题和提示写在一面,将答案写在另一面。使用方法就是先看正面的问题与提示,在脑中回想答案,然后翻出反面进行对照验证。
闪卡的核心制作原则就是:一个知识点一张卡。因此非常适合用来学习英文,也可以用来记忆历史事件时间、公式等等。给大家看下我制作的闪卡:
每张卡片只有一个英文单词,与之配套的是该单词的音标、发音、图片、英文解释、例句。所有的版块都是英文,绝对不要出现中文! 卡片的核心是图片和例句,通过图片可以猜到这个单词大概是什么意思,通过例句可以验证自己对单词意思的猜测是否正确,如果还不放心,可以看下英文解释,这一套流程下来绝对可以正确理解单词的意思,完全不需要中文的干涉,这才是学习英文单词最完美的方式。
即便如此,大家在熟悉单词的过程中可能还会有一个误区,比如上面这个单词,你在学习的过程中可能会忍不住去想这个单词在中文里究竟是什么意思,甚至可能会在心里默念它的中文意思,即使你看了图片和英文解释,你心里可能还会忍不住去想:哦,这是转瞬即逝的意思。建议大家最好不要这么做,要想做到这一点,记住一句名言:只可意会,不可言传。你去看这张图片,然后用心去体会:哦,大概就是这么一种感觉,对对对。你能 get 到这个单词所表达的那种感觉就行了,不要再去思考如何用中文来描述它,那样反而吃力不讨好。
下面言归正传,相信有很多小伙伴和我一样在使用 Anki 来学习英文单词或者其他的知识,但是 Anki 的同步服务器在国外,还是一个个人项目,带宽很小,同步速度很慢,如果我们想在多个客户端之间同步学习进度和新增的知识点,那将非常痛苦。
为了解决这个问题,我们需要部署一个自定义的同步服务器,然后让客户端去使用这个同步服务器。目前桌面客户端和安卓客户端都可以使用自定义服务器,惟独 iOS 客户端不可以,iPhone 和 iPad 用户可以不用往下看了😂。
Anki 同步服务器部署
目前只有 anki-sync-server[1] 这个项目支持最新的 Anki 版本,其他的同步服务器项目基本上都失效了。这个项目是用 Python 写的,需要装一堆依赖,想想就难受哦,我才不会这么傻呢,赶紧扒扒看有没有现成的 Docker 镜像,还真有诶,项目地址:Anki Sync Server with Docker[2]。
有了镜像,部署起来就简单了,不就是 Docker 一把梭嘛!我所有的服务(包括我的博客)都部署在 K3s 集群上[3],所以我肯定是选择将同步服务部署在 K3s 集群中了,如果你想使用 docker-compose 来部署,可以参考 Anki Sync Server with Docker 项目的示例[4],这里不再赘述。
K3s 部署就简单了,先准备一个部署清单:
# docker-anki-server.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: docker-anki-server
labels:
app: docker-anki-server
spec:
replicas: 1
selector:
matchLabels:
app: docker-anki-server
template:
metadata:
labels:
app: docker-anki-server
spec:
volumes:
- name: data
hostPath:
path: /data/anki
containers:
- name: docker-anki-server
image: johngong/anki-sync-server:latest
ports:
- containerPort: 27701
env:
- name: TZ
value: Asia/Shanghai
- name: USER
value: ********
- name: PASSWORD
value: ********
livenessProbe:
httpGet:
path: /
port: 27701
readinessProbe:
httpGet:
path: /
port: 27701
volumeMounts:
- mountPath: /config
name: data
readOnly: False
---
apiVersion: v1
kind: Service
metadata:
name: docker-anki-server
labels:
app: docker-anki-server
spec:
selector:
app: docker-anki-server
ports:
- protocol: TCP
name: http
port: 27701
targetPort: 27701
记得将数据目录映射到宿主机或者保存到外部存储中,我是直接通过 hostpath 映射到宿主机目录的。
然后直接 kubectl 一把梭部署:
$ kubectl apply -f docker-anki-server.yaml
部署完成后,可以到 KubeSphere[5] Console 界面中查看运行状况。
这就部署完了。
最后我们还需要把服务通过公网暴露出来,而且安卓版 Anki 要求同步地址为 HTTPS
协议,所以还需要通过 Ingress 等代理将服务暴露出来,并配置好证书和域名,这里大家根据自己所使用的代理来配置就行,我就不写了。
客户端设置
桌面端
桌面客户端(macOS/Windows/Linux)配置方法如下:
依次选择 工具 --> 插件。
点击获取插件。
输入代码
358444159
,点击 ok。这样就装好插件
custom sync server redirector
了,选择该插件,然后点击配置。将 syncaddr 的值替换成自定义服务器的地址。
配置完成后,在 Anki 主界面点击同步。
然后输入之前配置清单中设置的账号和密码,点击 ok。
这样就配置完成了。
安卓端
安卓端不需要安装插件,直接配置即可,我的 AnkiDroid 版本是 2.15.6
。你可以通过「设置 -> 高级设置 -> 自定义同步服务器」找到配置页面。
再填写用户名和密码:
设置 -> 常用设置 -> AnkiWeb账户
这样就算配置完成了,所有的牌组都同步过来了。
iOS 端
虽然 iOS 端不能自定义同步服务器,但也不是没有解决方案的,我建议的方案是:
打开咸鱼,卖 iPad 和 iPhone,然后买 Android。
题外话
大家如果对我的卡片模板比较感兴趣,可以关注公众号:
引用链接
anki-sync-server: https://github.com/ankicommunity/anki-sync-server
[2]Anki Sync Server with Docker: https://github.com/ankicommunity/anki-devops-services
[3]部署在 K3s 集群上: https://icloudnative.io/posts/deploy-k3s-cross-public-cloud/
[4]Anki Sync Server with Docker 项目的示例: https://github.com/ankicommunity/anki-devops-services/blob/develop/services/anki-sync-server/images/docker-compose.yml
[5]KubeSphere: https://kubesphere.com.cn
推荐阅读
你好,我是程序猿DD,10年开发老司机、阿里云MVP、腾讯云TVP、出过书、创过业、国企4年互联网6年。10年前毕业加入宇宙行,工资不高、也不算太忙,业余坚持研究技术和做自己想做的东西。4年后离开国企,加入永辉互联网板块的创业团队,从开发、到架构、到合伙人。一路过来,给我最深的感受就是一定要不断学习并关注前沿。只要你能坚持下来,多思考、少抱怨、勤动手,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你看好一个事情,一定是坚持了才能看到希望,而不是看到希望才去坚持。相信我,只要坚持下来,你一定比现在更好!如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯,帮你积累弯道超车的资本。