我们M2的核心任务就是实现reward system,从而激励更多的人使用这一软件。我们的reward system是基于一种叫lottery tree的算法。根据用户之间的邀请关系建立lottery tree,父节点的所有孩子节点为该父节点对应的用户所邀请的用户。如果一个用户邀请的用户多,该用户理所应当获得更多的奖励。基于这一基本思想,昨天Yingce Xia已经着手开始建立lottery tree。今天,Yingce改进了建树算法。最初的程序是直接根据数据库中的用户信息,搜索某节点的所有孩子节点。但当用户量比较大的时候这种建树算法很慢。所以现在我们使用C#提供的词典类(Dictionary)进行查找,将用户的ID映射为唯一的一个整数,该整数也为该用户在用户列表中的下标。通过下标进行索引能够减少建树过程的时间开销。
昨天的Scrum也提到现在原网页和现有网页的滚动条不能同步,原因是两个滚动条之间会出现互相触发时间的过程。今天我们通过一个巧妙的方法解决了这一问题。有两个滚动条A,B,A的移动会触发B的移动,B的移动也会触发A的移动,我们现在的做法是,当A先移动时,立刻使B对A的触发无效,直到鼠标指针再次回到B所在的页面,重新选中该页面时(这时才有可能对B进行操作),B对A的触发才重新有效。通过这种简单的转换,很好的解决了事件相互触发的死循环问题。细心的读者可能发现昨天也采用了类似的算法,为什么没有取得好的效果呢?原因是昨天的算法重新使B对A触发有效的时间不是在鼠标重新选择B所在页面时,而是在B完成移动的时刻就重置有效。这样当B连续被触发时,就会出B对A的触发一会无效,一会有效,造成不稳定性,可能在某瞬间B对A触发有效,且B真的产生了触发信息,这时就会出现不稳定现象,滚动条将不受控制。重置有效时间的选择是新算法的精髓所在。
今天还遇到一个问题就是皮肤设置。因为我们现在使用的皮肤设置程序来自第三方,与我们的窗体兼容性可能存在问题,一旦加载皮肤,软件原窗体的布局就会稍有改变。我们明天会和老师联系,看能不能获得微软内部的皮肤设置代码,这样我们能够根据自己的框架修改源代码,同时又能避免一些不必要的法律问题。
恶意投票。因为我们软件要根据用户提供的翻译的得票数来决定改用户的贡献,所以就有可能出现用户恶意为自己投票的情况。为此,我们设置一个用户只能为一个词条投一票,在注册用户时需要使用邮箱验证。这样如果用户想为自己刷票的话就必须多注册邮箱,这是一个很麻烦的行为,一般用户可能就会望烦却步。今天我们已经实现了系统自动往邮箱发邮件的功能。
因为服务器更新较慢,有些没有更新。而且因为转队的原因,今天我们的Task才输入到TFS,所以今天的burn down意义不是很大。
Member | Today's work | Tomorrow's work |
Fei Liang | 组织总结daily scrum,与Yingce Xia合作建树 | 组织总结daily scrum,根据expected value概率选择winner |
Hongyi Yao | 测试换肤功能 | 继续完善换肤功能,希望能得到微软内部的支持 |
Rui Lin | 解决网页同步问题 | 开始开发新网页打开功能 |
Yingce Xia | 改进建树算法 | 与Yue Hu对接数据接口 |
Yue Hu | 实现自动发邮件功能 | 与Yingce Xia对接数据接口 |
Shanchi Zhang | 请假 |
|