随笔-90  评论-947  文章-0  trackbacks-0
 
     摘要: 引言   之前也做过一些含内嵌IE控件的东西,只是一直用MFC/ATL等框架,对于里面的原理其实一知半解,只有脱离它们写一遍,才算能真正懂。前不久在写一个SkyDriveClient的时候正好有一个需求,就练习了一下。技术含量没有,在此记录一笔,供后来人入门,供前辈们批评。   本文中,行文以流水帐、贴代码方式为主,同时为了不带来干扰,代码将尽量以不带或少带封装的方式书写。目...  阅读全文
posted @ 2012-09-01 01:04 溪流 阅读(7193) | 评论 (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 溪流 阅读(4565) | 评论 (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/十万次。

结果如下:

image

匹配速度差很多,解析速度差不多。

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

image

可以看到有所提高,但是解析速度还是跟std:wregex的差很多,匹配速度有明显领先。目前只解析到ε边、-NFA,如果再做状态机转化,虽然会提高匹配速度,可是解析速度会进一步下降。因此,一开始就要考虑使用一种更高效的状态机存储方法。

这两天着凉生病了,好难受啊……

posted @ 2012-06-13 23:00 溪流 阅读(496) | 评论 (0)编辑 收藏
     摘要: 引言 根据预告,这篇我们对“?”“+”“*”进行处理,实现对重复的支持。“x?”匹配0个或1个“x”,“x+”匹配1到任意个“x”,“x*”匹配0到任意个“x”。   有了重复,就有贪婪模式和非贪婪模式。在贪婪模式下,“x+”匹配“xxxyyy”中的“xxx”;在非贪婪模式下,“x+”匹配“xxxyyy”中的第一个“x”。为了区别两种模式,按照通常的语法,我们在重复控制符号后面加一个“?...  阅读全文
posted @ 2012-06-08 23:35 溪流 阅读(1857) | 评论 (2)编辑 收藏
     摘要: 引言 这篇我们要实现的是中括号表达式。   一个中括号里写上任意数目的字符,表示匹配这些字符中的任何一个。比如“[abc]”匹配a或b或c。中括号里除了单个字符,也可以写字符区间,比如“[a-c]”就表示从a到c的所有字符,这里“a到c”是指内码连续的一系列字符,包含首尾的a和c。综合起来说,中括号里面可以放任意个字符或者字符区间,匹配所填字符或字符区间内的任意一个字符。比如“[acd-...  阅读全文
posted @ 2012-06-04 22:19 溪流 阅读(2095) | 评论 (0)编辑 收藏
仅列出标题
共18页: First 2 3 4 5 6 7 8 9 10 Last