摘要: 引言 之前也做過(guò)一些含內(nèi)嵌IE控件的東西,只是一直用MFC/ATL等框架,對(duì)于里面的原理其實(shí)一知半解,只有脫離它們寫(xiě)一遍,才算能真正懂。前不久在寫(xiě)一個(gè)SkyDriveClient的時(shí)候正好有一個(gè)需求,就練習(xí)了一下。技術(shù)含量沒(méi)有,在此記錄一筆,供后來(lái)人入門(mén),供前輩們批評(píng)。 本文中,行文以流水帳、貼代碼方式為主,同時(shí)為了不帶來(lái)干擾,代碼將盡量以不帶或少帶封裝的方式書(shū)寫(xiě)。目...
閱讀全文
(cnBeta: http://www.cnbeta.com/articles/203020.htm)
微軟拼音輸入法的新體驗(yàn)?zāi)J剑鋵?shí)是微軟拼音一直以來(lái)的主要模式。筆者從1.5版開(kāi)始接觸微軟拼音以來(lái)就一直是這種模式,主要特點(diǎn)就是長(zhǎng)句輸入、二次確認(rèn),在第一次確認(rèn)的時(shí)候,文字就進(jìn)入仿佛實(shí)際輸入?yún)^(qū)域,但是文字下面有虛線,此時(shí)我們可以用光標(biāo)鍵左右移動(dòng),就像下圖顯示的一樣:
而在輸入拼音的時(shí)候,我們其實(shí)無(wú)需開(kāi)啟候選詞窗口,也不用看屏幕:
輸入完畢之后按空格,觀察首選是否正確,如果正確的話再一次空格確認(rèn),否則按一下右光標(biāo)鍵回到句首開(kāi)始選詞。非常方便,也顯得很專業(yè)。
習(xí)慣于詞組輸入的同學(xué)可能喜歡時(shí)刻盯著屏幕出現(xiàn)的候選詞,一旦有錯(cuò)立刻糾正選擇。而長(zhǎng)句輸入則不必這樣,輸入整個(gè)句子,讓輸入法在整句的語(yǔ)境中替你選詞,命中率會(huì)高很多,特別是在打長(zhǎng)篇文章的時(shí)候,非常有用。
很多時(shí)候別人在看我輸入的時(shí)候,發(fā)現(xiàn)屏幕上有錯(cuò)別字,會(huì)忍不住提醒我錯(cuò)了,但是當(dāng)我最后確認(rèn)的時(shí)候,往往又對(duì)了,會(huì)顯得有一點(diǎn)點(diǎn)疑惑,但是通常不說(shuō)。有趣的是,我在打別人名字的時(shí)候,他們發(fā)現(xiàn)一開(kāi)始的錯(cuò)別字,也會(huì)忍不住提醒我錯(cuò)了,并且對(duì)輸入法把某人的名字弄成另外一個(gè)字非常感興趣,有時(shí)會(huì)以此"嘲笑"那個(gè)人。然后當(dāng)我最后回來(lái)選詞的時(shí)候,他們會(huì)"指責(zé)"干嘛一開(kāi)始不選對(duì)的字……我已經(jīng)習(xí)慣了。但是整句輸入帶來(lái)的便捷之處,大部分人是沒(méi)法認(rèn)識(shí)到的。所以我今天在這里花很大的篇幅介紹一下。
遺憾的是,微軟拼音1.5、2.0、3.0都沒(méi)人叫好。到Office2003的時(shí)候,因?yàn)?新體驗(yàn)"模式的出現(xiàn),使得一部分人叫好,但那部分人其實(shí)還是把它當(dāng)作詞組輸入法來(lái)用的。到Office2010出來(lái)的時(shí)候,又有一部分人叫好,實(shí)際上很大一部分人是為"簡(jiǎn)捷"模式叫好。到現(xiàn)在Win8成了簡(jiǎn)體中文語(yǔ)言下默認(rèn)輸入法,即便有強(qiáng)推的味道,但好多人還是叫好,而新體驗(yàn)?zāi)J降南В瑓s很少有人問(wèn)津。
下面正式來(lái)看標(biāo)題中提到的問(wèn)題。Win8安裝完畢后簡(jiǎn)體中文下只有一個(gè)微軟拼音簡(jiǎn)捷,新體驗(yàn)?zāi)J讲灰?jiàn)了!!!
有需要的同學(xué),請(qǐng)跟隨筆者,一步一步找回新體驗(yàn)?zāi)J健?
1、打開(kāi)開(kāi)始屏幕,在英文狀態(tài)下輸入regedit,然后回車(chē),打開(kāi)注冊(cè)表編輯器。(遇到UAC提醒,請(qǐng)選擇"是")
2、在左側(cè)展開(kāi)目錄樹(shù),一直到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\CTF\TIP\{81d4e9c9-1d3b-41bc-9e6c-4b40bf79e35e}:
微軟對(duì)這一項(xiàng)做了特殊的權(quán)限保護(hù),它的權(quán)限和相鄰的那幾個(gè)不一樣,我們要取得寫(xiě)權(quán)限。
3、右鍵單擊它、選擇權(quán)限,打開(kāi)如下圖的窗口:
4、單擊"高級(jí)",再打開(kāi)一個(gè)窗口:
5、在所有者的右邊點(diǎn)擊"更改",輸入"everyone"或者當(dāng)前登錄用戶名,按"確定",并選中"替換子容器和對(duì)象的所有者",然后按應(yīng)用。(不要關(guān)閉這個(gè)窗口,等下我們還要改回來(lái)。)
6、然后點(diǎn)擊左下方的啟用繼承(按了后該按鈕變?yōu)榻美^承),并選中"使用可從此對(duì)象繼承的權(quán)限項(xiàng)目替換所有子對(duì)象的權(quán)限項(xiàng)目"。最后按"應(yīng)用",遇到提示選擇"是"。
現(xiàn)在,這個(gè)窗口變成這個(gè)樣子了:
保留這個(gè)窗口,我們進(jìn)行下一步。
7、打開(kāi)開(kāi)始屏幕,在英文狀態(tài)下輸入"cmd",左側(cè)出現(xiàn)"命令提示符",右鍵點(diǎn)擊選中它,再到屏幕下方點(diǎn)擊"以管理員身份運(yùn)行",遇到UAC提示選擇"是"。這樣我們打開(kāi)具有管理員權(quán)限的命令提示符窗口,工作路徑位于System32目錄。
8、輸入"regsvr32 ime\imesc\imsctip.dll",并按回車(chē)。
直到看到下圖的提示,點(diǎn)擊確定,關(guān)閉命令提示符窗口。
9、回到剛才的高級(jí)安全設(shè)置窗口,點(diǎn)擊左下方的"禁用繼承"按鈕,這時(shí)出現(xiàn)下圖提示:
選擇第二項(xiàng),"從此對(duì)象中刪除所有以繼承的權(quán)限":
并選中"使用可從此對(duì)象繼承的權(quán)限項(xiàng)目替換所有子對(duì)象的權(quán)限項(xiàng)目",按"應(yīng)用",遇到提示選擇"是"。
10、點(diǎn)擊上方所有者右邊的"更改",輸入"nt service\trustedinstaller",按"確定",并選中"替換子容器和對(duì)象的所有者",然后按"應(yīng)用"。
至此,我們將注冊(cè)表權(quán)限恢復(fù)如初了。
打開(kāi)輸入法管理界面:
我們可以看到多出來(lái)的"Microsoft Pinyin NewExperience"了,它就是我們要找的新體驗(yàn)?zāi)J剑?
悲劇的是,貌似新體驗(yàn)?zāi)J皆贛etro界面下有問(wèn)題,每次確認(rèn)輸入,光標(biāo)都會(huì)回到最前面(注:確認(rèn)這是當(dāng)時(shí)新浪微博Win8客戶端的Bug,不是輸入法的問(wèn)題,新浪微博貌似已經(jīng)修正此問(wèn)題)。也許是因?yàn)橛羞@些Bug,微軟才隱藏它的吧。不過(guò),桌面模式下使用起來(lái)未發(fā)現(xiàn)任何問(wèn)題哦。
因?yàn)榻酉氯ヒ鰞?yōu)化工作,在此之前,先做下簡(jiǎn)單的性能測(cè)試。
比較的對(duì)象是std::regex,暫時(shí)只比較兩項(xiàng):
1、解析正則表達(dá)式的速度
2、使用解析好的正則表達(dá)式去匹配字符串的速度。
測(cè)試代碼如下:
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]+/"十萬(wàn)次,后兩則是拿來(lái)匹配http://w-1.w-2.w-3.streamlet.org/十萬(wàn)次。
結(jié)果如下:

匹配速度差很多,解析速度差不多。
考慮到在解析“?”“+”“*”的時(shí)候,引入了很多ε邊,于是對(duì)那部分做點(diǎn)優(yōu)化,去除不必要的ε邊和節(jié)點(diǎn)構(gòu)造,然后再測(cè)試:

可以看到有所提高,但是解析速度還是跟std:wregex的差很多,匹配速度有明顯領(lǐng)先。目前只解析到ε邊、-NFA,如果再做狀態(tài)機(jī)轉(zhuǎn)化,雖然會(huì)提高匹配速度,可是解析速度會(huì)進(jìn)一步下降。因此,一開(kāi)始就要考慮使用一種更高效的狀態(tài)機(jī)存儲(chǔ)方法。
這兩天著涼生病了,好難受啊……
摘要: 引言 根據(jù)預(yù)告,這篇我們對(duì)“?”“+”“*”進(jìn)行處理,實(shí)現(xiàn)對(duì)重復(fù)的支持。“x?”匹配0個(gè)或1個(gè)“x”,“x+”匹配1到任意個(gè)“x”,“x*”匹配0到任意個(gè)“x”。 有了重復(fù),就有貪婪模式和非貪婪模式。在貪婪模式下,“x+”匹配“xxxyyy”中的“xxx”;在非貪婪模式下,“x+”匹配“xxxyyy”中的第一個(gè)“x”。為了區(qū)別兩種模式,按照通常的語(yǔ)法,我們?cè)谥貜?fù)控制符號(hào)后面加一個(gè)“?...
閱讀全文
摘要: 引言 這篇我們要實(shí)現(xiàn)的是中括號(hào)表達(dá)式。 一個(gè)中括號(hào)里寫(xiě)上任意數(shù)目的字符,表示匹配這些字符中的任何一個(gè)。比如“[abc]”匹配a或b或c。中括號(hào)里除了單個(gè)字符,也可以寫(xiě)字符區(qū)間,比如“[a-c]”就表示從a到c的所有字符,這里“a到c”是指內(nèi)碼連續(xù)的一系列字符,包含首尾的a和c。綜合起來(lái)說(shuō),中括號(hào)里面可以放任意個(gè)字符或者字符區(qū)間,匹配所填字符或字符區(qū)間內(nèi)的任意一個(gè)字符。比如“[acd-...
閱讀全文