月度归档:2010年09月

sunner.cn下辖域名更改

还是成功拿到了备案,所以域名暂时不换了

中国网站备案的条条框框实在太多,而我的网站又有一些特殊,所以经过慎重考虑,决定放弃sunner.cn域名,改为sumoon.org。

从即日起,我的主页地址变更为:

http://sunner.sumoon.org

我的博客地址变更为:

http://blog.sumoon.org

sunner.cn域名及其子域被停止解析的时间未知。但我还是想继续为这个域名付费,等到那一天,不再需要如此繁琐的审查时,马上恢复使用。

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

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

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

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

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

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

在Linux下用ffmpeg自拍课程录像

某一天突然觉得,上课时直接用电脑自己把屏幕信息录下来,并同步录音,就能做出很不错的课程录像了,而且成本超级低。于是乎,折腾了一番。

因为我的操作系统课全程在Linux下放幻灯片、做演示,所以当然就寻找Linux下的解决方案。

首先试验了xvidcap,它支持命令行和图形界面两种方式,能同步录音和录像,支持多种编码,2006年开始停止更新。最先遇到的问题是不能录音,几经周折发现只有在音频编码设为pcm16的时候才能录音。然后遇到的问题是不稳定,连续工作一会儿就segment fault。于是放弃。

然后试验了recordmydesktop,它是命令行的,有图形前端,能同步录像和录音,只支持ogv编码和格式,2008年停止更新。它的问题是编码器的CPU消耗太高,我把帧率设成1,才能正常地实时编码。它支持先无损压缩捕获,然后再编码的方式,但因为下课就得走人,没那么多时间给它。从它的源码里发现一个未公开的参数–no-encode,捕获完毕直接退出,以后可以用–rescue参数慢慢编码。看上去很美,但–rescue的结果就是segment fault。调了调代码,没搞定,于是放弃。

开始慨叹咋就没一个像windows下Camtasia那样好用的呢?又几经周折,居然发现ffmpeg就能录!而且几乎100%满足我的需求!下面的脚本就是干这个的:

#!/bin/sh
 
wait_til()
{
    CURRENT=$(date +%s)
    TARGET=$(date -d "$1" +%s)
 
    SECONDS=$(($TARGET - $CURRENT))
 
    if [ $SECONDS -lt 0 ]; then
        SECONDS=0
    fi
 
    sleep "$SECONDS"
}
 
WORKDIR=~/podcast
FILENAME=lecture_`date +%Y%m%d_%H%M`.mkv
 
if [ "$1" != "" ]; then
    wait_til $1
fi
 
cd $WORKDIR
ffmpeg -f alsa -ac 1 -i pulse -f x11grab -r 10 -s 1024x768 -i :0.0 -acodec pcm_s16le -vcodec libx264 -vpre lossless_ultrafast -s 512x384 -threads 0 $FILENAME

将代码存为capscreen文件,赋予执行权限,然后在命令行输入capscreen命令就立刻开始录像了。录好的文件存放在~/podcast中,文件名是“class_日期_时间.mkv”。capscreen后如果加上一个时间参数,就是等到该时刻才开始录像。比如“capscreen 8:00”就是早8点整开始。

这个脚本为了节约CPU资源(我上课用的是上网本,atom cpu,实在能力不足),设定的是图像无损压缩,音频不压缩,帧率10,屏幕分辨率1024×768,视频文件分辨率512×384。过后,可以再用ffmpeg重新编码,制作出适合各种情况的视频,详情请参考这里。如果CPU够劲,可以忽略后期过程,直接输出最终格式,再配合上传脚本,或者nfs、smb一类的网络文件系统,以最快的速度发布。每个教室里的教师机都应该考虑搞个类似的东西。

缺点:

  1. 鼠标指针始终都是一个箭头,而且不能隐藏。这个据说新版ffmpeg已经能处理了。懒得自己编译了,等ubuntu 10.10吧
  2. 不能融合摄像头,做出camtasia那样的画中画功能

增加可被LKM调用的内核函数

LKM(Loadable Kernel Module)可以调用的内核函数及变量都列在/usr/src/linux-headers-xxxxxxxxx/Module.symvers里。有些资料说是在/proc/kallsyms里,这是不对的。kallsyms里列出的是内核中的各种符号,但并不是所有的符号都可以被LKM调用。如果使用了不可用的符号,insmod的时候会报错:Unknown symbol in module

如果想调用Module.symvers以外的内核函数,必须修改内核。找到该函数,在函数结束的“}”后加上一行:

EXPORT_SYMBOL(funcname);

在LKM的源文件中,用extern声明一下该函数。如果这个函数是系统调用,在extern后面还要加上asmlinkage,否则参数不会正确传递。

强制Makefile中的一条必须执行

一个工程有多个子目录。每个子目录下都有一个Makefile,将该子目录下的源代码编译为一个.o文件。根目录下的Makefile控制将这些.o链接到一起形成最终的执行文件。执行文件只依赖.o文件,对每个.o的处理规则都是进入其子目录然后make。这种布局会遇到一个问题,就是子目录里有源码的修改,根目录Makefile定义的依赖关系里检测不到,就不会重新编译。被这个问题困扰很久,今天看qt的Makefile,发现了一个很巧的解决方法。

subdir1/sub1.o: FORCE
    cd subdir1 && make
 
subdir2/sub2.o: FORCE
    cd subdir2 && make
 
FORCE:

给一台没有系统且不能从光驱、U盘、PXE等启动的电脑安装Linux

  1. 把硬盘拆下来,挂到别的机器上,并且拆下那台机器的硬盘;
  2. 在别的机器上安装Linux;
  3. 硬盘换回原先的机器;
  4. done

同样的方法用来安装Windows,硬件的相似度必备比较高才行。Linux貌似并不保存硬件信息,而是每次启动时重新检测。至少我这两台年龄相差6岁的机器没有半点儿相同的硬件。

Android内核开发的几个便捷命令

在android源码的根目录下执行:

. build/envsetup.sh

可以获得下列非常方便的命令:

croot:   Changes directory to the top of the tree.
m:       Makes from the top of the tree.
mm:      Builds all of the modules in the current directory.
mmm:     Builds all of the modules in the supplied directories.
cgrep:   Greps on all local C/C++ files.
jgrep:   Greps on all local Java files.
resgrep: Greps on all local res/*.xml files.
godir:   Go to the directory containing a file.

当我第一次获知它们的时候,内流满面啊……

用“help”命令可以获知更多……