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

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

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