1. 2005-07-29 《邮件列表的规范和礼节:创造良性发展的交流空间》幻灯

CPUG/BPUG成立大会上的报告。

使用S5制作,请下载 Upload new attachment "slideshow-v2.tar.gz" 或者 在线阅读

构思时用的freemind图在QiangningHong/2005-07-25

1.1. 使用方法

解压后用浏览器(推荐Firefox)打开maillist.html即可。

1.2. 用到的统计邮件列表中MUA使用情况的小程序

写的很烂 //blush 不过应该不会算错;)

用mbox文件的文件名作参数,我是直接用的Thunderbird的文件。

   1 #!/usr/bin/env python
   2 
   3 import email
   4 import mailbox
   5 
   6 
   7 class Statics(object):
   8     def __init__(self):
   9         self.muas = {}
  10         self.muas_by_from = {}
  11 
  12     def process(self, msg):
  13         mua = self.get_mua(msg)
  14         if not mua:
  15             return
  16 
  17         self.muas[mua] = self.muas.get(mua, 0) + 1
  18 
  19         self.muas_by_from.setdefault(mua, set()).add(msg['From'])
  20 
  21     def get_mua(self, msg):
  22         mua = msg.get('X-Mailer') or msg.get('User-Agent')
  23         return mua
  24 
  25     def get_frequent_muas(self):
  26         muas = sorted(((count, mua) for mua, count in self.muas.iteritems()),
  27                 reverse=True)
  28         return muas
  29 
  30     def get_popular_muas(self):
  31         return sorted(((len(y), x) for x, y in self.muas_by_from.iteritems()),
  32                 reverse=True)
  33 
  34 
  35 def main():
  36     import sys
  37 
  38     mbox_fn = sys.argv[1]
  39     mbox = mailbox.UnixMailbox(file(mbox_fn), email.message_from_file)
  40 
  41     stat = Statics()
  42 
  43     total = 0
  44     for msg in mbox:
  45         total += 1
  46         stat.process(msg)
  47     print total, 'messages processed'
  48     print
  49 
  50     print 'The top 10 MUAs are:'
  51     m = stat.get_frequent_muas()
  52     c = sum(x[0] for x in m)
  53     for count, mua in m[:10]:
  54         print mua, '(%.1f%%)' % (count * 100. / c)
  55     print 'Messages without MUA field: %.1f%%' % ((total - c) * 100. / total)
  56     print
  57 
  58     print 'The top 10 popular MUAs are:'
  59     m = stat.get_popular_muas()
  60     c = sum(x[0] for x in m)
  61     for count, mua in m[:10]:
  62         print mua, '(%.1f%%)' % (count * 100. / c)
  63 
  64 
  65 
  66 if __name__ == '__main__':
  67     main()

1.3. 反馈

对我的幻灯有什么意见哪?提在这儿好了。