Adventure 项目(2)

Box Chart

Ray 喝了口咖啡,继续问到,“那么,拿到这些数据,整理好以后,怎么使用呢?”

“对,这就是问题的关键。” 墨翟接着解释,“我们现在用 Excel,自己画分析图表,唉,太累人了!” Alan 也赞同的点点头,“我和墨翟现在一起弄这个,每个月得3、4天时间才能完成。”

Ray 问,“是什么样的分析图表呢?”

“就是这样的,” Alan 打开 Excel 文件,用投影展示了几张图表:

Column Chart_thumb[4]

“这样的柱图+折线图是我们最常用的,用来分析各个工厂的数据。将去年和今年的列在一起比较,然后用折线显示上个月的值,这样看起来就很清楚各个工厂的表现的变化情况。” 墨翟解释说,“现在的分析都是汇总到工厂级别的,但实际上,我们还想要到国家、产品级别的,这样,可以从不同的角度来看我们的制造数据。此外,我还想要一个以前 Excel 没有的图。你听说过 Box Chart 吗?”

Ray 摇摇头,其实,他是知道 Box Chart 的,以前考研究生的时候,统计学的课本里面就教过 Box Chart。但是,Ray 还是想听听墨翟和 Alan 的描述,因为用户的理解未必和自己一样。

“是这样的,Box Chart 可以告诉你每个工厂在某个指标上面最好、最差、中位、1/4、3/4 的表现,就是这样的图。” 墨翟直接在白板墙上面画了出来:

image

“很复杂,对吗?但是很有用!” 墨翟补充。

“不复杂,但是,因为没有直接的 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 才能好好坐下,喝今天的第一杯咖啡。

image

今天的工作,是解决一个 SharePoint 的技术问题。昨天,Jony 写了一个小 Web Part,用来在网页上输出一大段 HTML。这段 HTML 的内容,则来自同一个 SharePoint 站点的 List,List 提供数据,然后 Web Part 负责输出 HTML 到网页。

现在的问题是,Web Part 放到网页上面后报错,提示“Sandbox 拒绝执行”的错误。

"The sandboxed code execution request was refused because the Sandboxed Code Host Service was too busy to handle the request"

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 秒绝对值阀值:

image

下面是修改后的设置,1 秒,这是肯定执行不完的:

image

修改后,果然,在开发环境中也报错了:

image

好了,问题找到了。似乎,现在就只能从程序本身的性能处着手了。

这个 Web Part 由于包含复杂的从 SharePoint 列表查询的数据,所以,一开始,为了简便,Jony 用了 LINQ 而非 CAML。

因为 CAML 一个查询块里面只能有2个元素,所以,当不特定多个查询条件出现时,就要仔细拼接。Jony 写过一个拼接的函数,不过,是用 Javascript 写的。这次图方便,用了 LINQ。

SPLinq 又可能会好些吧?

Jony 靠在椅子上面正准备喝口咖啡,突然电话响了。“Jony,我是 Ray,明天下午你有空吗,2点,我有事情要找你聊聊。”“哦,好啊,那明天下午见。”

posted on 2013-02-25 09:40  JonyZhu  阅读(546)  评论(0编辑  收藏  举报