摘要: 引言 之前也做过一些含内嵌IE控件的东西,只是一直用MFC/ATL等框架,对于里面的原理其实一知半解,只有脱离它们写一遍,才算能真正懂。前不久在写一个SkyDriveClient的时候正好有一个需求,就练习了一下。技术含量没有,在此记录一笔,供后来人入门,供前辈们批评。 本文中,行文以流水帐、贴代码方式为主,同时为了不带来干扰,代码将尽量以不带或少带封装的方式书写。目...
阅读全文
posted @
2012-09-01 01:04 溪流 阅读(7351) |
评论 (19) |
编辑 收藏
(cnBeta: http://www.cnbeta.com/articles/203020.htm)
微软拼音输入法的新体验模式,其实是微软拼音一直以来的主要模式。笔者从1.5版开始接触微软拼音以来就一直是这种模式,主要特点就是长句输入、二次确认,在第一次确认的时候,文字就进入仿佛实际输入区域,但是文字下面有虚线,此时我们可以用光标键左右移动,就像下图显示的一样:
而在输入拼音的时候,我们其实无需开启候选词窗口,也不用看屏幕:
输入完毕之后按空格,观察首选是否正确,如果正确的话再一次空格确认,否则按一下右光标键回到句首开始选词。非常方便,也显得很专业。
习惯于词组输入的同学可能喜欢时刻盯着屏幕出现的候选词,一旦有错立刻纠正选择。而长句输入则不必这样,输入整个句子,让输入法在整句的语境中替你选词,命中率会高很多,特别是在打长篇文章的时候,非常有用。
很多时候别人在看我输入的时候,发现屏幕上有错别字,会忍不住提醒我错了,但是当我最后确认的时候,往往又对了,会显得有一点点疑惑,但是通常不说。有趣的是,我在打别人名字的时候,他们发现一开始的错别字,也会忍不住提醒我错了,并且对输入法把某人的名字弄成另外一个字非常感兴趣,有时会以此"嘲笑"那个人。然后当我最后回来选词的时候,他们会"指责"干嘛一开始不选对的字……我已经习惯了。但是整句输入带来的便捷之处,大部分人是没法认识到的。所以我今天在这里花很大的篇幅介绍一下。
遗憾的是,微软拼音1.5、2.0、3.0都没人叫好。到Office2003的时候,因为"新体验"模式的出现,使得一部分人叫好,但那部分人其实还是把它当作词组输入法来用的。到Office2010出来的时候,又有一部分人叫好,实际上很大一部分人是为"简捷"模式叫好。到现在Win8成了简体中文语言下默认输入法,即便有强推的味道,但好多人还是叫好,而新体验模式的消失,却很少有人问津。
下面正式来看标题中提到的问题。Win8安装完毕后简体中文下只有一个微软拼音简捷,新体验模式不见了!!!
有需要的同学,请跟随笔者,一步一步找回新体验模式。
1、打开开始屏幕,在英文状态下输入regedit,然后回车,打开注册表编辑器。(遇到UAC提醒,请选择"是")
2、在左侧展开目录树,一直到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\CTF\TIP\{81d4e9c9-1d3b-41bc-9e6c-4b40bf79e35e}:
微软对这一项做了特殊的权限保护,它的权限和相邻的那几个不一样,我们要取得写权限。
3、右键单击它、选择权限,打开如下图的窗口:
4、单击"高级",再打开一个窗口:
5、在所有者的右边点击"更改",输入"everyone"或者当前登录用户名,按"确定",并选中"替换子容器和对象的所有者",然后按应用。(不要关闭这个窗口,等下我们还要改回来。)
6、然后点击左下方的启用继承(按了后该按钮变为禁用继承),并选中"使用可从此对象继承的权限项目替换所有子对象的权限项目"。最后按"应用",遇到提示选择"是"。
现在,这个窗口变成这个样子了:
保留这个窗口,我们进行下一步。
7、打开开始屏幕,在英文状态下输入"cmd",左侧出现"命令提示符",右键点击选中它,再到屏幕下方点击"以管理员身份运行",遇到UAC提示选择"是"。这样我们打开具有管理员权限的命令提示符窗口,工作路径位于System32目录。
8、输入"regsvr32 ime\imesc\imsctip.dll",并按回车。
直到看到下图的提示,点击确定,关闭命令提示符窗口。
9、回到刚才的高级安全设置窗口,点击左下方的"禁用继承"按钮,这时出现下图提示:
选择第二项,"从此对象中删除所有以继承的权限":
并选中"使用可从此对象继承的权限项目替换所有子对象的权限项目",按"应用",遇到提示选择"是"。
10、点击上方所有者右边的"更改",输入"nt service\trustedinstaller",按"确定",并选中"替换子容器和对象的所有者",然后按"应用"。
至此,我们将注册表权限恢复如初了。
打开输入法管理界面:
我们可以看到多出来的"Microsoft Pinyin NewExperience"了,它就是我们要找的新体验模式!
悲剧的是,貌似新体验模式在Metro界面下有问题,每次确认输入,光标都会回到最前面(注:确认这是当时新浪微博Win8客户端的Bug,不是输入法的问题,新浪微博貌似已经修正此问题)。也许是因为有这些Bug,微软才隐藏它的吧。不过,桌面模式下使用起来未发现任何问题哦。
posted @
2012-08-25 15:31 溪流 阅读(4663) |
评论 (23) |
编辑 收藏
因为接下去要做优化工作,在此之前,先做下简单的性能测试。
比较的对象是std::regex,暂时只比较两项:
1、解析正则表达式的速度
2、使用解析好的正则表达式去匹配字符串的速度。
测试代码如下:
SECTION_BEGIN(StdRegExParse100000); PERFORMANCE_TEST_BEGIN(StdRegExParse100000); for (int i = 0; i < 100000; ++i) { wregex r; r.assign(L"http://([a-zA-Z0-9\\-]+.)+[a-zA-Z]+/"); } PERFORMANCE_TEST_END(StdRegExParse100000); SECTION_END(); SECTION_BEGIN(xlRegExpParse100000); PERFORMANCE_TEST_BEGIN(xlRegExpParse100000); for (int i = 0; i < 100000; ++i) { RegExp r; r.Parse(L"http://([a-zA-Z0-9\\-]+.)+[a-zA-Z]+/"); } PERFORMANCE_TEST_END(xlRegExpParse100000); SECTION_END(); SECTION_BEGIN(StdRegExMatch100000); { wregex r; r.assign(L"http://([a-zA-Z0-9\\-]+.)+[a-zA-Z]+/"); PERFORMANCE_TEST_BEGIN(StdRegExMatch100000); for (int i = 0; i < 100000; ++i) { regex_match(L"http://w-1.w-2.w-3.streamlet.org/", r); } PERFORMANCE_TEST_END(StdRegExMatch100000); } SECTION_END(); SECTION_BEGIN(xlRegExpMatch100000); { RegExp r; r.Parse(L"http://([a-zA-Z0-9\\-]+.)+[a-zA-Z]+/"); PERFORMANCE_TEST_BEGIN(xlRegExpMatch100000); for (int i = 0; i < 100000; ++i) { r.Match(L"http://w-1.w-2.w-3.streamlet.org/"); } PERFORMANCE_TEST_END(xlRegExpMatch100000); } SECTION_END(); |
前两则是分别使用std::wregex和xl::RegExp解析"http://([a-zA-Z0-9\\-]+.)+[a-zA-Z]+/"十万次,后两则是拿来匹配http://w-1.w-2.w-3.streamlet.org/十万次。
结果如下:

匹配速度差很多,解析速度差不多。
考虑到在解析“?”“+”“*”的时候,引入了很多ε边,于是对那部分做点优化,去除不必要的ε边和节点构造,然后再测试:

可以看到有所提高,但是解析速度还是跟std:wregex的差很多,匹配速度有明显领先。目前只解析到ε边、-NFA,如果再做状态机转化,虽然会提高匹配速度,可是解析速度会进一步下降。因此,一开始就要考虑使用一种更高效的状态机存储方法。
这两天着凉生病了,好难受啊……
posted @
2012-06-13 23:00 溪流 阅读(522) |
评论 (0) |
编辑 收藏
摘要: 引言 根据预告,这篇我们对“?”“+”“*”进行处理,实现对重复的支持。“x?”匹配0个或1个“x”,“x+”匹配1到任意个“x”,“x*”匹配0到任意个“x”。 有了重复,就有贪婪模式和非贪婪模式。在贪婪模式下,“x+”匹配“xxxyyy”中的“xxx”;在非贪婪模式下,“x+”匹配“xxxyyy”中的第一个“x”。为了区别两种模式,按照通常的语法,我们在重复控制符号后面加一个“?...
阅读全文
posted @
2012-06-08 23:35 溪流 阅读(1884) |
评论 (2) |
编辑 收藏
摘要: 引言 这篇我们要实现的是中括号表达式。 一个中括号里写上任意数目的字符,表示匹配这些字符中的任何一个。比如“[abc]”匹配a或b或c。中括号里除了单个字符,也可以写字符区间,比如“[a-c]”就表示从a到c的所有字符,这里“a到c”是指内码连续的一系列字符,包含首尾的a和c。综合起来说,中括号里面可以放任意个字符或者字符区间,匹配所填字符或字符区间内的任意一个字符。比如“[acd-...
阅读全文
posted @
2012-06-04 22:19 溪流 阅读(2118) |
评论 (0) |
编辑 收藏