#
為了實現與數據庫無關,可以方便的在mysql和oracle之間移植,所以不能對于數據庫操作進行硬編碼。當然是使用hibernate,但是實現mysql的text字段和oracle的clob字段之間的轉換確實有點麻煩,幸好hibernate提供了net.sf.hibernate.type.TextType 類型。它可以方便的在clob和text數據類型之間轉換。
在轉換完成之后,總是報告“streams type cannot be used in batching”,將hibernate的配置文件中,設置hibernate.jdbc.batch_size =0 即可解決此問題。
在解決上問題后,我發現向clob字段寫入小數據量可以,但是數據量一大就會有問題,不能正常寫入,hibernate也不會報告錯誤。經jaoso的作者提醒,可在hbm文件中,設置length="10000"(你許可的最大長度) 就可以了。
?科學破解江湖騙術
???
科學破解江湖騙術赤手空拳伸進滾滾油鍋、燒而不斷的棉線、白紙突現血手印……這都是那些巫婆神漢用來欺騙大眾的小把戲,他們就是通過這些看似違背常理的現象,讓一些有病亂投醫的人相信他們擁有某種神秘力量,能為人消災避禍。無辜的人不僅被騙去錢財,甚至還搭上了性命。這些江湖騙術究竟暗藏哪些貓膩,我們將一一為您破解。
騙術一:
油炸厲鬼
一鍋熱氣騰騰的油,眼看就要燒開了。但是一些自稱擁有法術的大師們竟然可以將手伸進翻滾的油鍋。這通常讓旁人目瞪口呆。一般人炒菜的時候如果有油濺到手上通常都受不了,滾滾油鍋難道他們真的不怕燙嗎?
騙術揭秘
其實這并不是一鍋真正的油,一鍋油沸騰以后,溫度會達到兩三百攝氏度,肯定會對人造成傷害,這鍋油里面一定會有其他的東西,一般情況下會是醋,因為醋的密度會比較大,所以放入鍋中會沉在油的下面。我們從上面看上去,就像是一鍋油,看不到醋。加熱以后,因為醋的沸點低,所以它會首先沸騰。那氣泡就會鼓到油面上來,看上去像是油開了,但實際上這個時候的溫度只有60攝氏度左右,并不會對人造成傷害。如果想進一步降低溫度,還可以向鍋中加入碳酸鈣,或者是硼砂之類的化學物質,這樣因為發生化學反應,同樣會產生氣體,氣泡也會鼓到油面的上方,看上去油也像開了,而這個時候的溫度會更低,就更不會對人造成傷害了,就可以放心大膽地施加法術了。
騙術二:
白紙血印
原本是一張雪白的紙,只見“大師”用力一拍,紙上竟然出現了一個血手印,這個時候“大師”們往往告訴你家里的狐貍精、妖魔鬼怪已經被他降服了?!按髱煛苯酉聛戆殉霈F血手印的紙往水盆里面一放,血手印又慢慢消失了,“大師”的解釋是,鬼怪最終被驅走了。
騙術揭秘
在這個招術中,主要是一種化學試劑酚酞在起作用,酚酞遇堿會變成紅色,遇酸就自然地會褪色,其實“大師”就是利用了這個簡單化學反應。先把酚酞噴到一張白紙上,晾干了,看起來還是一張好端端的白紙,然后做法的時候,手上再沾點堿水,往上一拍,于是反應出來之后,一個紅手印就有了,等擱到水盆里的時候,水里面可以兌點稀鹽酸、白醋,所以紙往里一擱,遇酸它自然就褪色了,血手印它就沒了。
騙術三:
火燒棉線
一枚銅錢用一根普通的棉線懸吊著,“大師”將棉線點燃,可奇怪的是棉線明明已經燒著了,卻怎么也不斷。這也是大師們通常用的一招,聲稱這是因為鬼怪的法術太高明,所以才讓棉線怎么燒也不斷。
騙術揭秘
大師用的棉線,其實是被他動了手腳的,棉線可能用鹽鹵水泡過,鹽鹵水是用來點豆腐的,里面含有氯化鉀、氯化鎂等物質,用這樣的線系住那個銅錢,看起來是點著了,其實燒著的僅僅就在線的表面,而這個線的內部由于受到氯化鉀和氯化鎂的保護,并沒有接觸空氣,所以并沒有燒掉。
騙術四:
清水爆炸
“大師”手中拿著一根針,念念有詞地繞著一盆水轉著,一會兒那根針竟然在水面上漂浮起來?!按髱煛边@個時候往往都說這是因為水鬼把針托了起來。證明了有水鬼, “大師”自然要拿錢消災了,聲稱可以除掉水鬼。只見“大師”的手指在水盆中慢慢悠悠地轉,水盆中突然冒出來個東西,難道水里還真的有鬼?這個時候,水盆竟然爆炸了,冒出一股濃煙。
騙術揭秘
其實針可以浮在水面上,并不是因為神或者鬼的作用,這其實主要是因為水具有一定的表面張力,當我們把針或者是平常認為一定會沉入水底的硬幣輕輕地平放在水面上的時候,我們就會看到水面會凹陷下去一部分,凹陷下去的水面就會產生一個向上的力來托著這根針或者是硬幣,讓它不至沉入水底,這其實是一個很簡單的物理現象,所謂的“大師”們只是利用了他的這個知識,蒙騙了當事人,達到了他騙錢的目的。而水又怎么會爆炸呢?其實是偷偷地往水盆里扔了一塊鈉。金屬鈉個性是非?;顫姷?,遇到了水就會迅速地燃燒,并且起劇烈的化學反應,甚至會出現這種爆炸的場面,第一次扔塊小的,第二次扔塊大一點的,一旦爆開了就說,鬼被除掉了。
騙術五:手指自燃
“天靈靈、地靈靈,我要驅鬼了?!贝髱焸兺ǔO劝咽终礉窳?,然后把手全弄上面粉,只見大師左一拍,右一拍,手指在桌上晃來晃去,嘴里還念念有詞,“拍死你”、“抓住你”,緊接著手指那么一晃,突然手指上就出現了一股火。據說這樣也就把鬼怪擒住了。
騙術揭秘
手指怎么能夠著火呢?實際上也是挺簡單的,一般大師都會預先在桌子上灑上三種粉末,第一種就是樟腦,第二種是磷,第三種是硫黃,那么他事先手指上沾了面粉,于是在桌子上這樣來回晃動的同時,就把這三種粉末都沾到了手上,然后滿屋子都是煙霧,他又在空氣中使勁地喊,使勁地抖,樟腦易揮發,硫和磷容易燃燒,這么一抖一抖,熱度一合適,自然就著了,那大師為什么燒不著自己呢?因為事先他的手上有一層面粉,而且火馬上也被他掐滅了,根本不成什么問題。
騙術六:蛇妖現身
一張普通的黃紙就能讓蛇妖顯形?這本是十分荒謬的事情,可是卻騙了很多人。大師通常都會先說你已經被鬼纏身,比如蛇妖之類,只有他能讓蛇妖顯形,不過這自然少不了錢的作用,一旦拿到錢,大師拿出一張黃紙放在香火頭上開始燒,黃紙首先被燙出了一個洞。隨著黑洞不斷地擴大,黃紙上真的就如大師所言出了一條蛇的樣子,也就是他所謂的蛇妖現身了。
騙術揭秘
我們看到那張紙遇到香火頭,就神奇般地出現了蛇的形狀,其實是“大師”事先在那紙上,用一種化學藥品畫出來的,那化學藥品通常是硝酸鉀,因為硝酸鉀是造火藥的一種成分,在化學上是一種強氧化劑,也是一種助燃劑,它比較容易溶于水,“大師”可能就是用硝酸鉀溶液在紙上面畫出那條蛇的形狀,然后把它晾干。在晾干后,硝酸鉀顆粒就附著在紙上了,這樣的紙一旦遇火,附著硝酸鉀的那一部分就特別容易燃燒。
大學未卒,身先入此行。時光飛梭,頓悟跌打滾爬,五年已逾。
回首往事,歷歷在目,酸甜苦辣,肚中自知。。。
而如今,身在東瀛,蹴鞠行事,偶遇同行,故作此文,為之共勉。。。。。。。
================================================本文說明===================================================
???? 當別人問起我軟件行業和其他行業的最大區別時,第一個讓我想到的不同點便是理性的思維方式。軟件行業人的大腦會在經過幾年的和各種語言打交道之后,也逐漸學會用繼承,多態,抽象,擴展等方法看待各種問題。故此,當自己對待在日軟件開發工程師有些許的話要說的時候,一定會選擇一個結構完整,有著許多共通部分的父類來繼承,然后針對在日軟件開發工程師獨有的特性,進行子類的擴展,不過整體結構仍然保持父類的特性。上述說明,實在是非此行業不能理解。所以,正如老羅述,彪悍的人生無需解釋,只有兩種情況需要解釋:①自己的親人,因為不解釋會讓她們會傷心。②法院
以上!
===========================================================================================================
恭喜,你選擇做一個赴日本工作的軟件工程師。
悲哀,你選擇做一個赴日本工作的軟件工程師。
本文面向的讀者群,僅指如今身在日本并且從事著軟件開發工作的中國工程師。
謹以此文與小春上來日本從事軟件行業的兄弟們共勉,同時寫給我愛和愛我的人
???? 當我們大一時懷著青澀的記憶進入大學校園,并且選擇計算機、通信、電子、自動化、機電等專業時,我想你可能和我一樣說不清畢業后到底想從事什么行業??墒?,四年就這么一晃就過了,和很多人一樣經過熙熙攘攘的招聘會之后,終于找到了一份薪水不錯,很多人都羨慕的工作--—傳說中的軟件工程師。
??? 可是問題在于我們都并不滿足于此!為了將來的發展,各自通過各種方式包括外派中介,學校招畢辦,各種熟人選擇了赴日從事軟件開發,真是自作孽不可活。不過,歡迎你和我一樣加入這個被其它人認為是風光無限的“赴日軟件工程師”吧。
??? 赴日軟件工程師とは?(※1ご參照下さい)
??? 相
???? 對國內一些剛畢業的同學或者仍然在國內的同行們而言優厚的薪水(※2ご參照下さい),以及在日本新鮮的生活,發達國家的便利生活不僅僅讓你感到生活的充實,更滿足了你那不讓外人知的虛榮心。Z在日本的幾年中,你經常會回頭關心一下自己在國內親愛的同學和同行們的工資和生活,在內心憐憫他們的同時,我們也會為了在日本所付出孤獨,寂寞,沒盡頭的加班的感到平衡?!俺缘每嘀锌?,方為人上人”這句話在日本的幾年中你說的最多,不管對自己、朋友、還是愛人。對了,在日本的幾年中,你會覺得自己除了吃飯開銷、住房、小春足球活動、一個月幾次的飲み會之外,存款已經開始一天一天多了起來。心里已經打起了小算盤,開始考慮以后買套1000萬的小房子,開始談戀愛,開始考駕照,開始看車子。總之,你對前途充滿了信心,你確信認為這種“貧嘴張大民”式的日式小資生活會永遠的持續下去,即使不是變得更好的話。
??? 可是在日本的日子就這么一天一天的過去了,忽然有一天你突然發現你自己快30歲了,甚至已經超過 30歲了,漸漸你心里已經開始有了一種說不清楚的不安的情緒,因為你發現日本所能給你的生活并不象想象中一樣變得越來越好。你也突然發現國內以前瞧不起的親愛的同學和同行們已經不少買了房子,車子,結了婚,有的甚至還養了孩子,你才開始明白自己雖然每個月賺的比他們多,可是存下來的錢比起他們最多是中等偏上。工作中更加有讓人感到不舒服的地方,來了幾年了還是每天用相同的語言開發著各種項目,每天真正用日語交流的還是不超過100句甚至還必須加上手語才能解釋清楚。每天還是必須做在電腦前用C++,Basic,COBOL,Pro C*等工具寫上500行以上的代碼附帶測試,自己雖然是前輩了,不過手下還是沒有一個小兵,對工作的不滿只有在飲み會的時候才敢偶爾發發牢騷。
??? 你終于開始迷茫“老子再過幾年后,到底要干什么?”,這句話常常出現在你的心里。 “敢問路在何方?路在腳下。。。”,不過西游記里面猴兄和八戒兄這么認為是可以的,你呢?
??? 那就讓我們抱著研討的態度,來看一下我們大家的出路吧:
第一條:繼續留在日本做你的軟件開發工程師吧。
如果大家真的留心數過的話,發現還真的有很多朋友在30歲以后還在從事Coding工作,我這里說的從事,是指你還需要天天在破舊的電腦邊上用 Visual Studio.Net或者JBuilder等開發工具甚至于UltraEdit在表達你的邏輯思維。與你手下帶著幾個小兵無關,與你寫不寫仕様書無關,也與你是否被叫做SE、BSE、主任研、主幹研的帽子無關,只要你還需要親自寫代碼,你就屬于這一類。仔細的分析一下這類人,還真發現他們有以下的這些共同點:
?? 1.?? 癡迷工作或者癡迷電腦,晚上八點到十二點的這段時間,基本上是在電腦桌或工作臺前渡過的。
?? 2? 。? 頭發三七開,不會去刻意格好つける。
?? 3? 。? 近視+戴眼鏡。
?? 4? 。 體型偏胖或偏廋,不在正常區間。
?? 5? 。 不喜歡與人交住,不參加小春足球活動,飲み會,MSN上常聯系的MM不超過五個。
?? 6?? 。除了程序邏輯之外,不太討論其他的話題。
?? 7? 。 無遠期未來計劃,對五年后自己生活怎么樣、從事什么工作說不清楚。
?? 8? 。 儉省,甚至扣門,從不亂花錢,每個月甚至可以節省20萬日元。
??? 即使你是還不到30歲的軟件開發工程師,如果你想知道是否會在30歲后還從事軟件開發,那么就請把自己和以上幾條逐一比對。四條疑似,如果五條一樣的話,那么恭喜你,你已經可以看到自己的未來了。
???? 這些朋友們通常抱著過一天是一天的態度生活,到了這個年齡,也不敢再輕易的換工作了,剛來日本時的銳氣慢慢的被生活所削平,唯一不變的希望是有一天中到彩票的頭獎。說實在話因為他們的性格所限,基本上可以確定他們以后不可能在人際關系復雜的職場上獲得更好的發展。當個Sub Leader混個SE,帶幾個人寫Coding已經是他們發展的頂點。至于以后的人生之路,不僅他們自己迷茫,可能老天爺也在頭痛。
??? 簡單建議:性格決定命運。所以說要改變命運,先改變性格。堅持半年晚上不從事工作、游戲及電視(不過說實話,這個還真的很難)。用此時間與人交往,參加小春足球活動,飲み會,相信你的人生可能會有所改變。
第二條:軟件開發擔當
???? 如果你現在還沒到30歲,而且已經是Sub Leader、制品擔當、或者項目經理,或者你眼看就有機會被提升為這類頭銜的話,那么我要恭喜你,你走的是從“生產從事”到“開發管理”這條金光大路了。有一點很明確,你不僅擁有很高的軟件專業技能,而且很顯然,你也有著很強的人際交往和日語溝通能力,你這類人根本不需要對未來有著任何的擔心,不要說在日本,即使在沙漠你也很容易白手起家。
??? 你能不能成為這類人也很容易區別,就像下圍棋的二十歲不能做國手終身無望一樣。你如果在工作三、四年以后,也就是說二十七歲左右就會發現自已工作中和客戶交流或者對著手下的小兵指手劃腳的時間比親自Coding的時間要多了,而且開會的時候已經開始學會說:“あのさー、えーどですね....”,那就說明你還是很有希望成為開發管理這類人的。相反,如果你快30歲了還天天埋頭于Coding、 Debug,電腦鍵盤上被按的最多的竟然是F9和F10(內行不用解釋,外行解釋了也不懂),或者30多歲了你還沒升到部門經理(雖然公司總是讓你覺得很有希望),基本上可以確定你不是開發管理這類人。好了,如果你確定你是這類人,那么你唯一的想法就是盡快爬上中層和高層,因為有時候工作當中的偶然性太大,雖然說一個蘿卜一個坑,可并不是所有的蘿卜都有坑的!
??? 簡單建議:和公司的某個課長或者部長搞好關系,關鍵時候,總是需要人頂你一把才能把你這個蘿卜頂到那個坑的。
第三條:轉行到相關的市場部門
???? 這里所謂的[相關的],也就是所謂的軟件公司的市場部門。通常在一個軟件公司里面,開發和市場都是最重要的兩個部門,也是最容易產生沖突和矛盾的地方。市場部門天天抱怨由于開發做得不好,不僅不能開發新的市場而且一些老客戶也轉用其他的系統。而開發也天天在抱怨自己開發出這么好的東西,市場部門卻賣不掉。從另一方面來說,這兩個部門也確實有各自欠缺的地方,市場部門的人總是缺少從技術角度看問題的能力,往往答應了客戶要實現這樣那樣不能實現的功能,隨后被公司的技術部門笑話。而技術部門也往往缺少從用戶角度看問題的態度,往往不知道一個ボタン放在哪最方便用戶,跳出的メッセージ的內容雖然覺得非常當たり前,可是用戶更本不知所云。
??? 所以,如果你對軟件開發沒什么興趣,不妨和你的上司談談試著轉到市場部門。如果可以成功轉行的話,相信你以后在市場部門的發展應該是非常好的。因為在和人打交道方面,你要學到和他們一樣,可能只需要1年左右。而在技術方面,他們永遠追不上你!
??? 簡單建議:流利的日語這是基本,除此之外,還需要做市場的樣子。比如要學會天天穿スーツ,學會格好つける,學會用一些男用化妝品打扮自己,比如ブルガリ的男士香水。
第四條:自己接項目,開公司
??? 關于這條,有兩點需要強調的。第一是在這里所謂的開公司指的是在國內開一家自己的公司。第二是這個順序是接項目然后開公司,而不是相反。
???? 如果你是從國內有過對日軟件開發經驗的軟件工程師的話,我想你應該會知道和了解國內的一些對日軟件的開發模式。往往一個在日本有著很多年軟件開發經驗的部長,從一個大公司例如接了一個項目帶到國內,然后和人合資創立了一家公司,找了一批剛剛畢業,沒什么經驗的大學生從事著周而復始的勞動。為什么說是勞動呢?如今的軟件開發其實早就沒有當年的神秘感,而且對日的軟件開發更是如此。國內理工科大學畢業生,即使是剛剛畢業的學生,只要學過一點C++, JAVA,Cobol的話完全可以在短時間內勝任PG的工作。從日本客戶這邊得到的是每個人月20-30萬日元的開發費用,而在國內付出的只是每個月 3000-4000的人月成本,這樣一來,中間的差價就可以讓這位老兄笑的合不攏嘴。這樣的公司往往有以下特點:
?? 1.?? 聲稱自己是日企,其實管理上全部中國人,只不過做的是日本軟件的外包。
?? 2.?? 員工的福利很差,四金總是用勞動法規定的最低標準來繳納。
?? 3.?? 總是對員工說干得好的話,有被派到日本的工作機會。日本的出差,對員工來說是獎勵。
?? 4.?? 開發語言通常為Cobol,Pro* C,Java J2EE等。
?? 5.?? 開發的項目通常為金融,證券等ERP系統。
?? 6.?? 無償的加班,員工怨音載道。
??? 如果你在上述這樣的公司有過工作經驗的話,我想你一定會抱怨公司的待遇以及老板的剝削??墒悄阌袥]有轉換過一種角度來考慮問題呢?難道我們不能成為這樣的人,反過來剝削別人嗎?答案是肯定的,別人可以做到,我們也可以做到!
??? 簡單建議:擴大你的人際交往圈,多認識一些在日本做軟件的朋友。說不定在什么時候,大家可以有機會進行項目合作。
第五條:第二職業與兼職
??? 這條與其說是出路,不如說是一種暫時的賺錢方式。當然它的前提是你還不至于太忙,至少還有自己的一些閑暇時間。這種方式覺得最適合那種現在收入已經比較高,或者對自己現在的工作比較滿意,不過又想賺點外快的那些人了。
???? 對于在國內搞了好幾年的軟件工程師來說,一個人做個公司網站,內部管理系統啥的其實并不是什么很困難的事情。國內的技術論壇上面,下載幾個網站的模板,然后改一下公司名稱,圖片,風格然后賣個1-2萬的事情大家也不是沒做過。內部管理系統也是一樣,對于一般的小公司來說,所謂的管理系統也不過是實現增,刪,改,查的需求而已,當需要稍微復雜一點程序的時候便到網上去找個控件+注冊碼便可以簡單實現。既然在國內可以這樣,為什么在日本的各位軟件工程師沒有想過呢?而且想對國內想對便宜的價格來說,同樣的系統在日本的價格應該更加合理。這樣下來,每個月增加個10萬左右的收入也不是什么很難實現的目標了。其實,最重要的不光是錢的問題,積累的人脈關系也將成為你以后無形資產,為你以后在國內的發展做一下鋪墊。
??? 簡單建議:多認識一些不同行業的日本人。不光是做IT的,其他比如服裝的,機械的。總之盡快融入日本這個社會,和方方面面的人多打交道。錢賺多了,別忘記給自己爸媽和女朋友買點東西,畢竟自己在國外工作,平時照顧不到的地方用其他的方式來彌補一下吧。
從2004
年11月20日參加了匯豐(香港上海匯豐銀行在廣州的軟件開發中心)在廣工的宣講會,到11月30日投了申請表,到12月8日的筆試,再到12月30日的
面試,2005年1月26日去體檢。。。。。。終于塵埃落定,一直覺得自己是挺幸運的一位,剛好遇到匯豐今年大招員,第一次的工作面試就找到一份不錯工
作。把這段幸運的經歷記下來,和大家分享一下,希望可以對還在找工作的同學們有些啟發,作一個參考!
簡歷:一般大型的公司是不去招聘會
的,都以校園宣講會的形式去招攬人才,而且宣講會一般都開在一些重點大學,所以要多出去走動,去別的學校參加這些活動,搜集些資料!匯豐并不收別人制作的
簡歷,而是得去上網下載些APPLICATION
FORM來填,填了四頁的英文表格,這是必須邁出的第一步,千萬不要一看到是英文表格就嚇倒,一邊查字典填出來也是可以的,不管怎么說投了就有一個希望,
而不投是無論如何都沒有機會的!
筆試:大公司的筆試都不會是些很專業的試題,因為它們注重自己去做人力資源的開發,所以它關注的是你的潛力(如學習,交流溝通,團隊,處理壓力等)。
? 整個筆試歷時三個鐘,第一部分是數列規律,有些類似于考公務員的那種數字推理題,15分鐘做30道題。
? 第二部分是與應聘職位有關的專業知識的閱讀,12篇閱讀,每篇50-100個單詞,共48道題(判斷對錯或不確定),25分鐘完成。
? 第三部分是邏輯推理題,是些XYZABC通過一些黑盒然后掉換了順序,交叉成一個網狀圖,然后推理黑盒代表什么,按照推理出的黑盒的意義再去做些題。35分鐘完成40道題!
?
筆試考的就是人的邏輯思維能力,在面對壓力下的穩定性等,像第二部分閱讀都是很短的幾句話,很多可以直接看出答案,但就是每一篇的字體不同,字的大小也變
來變去,有一篇甚至是沒有空格符號的一大串字母直接過去。時間肯定是不夠全部完成的,但不要緊張能做多少就算多少。我第一部分完成24道,第二部分26
道,第三部分28道!
面試:
面試官是兩個從香港過來的女士,主面試官是Grace Ma(以下簡稱G),另一位是Miss Li(以下簡稱L,還有我(以下簡稱ME)
G:首先好多謝你來參加我地匯豐既面試,你平時講英文多唔多架?
ME:ER.........(她們聽到我的ER后笑了一下),一般啦!
G:甘不如我地用英文傾下先,之后再轉返用廣東話啦
ME:好啊!
G:First of all,please introduce you educational background!
ME:I will be graduated in Guangdong University of Technology next year!My major is automation!
G:OK.....
L:Is automation relevant to IT?
ME:Yes,we learn how to design a system and make it run automatically,so we have to design the hardware and also the software.
G:OK.Do you have any experience of IT project?
ME:Yes,it's a small game.(大一的時候學C語言,做過一個貪食蛇的游戲)
G:A game?
ME:Yes,a small game which you can commonly find in some mobile phone!
G:OK,a small mobile phone game!When did you finish this project?
ME:When I was a freshman.
G:You meant the first year in the university?
ME:Yes.
G:Do you have any project finished recently?
ME:Yes,a website.
G:Why did you do this project?
ME:Because I joined a club and it needed a website.
G:What's it about?
ME:It's just an introduction of the club.
G:Did you have any difficulty in this project?
ME:Yes,since
my major is automation,not relevant to design,and I knew less about
HTML,ASP.So I had to learn how to design some pictures,arranged
them,made the page look more beautiful and also I had to learn how to
use some software,such as Photoshop,Dreamwaver,Frontpage,Flash.
G:How much time did you spend in completing this project?
ME:About one month.
G:Was there any deadline for this project?
ME:No.
G:OK.Why do you want to be an S.A.P(system analysist/programmer)?
ME:I think it's a challenge.
G:How can you find challenge from it?
ME:
Because.......(開始緊張,因為沒準備這問題)....others give me the task......and I
have to finish it on
time......(緊張,胡言亂語)....and.........(大概停了五秒)......sorry....I like to put
somebody under control.Some of my friends like to play PC game,and they
may say they are the king of the game when they win a battle or win the
game.But I say:"You are not the king,the king is the designer of the
game.You just deduce the result the designer designed,you are under
their control."......I like to be a programmer.Consider the customer's
demand,design the software make them like my design and also under my
control.I like that sence of
accomplishment.(這段話是平時對于一些沉迷游戲的人的看法,寫過在文章里,再添油加醋,總算派上用場了)
G:(或許她看出我的緊張,就轉回用廣東話了)你有無做過兼職啊?
ME:無
G:點解呢?好似宜家好多同學都有做兼職哦!
ME;因為我大一大二既時候有系度做學生會同社團既工作,到左大三后專業課程比較緊,所以無時間做.
G:甘你下學期有無打算做下兼職呢?
ME:無(我只是老實說,不知道她為何好像無奈地一笑)
L:點解唔做呢?下學期仲有課咩?
ME:下學期仲有畢業設計,畢業論文要做.
G:甘你無打算過畢業設計做咩啊?
ME:我地可以做D例如電梯控制,圖像識別,辦公自動化系統.
L:題目系老師定既,抑或系自己選啊?
ME:老師會俾D意見,都可以自己選后申請.不過仲未定住,因為仲要睇下可以申請到邊間實驗室做,因為要配合實驗室D條件!
L:甘用咩做?
ME:如果系電梯控制最常用PLC啦,圖像識別用C語言,辦公自動化系統可以用VC啦
L:甘你擅長用咩語言編程啊?
ME:C語言啊,匯編
G:你之前講話你做過學生會啦,甘你可唔可以講一D你參與過既活動,等我地睇下你既能力啊?
ME:
可以!我大一果陣時通過面試,加入左學生會既宣傳部.其實我當初加入可以話咩都唔識,畫畫系平時有睇下漫畫書,但都唔系幾識畫,書法細個學過,好多年無寫
過啦.不過我比較積極,每次有活動我都會去參加,仲報左書法選修,無事就拿些漫畫來照住練畫.期間我參加過校運會,露露贈飲,漫畫比賽等活動既宣傳,仲系
師兄既帶領下去聯系漫畫比賽既贊助商。終于由于我既積極勤奮,仲有人際關系處理得好,所以有幸系大二被提升為部長。
G:甘點解你當初咩都唔識仲要去報宣傳部呢?
ME:
因為我覺得.......可以學到野咯,當初我睇到學生會招生果份FORM,覺得宣傳部可以...學到畫畫啊,練下書法
啊................ER.....我覺得工作就要照住自己特長來找,在學校主要是學東西,所以就要照著自己唔識既,薄弱既環節去學咯!好
似我有一次練緊書法,有D同學行過就會話,練咩鬼啊,不如出去玩好過啦!我就笑住話:"練多一樣,就多一樣生存技能啊嘛,宜家就業壓力甘大,到時畢業穩唔
到工,都可以去擺個檔口幫人地寫揮春!
G:(笑.....)甘你做左部長之后有做過咩工作啊?
ME:其實第一年做干
事既時候,我就發現宣傳部既工作好被動,而且有好多唔系幾好既方面,有陣時就好似一臺打印機甘,人地過來按一下,我地就打幾張海報出來,工作比較單調,所
以我做左部長之后想有所改變咯!所以我上任第一件事就系同其他部門溝通好,要出海報要先支會我地,我地可以盡早安排好工作.做好自己既本職工作之后,就試
住帶D新生去組織一D活動,等距地有多方面既鍛煉!先后做過新生既招干工作,做面試官面試人地啦,做迎新晚會啦,校運會啦,仲有一次宣傳部自己既活動,同
校外既一個義工社團做一個義賣,募捐的活動,不過呢個活動最后由于學校審批方面唔批,所以就搞唔到,但系都帶住D新生做左好多前期既工作,鍛煉到好多野.
G:你頭先話你做面試官啦,甘你面試人地既標準系咩啊?
ME:我地會系現場有D紙筆,俾距地SHOW下畫畫書法既技能啊.但系呢個并唔系最重要既,因為系畫畫寫書法既過程中可以睇到好多野,例如細唔細心啊,有無責任心之類既野.我覺得責任心好重要,因為我一交份工作俾你,你如果無責任心,唔按時完成,甘成個活動就會俾拉低曬!
G:(點頭)甘你做部長后有無咩困難啊?
ME:
Mm.....最大既困難就系成個團隊氣氛既帶動問題咯!因為距地大部分都系新生,大家互相之間并唔熟悉,所以我就每兩個星期舉行一次例會啦,除左工作之
外,大家互相之間都可以傾下計啊.仲有安排工作時,每次都會分唔同既組,例如呢次A同B一組,下次就A同C一組,等距地系活動中去互相熟悉.
G:(睇下Miss Li問仲有無問題,回復無,就對我講)甘你有咩問題想問我地呢?
ME:我從你地既網站上邊睇到啦,從S.A.P開始,經過兩年,系有機會升做IT OFFICER,跟住一級一級甘升上去啦,我想請問下你地多久評估一次績效,評估既標準系咩
G:我地新招D人經過24個月既培訓同工作之后呢,如果表現良好,就有機會升做IT OFFICER架啦(她的回答很模糊,我從匯豐的網上也可以找到,我也沒再追問下去,反正我的目的就是想她覺得我對工作很有興趣,有上進心,就夠了)
ME:OK.我想請問下S.A.P具體系做D咩呢?
G:甘你來呢度應聘,你唔知呢個職位做咩噶咩?
ME:知啊,系統分析員主要系做D分析既工作,程序員主要系做coding咯!但系一個軟件工程入邊有好多part,我想知道具體做邊一part.
L:廣州呢邊呢分析既工作好少既,最主要都系跟翻香港果邊既file,做coding既工作,主要系做一D銀行系統既開發測試咯
ME:(點頭)OK
G:甘你仲有無問題啊?(無)甘OK,多謝你今日來參加我地匯豐呢個面試,如果有進一步既消息,我地會系12月中旬通知你!
ME:好既,唔該曬.
(就這樣走出了他們的OFFICE,當崩緊的神經放開的時候,頭腦一片空白,感覺好累......面試過程中我是關了手機的,也沒看手表,估計應該是三十幾分鐘吧)
總結:
? 感覺自己真是一個幸運者,第一次的工作面試,而且遇到匯豐今年大招員,就讓我中了這么份不錯的工作.
? 在我剛投匯豐的時候,老實說是沒有信心的,但我后來還是邁出了第一步,因為我對自己說有希望我就要去嘗試,當去見識一下知名企業的面試也好.我也不怕糗,因為我覺得沒有什么事比我讀了這么多年書都找不到工作再糗的事了.
? 第一次的工作面試,感覺一般,特別英文對話的時候,由于說不流利而帶來的緊張,感覺那時候特糗,但不管怎么說我都做出了一個嘗試,一個嘗試就是一個希望,如果我連試都沒有,就連一點希望也沒有,我相信我現在也在懊悔不已.
? 面試前做了不少準備工作,包括請教過一些已經去過面試的人,上網查找一些面試必問的問題還有回答等,后來發現真的受用無窮,幸運總是會光顧有準備的人嘛!
啊啊啊啊啊啊 | 2006-04-05 21:05 |
唉~~~ |
|
janly | 2006-04-05 21:58 |
網上這么多這種貼,匯豐的HR會不會看到啊,那以后我們不是更難.......... |
|
天空之城 | 2006-04-06 21:00 |
看到也不會怎樣。。。。。。。。。
匯豐一直都是問這種類似的問題的。。。
大公司不會在乎你知道或者不知道的。。。。
其實外企問的問題非常簡單,因為大部分外企的問題都非常類似,但是關鍵是你答的技巧,
人云亦云的東西太多了,關鍵是要表現出你自己就好了。 |
|
竹風 | 2006-04-07 11:46 |
嗯,同意樓上的. 50年不變的問題 |
|
sonic | 2006-04-09 19:35 |
其實問的問題本身不重要,而答問題時的邏輯組織和方法技巧才重要。一個好的HR問你幾個問題就大概知道你是怎樣一個人了。 |
|
happyjinting | 2006-04-17 15:19 |
天空之城 有戀童傾向~~ |
|
水d | 2006-04-17 18:31 |
匯豐的HR好勁的,面我的是jackson yu , 面完后還很“好人”,馬上給我總結,看出我的弱項在哪里,還問我是不是,呵呵~~我回答:相對來說~是~ |
健康九法
?
?? 大腦為精明之府 日梳五百把病除 頭為精明之府,人體之重要12經脈和40多處大小穴位,以及十多個特殊刺激區均會聚于頭部。用木梳或骨梳替代小銀針,對這些穴位和經脈進行所謂針灸性按摩或刺激,將去病健身。勤梳頭的確是一項積極保養人體精、氣、神的最簡單易行、最經濟的長壽保健對策。
腳底為第二心臟 常搓涌泉益健康
中醫學認為腳上的60多個穴位與五臟六腑的12條經脈著密切的聯系,布滿了相關全身各器官的反射區。但由于腳底部離心臟甚遠,抵抗力低下,是人體的先天薄弱環節,客觀上為寒濕邪氣病毒的侵襲提供了有利條件,所以說腳部的保健比其他部位顯得尤為重要。經常溫浴后搓涌泉穴,可去病延年。
日咽唾液三百口 保你活到九十九 中醫認為,唾液是人體的精華,貯于丹田,再化津還丹,遂成精氣,起到和脾健胃,濡潤孔竅,潤澤四肢五臟,強腎補元,滑利關節,補益腦髓的作用。所以日咽唾液三百口,保你活到九十九,是很有道理的。
日撮谷道一百遍 治病療疾又延年 谷道,又稱肛門。撮即上提收縮也。通俗地講,就是做收縮肛門的小動作。孫思邈在《枕中方》中規勸世人“谷道宜常撮”,認為肛門周圍的肌肉要間歇處于運動狀態,才能養生健體,尤其對防治痔瘡有特別療效。
朝暮叩齒三百六 七老八十牙不落
叩齒,就是指用上下牙有節奏地反復相互叩擊的一種自我保健養生法,俗稱叩天鐘。中醫學認為經常叩齒,不僅能強腎固精,平衡陰陽,疏通局部氣血運行和局部經絡暢通,延緩衰老。
隨手揉腹一百遍 通和氣血裨神元
揉腹,即用手來回按摩腹部,包括腹壁、腹腔以及內臟的一種養生保健法。中醫認為,腹為人體五臟六腑之宮城,陰陽氣血之發源。勤揉腹,即可以調整脾胃,通和氣血,增補神元,敷養腎精,充實五臟,驅外感之諸邪,清內傷之百癥。
人之腎氣通于耳 扯拉搓揉健身體 中醫認為,耳為腎惟一之上外竅,雙耳靈健則腎經通,腎氣充足,腎精盈滿,則聽覺靈敏。扯拉、按摩、搓揉、點捏耳朵,實際上就是對雙耳進行各種形式的物理刺激和針灸治療。
消疲健美伸懶腰 血運暢通最為高 所謂伸懶腰,就是指伸直頸部、舉抬雙臂、呼吸擴胸、伸展腰部、活動關節、松散脊柱的自我鍛煉。
安心郊游延年壽 調身調息加調神 醫學研究表明,情緒與健康二者緊密相連。凡情緒樂觀開朗之人,可使其內臟功能健康運轉,增強對外來病邪的抵抗,同時在平靜的情緒狀態下,方可從事持續的智力活動。因此,古人的攝生之道之一,便是安心養神。儒、釋、道三教皆有養生之法,并皆主張郊游。
----步驟 1. 用計算機管理員賬戶進入本機wingdows操作系統,啟動WAS服務器后,從 WebSphere 管理控制臺,展開安全性 -> 用戶注冊表。單擊本地OS(本地操作系統),并輸入 WebSphere 管理員標識。
a. 在服務器用戶標識字段輸入管理員用戶標識。
b. 在服務器用戶密碼字段輸入與標識關聯的密碼。
單擊確定。
----步驟 2. 轉到全局安全性窗口,單擊啟用安全性。請驗證實施 Java 2 安全性已關閉。其它選項默認。
----步驟 3. 單擊確定-> 保存。
----步驟 4. 重新啟動 WAS 服務器以使更改生效。
雖然Reqular
Expressions(以下簡稱REs)在這個論壇或是其他網站都可以找到相當多的資料,但是當我自己要學的時候才發現有很多小地方還是看不懂,所以才
以java API裡面的說明為主,把每個符號的解釋一一弄懂,終於對REs有了初步的認識。
所以這份文件是以java
API提到的符號解釋,加上我自己的心得及範例所整理出來的,我用"字元"和"字元組成",這兩大部分來解釋REs的符號,大部分的解釋都有範例,這樣比
較容易瞭解,沒有範例的部分不是太簡單,就是我找不到例子,不過對於認識REs應該沒有多大影響。
因為我算是REs的初學者,所以難免有觀念上的錯誤,加上很多"冷門"的符號,要找到正確的解釋都很困難,因此我沒把握所有的資料都是正確的,如果各位有發現錯誤,還請加以指正。
首先是字元,REs的基本元素就是字元,所以對於字元有相當細膩的描述方式,而且很多時候描述方式都不是唯一的,所以不必拘泥於找到最完美的寫法。
字元分兩部分來解釋。
1.一般字元,在還沒做字元組合時,下面這些都只是"一個"字元,先要有這個觀念,才不容易弄不清楚字串和字元的區別。
x : 一個字元,例如 "a" 表示要找含有這個字元的部分。
[abc] : 這個字元可能是a或b或c
[^abc] : 這個字元是除了"a" "b" "c"以外的。
[a-zA-Z] : 這個字元是a到z或是A到Z。
[a-d[m-p]] : 這個字元是a到d或是m到p (聯集)。
[a-z&&[def]] : 這個字元是"d", "e", or "f" (交集)。
[a-z&&[^bc]] : 這個字元是a-z但b c 除外,等價於 [ad-z] (差集)。
[a-z&&[^m-p]] : 這個字元是a-z但 m-p 除外,等價於 [a-lq-z] (差集)。
除了放在一開始的"^"以及兩個"&&"以外,放在[]裡面的都當一般字元。
可是\比較特殊,要\\才能當一個\,所以程式裡面必須寫\\\\,例如,想查"\"用[]包起來要寫成"[\\]",可是java在字串裡面要寫String pattern="[\\\\]"。
2.特殊字元. : 所有的字元,不一定包含換行。java REs的"."預設是不包含"\r"和"\n"的,但是可以用(?s)來讓"."等於所有字元,(?s)的用法下面還有說明。
\r : Carriage return。
\t : TAB。
\n : 換行。
\f : 換頁。
\e : escape。
\d : 數字0-9。
\D : 非數字,數字的除外集合。
\s : 會產生空白的字元也就是 [ \t\n\x0B\f\r],也就是 " "(空白)、"\t"、"\n"、"\x0B"、"\f"、"\r"。
\S : 非會產生空白的字元,上面的除外集合。
\w : 文字 a-z A-Z _ 0-9,所有的英文大小寫,數字和底線。
\W : 非文字,文字的除外集合。
\ : 把之後的特殊字元當作是一般是字元,例如"\\"等於一個"\","\["等於"["。
\Q \E:\Q到\E符號之間的特殊符號都當一般字元處理,例如"\Q(?:X)\E",符合的字串是"(?:X)"
^ : 行首,例如"^e"會找出所有在行首的"e",在[]裡面如果是第一個代表反相,如果不是第一個也當一般字元。
$ : 行尾,例如"e$"會找出所有在結尾的"e"。
\b : 符合文字邊界(word boundary)。也就是說在字與空格之間的位置 例如,'re\b' 符合"are" 裡的're'但是不符合"area"裡的're'
\B : 符合非文字邊界 例如,'re\B' 符合"area"裡的're'但是不符合"are" 裡的're'
\A : 輸入的開始。
\G : 前一個符合的結尾的地方。
\Z : 輸入的結尾去掉結尾符號的部分。例如字串"ABC\n",pattern "ABC\Z"就可以取得"ABC"。
\z : 輸入的結尾。例如字串"ABC\n",pattern "ABC\z"就不相符。
所謂的輸入,是指一次的處理資料,例如String s="ABC\nABC\tABC",就算一個輸入(input sequence)。
到這裡為止是對字元的描述,字元的所有的可能情況應該都可以涵蓋了,可是光是字元是沒辦法構成字串,所以接下來是把字元組成字串的方法。
字元組成,字元組成分三部分來解釋,下面符號的X和Y可以是一個字元也可以是一個Group。
1.簡單組合,就是把字元排在一起。
XY : 單純排列在一起,例如"ab"就是找"ab"這個字串,和"[ab]"不一樣,"[ab]"是代表"一個字元"可能是a或b。
X|Y : X or Y,例如 a|b,而以字元而言a|b就等於[ab],所以對單一字元效果不大,主要是用於字元範圍的[]|[]或者群組()|()比較有意義。
例如[a-z]|[0-9]表示不是小寫就是數字,(abc)|(123)表示是"abc"或是"123"。
實例 "c|Car"(等同於"[cC]ar")相符字串是"car"或"Car"。<-錯了,下面有被糾正的說明,所以就不改這裡。
另外abc|def是指"abc"或"def",而不是"ab[cd]ef"。
(X) : 群組,將多個字元包裝成一個群組,和單純排列不同的地方是,群組可以參照,也可以對群組設定出現次數,
例如(abc)+是指"abc"出現一次以上,abc+是指ab和一次以上的c。
群組參照舉例來說比較容易懂,例如"(.)(.)(.).?\3\2\1",可以找出3個字的回文。如"abccba"、"xcdfdcx"。
群組還有一個值得注意的是,群組0是留給整體的比對的結果,例如上面的例子group 0是"abccba",group 1是"a"、group 2是"b"、group 3是"c"。
有了群組參照的觀念,後面的non-capturing group就會比較容易瞭解。。
Group的另一個對應符號是
\m : m是數字,表示參照前面的group,如上述的範例。
2.重複次數
出現次數接在字元之後,表示這個字元出現的次數,接在Group之後就表示group的出現次數。
次數描述有三種quantifiers,
Greedy quantifiers
X?: X出現0或一次
X+: X出現一次以上
X*: X出現0或一次以上
X{n,}: X出現至少n次
X{n,m}: X出現n到m次
X{n}: X出現n次
Reluctant quantifiers
X??: X出現0或一次
X+?: X出現一次以上
X*?: X出現0或一次以上
X{n,}?: X出現至少n次
X{n,m}?: X出現n到m次
X{n}?: X出現n次
Possessive quantifiers
X?+: X出現0或一次
X++: X出現一次以上
X*+: X出現0或一次以上
X{n,}+: X出現至少n次
X{n,m}+: X出現n到m次
X{n}+: X出現n次
光看這樣的說明是無法分出三者不同,以下舉例說明。
Greedy quantifiers
字串 "xfooxxxxxxfoo"
pattern ".*foo"
結果 xfooxxxxxxfoo
Greedy字面翻譯是貪婪,也就是盡可能的取字串,其實最貪婪的是第三種方法,因為Greedy還會把之後相符的資料留下來,Possessive吃的連骨頭都不剩。
Reluctant quantifiers
字串 "xfooxxxxxxfoo"
pattern ".*?foo"
結果 xfoo 和 xxxxxxfoo
Reluctant字面翻譯是勉強,也就是抓最小可能,像這個例子,第一次抓一個x之後發現後面和foo相符,就得第一個結果,然後一直到最後又得到第二個結果。
Possessive quantifiers
字串 "xfooxxxxxxfoo"
pattern ".*+foo"
結果 沒有相符合資料,因為所有的資料都與"."比較相符,最後沒有剩下的字串可以和foo做比較,所以沒有符合資料。
3.Special constructs (non-capturing)
所謂的non-capturing就是說這個group會被比對,但是不會暫存在group裡面,就是最後得到的Group裡面不會有這組資料。
(?:X) :X會取得,但不會被保留,當之後有用\m的時候,這個Group會不算在內,這樣的處理效能會比較好。
(?i d m s u x) : 特別設定的flag設為on。
(?-i -d -m -s -u -x) : 特別設定的flag設為off。
i d m s u x的說明如下:
i CASE_INSENSITIVE : 就是不分大小寫。(?i)
例如
字串 "ABC"
pattern 用"abc"會找不到,用"(?i)abc"就會找到"ABC"。
d UNIX_LINES : \n當作換行,當文件是UNIX的換行格式時,要處理換行就可以打開這個模式。(?d)
m MULTILINE :多行模式下,^和$是以指每一行,不然是用整個字串的頭尾當^和$。(?m)
例如
字串 "ABC\nABC\nABC";
pattern "^ABC$"會找不到, "(?m)^ABC$"才會找到三個"ABC";
s DOTALL : 預設java的.不含\n \r,這個模式可以讓.等於所有字元包含\r \n。(?s)
例如
字串 "htm\nhtm\nhtm"
pattern 用".htm"會找不到,用"(?s).htm"就會找到後面兩個"\nhtm"
u UNICODE_CASE : unicode模式。(?u)
x COMMENTS :可以在pattern裡面使用註解,會忽略pattern裡面的whitespace,以及"#"一直到結尾。(?x)
例如
字串 "ABC"
pattern 用"A B C #找字串ABC" 會找不到,用"(?x)A B C #找字串ABC",就會找到"ABC"。
(?idmsux-idmsux:X) :X是non-capturing group並且設定flags on -off。
X(?=X) : lookahead在要取得的字串右邊,接著X但X不被算在內。例如Jack(?=Sprat) 則只有JackSprat的Jack會被取得,Jack(?=Sprat|Frost),則只有JackSprat和JackFrost的Jack都符合。
X(?!X) : lookahead在要取得的字串右邊,和上面相反,例如Jack(?!Sprat) 則後面是Sprat的Jack不會被取得。
(?<=X)X :
lookbehind在要取得的字串左邊,例如"(?<=foo)bar",找接在foo之後的"bar"。還有裡面的文字必須已知長度,也就是不
能用"(?<=foo+)" "(?<=foo*)" "(?<=foo{1,})",但是可以用"(?<=foo?)"
"(?<=foo{1,2})" "(?<=foo{1})"。
(?<!X)X : lookbehind在要取得的字串左邊,例如"(?<!foo)bar",找不是接在foo之後的"bar"。關於長度和上面符號有相同限制。
(?>X) : X, as an independent, non-capturing group。
因為這幾個符號都是non-capturing的,所以會有一個現象,直接看下面範例會比較容易瞭解
字串 "abc"
pattern "a(?:b)c"
結果 "abc" 但是b沒有變成group 1,這也就是non-capturing。
如果用 "a(b)c" 會得到 group 0是"abc",group 1是b。
字串 "abc"
pattern "a(?=b)c"
結果 抓不到,因為b並沒有被取出,要"a(?=b).c"才抓的到,而且"a(?=b).c"只會與"abc"相符,不會與"acc"等等相符。
字串 "abc"
pattern "a(?<=b)c"
結果 抓不到,因為b並沒有被取出,要"a.(?<=b)c"才抓的到,而且"a(?<=b).c"只會與"abc"相符,不會與"acc"等等相符。
由上面例子可知,這幾個符號都不會把符合的字串取出,也就是會比對但是不會算到結果裡面(non-capturing)。
所以lookahead和lookbehind那四個符號,不適合放在字串中間,另外,因為這幾個符號都是non-capturing,所以在後
面加上大於0的次數都和一次是一樣的,例如字串"XB",pattern"(?<=X){9}B"一樣可以取得B,而pattern""(?
<=A){0}B"也可以取得"B"。
整個java的REs大概就這些了,只是看完這些解釋其實離可以運用還有一小段距離,因為REs需要的是分析pattern的能力,而這種能力要多練習才會。
在自己能寫出pattern之前,可以拿別人寫好的pattern來測試體會一下,下面是一個簡單的測試程式。
這個程式是我小修改網路上找到的範例,會回傳符合的group,方便測試結果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| import java.util.regex.Matcher; import java.util.regex.Pattern; ? publicclass TestRegular { publicstaticvoid main(String[] args) { String inputStr = "ABC\nABC\nABC"; String patternStr = "(?d)ABC"; Pattern pattern = Pattern.compile(patternStr); Matcher matcher = pattern.matcher(inputStr); boolean matchFound = matcher.find(); while(matchFound) { System.out.println(matcher.start() + "-" + matcher.end()); for(int i = 0; i <= matcher.groupCount(); i++) { String groupStr = matcher.group(i); System.out.println(i + ":" + groupStr); } if(matcher.end() + 1 <= inputStr.length()) { matchFound = matcher.find(matcher.end()); ?? }else{ ?? ??break; ?? } ?? } ??} } |
測試REs也可以使用一外部工具,例如eclipse的plugin Regex tester,我很多範例跟觀念都是用這個工具去測試的。
最後"反組譯"幾個例子來練習,就是把別人寫好的pattern試著解釋出來。
HTML TAG
</?[a-z][a-z0-9]*[^<>]*>
開始是<,接著有0或1個/,接著是一個英文字,再接著是不限次數的英文或數字,之後是非"<"或">"的字元不限次數個,最後以">"結尾。
相符的是"<html>" "</html>" "<h0>"等。
不相符字串 "<123>"
HTML TAG 之二
<([A-Z][A-Z0-9]*)[^>]*>(.*?)</\1>
開始是<,然後由一個大寫英文字,和不限定個數的數字或大寫字母,構成一個group,接著不限個數的非">"字元,然後是一個
">",不限定個數的字元(用*?才不會一直取到之後的tag去),然後是tag結束的"</",要和第一個Group的值match,最後
以">"結束。
相符的有 "<A HREF="www.google.com.tw">Test</A>"
"<P></P> "<PRE>Test</PRE>"
"<H0></H0>"
不相符字串 "<abc></def>" "<123></123>"
IP
\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
前後都是"\b"表示在獨立的一個字的單元,用"?:"是不算group而已,250-255或200-249或0-199,接著一個".",這樣的group有3次,最後再一次0-255的group。
這樣就是一個0.0.0.0 - 255.255.255.255的IP的pattern,而[0-9][0-9]?也可以改成[0-9]{1,2}。
相符的字串 "140.115.83.240" "255.255.0.0"
不相符字串 "256.1.1.2" "-1.300.1.2"
IP之二
\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
IP之三
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
這是0.0.0.0 - 999.999.999.999的格式
其他例子
"[hc]+at" 相符的有 "hat", "cat", "hhat", "chat", "hcat", "ccchat" etc.
"[hc]?at" 相符的有 "hat", "cat" and "at"
"([cC]at)|([dD]og)" 相符的有 "cat", "Cat", "dog" and "Dog"
"/\*.*\*/" 相符的有 /* Second comment */
以下幾個(都是抄的)適合檢查輸入的值,因為都從^到$,從字串開始到結束。
1、非負整數:”^\d+$”
2、正整數:”^[0-9]*[1-9][0-9]*$”
3、非正整數:”^((-\d+)|(0+))$”
4、負整數:”^-[0-9]*[1-9][0-9]*$”
5、整數:”^-?\d+$”
6、非負浮點數:”^\d+(\.\d+)?$”
7、正浮點數:”^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$”
8、非正浮點數:”^((-\d+\.\d+)?)|(0+(\.0+)?))$”
9、負浮點數:”^(-((正浮點數正則式)))$”
10、英文字符串:”^[A-Za-z]+$”
11、英文大寫串:”^[A-Z]+$”
12、英文小寫串:”^[a-z]+$”
13、英文字符數字串:”^[A-Za-z0-9]+$”
14、英數字加下劃線串:”^\w+$”
15、E-mail地址:”^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$”
16、URL:”^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$”
-------
學習REs最重要是學會找到字串出現的特徵,特徵有時候是出現的位置,例如位置是行首(^),是行尾($),單字開始(\b),單字裡面(\
B),有時候是前後出現的字串,例如要找html
tag的屬性,都會由"<"當開始,到">"結束。而要抓"<a>"的url就可以從"href"開始。但有時候要找的字並沒有
特殊的位置,也沒關係,就把要找的字描述出來也就可以了,例如要抓日期就做一個"(0[1-9]|[12][0-9]|3[01])[-
/.](0[1-9]|1[012])[- /.](19|20)[0-9]{2}"的pattern就可以了。
而其實真正困難的地方在於很多pattern都要看到結果才會瞭解哪裡錯了。
看這個例子
字串 "ABCDC"
pattern "([A-Z]*).\1"
預期要抓到CDC的,結果卻是"A" "B"
"CDC",因為*是0~n所以沒抓也算,而後面的\1如果前面group沒抓到,他也跟著什麼都沒有,最後只有"."抓到第一個結果的"A",同理抓到
第二個結果的"B",然後才抓到預期的"CDC",而改成"([A-Z]+).\1"就只會抓到"CDC"了。
最後誰能幫忙解釋一下"(?>X)",因為我實在分不出來他和(?:X)有什麼差別....
1. Introduction
正規表示式(Regular Expression, 以下簡稱
regexp)在文字處理方面, 已經受到廣泛的應用。而各種程式語言中也幾乎都有提供對 regexp 的支援, 廣受歡迎的 Perl
更是其中的佼佼者。在 Java SDK 1.4 版釋出之前, 若想在 Java 語言中使用 regexp,
就必需依靠由第三方提供之類別函式庫(Third-Party Class Library), 例如 The Apache Jakarta
Project 提供的 Jakarta Regexp, 及 GNU Regex for Java 等. 而 Sun 也終於在 Java SDK
1.4 以來開始於其核心 API 中提供 java.util.regex.Pattern 等相關類別, 以提供C0D; regexp
的支援。本文將會介紹前述的三種 regexp package 之使用方法, 希望能提供讀者在 Java 中使用 Regular
Expression 的指引。注意, 本文中並不會介紹 regexp 的語法, 若要學習 regexp, 請參考附錄。
2. java.util.regex.*
JDK 1.4 中所提供的 regex package 中只有簡單的兩個類別, Pattern 及 Matcher。但這兩個物件已經包含了所有 regexp 的功能, 請看以下的介紹:
2.1 Pattern 與 split()
Pattern 類別並沒有建構式(Constructor), 若要使用此一類別, 可運用 Pattern.compile(String regex) 方法(method)。例:
Pattern?p?=?Pattern.compile("a*b");
注意若傳入的regexp string有錯誤, compile() 會丟出 PatternSyntaxException, 因此必需自行使用try ... catch 加以處理。
產生出 Pattern 物件後, 要如何使用呢? 先看看 Pattern 提供的方法 split()。此一方法可以將輸入字串中依符合Pattern的位置進行分段, 如:
String[]?result?=?p.split("123aba23aabc");
????for?(int?i?=?0;?i?<?result.length;?i++)?{
????????System.out.println(?(i?+?1)?+?":?"?+?result[i]);
????}
輸出的結果為:
1: 123
2: a23
3: c
2.2 Matcher 與 matches()
Regular Expression 的功能當然不只如此, 但是 Pattern 類別中只提供了split(),
若要進行比對(match)及取代(replace)則必需靠 Matcher 類別。例如要檢驗輸入字串是否合於Pattern, 可以使用
Pattern 中的靜態方法 matches:
System.out.println(Pattern.matches("a*b",?"aaaaab"));
輸出結果為:
true
此一靜態方法是為了方便使用而提供的簡化方法, 其作用等同以下程式:
Pattern.compile("a*b").matcher("aaaaab").matches();
另外, 要注意的是, matches() 是完整字串的比對,所以 Pattern.matches("a*b",
"aaaaab") 的傳回值為 true 。但是 Pattern.matches("a*b", "aaaaab1") 則會傳回否。因此,
若要在輸入字串中進行部分比對,則必需使用 Matcher 物件中提供的 method。而要如何取得 Matcher 物件呢? 方法如下:
Pattern?p?=?Pattern.compile("a*b");
Matcher?matcher?=?p.matcher("aaaaab");
Matcher 中提供了三種比對方法, 您可以依照實際需要來選擇使用:
- matches: 完整比對, 整個輸入字串必需符合 regexp。例如前例輸入字串 "aaaaab" 完全符合 "a*b", 因此會 matches() 傳回 true.
- lookingAt: 從輸入字串開頭比對。如前例, 若輸入字串改為 "aaaaab1" 則 matches() 會傳回 false, 而 lookingAt() 會傳回true。
- find: 從字串中任意位置開始比對,也就是部分比對。如前例, 若輸入字串改為 "22aaaaab1" 則 matches()及lookingAt()皆傳回 false, 而 find() 則會傳回true。
2.3 replaceFirst(), replaceAll()
除了比對之外, 取代(replace)也是regexp的常見用途之一, 在 Matcher 中也提供了 replaceFirst() 及 replaceAll() 等方法進行取代。如:
Pattern?p?=?Pattern.compile("a*b");
????Matcher?matcher?=?p.matcher("123aaaaab456abcdef");
????System.out.println(matcher.replaceFirst("_"));????
???????//1
????matcher.reset();
???????//2
????System.out.println(matcher.replaceAll("_"));
???????//3
前例中的 1 會輸出:
123_456abcdef
只將第一個 match 的 pattern 取代為 "_", 而 3 則會輸出
123_456_cdef
將輸入字串中所有合於 pattern 的字串取代為 "_"。
請注意到 2 的部分呼叫了 matcher.reset(), 此一方法可以讓 Matcher 的比對重新開始,
也就是從輸入字串的開頭開始比對。另外, 若在程式中需要以同一個 Pattern 比對不同的輸入字串, 只需使用
reset(<input>) 方法便可以比對新的輸入字串。
2.4 gourp(), start() 及 end()
Matcher還有更進階的用法, 例如群組(Grouping), 在 Matcher 中亦有提供, 請參考以下片段:
????Pattern?p?=?Pattern.compile("(\\w+)\\s*=\\s*(\\d+)");
????Matcher?matcher?=?p.matcher("abc?=?123");
????System.out.println("find:?"?+?matcher.find());
????System.out.println("groupCount():?"?+?matcher.groupCount());
????//1
????for?(int?i?=?1;?i?<=?matcher.groupCount();?i++)?{
????//2
??????System.out.println("group("?+?i?+?"):"?+?matcher.group(i));?
??????System.out.println("start("?+?i?+?"):"?+?matcher.start(i));
??????System.out.println("end("?+?i?+?"):"?+?matcher.end(i));
????}
????matcher.reset();
????System.out.println(matcher.replaceFirst("$2?=?$1"));
????//3
在 regexp 中, 小括號表示群組, 可以在比對之後, 將合於 pattern 的部分紀錄起來, 以便使用
Matcher 中的 gourp() 及相關方法來應用。前例中的 1 呼叫了 groupCount(), 此處會輸出 2 表示 Pattern
中有兩個群組。迴圈 2 會依序印出各 group 的內容, 結果如下:
group(1):abc
start(1):0
end(1):3
group(2):123
start(2):6
end(2):9
注意此處的迴圈由 1 開始, 因為 gourp(0) 所代表的是整個合於 pattern 的輸入字串, 以前例而言就是 "abc = 123", start(0) 與 end(0) 則分別為 0 與 9。
在 Matcher 提供的取代方法( replaceFirst 與 replaceAll )中, 可以使用"回溯參照", 也就是用 $n 來代表找到的群組編號, 如前例中的 3, 其輸出結果為:
123 = abc
2.5 比對參數旗標 (Matching flags)
熟悉 regexp 的讀者一定會覺得奇怪, 如何建立"與大小寫無關(Case-insensitive)" 的比對樣式呢?
又要怎麼在建立的時候, 指定讓 "." 能符合換行字元呢? 有兩種方式, 第一種方法為在建立 Pattern 物件時傳入比對參數旗標, 如:
????Pattern?p?=?Pattern.compile("A.b",?Pattern.DOTALL?|?Pattern.CASE_INSENSITIVE);????//1
????Matcher?matcher?=?p.matcher("aaa\nbbb");
????System.out.println(matcher.replaceAll("_"));
如此一來, 前例的輸出會是: aa_bb
另一種方法, 則是使用"內嵌式旗標(Embedded flags)", 也就是將旗標直接加在 regexp 字串中, 如前例中的 1 可以改為以下的寫法:
Pattern?p?=?Pattern.compile("(?si)A.b");
其中的 ?s 代表單行模式(single-line mode), 也就是 Pattern.DOTALL; 而
?i 則代表與大小寫無關, 即 Pattern.CASE_INSENSITIVE。事實上,Pattern可接受的旗標共有 7 種,
也都有其對應的內嵌式旗標, 請參考 JDK 1.4 文件。
最後, 在 JDK 1.4 中, 之前介紹的 split, matches, replaceAll 及
replaceFirst 等 regexp 功能已經整合到 String 物件中了, 例如要將 "abc123abc" 字串中所有的 "a"
或 "b" 取代為 "c", 可以使用以下敍述:
????String?tmp?=?"abc123abc";
????String?noab?=?tmp.replaceAll("(a|b)",?"c");
若程式中不需要使用到更進階的 regexp 功能, 便可以多加利用在 String 物件中的這些方法。詳細用法請參考 JDK 1.4 文件。
3. To be continue...
以上介紹了 JDK 1.4 中內建的 Regular Expression 類別使用方法, 下期將會介紹 Jakarta Regexp 及 GNU Regex for Java 等套件
4. 附錄:
本文所提到的套件參考文件可以在以下 URL 找到:
- java.util.regex API Documents, http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/package-summary.html
- Regular Expressions for Java, http://www.cacas.org/java/gnu/regexp/
- Jakarta Regexp, http://jakarta.apache.org/regexp/index.html
有關 Regular Expressions 的學習, 可以參考以下文件:
- Mastering Regular Expressions, http://www.oreilly.com/catalog/regex/
- Manual pages of Perl, perlrequick(1), perlretut(1), perlre(1)
- Regular Expression 簡介, http://phi.sinica.edu.tw/aspac/reports/94/94019/
- 一輩子受用的 Regular Expressions -- 兼談另類的電腦學習態度, http://www.cyut.edu.tw/~ckhung/b/gnu/regexp.shtml
- A Tao of Regular Expressions (正規表示式之道) http://sitescooper.org/tao_regexps.html
一、showModalDialog和showModelessDialog有什么不同?
showModalDialog:被打開后就會始終保持輸入焦點。除非對話框被關閉,否則用戶無法切換到主窗口。類似alert的運行效果。
showModelessDialog:被打開后,用戶可以隨機切換輸入焦點。對主窗口沒有任何影響(最多是被擋住一下而以。:P)
二、怎樣才讓在showModalDialog和showModelessDialog的超連接不彈出新窗口?
在被打開的網頁里加上<base target="_self">就可以了。這句話一般是放在<html>和<body>之間的。
三、怎樣才刷新showModalDialog和showModelessDialog里的內容?
在showModalDialog和showModelessDialog里是不能按F5刷新的,又不能彈出菜單。這個只能依靠javascript了,以下是相關代碼:
<body?onkeydown="if?(event.keyCode==116){reload.click()}">
<a?id="reload"?href="filename.htm"?style="display:none">reload
</a>
將filename.htm替換成網頁的名字然后將它放到你打開的網頁里,按F5就可以刷新了,注意,這個要配合
<base?target="_self">
使用,不然你按下F5會彈出新窗口的。
四、如何用javascript關掉showModalDialog(或showModelessDialog)打開的窗口。
<input?type="button"?value="關閉"?onclick="window.close()">
也要配合<base target="_self">,不然會打開一個新的IE窗口,然后再關掉的。
五、showModalDialog和showModelessDialog數據傳遞技巧。
(作者語:本來想用一問一答形式來寫的,但是我想不出這個怎么問,所以只好這樣了。)
這個東西比較麻煩,我改了好幾次了不是沒辦法說明白(語文水平越來越差了),只好用個例子說明了。
例子:
現在需要在一個showModalDialog(或showModelessDialog)里讀取或設置一個變量var_name
一般的傳遞方式:
window.showModalDialog("filename.htm",var_name)//傳遞var_name變量
在showModalDialog(或showModelessDialog)讀取和設置時:
lert(window.dialogArguments)//讀取var_name變量
window.dialogArguments="oyiboy"http://設置var_name變量
這種方式是可以滿足的,但是當你想在操作var_name同時再操作第二個變理var_id時呢?就無法再進行操作了。這就是這種傳遞方式的局限性。
以下是我建議使用的傳遞方式:
//不管要操作什么變量,只直傳遞主窗口的window對象
在showModalDialog(或showModelessDialog)讀取和設置時:
alert(window.dialogArguments.var_name)//讀取var_name變量
window.dialogArguments.var_name="oyiboy"http://設置var_name變量
同時我也可以操作var_id變量
alert(window.dialogArguments.var_id)//讀取var_id變量
window.dialogArguments.var_id="001"http://設置var_id變量
同樣還可以對主窗口的任何對象進行操作,如form對象里的元素。
window.dialogArguments.form1.index1.value="這是在設置index1元素的值"
六、多個showModelessDialog的相互操作。
因為光說很費勁,我就偷點懶,直接用代碼來說了,如果不明白的話那就直接來信(oyiboy#163.net(使用時請將#改成@))問我吧。
以下代碼的主要作用是在一個showModelessDialog里移動別一個showModelessDialog的位置。
主文件的部份js代碼。
var s1=showModelessDialog('控制.htm',window,"dialogTop:1px;dialogLeft:1px") //打開控制窗口
var s2=showModelessDialog('about:blank',window,"dialogTop:200px;dialogLeft:300px") //打開被控制窗口
控制.htm的部份代碼。
<script>
//操作位置數據,因為窗口的位置數據是"xxxpx"方式的,所以需要這樣的一個特殊操作函數。
function?countNumber(A_strNumber,A_strWhatdo)
{
A_strNumber=A_strNumber.replace('px','')
A_strNumber-=0
switch(A_strWhatdo)
{
case?"-":A_strNumber-=10;break;
case?"+":A_strNumber+=10;break;
}
return?A_strNumber?+?"px"
}
</script>
<input?type="button"?onclick="window.dialogArguments.s2.dialogTop=countNumber(window.dialogArguments.s2.dialogTop,'-')"?value="上移">
<input?type="button"?onclick="window.dialogArguments.s2.dialogLeft=countNumber(window.dialogArguments.s2.dialogLeft,'-')"?value="左移">
<input?type="button"?onclick="window.dialogArguments.s2.dialogLeft=countNumber(window.dialogArguments.s2.dialogLeft,'+')"?value="右移">
<input?type="button"?onclick="window.dialogArguments.s2.dialogTop=countNumber(window.dialogArguments.s2.dialogTop,'+')"?value="下移">
以上關鍵部份是:
窗口命名方式:var s1=showModelessDialog('控制.htm',window,"dialogTop:1px;dialogLeft:1px")
變量訪問方式:window.dialogArguments.s2.dialogTop
這個例子只是現實showModelessDialog與showModelessDialog之間的位置操作功能,通過這個原理,在showModelessDialog之間相互控制各自的顯示頁面,傳遞變量和數據等。這要看各位的發揮了。