Skip to Content

labrador 的blog

记录论坛用户行为的程序

首先是一段shell脚本。它会每隔30秒钟访问一下论坛(比如Dizcuz!)的在线用户列表,然后从列表中读取出在线用户的行为,并做记录。
#!/bin/sh

while true; do
    wget "http://www.example.com/member.php?action=online" -O - |
    sed -n '/<table summary=""/,/<\/table>/ p' | 
    sed -n '12~1p' | 
    sed 's/<\/\?\(a\|div\|table\|h1\|thead\|tbody\|td\)[^>]*>\|<tr>\|^\s*\|\r//g' | 
    awk -F '&nbsp;\n' -v RS='</tr>\n+' '{ printf "%15s | %5s | %16s | %30s | %s\n", $1, $2, $3, $4, $5 }' >>surveillant.log
    
    sleep 30
done
上面这个程序有个问题,查看在线用户本身也是一个用户操作,这样就会使得那个列表中大量充斥着匿名用户访问用户列表的记录,让人产生怀疑。

用于备份drupal文章的php程序

这个程序的功能是备份drupal数据库中的文章,即node_revisions表中的内容。当发现有新的文章的时候,它会将新文章保存为一文本文件在服务器上,同时通过邮件将此文章发送到指定的email地址。以后无论是文件系统还是数据库发生数据丢失,都可以找回这些文章,并用drupal重新将这些文章添加进数据库。

这种备份方式是对全站备份的一种补充,因为全站备份工作量大,不可能做到很频繁。而这个备份程序所需的工作量很小,对服务器产生的压力很小,可以做到比较频繁的执行,例如本站设定为15分钟执行一次这个备份脚本。而频繁的备份可以将文章编辑中间过程也保存下来。当然,它不能替代全站备份,因为它只备份了文章,而忽略了数据库中其他内容,另一方面,手工重新添加大量文章是非常费力的事情。

因为这个程序直接访问数据库,而并不依赖于drupal,所以只要稍加修改也可以应用于别的CMS/Blog系统。

它的原理很简单。程序开头的两个function来源于drupal 6,用于编码email的title。之后就开始连接数据库,取出比较新的文章。如果发现还没有备份过这些文章,则将它们以文本文件形式备份下来,同时通过php的mail()函数将它们发送到指定的地址。

将字符串escape成html/xml中常用的&#xxxx;形式

方法太多了,这里介绍一个用命令行的办法:
echo -n abc围棋123 | iconv -f utf8 -t utf16le | hexdump '-e /2 "%u\n"' | awk '{ if ($0 < 128) printf("%c",$0); else printf("&#%x;",$0) }'; echo
输出为
abc&#56f4;&#68cb;123
它分为三步:
  1. 把utf8编码转换为utf16编码;
  2. 把utf16字符显示为10进制数;
  3. 如果小于128则直接显示这个字符,否则显示为&#xxxx;形式。

利用wget做网站镜像的bash脚本

wget是一款非常优秀的http/ftp下载工具,它功能强大,而且几乎所有的unix系统上都有。不过用它来dump比较现代的网站会有一个问题:不支持css文件,它不会自动下载、重新链接css中所指定的图片。这个问题导致的最常见的后果是dump下来的网站看不到背景图片。本文所介绍的这个脚本主要就是用来解决这个缺陷的。

这里简要介绍一下这个脚本的细节:
  • 第3行用于设置要下载的网站的地址。
  • 第10行用于将文件名转换为windows兼容的格式。windows对文件名格式的要求比unix更为苛刻一点,这里指定为windows也可以兼容unix系统。总的来说,wget的这个功能稍微弱了一点,面对一些更苛刻的系统就没有办法了。
  • 第13行用于忽略robots.txt。很多网站的css、js文件都是在robots.txt中被定义为spider不可访问的。
  • 第15、16行用于忽略某些目录和文件。因为没有了robots.txt的限制,wget可能会去访问一些不需要的东西。这里可以根据具体情况做限制。
  • 第19~24行下载css中链接的文件。
  • 第26~29行修正css中的链接。

求next permutation的python程序

Next permutation即排列的下一个,比如数字1,2,3的排列有
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
那么2,3,1的next permutation就是3,1,2。

以下这个程序完全是用来晕人的,实现的方法效率并不高。不过既然是晕人用的,我就不具体解释它的原理了,呵呵。
def next(a):
    try:
        i = [k for k in range(-2, -len(a)-1, -1) if a[k]<a[k+1]][0]
        j = [k for k in range(-1, i, -1) if a[i]<a[k]][0]
        return a[:i] + [a[j]] + a[-1:j:-1] + [a[i]] + a[j-1:i:-1]
    except:
        return None
    
a = [1, 2, 3, 4, 5]
while a:
    print a
    a = next(a)

自由软件许可证知识测验

GNU官方网站上有一个有关GPL、LGPL知识的测验,难度相当大。当你回答完毕它会告诉你你错在哪里,并有相关的文献解释。蛮好的,估计不久就人把它译成中文。

*** Spoiler Alert ***
它也纠正了我的几个认识上的错误,比如,我以前一直以为在互联网上提供源代码是必须的,而通过光盘等物理介质提供源码是可选的。实际恰好相反,不过想想GPL诞生的年代,这样的要求也是可以理解的。
******************

后记,看来我的预测很神啊,果然有人将这些题目翻译成了中文

一个简易的sopcast的前端脚本

先去http://download.sopcast.cn/download/sp-auth.tgz下一个sopcast的客户端程序,解开,然后和下面的这个脚本sopcast放在同一个目录即可。为了使sp-sc-auth正常工作还需要安装libstdc++5包。

使用方法很简单,运行./sopcast,在弹出窗口中输入sop://开头的那个地址或者直接输入节目号,比如CCTV5是6002,也可以直接运行./sopcast 6002。静候一会就会弹出一个totem窗口开始播放你想看的节目。想停止sopcast则在那个terminal中按ctrl-c即可。

这个程序很简陋,没有像gsopcast那样节目列表功能,但因为很多时候都是从网上找到一个sop://形式地址,列表的用处也不是特别大。相反这样用地址的反而更方便。

动态监视log变动的脚本

这个脚本的功能是监视log文件(或者任意文本文件)的变化,并在terminal窗口标题栏上显示log文件的行数。其中调用了less +F filename功能,它和tail -f filename类似,不过可以按Ctrl-C后翻看前面的内容,按Shift-F继续监视文件末尾。这个脚本一个比较fancy的功能是当log文件有更新时,任务栏上的terminal窗口会像pidgin来消息时那样闪动。

这里还有一个用这个脚本做的.desktop文件,解开后双击就可以用了。需要注意的是,内嵌在.desktop文件中的脚本中的%要用%%来替代。

另外,从这个程序中也不难看出,在X11下监视、窃取键盘操作是很容易实现的。这也就是为什么在X11下的虚拟终端里运行sudo是有安全隐患的,而应该用gksudo一类程序代替。

让人脑子抽筋的逻辑问题

seeghost from forum.ubuntu.org.cn写道:
某教授给他的三个学生的脑门上各贴了一张纸条,并告诉他们:每个纸条上都写了一个正整数,并且其中两个的和等于第三个!(每个人可以看见另两个数,但看不见自己的)
教授问第一个学生:你能猜出自己的数吗?回答:不能;
问第二个,回答:不能;
问第三个,回答:不能;
再问第一个,仍然回答:不能;
再问第二个,仍然回答:不能;
再问第三个:这次回答:我猜出来了,是144!
下面请问:
第一个学生脑门上的纸条写的是什么数?
这个问题我好像在大学的时候听师兄说过,我把它稍微扩展了一下,写了下面这个python程序,其中变量n用于控制教授问了多少人次。比如就上面这个题目而言,n=6。
同步内容