Zachary.XiaoZhen - 梦想的天空

多年来一直占据主导地位的集中式IT功能,如今正承受着来自云计算、企业消费级移动设备以及大数据分析业务等多种全新技术趋势的强力冲击。根据《经济学家》杂志的报道,随着这些新趋势对固有IT结构造成的不断削弱,CIO与他们的团队必须更好地迎合企业业务需求,否则将很难在瞬息万变的市场中安然立足——正所谓不在进取中爆发,就在沉默中灭亡。

几十年来,企业一直对集中式IT功能信任有加,希望其能在控制技术基础设施的同时,为企业各部门及员工提供服务。如今,以云计算、企业消费级移动设备以及大数据分析为代表的新型技术已经粉墨登场,并大有颠覆现有游戏规则的趋势。CIO及其手中掌握的IT服务机制必须适时做出转型,否则必将被吞没在历史的洪流当中。

根据一份名为《高管层向IT发起挑战:来自商业价值的新预期》的最新报告称(由戴尔服务部门赞助,经济学家信息部撰写),企业高管层纷纷表示IT部门应该为即将到来的重大转型做好准备:在536位受访高管中,57%的管理者认为在未来三年内IT部门的核心职能将发生显著改变;12%的受访者则认为IT职能会发生“彻底改变”。另外,43%的受访者指出企业会根据自身需求购买额外的IT服务。
 

 

经济学家信息部在报告中指出,受访高管们所讨论的这种变化趋势不仅会给IT部门的职能带来革命,更会颠覆性地影响整套业务,并最终在开发创新型产品及服务、打造新的客户交流通道以及反思传统业务流程等方面给企业带来前所未有的机遇。在山雨欲来的压力之下,CIO及其技术团队所面临的既是不成功便成仁的挑战、也是涅槃重生的良机。

“当一切准备就绪时,传统CIO所代表的‘纯技术职位’将不复存在,”Hord Tipton告诉我们。他在2002年到2007年间曾担任美国内政部CIO,目前则在安全教育及认证机构(简称ISC)负责管理工作。“现在,IT已经成为业务中的重要组成部分,可以说没人能在缺乏IT支持的情况下让业务流程正常运转。”

CIO必须懂得使用商务语言

虽然IT可能会逐渐转型为业务的核心组成部分,但如果不能找到合适的办法迎合企业高管层在交流方式及投资价值方面的需求,CIO及其团队仍然很可能惨遭淘汰。报告发现,CIO与企业高管在技术与业务的结合效果方面看法并不一致:三分之二的受访CIO认为他们的技术职能已经与业务流程融合妥当,但只有不到一半的企业高管认同这一结论。值得注意的是,仅仅46%的企业高管表示他们的CIO能够理解业务部门的实际需求,44%的受访者指出他们的CIO能够发现IT发展新趋势中所蕴含的技术风险。

“在理想状况下,企业高管应该充分依赖CIO在工作汇报中对于现阶段情况的总结,并支持技术部门以新的方式利用IT,以解决技术与业务协作中可能存在的风险,”报告指出。“然而只有不到一半的受访管理者认为他们的CIO充分理解了这一任务;而将近四分之一的受访者干脆表示CIO们的表现很令人失望。我们可以基本认定,在如何将IT投资最大程度转化为经济利益方面,CIO与企业高管层之间仍然存在较大的观念分歧。”

与此同时,CIO们突然发现自己已经在某种情况下不知不觉受到排挤。在调查中研究人员发现,大约六分之一的受访CIO仅仅拥有“咨询”的权利,他们根本无法参与到企业IT战略的制定工作当中,也就是说他们在自己每天所要遵循的发展战略中竟然毫无发言权。该报告还发现,即使CIO能够加入到战略决策的讨论中来,往往也只能扮演“技术后台”的角色,跟创收等核心内容完全无关。只有约三分之一的受访者认为CIO应该在发掘潜在客户或者开发产品及服务等方面发挥关键性甚至主导性作用。

CIO在IT战略中表现越积极,企业整体业绩就越出色

虽然整体形势不容乐观,但最后一项统计数据给了决心扭转被动局面的CIO们一线希望。相对于将CIO们直接打入冷宫的做法,让技术领导者加入战略制定的企业的确在财务业绩方面交出了超过前者的优异答卷。在乐于让CIO在业务战略中发挥作用的37%受访高管中,有47%的企业表现出傲视同侪的业绩水准。而另一方面,在20%禁止CIO参与经营战略制定的受访者中,只有28%的企业能够让自己的运营状况超过平均水平。

对于CIO们而言,熟练掌握商务语言是前瞻性思维的一种具体表现。只有不到一半的受访者表示,他们将IT视为改善企业竞争优势的有效途径。尽管仍然有许多企业仅仅把IT作为削减运营成本(38%)或者提高业务执行效率(42%)的辅助角色,但勇于将IT与拓展商务业绩、增加运营收入的企业往往发现,IT职能所带来的助益其实能够在其它多个领域发挥重要作用。

降低成本与增加营收之间并不存在矛盾

“正所谓无利不起早,企业在从IT职能中发掘新的盈利途径时,表现得往往比利用IT开发新产品或培养新客户群体时更积极,”报告总结道。“另外,企业也更乐于提升IT基础设施的可靠性以及IT与业务之间的协作能力。令人惊讶的是,以营利为优先考量的企业受访者们在实际工作中会比那些以削减成本为主要目的的企业管理者更积极也更开明,可以说开源比节流更能调动企业的整体活力。”

举例来说,Lowes公司前任CIO Steve Stone就曾指出,CIO应该有能力把像Lowes公司这样规模的零售业巨头从技术挑战中解救出来,并将此转化为发展的机遇。2002年还在担任CIO一职时,他就制定了一系列基础设施改进战略,希望能够在任何情况下——包括通信系统被切断时——保证设施运转的正常与顺畅。但这一战略的制定也带来无数后续挑战,其中影响最大的就是每家店铺的冗余基础设施会给企业带来沉重的更新与维护成本。面对这一局势,Stone果断转换思路,尝试通过集中式数据中心代替分散各处的设施资源,如此一来不仅保证了数据的高度可用性,同时也令业务以更具时效性的方式运转。从另一方面来看,数据的集中管理使商务部门得以掌握大量第一手资源,并以此为基础开发出能够降低交付成本同时加速客户获得产品过程的新服务。

“对于当今的实体型零售产业而言,我们真正需要的是充分利用广域网优势并精简每家店铺中所使用的生产技术,频繁折腾现场设施既不明智、也不划算,”他总结道。

与业务融合也要讲策略

报告中给出了三种实用性策略,CIO们可以以此为基础,创造出更多适合自己的业务融合方案。策略的具体内容如下:

• 将一部分预算与商务部门共同分享,这样一来那些规划IT预算的管理者们将能使自己的部门也在方案中受益。这不仅有助于降低纯IT类运营成本,更可以使IT与业务高效配合起来,毕竟没人愿意为自己不需要的服务投入太多预算份额。除此之外,这种二者融为一体的策略也会让IT投资带来更多业务管理者想要的服务项目。

• 从培养正确的企业文化出发,让IT团队能够在业务发展中起到更重要的促进作用,这也将从不同的角度激励其他员工的工作干劲。

• 如果大家认为某些IT项目能够建立起理想的知识或技能储备,那么在大规模投入资金之前,先做些局部实验性工作。尽管从短期来看试点会增加一部分技术投入,但过程中培养出的骨干人才会为企业在今后的发展道路上立下更多显赫的功劳。

除了上述策略外,报告还提供了一些值得企业管理者认真考量的建议:

• 解放思想。技术创新所改变的绝不仅仅是企业的IT职能,它所带来的很可能是商务运作方式的根本性转变。我们应该以更宽泛的角度看待创新中蕴藏的潜在影响,发现IT职能之外那些更深远的业务走势。

• 勇于让CIO掌权。将IT基础设施视为一种商品的做法,确实能够减少企业IT部门的规模及影响范畴,但绝不应该因此而限制CIO角色的作用。对于大多数高层管理者而言,应该将CIO从纯技术领域解放出来,使其实现更多商务价值。

• 不要将IT职能与其它部门完全隔离。多数在云计算、移动设备扩展以及大数据分析等新型技术的冲击下仍能从容应对甚至借势为己用的优秀企业,其成功的法门主要在于适应变化的高超能力。这种能力除了帮助部门紧跟时代发展的脚步,更能让技术与业务需求完美契合起来。

• 重新审视企业制定的投资分配方案。不要以为IT投资就一定意味着在降低成本与增加收入之间做出权衡。随着时代的发展,越来越多的企业发现二者其实并不矛盾。

• 风险只是种潜在的可能性,不要因噎废食。随着云计算、移动设备扩展以及大数据分析等技术的普及,很多企业对这些领域的相关风险逐渐重视起来。不过请记住,风险只是种潜在的可能性,不要因噎废食。我们完全可以通过成熟的机制识别、评估、管理并最终避免新技术所带来的风险,这与其它经营项目中的风险并无不同,没必要太过紧张。

原文名:CIOs Need to Evolve or Be Left in the Dust
 

【责任编辑:王勇 TEL:(010)68479336】

   
posted @ 2012-07-14 10:15 BoyXiao 阅读(112) | 评论 (0)编辑 收藏
     MUILIB界面库的界面设计编辑器近日已经初步完成,并进行了内部测试,
关于该界面设计编辑器的更详细的功能介绍已经更新到官方网站,对该编辑器
感兴趣的可以前往欣赏!
    本次网站的对相关内容的更新相较前段时间贴出来的图片更加详细,已经
细致的介绍了该软件的主要功能模块的截图!
posted @ 2012-07-14 10:15 BoyXiao 阅读(104) | 评论 (0)编辑 收藏
    博客光写GacUI(http://www.gaclib.net/)的Demo更新也好无聊啊。所以今天先换换口味,胡扯点别的。

    一年一度的高中毕业生填简历的日子即将就要到了,又有很多人问计算机专业的事情。其实我从心底里觉得,高考后才来问这个,已经完了一大半了。当然另一小半十分有前途的人可以在大学四年赶上来,不过估计他们还是要读个研究生,才能把自己训练成能用的码农。

    编程是一件很难的事情。当然我的意思跟那篇著名的《编程是一件很难的事情》不一样。想把代码写好,本来就是一件非常困难的事情。我大三的时候训练一个大一的老乡,就光是C++,长达四年后她还搞不清楚模板元编程究竟是什么。而且还有C语言学会了转C++会把坏习惯带进来啦,C++的人转做C#之后发现很多C++的好技巧到了C#都只会让程序变得更慢啦,很多写动态语言的人不理解类型的好处还在那里胡扯啦,还有C#和javascript明明放着大好的函数式风格不用,非要把代码写的超长(本来光是这样没什么问题的,只是有某些人不肯学习新知识)。可见,就算把自己训练了好多年,最终进入了工作岗位,想把代码写好,也是一件非常困难的事情。

    当然有些人说,如今只有产品做得好才能赚钱,代码写的好有个屁用。这只能是人各有志,有些人就不喜欢钻研代码,这本来也没什么。但是这些人老是跳出来忽悠别人,也只会让编程变得更难。只是幸好,我的单位并不会跟某些单位一样说一些“把代码写得那么好有什么用,搞到我们还非得学东西才能看你的代码,赶紧做点新feature啦”的这种话,我已经觉得很好了。

    写得好这个东西还是比较抽象。我认为其中一条就是代码要好维护。我一直以为,只有代码写得好维护,好改,清晰易懂,这样加新的功能才会容易,不出事情,顺利发布软件。后来我发现我错了,腾讯不也是QQ一版一版的发吗,原来加班也是一种方法,啊哈哈哈。如果在一个单位里面,不加班别人就会找你麻烦的话,我相信你也不会花心思把代码写好的,反正都要加班。

    不过对于志向就是写代码的那一些人,最好还是不要受到这些外来信息的干扰。最近跟我们组里的一个test manager聊天,他是一个菲律宾人,说是从纸带时代开始就写代码了(不过看起来好年轻……),工作的时候还觉得C语言是一个崭新的语言。后来他跟我说,如果一个人有志向与,代码一条路走到黑,最好就去学习一下怎么当architect。他说道,Architect的知识架构是由各种pattern组成的,然后就说了自己年轻的时候的很多故事来作证这个道理。然后还讲了微软的其中一个创始人到现在还坚持一线写代码的事情,不过没告诉我是谁。

    在这之前,刚好MSR的Daan Leijen因为来北京参加programming language相关的conference,就来我们这里参观了一下。后来我看他做过GUI,做过parser combinator,发明实现过语言,就前去搭讪,结果发现他读书的时候的导师竟然是Erik Meijer。按照他的话说,“then we are connected”,如果说成中文,就是有缘分吧。接着就跟他讨论了一些parser combinator和类型系统之类的东西。我说我之前也搞过这些东西,最后还贡献了一部分给公司,换了个组之后还开了讲座什么的。他讲到他读书的时候,也是学校没教自己自学的这些东西,后来周围也没什么人做,但是并没有让他丧失动力。然后就说了一句话让我印象很深刻:“原来你也做这些东西啊,我应该可以看到为什么你要从产品组跳到MSRA来了。”他直到今天,头发都基本上掉光了,还在那里继续研究programming language的东西,还给了我几篇论文。我觉得很好,人就该像他那样。

    有些时候,人就得有那个信念,才能把可行但是难度大的东西,也最终搞出来。我自己写了11年的程序,其实并没有接触过十分广泛的东西,因为很多时间都花在重写我的一些idea上面了。譬如说编译器就写了五六个,GUI库就写了八遍,还有些杂七杂八的。不过从这个过程之中,可以明显感觉到自己什么时候比以前更进一步。这种signal有很多,譬如说当你决定要添加一个比较复杂的功能,也可以迅速知道怎么做而不用动到架构啦;譬如说你觉得你的代码越来越顺眼啦;譬如说你因为架构不行决定重写的时候,你发现前一个版本的代码可以捡起来继续用的部分越来越多啦。

    写到这里,我想起很多人都问过我,程序要怎么写才能写得好,或者说设计模式要怎么写,之类的问题。如果把学习编程花费的精神代价做标准的话,捷径是没有的。但是如果仅仅把时间作为标准的话,捷径显然是有的。怎样才能加速你学习的过程呢?答案就是,先写再看书。对于像编译原理这种略微高深的知识,总要自己写过几遍,吃了一些苦头,才能知道为什么书里非要把算法那么设计结构那么安排。对于像设计模式这种需要大量经验才可以领悟到的知识,如果你从来没独立写过一个上万行的程序,你觉得你能理解设计模式在讲什么吗?我觉得这种时候能做的也就是背下来,理解什么的都是扯淡。诸如此类,学习程序,如果要加速那个过程,肯定要花大量的时间写代码。当你把项目做得越大、越复杂、算法越扭曲、界面越华丽、尺寸已经大到你觉得不学习新的方法论就肯定会让代码失控的时候,这个时候你来看设计模式的书,保证是每看到一个模式都觉得人家说到你心坎里去了。那你不仅可以迅速理解,而且以后还可以不由自主的想起来使用它。

    当然,如果你不是一个喜欢写代码的人,那这个方法肯定没有用,因为中途放弃什么的太多了。这种时候,只能怪你没缘分,设计模式不渡你了。如果你最后撑下来了,虽然你自己觉得你也花费了相当的努力,但是别人反正是看不到你的努力的,就会开始觉得你有捷径了。为什么呢?因为效率高啊,时间花得短啊。

    光写代码也是没用的。同人于野一篇讲成年人还能不能进步的博客说得很好,知识分为舒适区,学习区和恐慌区。舒适区的意思就是,你很容易就可以做完。学习区的意思就是,你需要花费大量的智力才可以做完。恐慌区的意思就是,你根本不知道如何下手。当你在为了练习编写大量的代码的时候,你要尽量把题目都安排在学习区这里,这样才能让你进步快的同时,还不会被问题打倒,可以继续积累成就感了。

    学生做这个最方便了,工作之后,如果刚好遇上个黑心公司要你天天加班,你反而没时间做学习区的内容了,公司给你的肯定是舒适区的苦力活。

    说到这里,如果你还有时间练习的话,千万不要去想:“我每一个程序都要跨平台”,“我只做这个语言”等等。反正将来,语言你都要会,平台的差异你都要知道,为什么要断送自己了解这些东西的机会呢?你真的以为不知道垃圾收集的原理,和一些底层的可以通过C++的练习而得到的的操作,你真的可以在某些关键时刻操纵好C#吗?当然有些人会觉得,我估计一辈子不会遇到这些问题的,所以我还是不管他了。人各有志嘛,C#不渡你,也是你自己的事情。如果你真的可以一辈子都在一个平台上用一种语言做同一种程序做到退休,那真是幸福的生活啊。

    胡扯到这里也差不多了,这就是月经贴,时不时,总是要发一下的。
posted @ 2012-07-14 10:15 BoyXiao 阅读(104) | 评论 (0)编辑 收藏

美社会学家建议 Twitter 向中国微博学习

  社会学家特蕾西娅·王

  北京时间 7 月 13 日消息,据国外媒体报道,32岁的特蕾西娅·王(Tricia Wang)是在中国工作的社会学家和顾问,据她表示自己现在的日常工作已经离不开 Instagram 了。另外,她还在工作中记录了微博和人人网等全新社交媒体在中国蓬勃发展的情况,并建议 Twitter 向中国的微博学习。

  以下为文章摘要:

  特蕾西娅·王很有可能是在中国火车上用 Instagram 拍摄照片最多的。王有多种身份,她是一名社会学家、民族志学者(ethnographer),以及研究全球科技在移民、低收入群体、年轻人和社会边缘阶层中使用情况的企业咨询顾问。王过去几年都生活在中国。从 2005 年开始,她跑遍了中国的大江南北,经常乘坐的交通工具是火车。她的工作是观察数字技术对进城农民工的深远影响,并对新型社交媒体(如微博和人人)的迅速普及进行记录。一年前,王回到了自己位于纽约布鲁克林的家中。在接受国外网站的采访时,王谈到了以下几点内容:她使用了数字技术来进行民族志的工作、不在大公司工作的好处,以及美国高科技公司可以从中国同行那里获得灵感。

  问:你是怎样获得这份不错的工作的?

  答:特蕾西娅·王:我之前从没想过要去找一份工作。我就读于加州大学圣地亚哥分校,主修的是传播学,毕业之后我在纽约市的低收入社区从事过几年社区干事的工作,另外还从事过宣传和普及教育的工作。我并没有打算进入学术界,我一直以来都没有这方面的兴趣,尤其是大多数学术界那种封闭的氛围不太吸引我。丹娜·博伊德(Danah Boyd)是第一位吸引了我的学者,因为她的工作看上去和外界息息相关。另外,她的个性也启发了我,让我意识到我需要具备一些额外的研究技巧,才能对我感兴趣的领域具有一定影响力。所以,我又回到了加州大学圣地亚哥分校,继续攻读我的社会学博士学位。

  现在,我已经是一名独立的研究员。去年,我获得了富布莱特访问学者(Fulbright Fellow)的资助,我还从事着咨询的工作,负责几个项目,有时还会对外界做报告。上一次做报告是在里昂证券公司,它是中国最大的股票交易和金融服务公司之一。我曾经在诺基亚做过研究工作,并拥有微软的访问学者资格。我尤其喜欢关注公司战略层面的内容。另外,我时常通过分析科技用户的文化特性,使得投资者能够更好的理解市场,或者从不同的角度去理解用户。比如说,我曾经就“为什么谷歌会在中国失败”写过一些文章,并做过报告。我之所以会做这些工作,只是希望自己能有机会去分享我的研究成果,而不至于将来眼看着这些科技公司陷入困境。

  问:当你“在现场”的时候,你实际上在做什么?

  答:我接受过社会学调研的培训,我记录时使用的是民族志的方法。这种方法要求我全身心的投入进去,所以我去到中国,同那里的人生活在一起,花大量的时间同他们一起吃饭、逛街等,从而理解他们的生活方式到底是怎么样的。另外,还有一个目的就是了解他们是如何使用科技的。我尤其喜欢和低收入者、年轻人和外地务工人员打交道,因为我认为社会边缘阶层所形成“亚文化”是理解社会变迁和未来趋势的关键。我在美国和墨西哥从事过社会研究工作,但是从 2005 年以后我就一直聚焦中国的发展。近几年,中国人在科技使用上的变化是令人吃惊的,尤其是在互联网和手机的使用方面。和美国不同的是,中国一些低收入甚至更边缘化的人群在手机购买方面增长得特别快,这得归功于政府积极建设无线通信基础设施,以及国有电信运营商之间竞争激烈,导致资费显著下降。

  问:你在中国的研究开始之后,所关注的重点有没有过变化?

  答:刚开始的时候,我专注的是外来务工人员,并花了很多时间泡在网吧里面,里面有很多人在上网、打游戏和看电影,但是不少人在网上找工作的时候却吃住都在网吧。我对中国中产阶级和上层阶级使用科技的情况从来没有感兴趣过,因为我看不出来他们同美国的情况有什么区别。当我去年再次回到中国时,发现那里又发生了很多变化——现在年轻人都在频繁使用社交媒体。人们开始使用类似于 Twitter 和 Facebook 这样的手机应用,不过功能会有些不同。作为一个民族志学者,你很多时候没有办法选择你所研究的对象,而且必须紧跟当下发生的事情。我对社交媒体的关注并不是刻意的,但现在却成了我研究的焦点。

  问:为什么和中国的社交媒体如此不同?

  答:在中国,最重要的两个社交媒体是人人网(基本上是抄袭 Facebook)和微博(与 Twitter 有点像)。一般来讲,我们认为没有必要向美国以外的科技公司学习,但对 Twitter 而言,无疑应该好好研究微博,并从中汲取一些灵感。微博看上去像是轻博客 Tumblr、游戏平台 Zynga、Facebook 和 Twitter 的混合体。它上面的消息带有很多图片,而 Twitter 往往是文字更多一些。在微博中,图片直接就放在每条消息的下面,所以你不需要再次点击就可以查看图片。有些图片往往同消息中的文字内容非常不同,有时图片中的内容还可以是文字。

  问:用户的使用情况怎么样?

  答:微博历史上的一个转折点就是去年的动车事件。网民拍摄了很多现场的照片,并发布到了微博上面,甚至有关于追尾瞬间发生的内容。由于疯狂转发,现场的信息也大量传播了出去。目前,微博上出现了一种“长微博”,这种工具允许你将发布的整篇文章转化成 JPEG 图片。点击该图片,里面的文字得以放大,这样用户就可以查看完整的内容。虽然这看上去是一件微不足道的事情,但是从中你可以了解中国社交媒体的现况。同样,如果是在美国,我一般关注的是用户如何黑掉社交媒体,因为各个国家的文化是不一样的。

  问:你在工作中是如何使用社交媒体的?

  答:虽然一些研究人员对自己的工作相当保密,但是我做的事情确是透明的。我告诉人们我在哪里,我常使用 Foursquare 和 Instagram,这样我可以将我的文章转发到 Tumblr、Facebook 和 Twitter 上。我尽可能在网络上留下我的踪迹,这可以提醒自己在网络上从事的任何工作都是公开的,不管是在美国还是在中国。如果发生了任何事情,朋友都可以在网上找到我的位置。Instagram 是我在中国工作的主要工具,我可以在第一时间将实地研究报告发布到上面,既有图片又有文字。做实地调查很枯燥、孤单,所以朋友们的实时回复可以让我减少孤独感。

posted @ 2012-07-14 10:15 BoyXiao 阅读(108) | 评论 (0)编辑 收藏

Linq to xml 这个东西出来好多年了,但一直没有机会在项目中用到,前段时间,终于项目中一些地方需要用到xml作为数据源,于是就体验了一把这个,感觉还挺不错的,今天在此小结一下.

       首先我们来模拟一下一个真实的业务场景:在这里我们需要展示一个火车站上各个站台上面灯光开关状态.假设每个站台一共6个开关,站台我们用Station节点表示,站台开关我们用SwitchNo来表示,在初始化(即默认状态)的时候,我们需要表示成第一个站台2个开关开着,第二个站台3个开关开着,第三个站台4个开关开着….

    那么我们可能需要的一个xml文件格式可能就是如下这个样子: 

<?xml version="1.0" encoding="utf-8"?>
<Stations>
  <Station Id="1">
    <SwitchNo Id="1">1</SwitchNo>
    <SwitchNo Id="2">1</SwitchNo>
    <SwitchNo Id="3">0</SwitchNo>
    <SwitchNo Id="4">0</SwitchNo>
    <SwitchNo Id="5">0</SwitchNo>
    <SwitchNo Id="6">0</SwitchNo>
  </Station>
  <Station Id="2">
    <SwitchNo Id="1">1</SwitchNo>
    <SwitchNo Id="2">1</SwitchNo>
    <SwitchNo Id="3">1</SwitchNo>
    <SwitchNo Id="4">0</SwitchNo>
    <SwitchNo Id="5">0</SwitchNo>
    <SwitchNo Id="6">0</SwitchNo>
  </Station>
  <Station Id="3">
    <SwitchNo Id="1">1</SwitchNo>
    <SwitchNo Id="2">1</SwitchNo>
    <SwitchNo Id="3">1</SwitchNo>
    <SwitchNo Id="4">0</SwitchNo>
    <SwitchNo Id="5">0</SwitchNo>
    <SwitchNo Id="6">0</SwitchNo>
  </Station>
  <Station Id="4">
    <SwitchNo Id="1">0</SwitchNo>
    <SwitchNo Id="2">0</SwitchNo>
    <SwitchNo Id="3">1</SwitchNo>
    <SwitchNo Id="4">1</SwitchNo>
    <SwitchNo Id="5">0</SwitchNo>
    <SwitchNo Id="6">0</SwitchNo>
  </Station>
  <Station Id="5">
    <SwitchNo Id="1">1</SwitchNo>
    <SwitchNo Id="2">1</SwitchNo>
    <SwitchNo Id="3">1</SwitchNo>
    <SwitchNo Id="4">1</SwitchNo>
    <SwitchNo Id="5">1</SwitchNo>
    <SwitchNo Id="6">0</SwitchNo>
  </Station>
  <Station Id="6">
    <SwitchNo Id="1">1</SwitchNo>
    <SwitchNo Id="2">1</SwitchNo>
    <SwitchNo Id="3">1</SwitchNo>
    <SwitchNo Id="4">1</SwitchNo>
    <SwitchNo Id="5">1</SwitchNo>
    <SwitchNo Id="6">1</SwitchNo>
  </Station>
</Stations>

 

下面我们就从xml数据的创建/查询/修改这三个方面简单谈一下吧.关于概念啥的就不啰嗦了,直接上代买吧.

1. 创建这个文件

/// <summary>
        /// 创建xml文件
        /// </summary>
        private void writeStationXmlData()
        {            
            string fileName = Path.Combine(dataPath, "StationWitch.xml");

            if (!Directory.Exists(dataPath))
                Directory.CreateDirectory(dataPath);

            if (File.Exists(fileName))
                return;

            var stationEleList = new List<XElement>();  //临时缓存每个站台节点

            //一共6个站台,循环创建           
            for (int i = 1; i < 7; i++)
            {
                var xAttr = new XAttribute("Id", i);

                //临时缓存每个每个站台下的开关状态
                var childList = new List<XElement>();       
                for (int j = 1; j < 7; j++)
                {
                    childList.Add(new XElement("SwitchNo", new XAttribute("Id", j), i >= j ? 1 : 0));
                }

                //构建一个站台节点
                var stationEle = new XElement("Station", xAttr, childList.ToArray());
                stationEleList.Add(stationEle);
            }

            //构建Stations节点
            XElement xBody = new XElement("Stations", stationEleList.ToArray());

            //构建整个文档
            XDocument doc = new XDocument(
                    new XDeclaration("1.0", "utf-8", "yes"), xBody);
            doc.Save(fileName);
        }

2. 读取当前xml 文件并转化为友好的类型

/// <summary>
        /// 查询读取每个站台的开关状态并转化为keyValue键值对
        /// </summary>
        /// <returns></returns>
        public IList<KeyValue<int, int>> GetStationLightData()
        {
            writeStationXmlData();
            if (stationLightData == null)
            {
                stationLightData = new List<KeyValue<int, int>>();
                stationSwitchStatus = new List<KeyValue<int, bool>>();                

                //加载xml
                string fileName = Path.Combine(dataPath, "StationWitch.xml");
                XElement doc = XElement.Load(fileName);

                //读取站台列表
                var station = from s in doc.Descendants("Station")
                              select s;
                //遍历站台
                foreach (var st in station)
                {
                    //获取每个站台的开关集合 即SwitchNo节点
                    var st_switchs = st.Elements("SwitchNo");
                    var stationId = int.Parse(st.Attribute("Id").Value);
                    int light = 0;
                    foreach (var sw in st_switchs)
                    {
                        var swithNo = int.Parse(sw.Attribute("Id").Value);
                        bool isOn = sw.Value == "1";
                        if (isOn)
                            light += 20;
                        stationSwitchStatus.Add(new KeyValue<int, bool>(stationId, isOn, swithNo));
                    }
                    stationLightData.Add(new KeyValue<int, int>(stationId, light));
                }
            }
            return stationLightData;
        }

3.更新节点值(先查询找到指定的节点 在更新后保存)

 /// <summary>
        /// 更新制定站台中的指定开关的状态,即更新制定Station->SwitchNo节点下值
        /// </summary>
        /// <param name="station"></param>
        /// <param name="switchNo"></param>
        /// <param name="isOn"></param>
        public void UpdateStationSwitchStatus(int station, int switchNo, bool isOn)
        {
            string fileName = Path.Combine(dataPath, "StationWitch.xml");
            //读取数据
            XElement doc = XElement.Load(fileName);
            var up_station = doc.Descendants("Station")
                .Where(o => o.Attribute("Id").Value == station.ToString()).FirstOrDefault();

            //找出指定的节点
            var upSwitch = up_station.Elements("SwitchNo").FirstOrDefault(o => o.Attribute("Id").Value == switchNo.ToString());

            //更新
            if (upSwitch != null)
            {
                upSwitch.Value = isOn ? "1" : "0";
            }

            //保存为文件
            lock (sync)
            {
                doc.Save(fileName);
            }
        }

至此,xml的常规操作就介绍完了,希望能对有需要的同学有所帮助.

posted @ 2012-07-14 10:15 BoyXiao 阅读(94) | 评论 (0)编辑 收藏

攸關政府資安設備採購的台銀共同供應契約網路及資訊安全設備類(LP5-990074),自從去年新制訂出「加值服務選項」規格,要求必須通過資訊安全產品評估之共同準則(Common Criteria, CC)ISO/IEC 15408定義之評估保證等級(EAL)檢測認證之產品可被採購勾選。公告一出,對台灣資安設備市場造成不小衝擊。而NCC經過一年努力推動台灣版資通設備安全檢測認證,並期望在今年7月台銀換約時也被納入加值服務選項認可中,但目前看來仍有變數。

 

去年台銀祭出這項公告,首波是在入侵偵測防禦系統、防火牆與防毒閘道器等三類產品的採購案中。據台銀統計,自去年公告至今年4月為止,在這三類的產品採購案中,有近半數的採購案均勾選需要此加值服務選項功能。

 

而有無加值服務功能最大的差別就是反映在售價上。以1Gbps吞吐量的防火牆來說,含加值服務功能的產品售價約比不含此功能的產品高出5倍,而以500Mbps的入侵偵測防禦系統來說,也有2倍的價差。

 

由於目前取得CC認證以外商品牌居多,因此市場上呈現幾家歡樂幾家愁現象。在國外政府標案市場中,常見資安設備以國土安全為由,被設定採購門檻,外商需要配合該國各種規定才有機會得標。本土廠商認為此次台灣政府不扶植本土業者就罷了,台銀此舉將本土品牌屏除在這些加值選項之外,將不利國內資安產業的發展。

 

通傳會NCC所推動的台灣版CC認證,其包含書面審查與實機檢測兩部分,目前已制定出8類資通設備安全檢測技術規範(網路型防火牆等8類IS0008~IS0015),而國外CC認證只包含書面審查。然而自去年NCC開始舉辦檢測說明會,迄今本土廠商投入準備此認證的廠商卻不多,有業者認為此認證目前尚未被台銀共同供應契約認可,耗費金錢、人力資源投入也未必看得到結果,目前先觀望。

 

台銀委託二科表示,此認證能否暨CC之後,也被納入加值服務選項,目前仍在研議中,將視取得認證通過的家數來衡量。NCC技術管理處羅金賢副處長指出,近期將與台銀協調,請台銀支持政府政策,將技術規範納入加值服務選項當中。

posted @ 2012-07-14 10:13 BoyXiao 阅读(129) | 评论 (0)编辑 收藏

Linq to xml 这个东西出来好多年了,但一直没有机会在项目中用到,前段时间,终于项目中一些地方需要用到xml作为数据源,于是就体验了一把这个,感觉还挺不错的,今天在此小结一下.

       首先我们来模拟一下一个真实的业务场景:在这里我们需要展示一个火车站上各个站台上面灯光开关状态.假设每个站台一共6个开关,站台我们用Station节点表示,站台开关我们用SwitchNo来表示,在初始化(即默认状态)的时候,我们需要表示成第一个站台2个开关开着,第二个站台3个开关开着,第三个站台4个开关开着….

    那么我们可能需要的一个xml文件格式可能就是如下这个样子: 

<?xml version="1.0" encoding="utf-8"?>
<Stations>
  <Station Id="1">
    <SwitchNo Id="1">1</SwitchNo>
    <SwitchNo Id="2">1</SwitchNo>
    <SwitchNo Id="3">0</SwitchNo>
    <SwitchNo Id="4">0</SwitchNo>
    <SwitchNo Id="5">0</SwitchNo>
    <SwitchNo Id="6">0</SwitchNo>
  </Station>
  <Station Id="2">
    <SwitchNo Id="1">1</SwitchNo>
    <SwitchNo Id="2">1</SwitchNo>
    <SwitchNo Id="3">1</SwitchNo>
    <SwitchNo Id="4">0</SwitchNo>
    <SwitchNo Id="5">0</SwitchNo>
    <SwitchNo Id="6">0</SwitchNo>
  </Station>
  <Station Id="3">
    <SwitchNo Id="1">1</SwitchNo>
    <SwitchNo Id="2">1</SwitchNo>
    <SwitchNo Id="3">1</SwitchNo>
    <SwitchNo Id="4">0</SwitchNo>
    <SwitchNo Id="5">0</SwitchNo>
    <SwitchNo Id="6">0</SwitchNo>
  </Station>
  <Station Id="4">
    <SwitchNo Id="1">0</SwitchNo>
    <SwitchNo Id="2">0</SwitchNo>
    <SwitchNo Id="3">1</SwitchNo>
    <SwitchNo Id="4">1</SwitchNo>
    <SwitchNo Id="5">0</SwitchNo>
    <SwitchNo Id="6">0</SwitchNo>
  </Station>
  <Station Id="5">
    <SwitchNo Id="1">1</SwitchNo>
    <SwitchNo Id="2">1</SwitchNo>
    <SwitchNo Id="3">1</SwitchNo>
    <SwitchNo Id="4">1</SwitchNo>
    <SwitchNo Id="5">1</SwitchNo>
    <SwitchNo Id="6">0</SwitchNo>
  </Station>
  <Station Id="6">
    <SwitchNo Id="1">1</SwitchNo>
    <SwitchNo Id="2">1</SwitchNo>
    <SwitchNo Id="3">1</SwitchNo>
    <SwitchNo Id="4">1</SwitchNo>
    <SwitchNo Id="5">1</SwitchNo>
    <SwitchNo Id="6">1</SwitchNo>
  </Station>
</Stations>

 

下面我们就从xml数据的创建/查询/修改这三个方面简单谈一下吧.关于概念啥的就不啰嗦了,直接上代买吧.

1. 创建这个文件

/// <summary>
        /// 创建xml文件
        /// </summary>
        private void writeStationXmlData()
        {            
            string fileName = Path.Combine(dataPath, "StationWitch.xml");

            if (!Directory.Exists(dataPath))
                Directory.CreateDirectory(dataPath);

            if (File.Exists(fileName))
                return;

            var stationEleList = new List<XElement>();  //临时缓存每个站台节点

            //一共6个站台,循环创建           
            for (int i = 1; i < 7; i++)
            {
                var xAttr = new XAttribute("Id", i);

                //临时缓存每个每个站台下的开关状态
                var childList = new List<XElement>();       
                for (int j = 1; j < 7; j++)
                {
                    childList.Add(new XElement("SwitchNo", new XAttribute("Id", j), i >= j ? 1 : 0));
                }

                //构建一个站台节点
                var stationEle = new XElement("Station", xAttr, childList.ToArray());
                stationEleList.Add(stationEle);
            }

            //构建Stations节点
            XElement xBody = new XElement("Stations", stationEleList.ToArray());

            //构建整个文档
            XDocument doc = new XDocument(
                    new XDeclaration("1.0", "utf-8", "yes"), xBody);
            doc.Save(fileName);
        }

2. 读取当前xml 文件并转化为友好的类型

/// <summary>
        /// 查询读取每个站台的开关状态并转化为keyValue键值对
        /// </summary>
        /// <returns></returns>
        public IList<KeyValue<int, int>> GetStationLightData()
        {
            writeStationXmlData();
            if (stationLightData == null)
            {
                stationLightData = new List<KeyValue<int, int>>();
                stationSwitchStatus = new List<KeyValue<int, bool>>();                

                //加载xml
                string fileName = Path.Combine(dataPath, "StationWitch.xml");
                XElement doc = XElement.Load(fileName);

                //读取站台列表
                var station = from s in doc.Descendants("Station")
                              select s;
                //遍历站台
                foreach (var st in station)
                {
                    //获取每个站台的开关集合 即SwitchNo节点
                    var st_switchs = st.Elements("SwitchNo");
                    var stationId = int.Parse(st.Attribute("Id").Value);
                    int light = 0;
                    foreach (var sw in st_switchs)
                    {
                        var swithNo = int.Parse(sw.Attribute("Id").Value);
                        bool isOn = sw.Value == "1";
                        if (isOn)
                            light += 20;
                        stationSwitchStatus.Add(new KeyValue<int, bool>(stationId, isOn, swithNo));
                    }
                    stationLightData.Add(new KeyValue<int, int>(stationId, light));
                }
            }
            return stationLightData;
        }

3.更新节点值(先查询找到指定的节点 在更新后保存)

 /// <summary>
        /// 更新制定站台中的指定开关的状态,即更新制定Station->SwitchNo节点下值
        /// </summary>
        /// <param name="station"></param>
        /// <param name="switchNo"></param>
        /// <param name="isOn"></param>
        public void UpdateStationSwitchStatus(int station, int switchNo, bool isOn)
        {
            string fileName = Path.Combine(dataPath, "StationWitch.xml");
            //读取数据
            XElement doc = XElement.Load(fileName);
            var up_station = doc.Descendants("Station")
                .Where(o => o.Attribute("Id").Value == station.ToString()).FirstOrDefault();

            //找出指定的节点
            var upSwitch = up_station.Elements("SwitchNo").FirstOrDefault(o => o.Attribute("Id").Value == switchNo.ToString());

            //更新
            if (upSwitch != null)
            {
                upSwitch.Value = isOn ? "1" : "0";
            }

            //保存为文件
            lock (sync)
            {
                doc.Save(fileName);
            }
        }

至此,xml的常规操作就介绍完了,希望能对有需要的同学有所帮助.

posted @ 2012-07-14 10:10 BoyXiao 阅读(122) | 评论 (0)编辑 收藏
仅列出标题
共2页: 1 2 

导航

留言簿(43)

最新评论

阅读排行榜

评论排行榜