Differences between revisions 2 and 7 (spanning 5 versions)
Revision 2 as of 2005-12-11 15:21:49
Size: 657
Editor: ZoomQuiet
Comment:
Revision 7 as of 2005-12-25 10:05:28
Size: 5947
Editor: ZoomQuiet
Comment:
Deletions are marked like this. Additions are marked like this.
Line 4: Line 4:

Line 7: Line 5:
[[TableOfContents]]
Line 10: Line 9:
 * 此mm 非彼 mm 哪! 乃FreeMind 思维图谱文件 `.mm`
== FreeMind的另类使用 ==
'''要想进行问卷回答的统计,首先要有手段知道现在组织内成员信息,以便对应统计'''
 * 为什么想到了 FreeMind?
  * 以往使用DB,怎么样都要立成员表和组织表然后还有这那儿的对应选择关系什么的
  * 还是 FreeMind 直观,操作也非常快捷,复制,移动太爽直了!
  * 而且是XML的数据文件!
 * 曾经依照提供的`freemind.xsl`+`freemind.mm` 输出了加个xml头说明的自定 mm 文件
 
"attachment:snap-KwDay60.png
Line 11: Line 20:
== FreeMind的另类使用 ==
"XSTL 的重构!"
 * 哈哈哈!大致知道 FreeMind 的数据格式:
     1. 所有节点是统一的 `<node>`
     1. 属性和值,全部是UTF8编码的字串
 * 所以,只要有简单的约定,就可以作为 Xpath 的过滤参数来理解真正的数据意义了
 * 以上的组织成员信息就是有个小小的约定:
     1. 一级节点都是部门描述,中文
     1. 二级节点是属性描述:
         1. dept 说明部门的整体信息
         1. staff 汇集成员信息,类似部门的节点组织
         1. total 成员总数
"attachment:snap-KwDay6mm.png
 * 这样就令 XSLT 有基础原则可以进行数据组织了
 * 同理,也可以让Python 快速理解了...
 
Line 15: Line 36:
'''处理XML Python 有丰富的模块,你知道其中 ElementTree 最方便支持部分Xpath 的搜索'''
 * 其实从使用方面也是 ElementTree 最PythyonIc 了
 * `deptorg.py` mm专用理解脚本中:{{{#!python
from elementtree import ElementTree
print open(xmlFileName,"r").read()
tree = ElementTree.parse(xmlFileName)
elem = tree.getroot()
dept = elem.findall("node/node")
for d in dept:
    print d
    print LI(d.attrib["TEXT"].encode("utf8"))

}}}
Line 17: Line 51:
  1. 引入 ElementTree
  1. 处理XML为 ElementTree 对象
  1. 找到根
  1. 从根找到所有第二级的`<node>`节点对象列表
  1. 已经可以通过 `.attrib["TEXT"]` 来获得内容了!

"attachment:snap-KwDay61.png
 * 就使用 `findall()` 和 `attrib["TEXT"]` 便可以判定/获取足够的信息,输出成以上的页面从 mm 中!!!
 * 哈哈哈!具体的就看代码吧……
 
Line 18: Line 62:
'''但是!怎么样可以使用这种mm 的理解成果?'''
 * 麻烦在于 `ElementTree.parse(xml文件)` 要可以直接访问的文件名
 * 你不想在程序中包含太多系统的路径信息
  1. 反复尝试,发现从相对路径偏移还是从URL 来访问都不稳定,也麻烦
  1. 最简单的就是理解脚本和mm 文件在一起
 * 问题就来了,各种事务页面如何快捷直观的使用理解成果?
  * 自然的,就想到了 `Include()` KarriGell 中到处都可以进行的基础操作 -- '''包含'''

  * 有MoinMoin 的经验,你就想这样一来应该能将字典对象混人当前名称空间??
   * 在专门mm 理解脚本中 `print dir()`

"attachment:snap-KwDay62.png

   * 不会这么简单吧!你发现了 `index.ks` 事务页面中才有的对象 '''sess''' —— 对话容器
   * 尝试的赋值一下子?
   * KAO! 真的好用! 在`index.ks/stat` 统计页面,包含 `deptorg.py` mm专用理解脚本 再打印 '''sess''' 看一下子,唉呀呀!真的有了!
   

"attachment:snap-KwDay63.png
Line 21: Line 84:
== 反复测试 == == 统计汇报 ==
 * 接下来就简单了:
     1. 所有人的回答输出为简单的文件,比如说: 每个题目的回答为一行
     1. 套用问卷列表的技巧,可以搜索出对应问卷的所有回答文件
     1. 批量读到列表中,和成员信息字典匹配一下子,就可以人性化的输出了
{{{#!python
ali = fnmatch.filter(os.listdir(conf.qpage.apath), '%s.*.aq'%qpname)
aed = []
for f in ali:
    a = open(conf.qpage.apath+f,"r").read()
    aed.append(f.split(".")[-2])
done = []
unknow = []
for a in aed:
    if a in sess.usr["dept"].keys():
        done.append(a)
    else:
        unknow.append(a)
}}}
 * 先要预备处理一下子,过滤出不知道的人
  1. 明显的你约定回答文件的命名格式是 `问卷名.成员帐号名.aq`
  1. 所以可以根据文件名快速整理出名单列表 `aed`
  1. 然后,就有了已知合理成员回答列表 `done` 和 `unknow` 未知成员列表

"attachment:snap-KwDay6stat.png
 * 最后就是个显示问题了:
     1. 要有回答时间的信息?{{{
fn = conf.qpage.apath+'%s.%s.aq'%(qpname,a)
...
time.strftime("%y/%m/%d %H:%M:%S",time.localtime(os.path.getmtime(fn)
}}}
     1. 要有 百分制 的成绩?{{{#!python
def _grade(right,answer):
    """根据问卷答案自动计算分数
    """
    grade = 0
    for i in range(0,len(right)):
        if right[i]==answer[i]:
            grade +=1
        else:
            pass
    return 100*(float(grade)/len(right))
}}}

     1. 要有总平均成绩?{{{
#使用stat 列表收集所有有效成绩
stat = []
...
stat.append(_grade(crtright,open(fn,"r").read().split()))
...
sum(stat)/len(stat)) 就出来了
reduce(lambda a,b:a+b, stat)/len(stat) 更加cool
}}}
 * 哈哈哈!!什么也难不住你!

== 事务测试 ==
Line 23: Line 141:


 * 好了!所有功能都实现了,你现在非常成就感的一路点击一下子
 * 感觉哪里不好,随手就修正它!
 * 溜个几回,功能测试基本也就了了…………
     
Line 30: Line 149:

== 讨论 ==
[[Include(/Discuss)]]

::-- ZoomQuiet [DateTime(2005-12-11T04:51:41Z)] TableOfContents

1. K6日:统计!mm的

快速扩展一个页面适应所有情况!

  • 此mm 非彼 mm 哪! 乃FreeMind 思维图谱文件 .mm

1.1. FreeMind的另类使用

要想进行问卷回答的统计,首先要有手段知道现在组织内成员信息,以便对应统计

  • 为什么想到了 FreeMind?

    • 以往使用DB,怎么样都要立成员表和组织表然后还有这那儿的对应选择关系什么的
    • 还是 FreeMind 直观,操作也非常快捷,复制,移动太爽直了!

    • 而且是XML的数据文件!
  • 曾经依照提供的freemind.xsl+freemind.mm 输出了加个xml头说明的自定 mm 文件

"attachment:snap-KwDay60.png

  • 哈哈哈!大致知道 FreeMind 的数据格式:

    1. 所有节点是统一的 <node>

    2. 属性和值,全部是UTF8编码的字串
  • 所以,只要有简单的约定,就可以作为 Xpath 的过滤参数来理解真正的数据意义了
  • 以上的组织成员信息就是有个小小的约定:
    1. 一级节点都是部门描述,中文
    2. 二级节点是属性描述:
      1. dept 说明部门的整体信息
      2. staff 汇集成员信息,类似部门的节点组织
      3. total 成员总数

"attachment:snap-KwDay6mm.png

  • 这样就令 XSLT 有基础原则可以进行数据组织了
  • 同理,也可以让Python 快速理解了...

1.2. ElementTree,当然的!

处理XML Python 有丰富的模块,你知道其中 ElementTree 最方便支持部分Xpath 的搜索

  • 其实从使用方面也是 ElementTreePythyonIc

  • deptorg.py mm专用理解脚本中:

       1 from elementtree import ElementTree
       2 print open(xmlFileName,"r").read()
       3 tree = ElementTree.parse(xmlFileName)
       4 elem = tree.getroot()
       5 dept = elem.findall("node/node")
       6 for d in dept:
       7     print d
       8     print LI(d.attrib["TEXT"].encode("utf8"))
    
    1. 引入 ElementTree

    2. 处理XML为 ElementTree 对象

    3. 找到根
    4. 从根找到所有第二级的<node>节点对象列表

    5. 已经可以通过 .attrib["TEXT"] 来获得内容了!

"attachment:snap-KwDay61.png

  • 就使用 findall()attrib["TEXT"] 便可以判定/获取足够的信息,输出成以上的页面从 mm 中!!!

  • 哈哈哈!具体的就看代码吧……

1.3. Karrigell 的对象混合

但是!怎么样可以使用这种mm 的理解成果?

  • 麻烦在于 ElementTree.parse(xml文件) 要可以直接访问的文件名

  • 你不想在程序中包含太多系统的路径信息
    1. 反复尝试,发现从相对路径偏移还是从URL 来访问都不稳定,也麻烦
    2. 最简单的就是理解脚本和mm 文件在一起
  • 问题就来了,各种事务页面如何快捷直观的使用理解成果?
    • 自然的,就想到了 Include() KarriGell 中到处都可以进行的基础操作 -- 包含

    • MoinMoin 的经验,你就想这样一来应该能将字典对象混人当前名称空间??

      • 在专门mm 理解脚本中 print dir()

"attachment:snap-KwDay62.png

  • 不会这么简单吧!你发现了 index.ks 事务页面中才有的对象 sess —— 对话容器

  • 尝试的赋值一下子?
  • KAO! 真的好用! 在index.ks/stat 统计页面,包含 deptorg.py mm专用理解脚本 再打印 sess 看一下子,唉呀呀!真的有了!

"attachment:snap-KwDay63.png

1.4. 统计汇报

  • 接下来就简单了:
    1. 所有人的回答输出为简单的文件,比如说: 每个题目的回答为一行
    2. 套用问卷列表的技巧,可以搜索出对应问卷的所有回答文件
    3. 批量读到列表中,和成员信息字典匹配一下子,就可以人性化的输出了

   1 ali = fnmatch.filter(os.listdir(conf.qpage.apath), '%s.*.aq'%qpname)
   2 aed = []
   3 for f in ali:
   4     a = open(conf.qpage.apath+f,"r").read()
   5     aed.append(f.split(".")[-2])
   6 done = []
   7 unknow = []
   8 for a in aed:
   9     if a in sess.usr["dept"].keys():
  10         done.append(a)
  11     else:
  12         unknow.append(a)
  • 先要预备处理一下子,过滤出不知道的人
    1. 明显的你约定回答文件的命名格式是 问卷名.成员帐号名.aq

    2. 所以可以根据文件名快速整理出名单列表 aed

    3. 然后,就有了已知合理成员回答列表 doneunknow 未知成员列表

"attachment:snap-KwDay6stat.png

  • 最后就是个显示问题了:
    1. 要有回答时间的信息?

      fn = conf.qpage.apath+'%s.%s.aq'%(qpname,a)
      ...
      time.strftime("%y/%m/%d %H:%M:%S",time.localtime(os.path.getmtime(fn)
    2. 要有 百分制 的成绩?

         1 def _grade(right,answer):
         2     """根据问卷答案自动计算分数
         3     """
         4     grade = 0
         5     for i in range(0,len(right)):
         6         if right[i]==answer[i]:
         7             grade +=1
         8         else:
         9             pass
        10     return 100*(float(grade)/len(right))
      
    3. 要有总平均成绩?

      #使用stat 列表收集所有有效成绩
      stat = []
      ...
      stat.append(_grade(crtright,open(fn,"r").read().split()))
      ...
      sum(stat)/len(stat)) 就出来了
      reduce(lambda a,b:a+b, stat)/len(stat) 更加cool
  • 哈哈哈!!什么也难不住你!

1.5. 事务测试

不用想什么黑/白盒;边界,点击就成!

  • 好了!所有功能都实现了,你现在非常成就感的一路点击一下子
  • 感觉哪里不好,随手就修正它!
  • 溜个几回,功能测试基本也就了了…………

1.6. 实例下载

使用 [wiki:self/AllAboutSubversion SVN 下载]:

  • [wiki:selfsvn/zqlib/trunk/zqlib/tangle/zoomq/Karrigell/obpKWD/KwDay6/ KwDay6实例]

1.7. 讨论

Include(/Discuss)


返回 KarrigellWebDev -- 快速体验K开发

KwDay6 (last edited 2009-12-25 07:19:10 by localhost)