手把手教你搭建自己专属的Anki服务器

96
张发荣
2017.08.06 15:50* 字数 3140

一. 为什么要搭建自己的Anki服务器?

1. Anki是什么?

Anki是一个基于间隔重复(Spaced Repetition)的字卡软件,同样基于该原理的软件还有商业软件SuperMemo和免费软件Mnemosyne。其名称源自日语的“暗記”(日语发音为:Anki,意思即为“记忆”)。
Anki对SuperMemo的SM2算法予以改进,使其可以根据记忆卡的优先级、紧急程度进行优化调整。
记忆卡采用HTML语言编写,支持插入图片、音频以及LaTeX公式。
Anki支持多平台客户端,包括PC、安卓、iOS、塞班等,也可以直接登录Ankiweb进行学习。除此之外,注册一个免费账户,便可实现平台之间的同步。
——维基百科,自由的百科全书

简单说就是,Anki是一个利用更好的算法,通过间隔重复的方式,帮助我们记忆东西的软件。它多平台支持,开源,同步方便。

此外,因为Anki的记忆卡采用HTML编写,扩展方便。多年的发展让它积累了大量成熟、优秀、好用的卡片组,比如各种英语考试的,其他语种学习的,初高中各学科的,各种国家等级证书考试的,应有尽有,均可在网上方便地免费获得。

如果你觉得现有的卡片不能满足你的要求,你还可以制作自己的记忆卡片组。因此,只要是需要记忆的内容,都可以制作成记忆卡片组,通过Anki来完成。这大大扩大了Anki的应用范围,使它成为了我们记忆学习的一个大杀器。

2. 为什么要搭建自己的Anki服务器?

1)

在阅读Anki的维基百科时,你可能不禁会产生这样的疑问:既然Anki有免费的同步服务,那为什么我们还要花费精力来自己搞一个呢?

这个问题相当好,我将认真回答。

是这样的。

  • 首先,Anki的官方服务器在国外,Anki官方资金也不是很充足,导致在国内使用他们的同步服务速度非常慢。那种感觉……谁用谁知道,特别是当你有大量媒体数据需要同步的时候。时间就是金钱,浪费时间就是浪费生命。所以,出于对自己生命的珍惜,我建议你搭建自己的Anki服务器。

  • 其次,用别人的服务器,就意味着你的数据是掌握在他人手上的,服务也是掌握在他人手上的,多少会受制于人。出于对自己数据安全和隐私的考虑,我推荐你搭建自己的Anki服务器。

也许你会说,反正我们那么多数据都是掌握在别人手里的,再多一个无所谓了,又不是什么关键数据。我却认为,正因为那么多数据已经掌握在别人手里了,所以我们能夺回来一点算一点。

这个世界与我们想象的很不同。有的事情,你觉得反正做了也没用,所以选择不做。真相却是:正是因为我们不去做,不坚持做,做的不够多,才导致貌似做了也作用不大。 你想想看吧,罗马也不是一天建成的,不是么?

  • 再次,官方提供了Anki的服务软件及安装指南,这分明就是在鼓励我们自己搭建服务器的嘛。作为热爱学习,追求进步,想要不断成长的我们,怎么可能放弃这么好的学习、进步、成长和折腾自己的机会呢?生命不休,折腾不止。 这个服务器咱必须得自己搭建哪!

当然了,大前提是:首先你得是个Anki用户,或者是Anki的潜在用户。不然搭个服务器干嘛使呢,对吧?

如果你对我上面的回答不满意也没关系,继续往下读就是了。

2)

自己搭建的服务器,就一定比官方的同步速度更快么?

很遗憾地告诉你:并不能。

具体的同步的速度跟你自己所选用的服务器有关,你连服务器的速度快,搭建之后同步速度自然快,如果你连服务器的速度一般,那自建服务器之后同步速度也快不了。

不过我还是可以跟你保证一点:如果你的服务器是建在局域网里面的,那么速度绝对慢不了。但是这样做有个缺点:你只有在这个局域网内才能同步,出了局域网就不行了。

3. 需要的条件

前面说了这么多,都是在介绍Anki和自建服务器的优势的。

在进入正题,我们再来说一个准备工作:要搭建自己专属的Anki服务器,都需要哪些条件呢?

下面是列的一个清单——其实一共就两项,哈哈

  • [x] 一个有公网IP的Linux服务器,或者一台局域网内的Linux主机。
  • [x] 一颗不怕麻烦,勇于折腾的心

下面作个说明。

  1. 这里所说的Linux主机,不一定非得是个人电脑,也可以是路由器、树莓派、下载宝,pogo之类的小玩意儿。
  2. 因为折腾的过程中,总会出现各种各样意外的情况,所以,在折腾前请确认你是一个勇于折腾、不畏艰险、迎难而上的人,碰到意外状况能够不屈不挠,不断摸索,反复尝试,直到成功。否则,真心不建议你折腾。
  3. 如果你觉得自己做不到上一条,但是仍然读到这里了,那就放心折腾吧。别怕,有我呢!
    因为几乎整个过程能够碰到的大部分问题及其解决方法,我都翔实地记录下来,下在下面了,即使你几乎没有Linux系统的使用经验,只要一步步照着做,也能把服务器搭建起来,问题不是太大。

如果你能够看到这里,那么说明万事具备,只欠行动了。撸起袖子加油干,甩开膀子加快干。还愣着干嘛?赶紧行动呀!

二.服务器的搭建

开始前,先把我们的思路说明一下。

  1. 让Anki服务随系统自动运行,平时不需要我们操心和干预,即使服务器重启也不怕。
  2. 让Anki服务以普通用户身份运行,避免服务器本身因为Anki服务而出现一些奇怪的问题或者不可挽回的意外。

下面正式开整。

1.我的安装环境:

  • Python 2.7
  • pip软件包管理工具
  • debian-8.0-x86_64-minimal

下面使用的命令也是针对此系统的,其他系统请自行调整。

2.安装

  1. 安装Akni服务:
    easy_install AnkiServer

  2. 添加名为anki的用户:
    useradd -d /home/anki -m anki

  3. 切换到anki用户:
    su -l anki

  4. 新建anki文件夹并进入:
    mkdir anki
    cd anki

  5. 创建配置文件:
    cp /usr/local/lib/python2.7/dist-packages/AnkiServer-2.0.6-py2.7.egg/examples/example.ini production.ini

  6. 修改配置文件:
    nano production.ini

  7. 修改其中的服务器地址为实际地址:
    host = x.x.x.x
    保存,然后退出。

  8. 添加anki账号:
    ankiserverctl.py adduser username

回车后根据提示输入账号密码。

3.测试

  1. 调试模式运行Ankiserver
    ankiserverctl.py debug

收到报错:
Anki requires a UTF-8 locale

  1. 执行以下命令:
    python2 -c "import sys; print sys.getfilesystemencoding()"

结果如下:
ANSI_X3.4-1968

  1. 语言设置问题,执行以下命令:
    export LC_ALL="en_US.UTF-8"
    再次debug调试,报错仍旧,应该是语言包缺失。

  2. 安装语言包:
    dpkg-reconfigure locales

  3. 选择en-US.UTF-8安装,然后修改/etc/default/locale
    LANG="en_US.UTF-8"

  4. 重启:
    reboot

7 查看语言环境:
python2 -c "import sys; print sys.getfilesystemencoding()"
结果为:
UTF-8
语言环境已正常,继续debug试运行

  1. 以anki用户进入/home/anki/anki,再次调试:
    ankiserverctl.py debug ./anki/production.ini

  2. 无报错,Ctrl+C退出,运行ankiserver:
    ankiserverctl.py start
    手机测试同步正常。

4.添加开机启动

  1. 以anki账号在anki家目录下操作:
    touch anki-start.sh
    nano anki-start.sh

  2. 敲入以下内容:
    #! /bin/sh
    ankiserverctl.py start /home/anki/anki/production.ini
    保存并退出。

  3. 为脚本添加执行权限:
    chmod +x anki-start.sh

  4. 然后切换root账号操作
    nano /etc/rc.local

  5. exit 0前面加入以下内容:
    su anki -c "/home/anki/anki-start.sh"

  6. 保存,退出。重启测试。
    同步正常,速度很快。

至此,Anki服务器搭建完成,接下来我们进行客户端的设置。

三. 客户端的设置

Anki对多平台的支持相当完善,主流的电脑系统和手机系统官方都有支持,而且基本上都是免费的——IOS系统除外。

下面我就根据我自己的使用情况,介绍一下PC端和Android手机上自建服务器同步的设置方法,即Anki for Windows和AnkiDroid的设置方法。

1. Anki for Windows的设置

  1. 打开插件文件夹


  2. 新建一个txt文档,在里面填入以下内容:
    import anki.sync
    anki.sync.SYNC_BASE = 'http://192.168.0.100:27701/'
    anki.sync.SYNC_MEDIA_BASE = 'http://192.168.0.100:27701/msync/'
    这里的IP只是示范用,自行替换为你的服务器IP,即安装时第7小步所修改的IP。。

  3. 保存并关闭文档,修改文件名为mysyncserver.py
  4. 重启Anki。点击同步,登录设置好的用户名和密码,点击登录即可开始同步。

2. AnkiDroid的设置

  1. 进入软件菜单,点设置:
  2. 然后点击“高级设置”:
  3. 点击自“定义同步服务器”:
  4. 在使用“自定义同步服务器”后面的小框打勾,然后修改同步地址和媒体文件同步地址:

    这里有两个小细节值得注意:

    • 黑线部分替换为你自己的服务器IP,
    • 记得把IP前面的的https改成http
  5. 返回软件主界面,下拉开始同步。在弹出的对话框输入设置好的用户名和密码,点击登录即可开始同步。

四. 参考来源

文主在折腾的过程中,主要参考了以下两篇文章:

  1. 来自知乎的Linux下自建Anki服务器
  2. 来自简书的利用远程服务器搭建Anki服务

其他一些问题则是通过搜索解决的。

当然了,个人精力和经历毕竟有限,不可能穷尽所有的情况。所以,你在折腾的过程中,有很大可能会遇到这里没有记录和说明的问题。不过没关系,这不是还有我嘛!

不管在折腾过程遇到什么问题,或者上面的操作步骤有什么不明白的地方,你都可以在留言里面提出来。虽然我不能保证百分之百地帮你解决,但是我可以保证百分之百地认真对待,竭尽所能帮你出主意,想办法,提供解决思路。

顺便说一句,对于Linux我也是个新手,折腾没多久。让我们一起交流,一起进步吧。

无华进化论
Web note ad 1