Differences between revisions 1 and 9 (spanning 8 versions)
Revision 1 as of 2005-12-11 04:51:41
Size: 612
Editor: ZoomQuiet
Comment:
Revision 9 as of 2005-12-25 11:02:59
Size: 6733
Editor: ZoomQuiet
Comment:
Deletions are marked like this. Additions are marked like this.
Line 4: Line 4:
::-- ZoomQuiet [[[DateTime(2005-12-11T04:51:41Z)]]]
[[TableOfContents]]

= K6日:统计!mm的 =
'''快速扩展一个页面适应所有情况!'''
 * 此mm 非彼 mm 哪! 乃FreeMind 思维图谱文件 `.mm`
== FreeMind的另类使用 ==
'''要想进行问卷回答的统计,首先要有手段知道现在组织内成员信息,以便对应统计'''
 * 为什么想到了 FreeMind?
  * 以往使用DB,怎么样都要立成员表和组织表然后还有这那儿的对应选择关系什么的
  * 还是 FreeMind 直观,操作也非常快捷,复制,移动太爽直了!
  * 而且是XML的数据文件!
 * 曾经依照提供的`freemind.xsl`+`freemind.mm` 输出了加个xml头说明的自定 mm 文件
 
"attachment:snap-KwDay60.png

 * 哈哈哈!大致知道 FreeMind 的数据格式:
     1. 所有节点是统一的 `<node>`
     1. 属性和值,全部是UTF8编码的字串
 * 所以,只要有简单的约定,就可以作为 Xpath 的过滤参数来理解真正的数据意义了
 * 以上的组织成员信息就是有个小小的约定:
     1. 一级节点都是部门描述,中文
     1. 二级节点是属性描述:
         1. dept 说明部门的整体信息
         1. staff 汇集成员信息,类似部门的节点组织
         1. total 成员总数
"attachment:snap-KwDay6mm.png
 * 这样就令 XSLT 有基础原则可以进行数据组织了
 * 同理,也可以让Python 快速理解了...
 

== ElementTree,当然的! ==
'''处理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 6: Line 51:
::-- ZoomQuiet [[[DateTime(2005-12-11T04:51:41Z)]]]
[[TableOfContents]]
= K6日:clone =
'''快速扩展一个页面适应所有情况!'''
  1. 引入 ElementTree
  1. 处理XML为 ElementTree 对象
  1. 找到根
  1. 从根找到所有第二级的`<node>`节点对象列表
  1. 已经可以通过 `.attrib["TEXT"]` 来获得内容了!
Line 11: Line 57:
== 悠然 Leo ==
{{{Ctrl+`}} 从来没有如此让你放心过……
"attachment:snap-KwDay61.png
 * 就使用 `findall()` 和 `attrib["TEXT"]` 便可以判定/获取足够的信息,输出成以上的页面从 mm 中!!!
 * 哈哈哈!具体的就看代码吧……
Line 14: Line 61:
== 反复测试 == == Karrigell 的对象混合 ==
'''但是!怎么样可以使用这种mm 的理解成果?'''
 * 麻烦在于 `ElementTree.parse(xml文件)` 要可以直接访问的文件名
 * 你不想在程序中包含太多系统的路径信息
  1. 反复尝试,发现从相对路径偏移还是从URL 来访问都不稳定,也麻烦
  1. 最简单的就是理解脚本和mm 文件在一起
 * 问题就来了,各种事务页面如何快捷直观的使用理解成果?
  * 自然的,就想到了 `Include()` KarriGell 中到处都可以进行的基础操作 -- '''包含'''
{{{Include("../xslmm/deptorg.py")
            ^
            |
            +- 因为是从index.ks/login 之类下级行动函式页面访问}}}
            
  * 有MoinMoin 的经验,你就想这样一来应该能将字典对象混人当前名称空间??
   * 在专门mm 理解脚本-- '''deptorg.py''' 中 `print dir()`

"attachment:snap-KwDay62.png

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

"attachment:snap-KwDay63.png

== 统计汇报 ==
 * 接下来就简单了:
     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. 唉呀呀??为什么不许怎么回答都是0分?
      * 发现问题..字典的无序和回答的有序!间的矛盾
     {{{
print crtqp.ask.keys()
crtright = [crtqp.ask[i]["key"] for i in crtqp.ask.keys()]
print crtright
}}}
attachment:snap-KwDay6dict.png
      * 知道症结就好修改了{{{#!python
#字典排序技巧
ak = crtqp.ask.keys()
ak.sort()
print ak
crtright = [crtqp.ask[i]["key"] for i in ak]
print crtright
}}}
attachment:snap-KwDay6sort.png
     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
}}}
 * 哈哈哈!!什么也难不住你!
attachment:snap-KwDay6done.png

== 事务测试 ==
Line 16: Line 164:


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

== 讨论 ==
[[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 中到处都可以进行的基础操作 -- 包含

{{{Include("../xslmm/deptorg.py")

  • ^ | +- 因为是从index.ks/login 之类下级行动函式页面访问}}}
  • MoinMoin 的经验,你就想这样一来应该能将字典对象混人当前名称空间??

    • 在专门mm 理解脚本-- deptorg.pyprint dir()

"attachment:snap-KwDay62.png

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

  • 尝试的赋值一下子?

    #deptorg.py 中最后..
    sess.usr["dept"]=deptall
    sess.usr["deptree"]=deptree
  • KAO! 真的好用! 在index.ks/stat 统计页面,包含 deptorg.py mm专用理解脚本 再打印 sess.usr 看一下子,唉呀呀!真的有了!

"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. 唉呀呀??为什么不许怎么回答都是0分?
      • 发现问题..字典的无序和回答的有序!间的矛盾
      print crtqp.ask.keys()
      crtright = [crtqp.ask[i]["key"] for i in crtqp.ask.keys()]
      print crtright

attachment:snap-KwDay6dict.png

  • 知道症结就好修改了

       1 #字典排序技巧
       2 ak = crtqp.ask.keys()
       3 ak.sort()
       4 print ak
       5 crtright = [crtqp.ask[i]["key"] for i in ak]
       6 print crtright
    

attachment:snap-KwDay6sort.png

  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
  • 哈哈哈!!什么也难不住你!

attachment:snap-KwDay6done.png

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)