缘起

就教育而言,内容始终是个宝贵资源,随着平台课程增多,如何备份就是个摆上日程的问题了,当课程还少的时候,采用定人定期备份的方式也觉得尚可接受,可手动备份的缺陷太多

  • 重复性的导入导出极其乏味,浪费时间
  • 导出课程名是随机字符,很闹归类
  • 人类不善于且厌恶重复性的工作,容易出错

这类工作让代码来做再合适不过了,所以我写了个备份Open edx课程的工具,已经上传到github和pypi,直接安装就可使用

使用

当前版本只支持python2

建议采用virtualenv来管理环境(virtualenv -p /usr/bin/python2 env),使用centos的同学最好采用以上建议,其他操作系统的其他同学可以无视

我们先来看下如何使用,十分简单,首先安装它:pip install course_backup

安装完成后,执行course_backup --help会看到参数提示

首先你需要登录studio,查看你的cookies中sessionid和csrftoken字段,然后填入配置文件,默认的配置文件为~/.backup_course.ini,当然你也可以自己指定它

我的配置文件为(cat ~/.backup_course.ini):

1
2
3
4
[main]
studio = http://192.168.0.100:18010
sessionid = 2aerthgca4fyqt4hqza38jhmoue9te5v
csrftoken = c4DiddgttfhhttjfKrCb47YQBeyS

填好配置文件后就可以启动备份任务啦

现在开始备份

course_backup –start

晚上两点开始备份

course_backup –start –night

指定配置文件

course_backup –start –config_file ./my_config_file.ini

指定备份目录

course_backup –start –courses_data_path /tmp/data

滚动备份

course_backup –start –night –interval_days 7 –courses_data_path /tmp/data

每七天备份一次,滚动周期为3周(超过3周的文件将自动删除)

Todo

  • 滚动备份
  • 只备份差异版本
  • 定时任务(for humans)
  • 云端同步

反思

这个自己写的工具从使用来看倒是挺顺手的。不过设计的时候,有一点始终让我左右为难:是提供一体化的解决方案好,还是让工具只专注在一件事(诸如只下载课程),然后把它和其他linux工具组合起来使用

《Unix编程艺术》里建议说

do one thing,and do well

这也是Unix哲学提倡的。

陷入到实际项目中,什么叫one thing呢?就很让人头疼,在这里我可能觉得backup courses整件事就是one thing,而其他人可能觉得download course是one thing,other thing可以通过组合其他工具,这样最终完成backup courses,诸如:

  • course_backup提供download course指令(粒度似乎很合适,利落)
  • course_backup提供所有课程id
  • 通过course_backup首先获得所有id,然后通过bash写一个循环来download all courses
  • 使用cron来写定时任务
  • 使用bash来写滚动备份功能

如果你真的这样做,你可能会发现,实际上我们只是把编程的任务从python移交到bash脚本里。

在bash里写逻辑是我极不情愿做的一件事,相比于shell里那些好用的工具(vim/grep/find/sed…),bash的语法简直丑哭。所以就我而言我会选择尽可能用python把逻辑写到course_backup里,对外暴露出配置选项,那么我的one thing粒度可能大一些

即便如此我对一些东西是不是应该包含在工具内还是犹豫不决,即便现在也是,诸如定时任务功能是应该用系统的cron来做还是采用python的定时任务模块来写到工具内部,写在外部的好处是:

  • 用户可以自由写定时任务
  • 代码简介干净

而混杂在工具里,就是这个工具不得不是一个常驻进程,同时为了追求灵活的配置参数,解析参数的代码也会很长,而这些本不是核心代码,不过是重造了一个丑陋的车轮

可把定时功能混和在工具里,也有好处

  • 对用户而言,上手容易,不需要而外去学cron和linux脚本

当然你可以说这是我对目标用户的定位不够清晰。这又是另一种的问题了。工程问题也许就许多这一类各种因素都需要权衡的问题

关于one thing的粒度,我一直拿捏不好,不知道别人是不是也有这个疑惑。我的自我安慰是这是一件需要权衡的事,也许还包含武断/拖鞋的/拍脑袋的过程,也许我们会把它称为直觉,无论用哪个词,指的似乎都是非理性的判断过程

这可能也是《Unix编程艺术》书名中艺术的所指吧

我并不是说我不喜欢do one thing,and do well这个建议,相反,它可能是我最喜欢的几个编程箴言之一,它优美而非线性,需要我们不断打磨练习和试错。在我读过的所有计算机的书里,《Unix编程艺术》和《代码大全》可能是我最喜欢的两本实践类指导书籍,我把他们看做best practice。

付诸直觉的事,尤其是在各种特质中做折衷选择的事,决策者肯定都会有足够的理由为自己辩护,最后我们能说的可能只有

Talk is cheap, show me your code

创建项目

上传到pypi

源码

course_backup