标签归档:moodle_dev

新安装 Moodle 应该选择哪个版本

Moodle 从 2.0 开始,采用了新的开发过程。从用户角度看,最大的变化是版本发布的频度提升了。现在,每年6月和12月左右会各发布一个新的 2.x 版;每 1-2 个月会为最近的 3 个 2.x 分支各自发布新的稳定版,也就是 2.x.x 版;每星期还会为每个分支发布一个 2.x.x+ 版,包含最新的更新。比如现在(2012/6/12)在官方下载页面就可以看到 2.0.9、2.0.9+、2.1.6、2.1.6+、2.2.3 和 2.2.3+ 六个版本(1.9.x 系特例,本文不讨论),而且它们都在被继续维护。其中最新的 2.n.x 分支叫做“Current stable”,次新的 2.n-1.x 分支叫做“Other supported stable”,最旧的但还维护的 2.n-2.x 分支叫做“Security fixes only”。为方便起见,后文就称它们为 C、C+、O、O+、S 和 S+ 版。更老的版本官方已停止支持,不建议使用,就不涉及了。

多数新安装 Moodle 的用户都会自然地选择版本号最高的 C+ 版。如果只是试试、玩玩,或者只提供短期、小用户量服务,那么这个选择无可厚非。但如果面向的是长期、大用户量服务,我建议您一定认真做一下评估。要知道,以前 Moodle 会在 C+ 后面标注“新安装的最佳版本”,但最近已经悄然删除了此话。原因就脑补吧。

下面我结合我的经验,先谈谈不同版本的特点,然后再谈谈如何选择最适合的初装版本,最后谈维护过程中如何决定是否升级。

版本间比较

从功能性角度看,显然 C+ >= C > O+ >= O > S+ = S。其中 X+ 和 X 之前的差异随着时间的推移逐渐加大,但最大时也不会有多少喜人的改变,待到小版本号提升,就又回到同一起跑线。例外是 S+ 和 S 之间只有安全相关的更新,所以功能上没有区别。它们之间的功能差异,可以看 Release notes

从安全性角度看,排序是 S+ > S > O+ > O > C+ > C。一般来说,低版本有的漏洞,高版本往往也有,一旦发现就会一起修复。而高版本新增功能引入的漏洞,在低版本未必存在。所以大方向上看,版本越低,安全性就越好。但 X+ 版因为包含最新的安全修复补丁,而且新增功能也不激进,所以通常比 X 版更安全。

从稳定性角度看,排序是 S+ > S > O > O+ > C > C+。S 版虽然声称只修补安全漏洞,但据我观察,很严重的 bug 也会被修复,所以 S+ > S。O+ 每周都会更新几十个补丁,其中大多数都是修 bug。C+ 版初期每周会有近百甚至过百的补丁,后期和 O+ 基本持平。从表面看,有这么多补丁,稳定性应该是提升的。理论上确实如此,但实际感受却不一样。

每个 bug 的修复,可能还会引入新的 bug。bug 修复得多,虽然整体上让软件更加稳定,但某些局部可能反倒更糟糕。比如说,某软件有十个功能,我只用其中两个,那么其余功能的 bug 与我无关,但如果恰好这两个功能引入了新的大 bug,会严重让我感到更不稳定。最近大半年,乐学网一直在用 2.1 分支。从它是 C+ 状态时开始,现在已降到 O+。一开始,我每周都是第一时间更新 + 版,但没多久就变保守了,总要等上几天,而且养成了 review 与常用功能相关的补丁的习惯。坦率地说,+版的补丁多数和乐学网关系不大,有关的里面又大多数没有问题,所以我仍坚持每周更新。但只要出现一个与我有关的小问题,就会狠狠折腾我一下。出新问题的频度有多大呢?印象中 Moodle 2.1 过去一年至少有三次 emergency release,就是刚发布新版本,24小时内又发布一个,修复严重 bug。这是 bug 严重到 Moodle HQ 很重视才会发生的情况。有些 bug 重视度不够,就修补得不及时了。比如我发现的这个 bug,把条件表达式里的“or”写成了“of”,很是吓人。在 release 后 4 小时我就提交了报告,但要一周后才修复。

所以,我认为在稳定性方面,从实际使用的体验看,O > O+,C > C+,除非 O 或 C 版中的某个 bug 会非常严重地影响使用。不过,对非 + 版也别太信任。比如我报告并全程参与的这个 bug,由一次 O 和 C 版的发行引入,影响面很广,优先级很高,但下一次发行也没解决。现在三个月过去了,仍然 open(倒不是开发者不上心,而是确实涉及面太广,所以非常慎重,reopen了若干次)。要不是有自制的山寨小补丁,还真顶不住。

所以,综合来看,S+ 版是最值得信赖的。

选择初装版本

初装的最佳版本就是当前的 S+ 版,原因有二:

  1. 最稳定、安全,如前述。所以日常维护的工作量最小,基本可以无负担每周更新。
  2. 从低版本升级到高版本如行云流水,数据都在;反之,几乎不可能。所以如果 S+ 不够用,随时可以升级。可一旦踏入高版本,发现不合适,想降级,可真没后悔药

当然,如果想得明白,考虑得周全,那么也可以直接装 O 或 C 版。先解释一下为什么不推荐 O+ 和 C+。首先是稳定性因素,当然选更稳定的(但如果某不能忍 bug 在+版修复了,可以升到 + 版,但后续还是尽量稳定到非 + 版)。其次看安全性。虽然 + 版更安全,但 Moodle 很负责,会先用 email 通知管理员一定要升级到最新的非 + 版,两周后才会公开安全漏洞细节,所以用非 + 版在大多情况下都是安全的。而且,漏洞这词听起来可怕,但实际上其中多数就算被黑客利用,也干不了太大坏事。如果有很严重漏洞,Moodle 会打破常规发行规律,马上更新非 + 版的。

好,接下来说选择 O 或 C 版的依据。

其实主要依据就一条:功能。这里主要考虑三个问题:

  1. 高版本是否有一定需要的新功能。比如 Moodle 2.2 有针对手机和平板设计的主题,如果很需要这个,就必须上,哪怕它还是 C 的状态(题外话,有 2.0/2.1 版可用的第三方移动主题,是 2.2 官方移动主题的前身。虽有问题,但凑合凑合也勉强能用)。
  2. 是否要做大量的定制开发。C、O 和 S 版之间的内部差异不能算很小,如果在它们之间升级,所有定制开发的东西都得或多或少地更新,搞不好还得重写。重新定制的工作量和日常维护的工作量相比较,当定制量比较大时,可以考虑上高版本,避免重复开发。
  3. 高版本的界面是否有巨大变化。这主要是从网站用户培训的角度考虑。Moodle 确实不是一个很容易掌握的东西。如果教师用户费劲巴力地刚勉强学会某版本,下学期一升级,又要重学,那可苦了他们了。本着“苦了我一个,幸福千万人”的精神,管理员得担起担子,优先选择高版本,减少用户的麻烦。

还有一个选择依据是安装的时间。比如在 5 月末安装,按 Moodle 路线图,很快有新的大版本发行,当前的 C 会降为 O,O 降为 S,而 S 被抛弃,不再维护。那么所有的选择就都可以向上提一格了。

升级规划

按照 Moodle 的发行周期,我们每半年就要做一次大升级。其间,如果使用 + 版,每周都要小升一次;非 + 版,每 1-2 个月小升一次。小升没得说,必升。大升得看当前状态。假如用的是不再维护的版本,得马上升;假如用的是仍在维护的版本,就得理智决定是否升级。理智的依据与新安装的选择依据倒是差不太多。

拿乐学网为例。1.9 版用了两年有余,仍可再坚持。但在 2.0 还是 O 状态的时候就冒进,纯因为 1.9 和 2.0 界面变化巨大,而预计很快就会有新用户井喷,所以选择了后天下之乐而乐。随后很快又升到 C 状态的 2.1,是为了少做一次定制开发。这些虽然让我整一年的维护都在提心吊胆中度过,隔不太久就要救一次火,但把所有人的工作量加到一起看,还是划算的。未来,我一定要等到 2.2 成为 S 时才做下一次大升级,虽然那些新功能都挺诱人的。

最后说一句经验之谈:一定要用 git 下载和管理源代码。初次接触 git 可能会遇到一些痛苦,但与日后长久的高效相比,这些痛苦不值一提。用任何其它方式下载代码,都是让痛苦成为日后的顽疾。

支持Moodle 2.0的在线评测2.0开始公开测试了

项目主页、下载地址、安装说明等都在:https://github.com/hit-moodle/moodle-local_onlinejudge

它并不是1.x的简单升级,而是完全的redesign,和近乎完全的recode。主要改进:

  1. 架构上分成三个部分:judgelib、judge和client。
    1. judgelib是一个函数库,以local插件的形式安装到moodle中,对外提供评测接口
    2. judge是judgelib的子插件,可以叫做评测引擎插件。现在支持sandbox和ideone.com两种引擎,还可以扩展到更多
    3. client是和最终用户交互的插件,它对用户提供界面,对内调用judgelib做评测。现在只有一个作业类型插件,还可以扩展更多,比如测验插件、活动插件等等
  2. 作业插件支持多文件编程(仅限sandbox)
  3. 管理员可以设置一些全局设置
  4. 教师可以设定自己的ideone.com账号,避免了免费账号判题次数的问题,还能通过ideone.com管理学生的程序
  5. 可以一次只重新评判一名学生

暂时还未完成的1.x的功能包括:

  1. 显示学生程序的输出给教师。这个功能将改进成显示更详细的程序运行信息
  2. 代码加亮预览。因为moodle 2.0的变化,这个实现起来稍微有些麻烦,正在寻找最好的解决办法

1.x用户将moodle升级到2.0后,可以直接升级online judge 2.0,原有作业都会被继承保留。

欢迎测试!发现任何问题,有任何意见和建议,都请在项目主页的issues中提出。多谢!

另外,后续版本的发布可能不会再通过博客等媒体宣布,请在github上watch本项目,以便随时了解最新动态。

再另外:

  1. 热点提问支持moodle 2.0的版本早已经在了,而且可以算是稳定版,欢迎使用
  2. 支持Moodle 2.0的MOSS反抄袭将是接下来的开发焦点。现在的代码还很惨不忍睹,很不建议试用,不信可以在github上看看

最后:诚征志愿者帮我们解决各种issue,详见《志愿者指南

庆祝Moodle 2.0中文包翻译率达到80%,冲入第一阵营

在提交了剑晖的#1142贡献后,Moodle 2.0中文包的翻译率终于达到了80%,冲入第一阵营。记得去年9月份翻译协作网刚开通时,只有50%多一点儿翻译率。半年多的时间,326次提交,15位志愿贡献者,完成了大量的翻译和修订工作。贡献者名单如下(排名不分先后):

  • 邢林林
  • 陶显锋
  • Zhou Joe
  • zhang angel
  • 王帅
  • Xie Yubo
  • Jin Ping
  • Gao Jiayang
  • Fu Jianyu
  • 田大龙
  • Lee Edward
  • Zhao Chonke
  • Zhang Lei
  • 剑晖
  • Sun Zhigang

感谢他们!期待100%时,贡献者名单里能有您的名字!

Moodle用户认证切换到CAS+LDAP笔记

cms以前用的是email认证,用户自己填个人信息。过程繁琐,信息不准,相当折腾。偶然获知信息处正在做统一认证平台(CAS),就联系了一下,他们也正希望能有其它IT系统融入,所以一拍即合,相当融洽。

Moodle本身就有CAS认证插件,认证后从LDAP获取用户信息。配置起来并不复杂。两个比较好的参考:http://docs.moodle.org/en/admin/auth/ldaphttps://mediawiki.middlebury.edu/wiki/LIS/CASifying_Moodle

比较复杂的是和旧账号的兼容。如果能有明确的旧账号和CAS账号的对应关系,那么只要修改Moodle的user表,把username改成cas的用户名,auth改成cas就行。一个脚本,甚至几条sql语句就能搞定。

可惜我们没有这样的对应关系,必须让用户自己设定账号绑定,所以有了这个项目:https://github.com/hit-moodle/bind_cas_users。它先引导用户在CAS登录,然后让用户输入旧用户名和密码,验证通过,用户确认后,修改user表,使username为CAS用户名,auth为cas,这样用户以后直接从CAS登录就能完全继承旧账号的一切了。

这里有个难点,就是假如旧用户名是user1,CAS用户名是user2,而Moodle还有一个用户名是user2的用户。如果user1在user2之前做绑定,那么无法修改username。

解决方法是把所有旧用户名统一加上后缀“.local”(先要确认没有用户已经用过这个后缀),本地验证时自动在用户输入的用户名后加上“.local”。这样改username就不会发生冲突。下面这条SQL语句就是做这个的

提前若干天发出账号切换通知,让大家先去CAS激活账号,同时在小范围测试账号绑定程序。

在直接用cas登录时,假如moodle中并没有该用户的记录,会直接创建一个新用户。这导致,如果一个cas登录了的用户,没有去做账号绑定,直接点击了cms的任意要求登录的页面,那么他就在cms中有了一个和cas对应的新账号,而旧账号无法和新账号绑定了。这个问题的解决靠下面这个补丁:

挑一个夜黑风高的晚上,关站完成以上过程。大家一觉醒来,就都必须都用CAS登录了。

Moodle的cas登录插件还兼容其它登录方式。在其配置中设置好后,在登录界面会显示两个选择:CAS登录、其它登录。因为cms还有很多校外用户,以及cas中还没有考虑校园访客的情况,所以我们保留了原有的email认证(用户名加了后缀)。CAS登录会先判断用户是否已经在cas中登录了。如果是,就直接以其身份登录;如果否,才显示选择登录方式的界面。

另外,auth/cas/cas_ldap_sync_users.php是需要放在cron中的脚本,但没有转换完所有账号前千万不要运行。它会直接在moodle创建ldap中的所有用户,而不会进行任何账号关联操作。一旦运行,再想让用户能继承旧数据就比较麻烦了。

假期第一周工作总结

这一周的主题,就是Moodle 2.0

赶在临放假前,将cliff调好的服务器送入了网络中心,指导服务器的技术支持人员将其成功上架。因此错过了科研研讨会第一天精彩的下半场。

科研研讨会第二天中午接到数学系一名教师的电话,于是前去介绍Moodle,就又错过了第二天精彩的下半场。但愿这趟没白跑吧。

将老cms上的数据库和用户文件拷贝到新服务器。太多零碎文件了,打包和解包都耗费了数个小时。传输按理说应该很快,但一个机房里都是千兆接入的两台机器平均速度还到不了10MB/s……

1.9升到2.0勉强算顺利,遇到一个bug,但官方旋即就修正了。

开始测试和开发:

  1. 简单修改了几个缺省参数,可以让新用户直接启用AJAX功能、跟踪讨论区未读帖子和不自动订阅讨论区。
  2. 做了个可以用中文全名搜索用户的补丁,顺手pull-request给dongsheng讨论一番,决定做个更好的。
  3. 报了一个小bug,也做了小补丁,但skodak看我的补丁时发现原来的代码有严重安全问题,并没有直接用我的补丁,而是做了新的。留个名的念头破灭。
  4. 和dongsheng讨论后,做了个比较大的补丁,可以更好地支持各种语言的用户全名搜索。提交到moodle tracker,等待发落中……
  5. 又报了个moodle和nginx配合的bug,被skodak指出是我们自己配置的问题。耽误他时间了,很不好意思。希望这条信息能对后来人有帮助吧。
  6. 做了一个更好地处理姓、名顺序的补丁,如果全名搜索的补丁被接受,就再PULL一下这个。
  7. 中文姓氏检索用户的补丁移植到了2.0。这个太中国化了,不可能给官方。

git和github.com真好用啊!!!!

另外就是moodle 2.0的翻译工作。把中文包的翻译率从70%提升到了73%,大概新翻译了有500多条吧(感谢王帅朋友贡献的5条),修正的也好多,数量就没有统计了。

做这些很有成就感,很快乐,欲罢不能。但下周不能再干这个了,得写tmd的论文了,还有tmd的NSFC,过tmd年,开始tmd的生活。TMD!

Moodle 2.0值得关注的新特性

2.0是Moodle历史上最大的一次升级,已经发布了RC1版,期望一个月后能正式发布。现在moodle.org就在运行Moodle 2.0,说明它已经能在开发人员的监管下稳定工作。

目前已经有三个可以公开访问的运行2.0的网站,除了moodle.org,还有lang.moodle.org(Moodle的协同翻译平台,注册后就能参与),和qa.moodle.net(公测网站,每个人都可以用管理员、教师或学生身份登录)。通过使用这三个网站,以及Release Notes,对Moodle 2.0已经有了一些感受。

视觉上的主要变化是更漂亮和方便了。2.0官方提供的主题风格的数量和质量都有很大的提升,而且主题本身还可以提供个性化的功能。比如版块不再是只能傻傻地贴在页面上,用户可以把它放到一个停靠栏里,需要的时候才弹出来,很节约空间。

“导航版块”能让用户非常方便地直接进入不同课程的不同活动。“设置版块”有上下文感知能力,会根据你所处的位置不同自动变为最相关的选项。

旧的HTML编辑器被抛弃,换用TinyMCE。它不仅对各种浏览器的支持更好,排版功能更强(比如支持layer、CSS自定义),而且支持可视化的公式编辑,这个太有必要了!

旧的基于目录的文件管理被“容器”替代。从用户角度看,当需要使用文件的时候,只需从它所在的容器选择它。容器的种类很多,可以是自己上传的文件和目录,也可以提供一个url让moodle自己下载,还可以是从Google Docs、DropBox、Youtube等导入。当然,最主要的导入功能在中国是别指望用了。所有导入的文件都会自动和文件源保持同步。从开发者的角度看,文件不再是以目录、子目录的形式组织,而是被后台用hash一类的方法管理。好处是重复的文件会只有一份,缺点是不能再通过直接访问文件系统来处理文件了。

“活动完成状态跟踪”和“条件”对授课会很有帮助。它可以强制要求学生必须先做完某件事,才能再做另一件。比如,必须先参加一个投票,才能提交某个作业;完成作业1,才能做作业2;如果作业1得分高,可以做作业2,否则做作业3……。这个功能亦扩展到课程级别,从而开始支持先修课。

“反抄袭”功能有了内置API,既可以通过插件的方式扩充多种反抄袭手段,也让任何功能模块都可以调用反抄袭的API。看来与抄袭的斗争已经是世界性的了。

“信息反馈”模块第一次成为标准模块。用它可以自定义各种形式的调查问卷,而不像旧的“问卷调查”模块只能设置固定的几个问题。

表面的主要变化并不是很大,最重的都在后台。比如开始支持Web Service,这使得Moodle可以更好地和其它系统交互,也更便于移动客户端的开发;“备份和恢复”功能完全重写;Wiki完全重写;Workshop完全重写……

后台的变化意味着它需要更多的测试。估计一年以后俺的乐学网就可以升级到2.0了。在此期间,得把在线评测和反抄袭做个移植。因为底层的变化太多,这个移植动作实在不小,有兴趣的欢迎加入开发!

Moodle插件“热点提问 1.0”发布

这可能是Moodle第一个为教室服务的插件。其设计灵感来自于普渡大学的Hotseat

课堂互动是目前教学工作中比较强调的一件事。但中国学生的性格内敛、羞涩,在提问前经常会瞻前顾后,顾虑较多,导致提问不够踊跃,难以形成良好的互动。本插件就是为解决此问题而设计。

在“热点提问”中,学生可以像发微博一样地提问,而且可以匿名提问。还可以对别人的提问投票。教师可以根据投票结果获知学生对什么问题最感兴趣,就能更有选择性地回答学生的问题。

我已经用了两次课,效果还不错。能在上课时访问网络的学生还是不多,所以参与度目前还不算高。可以到这里围观它。

此插件可以在这里下载这里有安装说明。

moodle的隐藏功能

当了解到这些隐藏功能后,我不得不对Moodle的喜爱又增加了一层。本文慢慢搜集它们,持续补充。

隐藏功能是那些在moodle界面中找不到,必须手工在地址栏输入url才能使用的功能。本文后面只给出每个url相对于moodle root的部分,比如“/foo/bar.php”意味着应该访问“http://www.mymoodle.com/foo/bar.php”。

1. 系统管理

1.1 数据库性能监视

/admin/dbperformance.php

1.2 把MySQL数据库从MyISAM格式转换到InnoDB格式

/admin/innodb.php

因为MyISAM不支持事务等缺点,从Moodle 2.0开始,InnoDB将成为官方推荐的格式。详情可以参考MDL-23682,moodler们对MyISAM的态度几近于愤怒。

1.3 体检中心

/admin/health.php

自动检查系统潜在的问题,并给出建议性的解决方案。这个很值得每隔一段时间就用一用。

1.4 全数据库替换

/admin/replace.php

对整个moodle数据库进行文本搜索和替换。比如网站更换了域名,就可以用一下这个。

2.辅助开发

2.1 调试发出的email

把所有发出的email都重定向到一个log文件中。

脚本在/admin/mailout-debugger.php,但它不是从浏览器里访问的。它的注释详细说明了使用方法。

3. 彩蛋

3.1 列出所有用户的头像

/userpix/index.php

Moodle Online Judge 1.3.1发布

新特性:

  1. 支持40余种编程语言的在线评测。新语言的支持来自于ideone.com,这是一个免费的Web服务。所有程序都是在ideone.com运行,所以对您的moodle服务器而言,是相当安全。该功能由刘琦卿开发。
  2. 因为可以使用ideone.com运行程序,所以从这个版本开始支持Windows了

下载请到:http://code.google.com/p/sunner-projects/downloads/list