Adventure 项目(2)
Box Chart
Ray 喝了口咖啡,继续问到,“那么,拿到这些数据,整理好以后,怎么使用呢?”
“对,这就是问题的关键。” 墨翟接着解释,“我们现在用 Excel,自己画分析图表,唉,太累人了!” Alan 也赞同的点点头,“我和墨翟现在一起弄这个,每个月得3、4天时间才能完成。”
Ray 问,“是什么样的分析图表呢?”
“就是这样的,” Alan 打开 Excel 文件,用投影展示了几张图表:
“这样的柱图+折线图是我们最常用的,用来分析各个工厂的数据。将去年和今年的列在一起比较,然后用折线显示上个月的值,这样看起来就很清楚各个工厂的表现的变化情况。” 墨翟解释说,“现在的分析都是汇总到工厂级别的,但实际上,我们还想要到国家、产品级别的,这样,可以从不同的角度来看我们的制造数据。此外,我还想要一个以前 Excel 没有的图。你听说过 Box Chart 吗?”
Ray 摇摇头,其实,他是知道 Box Chart 的,以前考研究生的时候,统计学的课本里面就教过 Box Chart。但是,Ray 还是想听听墨翟和 Alan 的描述,因为用户的理解未必和自己一样。
“是这样的,Box Chart 可以告诉你每个工厂在某个指标上面最好、最差、中位、1/4、3/4 的表现,就是这样的图。” 墨翟直接在白板墙上面画了出来:
“很复杂,对吗?但是很有用!” 墨翟补充。
“不复杂,但是,因为没有直接的 Box Chart 能用的数据,呃,我是说,你们目前的 Excel 数据里面没有 Box 数据,所以,需要开发计算和显示 Box Chart 的程序。” Ray 回答。
“嗯,我知道这不容易,可以你是有办法的,对吧?” 墨翟笑着说。
Ray 笑着回答,“我可以试一下。” 他心里明白,没有那么容易,但是,有另外的一个想法在他脑海里浮现:Adventure 的 SharePoint 部署已经有一段时间了,作为协作解决方案组的负责人,是很希望在这个平台上面能有所应用,能够给 Adventure 带来价值的。而眼前这个制造数据分析的需求,在 Ray 看来,就是一个很好的开始。
流程
“那么,” Ray 接着说,“从工厂填报数据,到最后你做完这些分析,完整的流程是怎么样的、都有哪些人参与呢?”
“呃,这样吧,我告诉你我们从深圳工厂 SZE 得到数据的流程,这样我比较容易解释清楚。” 墨翟回答,“SZE 每个月会有人收集整理数据,然后填写 Excel,发给我下面负责电子设备制造的经理王祯,王祯会从里面汇总我需要的按照工厂、国家过滤的数据,并制作柱图、折线图,然后发给 Alan。Alan 收到不同经理的 Excel 文件,再汇总成为整个 Adventure 的数据和图表,最后给我。”
墨翟停了一会儿,继续说,“但是,事情并不总是这么顺利,经常会有没有按时提供数据,Excel 文件内容或者格式错误。你知道,工厂和我那些经理,他们搞制造是一流,但是做 IT、Excel 那就不行了,所以,经常最后就变成我和 Alan 来整理他们的工作,才能保证最后按时拿到我关心的高质量的分析结果。每个月这么折腾,太累了!”
“嗯。” Alan 点点头。
Ray 听完,笑了笑,然后,开始担忧起来:这个流程看似不复杂,但背后的数据权限分配,对 SharePoint 平台可是一个挑战,看来,要找 Works 的人来帮忙了。
LINQ vs. CAML
Jony 今天起床晚了,所以,快 10 点才坐到办公室里面。不过,因为他经常这样,所以,大家也都没说什么,各干各的,没人注意到他。
其实在 Works 公司的工作不算少,但是,因为人性化管理,这里对于上班(注意,是上班的)时间没有特别严格的要求,这让习惯晚上工作的人感觉很合适。
花 15 分钟展开自己的工作台,Jony 才能好好坐下,喝今天的第一杯咖啡。
今天的工作,是解决一个 SharePoint 的技术问题。昨天,Jony 写了一个小 Web Part,用来在网页上输出一大段 HTML。这段 HTML 的内容,则来自同一个 SharePoint 站点的 List,List 提供数据,然后 Web Part 负责输出 HTML 到网页。
现在的问题是,Web Part 放到网页上面后报错,提示“Sandbox 拒绝执行”的错误。
Busy?怎么可能!干什么就 busy 了?Jony 知道问题不在这上面,所以,今天来,就是要解决这个问题。到网上转了一圈之后,Jony 找到一个稍微站点儿边的帖子 Error: "The sandboxed code execution request was refused because the Sandboxed Code Host Service was too busy to handle the request" (Ricky Kirkham)
简单看了看之后,Jony 觉得帖子里面讲的对他应该不适用,因为这个错误只发生在将 Web Part 部署到生产环境中的时候;本地调试的时候一点儿问题都没有的。“后台部署和运维那些人,应该不会连 crl.microsoft.com 都没有处理好的。”Jony 心想。
最有可能的,应该是生产环境对 Sandbox 的执行有更多资源的限制才对。如果调低开发环境的 Sandbox 资源阀值能够在开发环境重现这个问题,那就能证明这种可能是对的。
Jony 于是按照 Configure resource points for sandboxed solutions (SharePoint Foundation 2010) 里面的说明,修改了开发环境的 Sandbox 资源阀值。将单次请求的 CPU 时间阀值从 60 秒改到了 1 秒,“这应该够 strict 了吧?”
下面是修改前的设置,60 秒绝对值阀值:
下面是修改后的设置,1 秒,这是肯定执行不完的:
修改后,果然,在开发环境中也报错了:
好了,问题找到了。似乎,现在就只能从程序本身的性能处着手了。
这个 Web Part 由于包含复杂的从 SharePoint 列表查询的数据,所以,一开始,为了简便,Jony 用了 LINQ 而非 CAML。
因为 CAML 一个查询块里面只能有2个元素,所以,当不特定多个查询条件出现时,就要仔细拼接。Jony 写过一个拼接的函数,不过,是用 Javascript 写的。这次图方便,用了 LINQ。
SPLinq 又可能会好些吧?
Jony 靠在椅子上面正准备喝口咖啡,突然电话响了。“Jony,我是 Ray,明天下午你有空吗,2点,我有事情要找你聊聊。”“哦,好啊,那明天下午见。”