2006年3月28日
如果有一天 我突然用很奇怪的內容聯系你 記得來救我!! (轉)
大家一定要互相關照 我轉一篇很實用的東西
覺得這對大家都有用!!
敏感身邊異常現象
當你聽到電話中,任何女性(尤其是老婆/家人/女朋友/親密朋友,也可能是男性):
· 正和你本人在一起,和已過世的人在一起,和出差/出國的人在一起,和任何不可能的人在一起,在XX地點.. · 任何不可能、異常、蹊蹺的事 ·
跟你借錢,急用 · 電話異常掛斷 (一定打回去,不能再通就更緊急危險) ——這是求救信號! 立刻報警! 救援!
·不要以為她瘋了,不要罵她有病,不要說她明明有錢,不要說出你和她的真實關系或任何真實、實際情況(以防是被迫用手機揚聲器或是免提電話) ·
記住任何與地點信息(如在XX吃飯,XX商場——很可能在車庫遇到危險;家——很可能入室搶劫) ·
她沒說地點要盡量問詳(在X家,問X哪個家,盡管X可能就一個家),她不正面回答要用只需表示肯定否定的一般疑問句盡量問出來
(btw,如果平時手機要沒電了打電話時先說明,既是尊重對方也免得讓對方誤會或擔心你有緊急情況。當然盡量不要讓手機處于這種狀態,耽誤事且輻射比滿電大n多倍)
遇到明顯異常的信息時,多一份留意,因為你的朋友正在向你呼救! 尤其是你,需要多小心了!
一、敏感身邊異常現象
一婦女被劫持,正好其老公打電話過來,她在電話里應付了一通,說正與她媽媽外出。
隨后警察趕到,終于得救。原因即在于,她媽媽早已去世,她丈夫即意識到存在問題。
而遺憾的是,我們多數人,沒有這樣敏捷的反應能力和應變能力。
附件是個事例,前不久在深圳也發生過一起類似事件:
一男駕車被綁架,他與歹徒周旋說沒錢,只是小白領,歹徒要其打電話跟家人、朋友借。
他很機警的跟家人、朋友每人借三、五千,當然有朋友立刻反應過來,他不可能找他們急借這么點錢。 結果他姐姐在大呼
“你還跟我哭窮,你剛賺了錢”,一朋友也大叫“你小子一頓飯就 花三、五千” 等等,——釀成慘重后果。
所以遇事務必保持冷靜,設法周旋,向外傳遞信息。
若遇到明顯異常的信息時,多一份留意,因為你的朋友正在向你呼救。
二、警惕入室盜竊
昨夜遭遇持刀盜賊入室行竊,此刻我仍然驚魂未定,這是我親身經歷的事情,想給我身邊的每一
位朋友一個警覺,永遠不要以為很多事情不會降臨自己的身上,永遠不要以為自己總是幸運的那一個,危險總是出現在我們喪失警覺的時候。
首先交待一下出事的地點及背景:為了遷就公司搬到了北四環以及照顧周末在北大讀書人的老公,我們在望京的新家還沒有裝修好之前,租住在北大中關園教工宿舍,我家是在
2樓。
就在這里 7月26日凌晨3點左右,本來打著微微鼾聲的先生突然說:“ 老婆你聽到什么聲音了嗎”? 迷迷糊糊的我說 “ 沒有啊”
但是緊接著,先生喊了一聲“嘿,干什么”,我也應聲而起 “ 嘿” 。當時恐懼和正義的力量讓我的聲音非常大。
先生迅速關上臥室的門并反鎖,兩個人迅速穿上衣服,我走到涼臺把窗戶打開,當時想要是歹徒不要命的闖進來,我跟先生可以從窗戶逃走,避免跟他搏斗。但是很快冷靜下來,先生從陽臺上喊保安,我開始打110。
110啊110這個從小被我熟記的救命電話號碼,這個被我心中神圣而威嚴的保護傘,在我用手機撥了10幾次后,仍然沒有人工接通的跡象,電話接通后出現電腦聲音,
“ 這里是110報警臺”然后持續44秒之后自動掛斷,始終沒有人應答。此刻,先生的手機不在房間內,臥室內也沒有固定電話。
我急中生智,走到臥室門口隔著門大聲說: “喂喂,110我要報警,嗯嗯
..,我這里有人入室盜竊,目前盜賊還在室內,嗯嗯,是的,請馬上過來吧”
“我的地點啊,地點在北大中關園,XX樓,X單元,對對對,就是方正大廈的后邊,好好,多長時間趕到,嗯好,你們馬上趕到是吧,,嗯嗯,好好,我明白”“ 謝謝你們”
而其實這一切都是我在自言自語。
我走到陽臺跟先生小聲說,我 110壓根沒打通,剛才詐一下歹徒。然后兩個人坐在床上,先生一個勁的對我說:
“老婆,你看你平時老是不愛關窗戶,萬一我出差不在家,你怎么辦啊” 我無言,只有驚恐,心里默念請菩薩保佑。
就這樣大概過了將近20分鐘,我們聽著好像沒有動靜了,也擔心是不是自己聽錯了,想著歹徒聽了我之前的詐報警應該已經逃走了。彼此小聲會意了歹徒可能藏身的地方,因為門口的左邊就是家,在客廳門口和家門之間有個可以掛衣服和放鞋子的衣架,我們確信歹徒很可能藏身在衣架的后面。老公抄著凳子,但是我的武器只有是陽臺上的木頭衣架了,于是先生迅速打開門,凳子朝著衣架方向掄去,沒有動靜,我們打開客廳的燈,這個小小的1室1廳就盡收眼底了(房子是個長方形,北邊是廁所,廚房,中間是小客廳,南邊是臥室,臥室外面是涼臺,南北通透,盜賊就是從廚房進來的)。
我走進廚房,發現原來放在廚房窗臺上的兩層小架子(平時會放一些洗菜的盆子方便面什么的)已經被移動到地下,我很佩服盜賊的技巧,居然把我很辛苦放在那里的小架子就輕易的挪到地上。廚房的窗戶開著,先生的筆記本電腦和我的一個真皮手提包放在地上,先生的手機放在我的手提包。
回頭看到客廳,果然在衣架的旁邊,先生的西裝在地上,廚房的菜刀也在那里。 天哪,如此膽大的盜賊,如此兇殘的盜賊。
先生的筆記本電腦原本是在臥室的桌子上的,盜賊居然從我們的床前明目張膽來回取走了筆記本電腦。
此刻又注意到臥室門口有一條毛巾,那絕對不是我們的毛巾。后來分析是歹徒放在客廳門邊,以 備主人發現關門,不能關死,這樣他才可以順利逃脫。
天哪,我開始回想今晚的一些反常跡象。我跟老公11:00多鐘睡覺,大概凌晨2點多鐘。感覺蚊子特別多,先生自責可能是自己放進來蚊子。而其實入夏以來,我們的房間里面還從來沒有過一個
蚊子。猜想盜賊可能1點多鐘就已經開始進入廚房了,廚房的窗戶開著放進來了蚊子。
由于被蚊子咬醒了,先生起身給他還有我抹了花露水,過了一會,我還是睡不著,沒開燈去了洗手間,推算大概2:20左右,這時發現臥室門口有個包,當時迷迷糊糊的我也沒在意,反而把包挪了一下放在旁邊,心里嘀咕是不是老公沒把包放好,怎么可以放在門口的路上。從洗手間往臥室里面走,發現地上有個東西,由于我是高度近視也沒想什么東西,想著可能是什么東西掉了,懶得揀了,踢到了旁邊,事后發現那是歹徒的毛巾,防止門被鎖死的。
先生用他的沒被盜賊偷走手機終于撥通了110,3個防爆警察10鐘之內就趕到了,這點我稍感欣慰,看到他們手中的槍,覺得踏實多了,可惜之前110沒有打通;小區保安隨后也來了,過了1個多小時,刑警來了,現場取了指紋,拍照,詢問了事情發生的經過。說抱歉來遲了,因為派出所的人都出去
—— 到一個自殺現場去了,天哪,我沒想到身邊會有這么多的事情。之后刑警幫助我們
總結的如下經驗:
1.110的系統是從總局到分局分層下達的,偶爾110系統也會出問題,出現我之前無法到達人工接聽的情形,或者110非常繁忙無法及時接聽,應該記得自己被管轄派出所的電話,直接打派出所的電話是最快最好的方式。所以請大家牢記自己所在派出所的電話,避免出現緊急事務無法到達110的情況。
2. 晚上的門窗務必關好,天再熱也不能放松警惕,盜賊就是這樣乘虛而入的,不要以為這樣的事情離你很遙遠,其實盜賊就在你身邊。
3.遇到入室盜賊盡量不要與其搏斗(除非你是警察或者有專業搏斗訓練),按照刑警的經驗,盜賊都是持刀入室的,前不久頤和山莊一個保姆發現盜賊入室而被刺死。并非不信任我們的警察偵破能力,這樣的被害與虛意被謀殺是兩回事情,除了現場指紋等,沒有什么有效的線索幫助他們破案了。我們的生命遠遠貴重于我們的財產。提醒在遇到事情的時候首先自保。比如我們迅速關上反鎖臥室門,而不是急于求證歹徒是否被嚇走,或者與歹徒正面沖突。
4. 遇到事情不要驚惶,不防對歹徒使詐,事后刑警說我當時自言自語的電話,嚇唬盜賊起了很大作用。
>5.
盡量不要破壞案發現場,然后報警。
>此刻的我想起客廳衣架旁邊的菜刀,確信我去廁所的時候,歹徒就藏匿在那里并用先生的西裝作遮擋(后來發現先生的西裝是在地上的),我們去完廁所,盜賊等我們熟睡后準備逃離時候,被我們發現。一直慶幸我們去洗手間的時候沒有發現持刀盜賊。萬一當時驚動盜賊,生死未卜,此次錢物基本沒有丟失,人身沒有受到傷害,但是我昨夜難以入眠,此刻仍然驚魂未定。我檢討自己的大意,檢討自己總以為很多事情不會發生在自己的身上,事情絕非如此,無論何時當我們放松警惕的時候,危險可能就在我們身邊。洋洋灑灑千言,并非危言聳聽而是我親身經歷的事實,提醒我得朋友提高警惕,希望每個人都平平安安。請朋友們互相轉告,一定注意安全。
三. 當事人已經夠笨了,警察更笨
5月7號,我們單位有一個女生,在家里被人入室搶劫,身中13刀!肺被扎穿,經搶救終于活過來!同事去看她,帶回她驚險的故事,我聽了以后雙腿發軟、雙腿發軟。不是我脆弱,實在是太
可怕了!
這個女生一個人租住在一個比較老舊的小區,被歹徒盯了一個多月。夜里倆點歹徒用鑰匙打開她的家門,把她掐醒、蒙上雙眼、索要錢財。她一直合作,冷靜而機智的與歹徒周旋,凌晨四點歹徒把她綁起來說是要出去聯系買主把她的車賣了。這個女生在半小時后確認歹徒已經離開,掙扎著松綁、報警、給自己的弟弟打電話,然后嚇木了的她在家里等待警方支援(這是她的致命失誤!!)誰知歹徒又回來了,倆人在客廳面對面撞上了!!!
歹徒驚慌失措,氣急敗壞質問她是否報警,她極力否認說只是給家人打了個電話搪塞過去。突然電話鈴響了,她接,是110的確認電話。這個女生仍冷靜機智,說“媽媽,我沒事,我平安到家
了”,誰知110的笨蛋一點都沒職業素質,說:我不是你媽,是110,你剛才是不是報警了?我們確認一下!!(天哪,這個笨蛋!!!害死人哪!以后有危險誰還能相信警察?!!!)女生重復說媽媽我沒事,你放心吧,把電話掛掉!
歹徒已經起疑,女生陷入生死境地!這時候家里的電話又響了!是弟弟打來的!歹徒接了電話,弟弟以為是警察,說找***,然后問姐姐,忘了姐姐家在哪個橋拐了(這個慌亂糊涂的弟弟喲,就是這個電話害了姐姐呀)。可憐的姐姐又在編:**老師,我從老家回來太累了不太舒服,明天不上班了,跟您請個假!那個弟弟不明所以:我是弟弟呀我就問你在哪個橋拐?姐姐只好說***橋-------話還沒說完,歹徒按下電話喪心病狂地朝她猛扎!!!!這個女生先還反抗,后來只能裝死,直到歹徒離去。。。
三分鐘后,警察趕到!在外面敲門說是接到報警電話。可憐的女生忍著劇痛爬去開門,警察看見
地上躺這一個渾身是血的人,第一句話是:還是個大案!(我靠)女生報出自己的車號叫他們攔截歹徒,他們無一人出門偵查追蹤!女生又讓他們叫救護車,然后,弟弟終于趕到。。。。
警察打電話確認確實是現在的工作方式。因為110是總臺,110接到報警電話后會轉到出事地點的片警。但現在看來對于這類入室搶劫的案子還電話確認是有問題。我以前也沒想到過類似問題。
注意:歹徒 tmd拿鑰匙開門。看來還是需要一個插銷之類的東西才保險。
在家被搶后,換個地方等警察,人多的公共場合,也可以找鄰居。
經驗教訓:
1,這樣要緊的電話一定要打給很熟悉自己近況的人,而且反應要快。警察往往不可靠。
2,派出所或者公安局的電話一定要記牢,110有時候也不管用。不過可以考慮119。
昨晚我參加一個的安全防范的研習會,讓我很驚嘆!這場研習會是由一個叫Pat
Malone的人主持,他是知名人士的保鑣,也為FBI工作,并教授警察及海軍的SEALS徒手格斗。
以下建議非常實用,多看幾次,受用無窮!
1.警方的提醒 : 手肘是身體最有力的部位。距離夠近,就善用手肘!
2.假如歹徒向你要皮夾或錢包,
不要遞給他,而是往遠處丟去。歹徒很可能 對財物比對你有興趣,他會去拿皮夾或錢包,這是你逃跑的機會。 往反方向拼命跑!!
3.假如被丟進車子的后備廂:把車后燈踢破,手從洞中伸出去,用力揮手,駕駛人看不到你,但是其他人看得到。這個方法救過無數人命。
4.女性常常在購物、吃飯及下班後進入車子,然後就坐在駕駛座上處理事情(如記帳、列清單等)。千萬不要這么做!
歹徒會藉機觀察情勢,闖入車內,拿槍威脅,控制你的行動。進入車內,立即鎖門,駛離現場。
5.在平面停車場及立體停車場的幾個注意事項 :
A.要警覺: 環顧四周;察看車內的副駕和后座。(接近車子時,留意車底。)
B.假如你的車停在箱型車旁,則應該從副駕車門進入你的車子。許多連續殺人犯都是趁著女性要進入車中時,將她們拖進箱型車中加害。
C.觀察停放在你左右兩邊的車。如果有男性單獨坐在最近的鄰車內,最好回到購物中心或辦公室,找男同事、保安或警察陪你回去。
寧愿防患未然,也不要終生遺憾。 (大驚小怪總比喪命好。 )
6.永遠搭電梯,不要走樓梯。(樓梯間是一個可怕的地方,容易讓人形單影支,變成最好的犯罪場所。)
7.假如歹徒有槍而你并沒有受到他的控制, 一定要跑! 一百次中,只有四次歹徒會襲擊逃跑的目標;即使他攻擊你,大多不會是致命的部位, 要跑!
8.身為女性,我們總是發揮同情心: 不要再這樣! 這樣會增加被強暴或是殺害的機會。一個叫泰得 ·
邦迪(TedBundy)的連續殺人犯就是一個相貌堂堂并且受過良好教育的人,總是利用女性的同情心。他走路時帶著一根手杖或是跛行,經常要求別人「幫忙」他進入車內或是看一下他的車子,趁機綁架受害者。
最近有人告訴我,他的朋友在晚上聽到門口有嬰兒在哭,不過當時已經很晚了,而且她認為這件事很奇怪,於是她打電話給警察。
警察告訴她:「無論如何,絕對不要開門。」這位女士表示那聲音聽起來像是嬰兒爬到窗戶附近哭,她擔心嬰兒會爬到街上,被車子碾過。警察告訴她:我們已經派人前往,無論如何不能開門。警方認為這是一個連續殺人犯,利用嬰兒哭聲的錄音帶,誘使女性以為有人在外面遺棄嬰兒,騙她們出門察看。雖然尚未證實此事,但是警方已經接到許多女性打電話來說,他們晚上獨自在家時,聽到門外有嬰兒的哭聲,請將這個消息傳給其他人,不要因為聽到嬰兒的哭聲而開門。
請嚴肅看待 , 因為上禮拜六「美國頭號通緝犯」(America's Most Wanted)節目中,報導路易斯安那州的連續殺人犯時 ,
提到了「哭泣嬰兒」的假設 。
請轉寄這封信給你所有認識的女性朋友, 并一個接一個傳下去 。
我原本只想把這封信轉寄給女性朋友,但是男性朋友,假如你愛你的媽媽、太太、姊妹、女兒等等,你也應該把這個訊息傳給他們 .
覺得有用就頂一下吧,讓更多的人知道這些知識
?????? 項目的管理部分用的active_scaffold,active_scaffold對render進行了改寫,theme_support對render_file進行了改寫,導致active_scaffold無法使用theme_support的機制。 ?????? 目前的解決思路是active_scaffold不使用theme_support機制,在active_scaffold中Core文件底部加入rails本身的render_file方法,已達到再次覆蓋的方式。 ?????? 還有一個思路是讓active_scaffold使用theme_support機制,然后對代碼進行改寫,達到兩者兼容,目前這個方法沒有進行,主要是時間問題,而且目前的方式也可以,可能不怎么優雅
???????? 在項目使用active_scaffold來做項目的管理部分,用jrails來代替首頁部分的js。 ???????? active_scaffold用的是prototype.js,jrails用的是jquery。本身prototype和jquery兩者就存在沖突,網上對兩者的解決方式是可以的實現的,可以很好一起工作。但是對于active_scaffold和jrails的沖突還是有不行,jrails的rails中ajax等代碼進行了重寫,導致active_scaffold無法正常工作,我只有想辦法把他們完全分開。 ??????? 我目前的解決方案是module ActionView中? module Helpers重新copy到項目管理部分的代碼中,已達到再次覆蓋,還原到本身的方式。這個辦法可以解決,但是我總覺得不是很好,不知道有沒有更好的辦法呢?
????? 最近買了一臺小黑,IBM T61,第一次感受IBM,小小激動了一把,性能上真的沒話說。 ????? 現在機子上用的是ubuntu7.10,把整個工作環境都搬到了linux,開發的環境是windows上沒法比的,windows上寫好代碼和調試代碼都慢的要命,linux就不會有這個問題,相當流暢,設計的時候不會被打斷思路了。windows上的一寫常用功能linux上都能實現,除了QQ和IE,這兩個現在還沒發丟掉的,所以在linux上通過虛擬機裝上了一個windows xp,這個XP的運行速度也很快,操作沒有停頓,完美解決。有關linux的生活,想接下來具體做些介紹,看時間了。 ??????最后,歡迎來到linux的世界。
????????昨天去交房租的時候,房東說想自己用了,不想租給我們了,主要是我們的房租太便宜。 ????????剛起步就發生這個事情,對我們打擊很大的,沒場地,沒地方辦公,公司怎么辦下去啊。當天晚上和朋友一起去跟房東談這個問題,動之以情、曉之以理,最后加了點房租以告結束,今天把房租交了,總算放下心來。 ??????? 都說創業很難,是的很難,現在一個個困難都擺出來了,處理不好的話,對我們都是一個很大的打擊, ??????? 不過我們有信心一個個解決,只要我們有共同的目標,共同理想,成功在不遠處。
3月26號,ki突然向我宣布一件事情,答應做我女朋友,又是意外又是開心。 前面好幾次提出這個問題,都沒有結果,也是比較郁悶的事情,不過現在好了哈哈 以此紀念,ki,我會好好待你的!
10多年前,在大洋彼岸的美國,有一個即將從商學院畢業的女孩,她是以下面的方法找工作、進入商界的。現在,這個女孩成了美國年輕一代商界女性的明星和楷模,并創建了屬于自己的公司,被譽為“難以抗拒的商界女性”。
請看她如何講述自己當年踏入商場的第一步——
“在商學院的最后一年里,我開始找工作的同時,就著手建立自己的職業關系網。像多數即將畢業的學生一樣,我在商界沒有什么熟人,因此不得不從零開始。我有一個詳細地記載我找工作的筆記,并且每一頁上都寫著我想去工作的公司名稱。每次我發一封信,打一個電話,或跟某個人談一次話,我都記下日期、時間、通信的性質,以及接下來的步驟。(典型的a型性格)。(“a型性格”的人個性急躁、成功心切、善于進取、爭強好勝)。
我有意向的大多數公司,我一個人也不認識。可是我不像其他畢業生那樣給人力資源部打電,而是上網查看公司的網站,找到負責我感興趣的部門的主管名字。我會直接給個人打電話,僅僅是為了弄清楚他或她是不是聯系這份工作該找的人。不過,屢試不爽的是,那個人或者那個對待我像貴賓一樣的助理,會給我另一位需要聯系的主管名字。然后,我在與那位主管聯系的時候,就會在我的郵件里赫然提到前面那位主管的名字: 您的同事某某建議我跟您聯系。 馬上就拉上了關系!
要是這一切聽起來像精于算計,那真抱歉。可它就是那么管用。并且這也是,在我們一起畢業的同學里面,我怎么就能夠得到最高的薪水!
在即將從研究生院畢業時,我想去工作的一家公司,就是薩柏瑞公司。這家公司開創了并緊追網上旅游預訂服務的潮流,是美洲航空公司的母公司美利堅公司的一個分公司。秋季學期的時候,公司到德克薩斯基督教大學校園招人,可是我當時忙于功課,不知道有面試這回事。不過,當一位同學得到了該公司一份收入可觀的工作后,我一下子來了興趣。我決定將薩柏瑞公司也定為自己的目標。碰上這種情形,大多數人都會聳肩嘆息: 咳,我錯過了正式的招聘會,所以我機會了。 我可不這樣。我決定運用已有的一點點關系接近該公司。
我父母有個鄰居是美國航空公司的董事,我給他打電話,問他能否告訴我,要是我想在薩柏瑞公司找份工作該跟誰聯系。他很熱心,給了我幾個人的名字。自然,我給每個人的信都用鄰居的名字開頭—— 執行副總裁喬治某某建議我跟您聯系…… 這樣的介紹把我從一大堆的求職者中分離了出來,讓我比其他無名的求職者得到更多的關注。我相信,有的人給我回復,僅僅是看在我鄰居的面子上,可是管它呢。最終,我得到了與合適的人面試的機會,并得到了一份業務分析師的工作。” 世界經理人博客http://blog.icxo.com
怎么樣,這個女孩是不是有些不同凡響?她叫艾米·亨利(amy henry),上述文字摘自她不久前出版的一本暢銷書——《女總裁告訴你:當代女性如何在商界成功》。
艾米·亨利曾在美國一些領先的it企業擔任高管職,取得了驕人的業績,然后建立了一家管理咨詢公司,成為當今美國炙手可熱的一位企管顧問。她服務、合作過的公司客戶,包括ibm、摩根大通、美林證券、麥肯錫公司、伊士曼化學公司、斯倫貝謝、藍十字保險公司等全球著名企業。艾米·亨利還頻頻受邀到美國和加拿大的許多電視臺、大學、領導才能培訓機構演講,與人們分享自身的經歷和體驗,包括成功與失敗,講述現代女性如何在職場、商界獲取升和成功。
艾米·亨利坦率地說,工作場所不是一個純粹的能人的天下。換句話說,單單有業績并不能保證你步步高升。光知道躲在角落里埋頭干活,很可能會讓別人搶了你的功勞,而你自己卻仍然呆在老地方。如果你想發展,就必須讓人知道你。
統治商界的不是女性(至少現在不是),如果我們想要與那些占統治地位的人一起捉迷藏,我們就不得不努力拼搏。對此,艾米·亨利感受很深。她認為,職場的規則長期以來都是男人們書寫的,女性必須了解那些規則,并學會如何讓那些規則為己所用。但女性應該心安理得地表現得像個女人而不是男人,并善于利用自己的女性資本取得對自己有利的結果。
有些道理總要等到適當的年紀才能明白,人生的哲理總是來得太遲。
(深有同感,當我為工作,生活中的錯誤而自責時,理智卻清醒地告訴自己,這些教訓我早已知曉,并且有無數前人用他們的人生為我做過證明,只能感嘆一句:只有自己經歷過,才會真正明白并記住它們。但是,細想,為什么我就不能盡可能地遵循自己并未經歷但被人證明正確的真理呢?,試著去做吧,既然相信,為何不遵循,回頭時,我會慶幸自己今天做出了這樣的決定)
(1)很多事情其實無關緊要(10年后再回首,有多少擔憂,一笑置之,既如此,早點覺悟又有什么關系呢?) (2)等待有把握時再去做一件事,往往意味著永遠的等待(簡單計劃,立刻出發,不斷修正) (3)一個人能做的最大的冒險事情,就是樂意在公共場合經常暴露自己的愚昧。沒有什么能比這樣學得更快。“哎呀”, 也是一種樂趣。(習慣自嘲是一種優秀的品質,它證明你足夠自信) (4)盲目追趕潮流是對精神和智力的扼殺 你可以成為一個廉價的時尚木偶,也可以成為獨一無二的你,這些都在于自己的選擇。信仰不是群眾的鴉片,流行才是。(最后這句話說的挺妙) (5)如果有人抱怨你太特立獨行,恭喜你,你正走在正確的路上(我希望自己足夠與眾不同,甚至我愿為了特立獨行而特立獨行) (6)如果你將工作等同于生活,那么你將為工作而生活(深表贊同,工作是為了更好的生活) (7)試圖取悅別人是徒勞無益的做法 (如老羅所言:彪悍的人生不需要解釋,我精力有限,在工作以外,把關注放在愛我的我愛的雙親,兄弟,女人身上吧) (8)你不可能取悅、平息或改造一個混蛋 (小人難養,敬而遠之,我不跟你玩了,這還不行,那就得流氓一點,以彼之道還施彼身了) (9)接納自己(因為自卑,悔恨,我還無法真正愛上自己,從思想,身體上去改造自己,希望這一天早點到來吧!) (10)生活中,有時候形式就是內容
這兩天裝了ubuntu系統,然后把整個開發環境都裝到上面了 。 但發現一個很奇怪的問題,hibernate的事務無法會滾,這個問題困擾我好幾天,今天終于解決了,原來mysql有配置有問題。mysql總共有4種存儲方式,MyISAM 是默認存儲方式,但是不支持事務,所以導致了我的問題,只要把默認設置成default-storage-engine=innodb就可以了,當然也可以在每個table創建的時候指定。 希望對碰到此類問題的朋友有所幫助。
今天星期六,放假。
很久沒有雙休日了。
本來想睡個懶覺的,但是到了正常工作時間,還是醒來睡不著了。起來開電腦是我的第一反應,那么多年的電腦和網絡生活讓我有了一種下意識,但是今天這個念頭一閃而過,工作是為了生活,因為我想到了這句話。我們為了工作,而忘記自己的生活應該怎么樣的了。我想我開始去尋找生活還有什么,有爸爸媽媽,有朋友,有痛苦和感動,有無奈和追求,突然發現生活是多么寬廣,原來我把自己局限在工作這個狹窄的空間里了。好好享受我的周末巴。起來給自己弄點東西,拿本自己喜歡的書,一杯咖啡,我喜歡的生活,之一。......
????? 這段時間發生很多的事情,也讓我認識到一些事情。 ????? 羅列一下: ????? 一天早上醒來,我突然產生一個感覺:我沒有那么多的精力去研究那些深奧復雜的it技術細節!這個想法讓我有點發呆 ,一直以來我都是很喜歡這個工作,以極大的熱情投入到研發這個工作中,不知道怎么會產生這樣的想法的。這段時間看了很多資料,也看到自己很多的不足,學的越多,知道自己越不足,難道我在這個無知面前害怕了?還是我的思維中心產生了轉移,因為我在慢慢的考慮往項目管理方面發展。我也搞不清楚了。 ?????? 這兩天在看一本書,《第五項修煉》,很早的書 ,主要講系統的思考方面的。其實去年已經看過,但是只看了前幾章,感覺不好理解,這段時間我又拿起來了,發現里面很多概念和想法,比較容易理解了,而且可以繼續看下去了。我感到很欣喜,這個算不算是一種進步呢?現在每天上班下班,因為是長期出差,平時的活動很少了,朋友接觸也少,感覺有點封閉,我慢慢感到自己的激情在磨損,這個現象終于在我身上體現了 (我居然用了終于這個詞)。進步了,思想在成熟,激情在減少,難道這個是反比的嗎?以我現在的水平無法看清這個問題,等以后慢慢去慢慢弄清楚吧。 ????? 這段時間總的來說不是很快樂,快樂是什么?我有點模糊了,難道就是腦子中的一種蛋白質?還是我想得到的太多,而擁有的太少?這段時間煙抽的有點多,感覺嘴巴不舒服,該收斂一下了,難道是煙抽多了?這段時間喝酒很少,我是一個喜歡喝酒的人,難道是酒的緣故?細細想來,這樣的狀態其實已經很久了。難道是一種必經的過程,我不得而知了。 ????? 今天早上又讓我看到了一句話,工作是為了生活,工作只是生活的一部分。我想我應該重新去理解這句話了,回到我自己喜歡的生活。回的去嗎?不知道,還有半包煙在桌子上,不抽了。抽煙無助與生活和思考。
內容介紹
本書是名著《心靈地圖》的續集。《心靈地圖》從1978年出版以來,連續十多年居于美國最著名的《紐約時報》暢銷書排行榜上,總發行量上千萬冊,在讀者中產生了廣泛的影響和獲得了巨大的認同。 本書為《心靈地圖》添了一個注腳:“人生多變”。每一個人的人生道路都得自己探索,沒有任何絕對的答案可以憑借。但是,我們也不必堅持踽踽獨行,可以向出現在我們生活中任何一種超過我們的力量求助。 在本書中,派克著重談的是“宗教”,但這并不是那種扼殺個人意志的宗教團體所傳播的宗教,而是作為個人信仰追求和靈魂提升的“心靈的宗教”,亦即,本書所宣傳的是一種極其自省的信仰。 本書有助于你避免以偏概全的思考模式,拒絕所有以偏概全的沖動,不要鉆牛角尖去尋找公式或簡單的解答,而開始從多元化的角度思考,崇揚生命的神秘與矛盾,不要因為每一次經驗內在的多重因果關系而惶惑不安,安心去欣賞生命的復雜多變。 愿本書與更多的讀者相遇,共結一段心靈共嗚的緣份!
本書精彩言論選 伊甸園的故事是神話,可是它蘊含著真理,告訴我們害羞是人性的一部分。 任何終生追求心理和心靈成長的人,都可以預防心理上的失調。 我們必須有一點罪惡感,才能在社會中生存。 不恐懼不等于有勇氣;勇氣是你盡管害怕、盡管痛苦,但還是繼續向前。 為自己的極限辯護,你就永遠受制于它們。 治療一個受苦的人最好的法子,并不是設法消除痛苦,而是懷著愿意分享的心坐在他身旁。 愈愿意承擔別人的痛苦,就愈能感受到更多的歡樂。 憤怒有其存在的必要;求生絕對少不了它。 我們必須學習一套復雜的方法,以處理憤怒的情緒。 我們的生活品質就決定于我們所作判斷的品質。 人生一切際遇無非是為了幫助我們靈性的成長。 堅強的意志是人類最大的優點,雖然有了它不一定能擔保成功或善良,但是少了它卻幾乎保證會失敗。 你不能用自己的意志控制意志,因為這樣等于沒有控制。 歸咎游戲也可稱做“要不是因為你”游戲,這是所有婚姻關系中最常見的游戲。 原諒需要正視邪惡,真正的原諒是一個非常困難的過 程,但它也是你維持心里健康一個不可或缺的要素。 你不能因一個人沒有犯的罪而原諒他。只有在確定他有罪以后,才能原諒。 原諒是療傷的必要條件 我們不可忘記任何事。我們做不到真正遺忘,只可能做到真正寬赦。 死亡不僅不剝奪生命的意義,反而是意義的賦與者。 你在跟自己的死亡之秘搏斗的過程中,一定會發現人生的意義。 除非我們能坦然面對自己的死亡、否則就永遠不可能 在生活中找到勇氣和自信。 大多數人其實有能力選擇在何時、何地、以何種方式死去。 要是世界上沒有一件我們愿意為之犧牲生命的事,生命就不完整。 所有的疾病都有心理、心靈、社會、生理的因素。求 生意志能大幅延長壽命,并改善生活的品質。 學習生活一定要面對死亡。因為死亡讓我們記住生命的有限。 如果你罹患嚴重的慢性病,倒不妨檢討一下,自問可 曾做過促使自己生病的事。 如果我們只把死亡當作一場意外,就不僅忽視了大多 數死亡的現實面,也忽視了它的神秘性。 我們遭遇的每一件事,無非是幫助我們學習,而最能 幫助我們學習的就是死亡。 只要我們向前跨出一大步,都會經過否定、憤怒、討 價還價、沮喪、接受的過程。 信仰宗教而能承認死亡的重要性,但然面對死亡,才更勇敢。 漫無節制的自戀是心理與心靈疾病的主要前兆。健全 的心靈生活是一種脫離自戀的漸進成長。 我們對百分之九十的事物的了解還不到百分之一。 我一開始問:“我們不知道什么?”所有我以為已經關 閉的疆域就又重新開放。 我們的知識像一葉扁舟,在無知的大海、神秘的汪洋中漂泊。 現代文化有逃避痛苦的特質,對心理建康并不特別鼓勵。 我們愈能適應現實,生活就愈有意義。 在現實生活里,探究神秘不僅是心理保健的目標也是心靈之旅的目的地。 有人為了逃避神秘而投身宗教,同樣有人為了逃避神秘而投身科學。 迷惑是追尋清晰的第一步,在追尋過程中,你會獲得很多知識。 謙遜就是確實了解自我的真相。真正的謙遜總要與實際相符。 為了生存,我們需要某種程度的罪惡感。要是我們一 直都自以為很好,當然就無法改正有缺點的部分。 我不好,你也不好,不過沒關系。 我們需要破裂時刻,讓我們覺悟到自己有問題,我們并不完美。 罪惡感涌現的時刻、懺悔的時刻、缺乏自信的時刻、面 對自己不喜歡自己的試煉時刻,對我們的成長都是不可或缺。 愛自己,追求自己靈魂的進步,是人生最重要的事。 準備是不能分享的。我們唯一能做的就是盡可能提供別人好好準備的動機。 神話對于了解自我可提供很大幫助,我們可以從中發掘人性的知識。 任何過于簡化的思考方式都會出問題。 神話是有關人性各種矛盾、多重向度、復雜面的一個最佳知識泉源。 人不可能像神一般無所不能,我們不可能靠自己的力量上達于神。 當某種東西擋了你的路,妨礙你的心理健康或心靈成 長,你就該除掉它,不要只是坐著抱怨。 做好事的動機就是創造力的泉源。做壞事的動機只會帶來毀滅,不能創造。 我們只有有學會同時發揮自身的男性和女性特質—— 左腦和右腦并用之后,才能成為英雄。 總有一天我們要放開孩子,他們是上天賜下的禮物,交 給我們照顧——但不是永遠。 人的本性是汁么?我最常給的答復就是,根本沒有這種東西。 我們人類最大的不同,就是在自身行為上享有完全的自由和變通可能。 大多數人當然早已脫離胚胎期。但會隨著年齡增長,更 加堅持自己的方法和本性。 身體的老化不能遇阻,但人的心理不一定要變老。 觸及自身生命的混沌,這可能是人類最痛苦的經驗。 信奉神秘主義的人熱愛神秘,喜歡解開神秘,同時也 知道,解開的愈多,發現的會更多。 處于心靈旅程不同階段的人,相互之間會產生飽受威脅的感覺。 悔改不是一時就結束的事。它跟所有靈性成長一樣,是一種持續不斷的程序。 立足不夠堅定時,固然可能墮落回去,但我們不可能 因此省略心靈成長過程的任何一階段。 關于心靈成長。不論我們發展到多遠,都還會保留一部分早期各階段的痕跡。 每個圣人都有不可告人的過去,每個罪人都有美好的展望。 上癮者有回家的渴望,證明他們比大多數人更努力追 求靈性和上帝,只不過他們搞錯了方向。 西方語言傳統上酒精和靈魂用同一個字表示,并非意 外,也許酗酒者比一般人更渴求靈性。 很多人聽到宗教都會退避三舍,一般人都不久喜歡被 感化而改變,他們有抗拒心理。你唯一改變得了的人就是自己。 每個人都有自己的憂傷與恐懼;也許我們沒有意識到,但這些情緒是存在的。 只有面臨危機時,共同體才會自然發展。 健康心理一大特征就是,及早面對危機的能力。 我們亟須賦與危機應有的尊嚴,只有透過這些痛苦與危機,我們才會成長。 我們的生活太缺乏戲劇味,整日混沌過活,對生命的重要本質毫無覺悟。 不同的人有不同的生存使命,每個人的使命都很獨特 不同的宗教往往殊途同歸,只要能到達同一個目的地, 走不同的路又有什么關系。 只要你認罪、懺侮,那么所有的罪就此滌清。唯一需 要的就是為自己的所作所為。覺得難過、痛苦。 每一個人都應該盡可能從各種宗教傳統中汲取智慧。 不論多么善良的人,都不免偶而因疲倦或過于自信,以至于顯得不夠努力。 用全部的靈魂和全部的力量,全心全意愛你的神。愛如鄰己 學習把自己交給上帝,心甘情愿讓他駕馭我這仍末脫離青春的人生。 或許基督教最大的罪,就是以一種獨特的傲慢或自戀 心態,讓許多基督徒自以為可以量身裁制一個上帝。 我對于凡是號稱足以解釋所有事物的觀念,都采取保留的立場。 身體只是一種限制,我相信靈魂可以不靠肉體存在,它不需要肉體就能進步。 地獄的大門是敝開的,任何人都隨時可以走出去,他 們之所以待在地獄是因為他們選擇不離開。 追求知識最好的方法就是透過經驗。 唯物主義和科學發展帶來一種使人坐立難安的匾乏 感,一種對內在生命的渴望。 分化使事情容易,整合則帶來痛苦。迫不經過整合,一個人永遠是支離破碎。 厘清科學的領域可視為人類智慧史上最重要的事件。 整合的過程需要我們坦然面對各種互相沖突的力量、 觀念,以及生活中的壓力 每當面對一個號稱能解決社會問題的方案,一定要問: “缺少了什么? 佛洛伊德用“愛”與“工作”界定心理健康。 為患恐懼癥的人灌輸比較樂視的世界觀,是唯一的治療辦法。 審慎運用宗教觀念,對于很多精神病例,也有加強療效或加速痊愈的效果。 抑郁源自無禮和不肯贊美別人。 如果父母能溫和的對待孩子,盡可能提供支持,孩子 就能朝脫離自戀邁出一大步。人生就是在你已定好的計劃之外所發生的事。 接受人生層出不窮的矛盾,是心理健康不可或缺的要素。 新時代運動的最大特色,就是對新觀念、新方法采取完全開放的態度。 救贖可以說是一種矛盾的混合,其中有恩典也有努力。 不論我們如何抉擇,其他的選擇并不因此被犧牲、被拋棄。 邪惡跟虛偽有很密切的關系。 從事任何冒險之前,都必須知道如何辨認對健康有益 或有害的事物,心靈旅程當然也不例外。 打好高爾夫球的原則,就是不要以一桿進洞為目標。心靈生活也應是如此。 上帝一方面是我們里面的一個小聲音,但同時也存在 我們外面,無比超越、偉大。 信心若不能化為行動,還有什么價值呢? 我們需要跟自己的極限、自己的支離破碎、以及人際 關系之間無可避免的互相倚賴關系妥協。 新時代運動最大的貢獻也無非是帶來新鮮空氣。 我們應該擺脫競爭和分化,全心追求社會生活和靈性生活各方面的整合。 根據神話的說法,性欲源自有一種不完整感,表現于追求個體完整和神性。 如果你追求最高品質的性高潮,最好的方法就是找自己深愛的人從事性行為。 對沉浸在愛情狂喜里的戀人而言,對方就像通往祭壇 的廟字大門,已經無關重要。 任何以為兩性關系中可以建立永恒羅曼史的人,都注定要失望。 這世界可被當作是一個上帝設計的魔鬼訓練營,其中 最難超越的一項障礙就是性。 性是上天賜與的好禮物,但這不代表它在所有季節,所 有時候都適合所有的人。 我發現了解上帝本質最有意義的方式,就是把人性中 最好的部分投射在他身上。
阮大年
生命的饑渴?????
? 《與心靈對話》是美國著名精神導師派克醫生繼《心靈地圖》(The Road Less Traveled)而寫的續集,顧名思義他所探討的乃是一般人不常去思考的問題,也是一般認為不實際的問題。? ??中國人一向重視實用,也許是中國人的歷史一直是為了生活而努力、奮斗,不得不實際的面對生存問題,在臺灣的這數十年經驗里,果然看到了實用主義的輝煌成果,而使臺灣人民走到任何地方都感到抬頭挺胸、趾高氣昴,甚至表現出不可一世的氣概,只是令人擔心的是,經濟的成就并沒有帶來真正生命的豐盛和愉悅,反而普遍的沉迷與失落。? ??其實臺灣的問題不是偶發的,而是一味追求發達及富足之后的必然因果,一九九二年的《美國新聞與世界報導》雜志中記載︰「近來有一種饑渴,那是源自唯物主義和科學發展而來的,一種使人不安的匱乏感,一種對內在生命的渴望……愈來愈多的人亟于找尋一個從心靈與精神層次出發的答案」。同樣的話可描繪在臺灣的中國人,我們目前心靈的饑渴及精神的苦悶,比當時的美國人可謂有過之而無不及。? ??派克醫生的主張是因應這種饑渴而寫的。? ??人生是由一連串的饑渴而編織成的,一個嬰孩一生下來就饑渴--需要食物及溫情;稍長后又對知識、真理產生饑渴--因此要上學、讀書;有生理及性的饑渴--因此進入婚姻之門;有群居及歸屬的饑渴--因此組織家庭、參加社團;有追求卓越的饑渴--因此努力于求名求利,著書立言等。? ??饑渴感并沒什么不好,而且是使人類努力的原動力,然而吾生也有涯,往往因為忙于解決上述一般的饑渴后,人生也就在解饑止渴的過程中溜走了,而很多人一輩子都沒有體會到生命中有另一種更基本及深邃的饑渴--心靈永恒的需求。? ??圣法蘭西斯有言︰「神啊!我心永遠不得安息(或作永遠在饑渴),直到在你里面。」? ??派克醫生的話,不一定能解除你我心靈中的饑渴,就像他一開始就說的「壞消息--我什么也不知道。」他的目的也不是給我們一個標準答案,雖然他承認已經尋到了自己的答案及方向。? ??派克醫生提醒我們,生命是有限卻又可能是永恒的,我們外在、可見的身體是會變老及消逝,但我們內心已經看見心靈是永存及可以日新又新的,只可惜我們幾乎把一生的精力及時間都去改進和化裝外在的形體,而忽視了對心靈的貫注及追尋。從某方面講,外在努力是可見且容易見效的,也易引人注意,甚至功成名就還可以遺傳給兒女,惠及子孫何樂而不為,反之,對心靈的追尋,是非只存乎一心,別人也體會不到,更不易傳授轉贈,因此在功利的環境中更加不受重視及被忽略了。? ??我推薦這本書,因為它系暮鼓晨鐘,在這個多元卻無目標的社會中發出了一個聲音,「要追求永恒!」、「要自省!」確實,這一代可稱為不多自省的一代,我們每天看到的都是批評、不滿,卻鮮見任何人自省。? ??派克醫生認為人類的心靈有無止境求新求變的獨特能力,這也是孟子所說人之異于禽獸者的「幾希」,而作者認為心靈的成長可大致分為四個階段︰? ??第一階段的人可謂是混沌的心靈,只有生活的過程而沒有明確的人生目標。? ??第二階段的人屬于需要形式才能滿足的心靈,他們倚賴某些形式作為生命意義之所依,這形式可能是宗教、藝術團體,也可能是黨派、社團,他們的特征是強調組織內的形式及教條,而以儀式為最高準則。? ??第三階段的心靈較自由且理性,也許沒有明顯的信仰主題,但都熱心積極正面的參與社會,認為生命的意義在貢獻自己,使世界更美好。? ??第四階段的心靈可以說是第三階段努力尋求后的答案,他們不迷信宗教,卻真正的可以認識上帝,生命中有不能說的真正神秘,也真正能感到天人合一的生命境地。然而這并不是一個目的地,第四階段只是表明真正進入一個有無限發展可能的心靈之旅,也正如基督教所謂的信仰是一條路--來于信,以致于信。? ??無論如何,一個好好接納本書的讀者,對自己心靈的成長都有更高、更深一層的激勵,也能認清自己內心有比目前更進步的可能,正如王爾德所說的︰「每個圣人都有不可告人的過去,每個罪人都能有美好的盼望!」?
王浩威醫師(專欄作家、臺大醫院精神部兼任主治醫師)的導讀
?
原先翻閱派克醫生著的《心靈地圖》時,總有些隨興消遣的意味,畢竟市面有太多「勵志」、「心理」或「心靈」的書籍了,令人覺得翻來翻去,也不過如此。偶爾拾遇了一本令我眼睛一亮的這類書籍,好不容易記住作者的大名,待他的新作出版時便趕快買一本,然而,常常原本抱著極大期待的,卻一次次的失望了。
?
看《心靈地圖》的感覺卻截然不同。躺在床上翻著這本書時,睡意逐漸消失,取而代之的是對作者的好奇。「愛」是談得令人有點厭煩的字眼,而「紀律」則是天生引人反感的,然而在這本書中,一切卻有了重生的定義。
?
對作者而言,寫作的材料原本就是源自實務的臨床經驗。病人或個案所陳述的生命經驗,觸目驚心地引發了他對自己的思考,寫作也就成為另一種自我探索的紀錄。
身為一位擅長精神分析的精神科醫師,在學理訓練的出發點上,他很明顯受到佛洛伊德和榮格的影響。特別是有關自戀的理論,佛洛伊德首先提出了原初自戀和次發自戀,榮格進而將之視為自我完成的必要途徑,也就是除了一般人知道的「自戀人格違常」這類負面陳述以外,其實自戀也有另一種正面的意義呈現。
?
在派克醫師的筆下,這一切學理化為無形,取而代之的是極其平易的舉例和用詞。也因為對這個平易的要求,他毫不畏懼地重新用了一些已經有些俗氣的字詞。這時,「紀律」已經不再是團體對個人的要求,而是來自自我的要求,是自我進行著紀律,而非自我被要求守紀律;同樣的,「愛」也不再是對他人的付出,而是「擴充自我的意愿」,只不過前提是「滋養個人和他人心靈成長」罷了。這是作者極其高明的地方,他用平凡得甚至有點保守的字眼,來暢談他極其進步的觀念。
?
到了《心靈地圖2》這本書,他進而開始談宗教。
?
直到今日,雖然很多人已經不再像馬克思一般強烈排反宗教:但對于社會上各種宗教形式的盛行,不免還是有些擔憂,從書中可以看出,派克醫師也懷有這樣一份隱憂,他敢于拂逆當今盛行的新世紀運動,指出各種盲點和困境,就是典型的例子。
?
然而作者也不忌諱宗教,甚至用信仰來解決宗教的困境。對他而言,宗教是必要的;但他指的是個人信仰的追求,而非宗派團體的遵循。
?
當下的宗教團體往往在無形中扼殺了個人的意志。關于這點,如果用強烈的字眼,便是常見的「宗教法西斯」:如果用派克醫師的說法,就是「秘密教派」。作者不擔心教派的攻擊,甚至提出了它們的十大特征,認為只要符合三、四點就可以了,像對領袖魄力的偶像崇拜、地位崇高的權力核心、行政黑箱作業、隱瞞財務、鼓勵教徒倚賴、強化教徒一致性、特殊語言、武斷的教義、異端邪說或是自認掌握了上帝。他列出了這份標準,幾乎是從新時代運動到傳統的基督教或佛教,全都被擊中要害了。
?
另一方面,他卻是極力陳述個人心靈或個人信仰的重要性,雖是科學訓練出身的精神科醫師,他還是排斥了以科學自居的狹義心理學,從《心靈地圖》到《心靈地圖2》,最大的突破莫過于這種將宗教和心理學融為一體的努力,恐怕是和心理學的人格階段相關;他對個案信仰活動發展出的興趣,特別強調了類似艾瑞克森(Eric Erikson)「認同危機」一般的「信仰危機」。
?
宗教的特殊角色,一種極與自省的信仰,成為本書最大的特色。作者自己也承認,他的受洗是在《心靈地圖》完成之后,《心靈地圖2》是重新信仰以后寫就的。因為宗教和科學(心理學和精神醫學)的兼顧,讓他能看見更廣闊的視野。
?
對于不可知的世界,他永遠保持必要的敬畏,像現象學常說的「劃上括號」(bracketing),也就是「存而不論」;承認它的存在,但暫時不會急著說定它。因為這樣的敬畏,他開始談論密契主義和死亡,甚至認為性愛高潮和性靈經驗有著一定的相關性。
?
如果《心靈地圖》是一本有關自我心理調適和成長的書籍,那么《心靈地圖2》則是自我靈性的修行和解放。這其實是很不容易的一步,然而作者平易而輕松地做到了。
??????? 春節假期結束,也告別了忙碌的2006年,迎來一個還未知的2007。想起2006年初,我給自己定的一些目標,慚愧的是大多數沒有完成,有些還在進行中。但是2006,對我來說也算是個充實的一年,有了很多的第一次,對事情思考比以前深入了,不過也許到了2008回想,現在的思考也是膚淺的,我希望是如此,這樣表示我在進步。
?????? 過去的2006有太多的內容,我也不想去細數了,還是在這里說說2007的目標。
- 作為一個軟件開發人員,我還是一如既往地對新技術、新思想關注,并努力的應用到平時開發工作中去,讓發揮其價值。
- 這一年我會更加關注敏捷管理,對于敏捷的思想和做法,我一直在徘徊在門外,不是猶豫,而是還在找哪扇門,希望今年能有機會能夠在實踐中應用。
- Kent有一句名言,"程序員要取得成功,關鍵在于程序之外的東西"。雖然平時也有這所認識,但是不夠重視,比如溝通能力(特別是口頭溝通和書面正式文檔的編寫)、全面系統思考問題的能力、組織協調能力、策劃推動能力、自我管理和團隊管理能力、工作的規范性和質量意識,等等。這需要我們更用心的去思考、去摸索、去提升,就是要有一個全面的提高。
- 到年底,目標是能達到一個項目經理的水平,要以一個項目經理的要求來衡量自己。
- 工作為了生活!我很喜歡這句話,但是現實和喜歡存在著很大的差距,只能在平時忙碌的工作中努力協調這個矛盾。
- 2006接觸了一些健康方面的知識,人體使用手冊讓我初步了解了人體的奇妙,健康一生讓我認識到飲食的重要性。忙碌的工作往往會把身體搞垮,不規律的飲食,不正常的加班熬夜,我們要怎么來呵護我們的身體呢?是不是工作到不惑之年后就疾病纏身呢?我不想要這樣的生活,2007年我會把一些健康知識應用到實際中來,如果有效,我還會推薦給我的朋友們。這一點也是對第五點的補充。
??????? 春節在家里找到一本以前看過的書,與心靈的對話,還是高中的時候看過這本書,主要說的是人生多變,人生的目標是讓自己的靈性成長,講的非常好。當時對其中講的很有感觸,現在拿起來又讀,猶如第一次讀一樣,引領我對人生的思考,而且比以前讀更加的能理解其中的含義。2007我將細讀這本書,特別在我這個年齡段,現實的沖擊,生活的壓力,導致我們對人生的迷惑。
??????? 2007會帶來什么誰也不知道,也許這就是人生多變,我喜歡這個多變。
??????? 人生就是你計劃之外發生的事情。2007,唯一現在要做的就是保持一種樂觀積極的心態。
???
Quartz作為一個開源的作業調度框架,已經廣泛應用于j2ee中。因為項目需要一個任務管理模塊,所以選擇了Quartz這個強大的框架,并對其進行
了擴展以適應項目的要求。首先介紹一下我們的系統構架,采用webwork,spring,hibernate整合架構,我的任務是無縫的把Quartz
加入到系統,提供一個界面,提供一些操作,使最終用戶能夠自己定義在什么時間對什么東西做哪些事情,“哪些事情”是預先定義的,提供給客戶選擇,這是客戶
需求,系統地要求是能夠容易的擴展,對增加一個新的任務定義提供一些簡單的接口。這里不對Quartz作介紹了,想了解的人參考官方網站:http:
//www.opensymphony.com/quartz/,由于涉及的東西比較多,有些細節就帶過了,我就大致的介紹一下總體的設計。
??? 作業調度框架,主要要解決的問題是在某個時間對某些對象作某些動作。
???
對于某個時間,Quarta提供一個字符表達式來表示,這方面要做的是提供一個方便的界面,直觀的對其進行設置,不能讓最終客戶看那些對客戶沒意義的字符
串。這個工作需要解析那些字符,做起來還是有點意思的,也是比較麻煩的,有興趣的話可以自己去試試。
???
對于某些對象作和某些動作,Quartz都交給程序員自己去定義,它提供一個Job接口,對我們來說增加任務是比較簡單的一件事情.既然Quartz提供
這么簡單的接口,我為什么還要對其進行擴展呢?這就要來看"某些對象"了.在一般的系統來"某個動作"所操縱的對象是固定的,比如定期刪除日至,定期檢查
庫存等.由于系統地特殊性,我們"某個動作"對哪些對象是不確定的,"哪些對象"由我提供一個界面,由最終客戶去決定對一個或多個對象進行操作.
???
這樣就引入了一個范圍的概念,"某個動作"是作用在一定范圍內的,這個范圍就不僅僅是哪些對象了,也可能是時間范圍,比如刪除幾天前的日志信息.到這里對
任務的定義有所改變了,一個任務包括一些范圍也可以說是條件,這個條件不包括觸發點這個條件),一個動作.所以系統中定義了一個IRange接口,范圍的
表示都保存在一個XML字符串,XML字符串的結構和怎么解析都交給具體的子對象,這樣就給了子類的靈活性.
public interface IRange {
??? public Map saveToMap(String strMap);//保存范圍參數
??? public List getResult(Map map);//解析范圍參數,并返回操作對象線程列表
??? public List getViewInfo();取得頁面表示方式,結合了webwork
}
一個任務對應一個IRange的子類,IRange的子類對任務的各種參數范圍,動作進行了實現.接著還加入一個IRangeManager接口,
public interface IRangeManager {
??? public void saveDataMap(Long jobId, String strMap)throws SchedulerException;//保存范圍參數
??? public List getObjects(Map map);//取得對象列表,其中包括了對參數的解析
??? public List getViews(Map map);
}
??? 實現的功能是對范圍進行管理,包括對Quartz的操作,主要一些保存數據庫等的操作,這樣對于增加一個新的Range子類就可以不用知道Quartz了.
??? 這樣因為很多東西都是可配置的,增加了靈活性,對以后任務的添加定義了一些接口,考慮到了擴展性.在設計這個模塊的時候,總的思路是把那些不變的東西都封裝起來,把能變得東西都交給具體的任務了.
上面我只是大致講了一下,由于水平有限,可能講的不是清楚,比較亂,我沒有提供具體的例子,只是提供了一個思路,希望對大家有所幫助,或者你還有更好的設計,請與我聯系.
???
首先介紹一下我們的系統構架,采用webwork,spring,hibernate整合架構,現在引入Quartz框架,Quartz和
hibernate各自擁有的自己數據庫配置和連接池的配置,現在的任務是把兩者用同一套配置.
先談談Quartz,我用的版本是1.5.1,后面的版本我沒去看了,沒時間,接下來說的都以這個版本為準.Quartz雖然在提供一個
ConnectionProvider接口,提供給程序擴展,但是看它的StdSchedulerFactory實現類,要對它進行擴展還是一件比較麻煩
一件事情,所以我就直接修改了StdSchedulerFactory類,以達到的我的需求.
接下來的問題是既然要結合,那么讓Quartz來提供連接池配置呢還是有Hibernate提供.研究了兩者的連接池方面的源代碼,發現
Hibernate的連接池設計遠遠好于Quartz,Quartz目前只提供一個連接池提供類PoolingConnectionProvider,而
且使用的連接池是dbcp,這個連接池聽說問題多多,相反hibernate提供了更加靈活的配置,所以連接池由Hibernate提供.
??? 首先實現一個Quartz中ConnectionProvider子類HibernateConnectionProvider
public class HibernateConnectionProvider implements ConnectionProvider {
??? private Connection con = null;
??? protected static ThreadLocal hibernateHolder = new ThreadLocal();
??? public Connection getConnection() throws SQLException {
??? ??? con = null;
??? ??? SessionFactoryImpl sessionFactory = null;
??? ??? sessionFactory = (SessionFactoryImpl) Global.getSessionFacotry();
??? ??? con = sessionFactory.getConnectionProvider().getConnection();
??? return con;
}
public void shutdown() throws SQLException {
??? // FIXME Auto-generated method stub
}
}
,然后修改StdSchedulerFactory,在不破壞其本來的邏輯和可配置性下進行了相應的修改.修改的是private Scheduler
instantiate() throws SchedulerException方法,找到//Set up any
DataSources段進行修改,代碼如下:
String[] dsNames = cfg.getPropertyGroups(PROP_DATASOURCE_PREFIX);
??? ??? for (int i = 0; i < dsNames.length; i++) {
??? ??? ??? PropertiesParser pp = new PropertiesParser(cfg.getPropertyGroup(
??? ??? ???
??? ??? PROP_DATASOURCE_PREFIX + "." +
dsNames[i], true));
??? ??? ??? String dsDriver = pp
??? ??? ???
??? ???
.getStringProperty(PROP_DATASOURCE_DRIVER, null);
??? ??? ??? String dsURL = pp.getStringProperty(PROP_DATASOURCE_URL, null);
??? ??? ??? boolean dsAlwaysLookup = pp.getBooleanProperty(
??? ??? ???
??? ???
PROP_DATASOURCE_JNDI_ALWAYS_LOOKUP, false);
??? ??? ??? String dsUser = pp.getStringProperty(PROP_DATASOURCE_USER, "");
??? ??? ??? String dsPass = pp.getStringProperty(PROP_DATASOURCE_PASSWORD, "");
??? ??? ??? int dsCnt = pp.getIntProperty(PROP_DATASOURCE_MAX_CONNECTIONS, 3);
??? ??? ??? String providerClass = pp.getStringProperty(
??? ??? ???
??? ??? PROP_DATASOURCE_PROVIDER_CLASS,
null);
??? ??? ??? String dsJndi = pp
??? ??? ???
??? ???
.getStringProperty(PROP_DATASOURCE_JNDI_URL, null);
??? ??? ??? String dsJndiInitial = pp.getStringProperty(
??? ??? ???
??? ??? PROP_DATASOURCE_JNDI_INITIAL,
null);
??? ??? ??? String dsJndiProvider = pp.getStringProperty(
??? ??? ???
??? ??? PROP_DATASOURCE_JNDI_PROVDER,
null);
??? ??? ??? String dsJndiPrincipal = pp.getStringProperty(
??? ??? ???
??? ??? PROP_DATASOURCE_JNDI_PRINCIPAL,
null);
??? ??? ??? String dsJndiCredentials = pp.getStringProperty(
??? ??? ???
??? ??? PROP_DATASOURCE_JNDI_CREDENTIALS,
null);
??? ??? ??? String dsValidation = pp.getStringProperty(
??? ??? ???
??? ??? PROP_DATASOURCE_VALIDATION_QUERY,
null);
??? ??? ??? if (providerClass == null
??? ??? ??? ??? ??? || providerClass.equals("")
??? ??? ??? ??? ??? || providerClass
??? ??? ???
??? ??? ???
???
.equals("org.quartz.utils.PoolingConnectionProvider")) {
??? ??? ??? ??? if (dsDriver == null) {
??? ??? ???
??? ??? initException = new
SchedulerException(
??? ??? ???
??? ??? ???
??? "Driver not specified for DataSource: "
??? ??? ???
??? ??? ???
??? ??? ??? + dsNames[i]);
??? ??? ??? ??? ??? throw initException;
??? ??? ??? ??? }
??? ??? ??? ??? if (dsURL == null) {
??? ??? ???
??? ??? initException = new
SchedulerException(
??? ??? ???
??? ??? ???
??? "DB URL not specified for DataSource: "
??? ??? ???
??? ??? ???
??? ??? ??? + dsNames[i]);
??? ??? ??? ??? ??? throw initException;
??? ??? ??? ??? }
??? ??? ??? ??? try {
??? ??? ???
??? ??? PoolingConnectionProvider cp =
new PoolingConnectionProvider(
??? ??? ???
??? ??? ???
??? dsDriver, dsURL, dsUser, dsPass, dsCnt,
??? ??? ???
??? ??? ???
??? dsValidation);
??? ??? ???
??? ??? dbMgr =
DBConnectionManager.getInstance();
??? ??? ???
??? ???
dbMgr.addConnectionProvider(dsNames[i], cp);
??? ??? ??? ??? } catch (SQLException sqle) {
??? ??? ???
??? ??? initException = new
SchedulerException(
??? ??? ???
??? ??? ???
??? "Could not initialize DataSource: " + dsNames[i],
??? ??? ???
??? ??? ???
??? sqle);
??? ??? ??? ??? ??? throw initException;
??? ??? ??? ??? }
??? ??? ??? } else if (providerClass
??? ??? ???
??? ???
.equals("org.quartz.utils.JNDIConnectionProvider")) {
??? ??? ??? ??? Properties props = null;
??? ??? ??? ??? if (null != dsJndiInitial || null != dsJndiProvider
??? ??? ???
??? ??? ??? || null !=
dsJndiPrincipal || null != dsJndiCredentials) {
??? ??? ??? ??? ??? props = new Properties();
??? ??? ??? ??? ??? if (dsJndiInitial != null)
??? ??? ???
??? ??? ???
props.put(PROP_DATASOURCE_JNDI_INITIAL, dsJndiInitial);
??? ??? ??? ??? ??? if (dsJndiProvider != null)
??? ??? ???
??? ??? ???
props.put(PROP_DATASOURCE_JNDI_PROVDER, dsJndiProvider);
??? ??? ??? ??? ??? if (dsJndiPrincipal != null)
??? ??? ???
??? ??? ???
props.put(PROP_DATASOURCE_JNDI_PRINCIPAL,
??? ??? ???
??? ??? ???
??? ??? dsJndiPrincipal);
??? ??? ??? ??? ??? if (dsJndiCredentials != null)
??? ??? ???
??? ??? ???
props.put(PROP_DATASOURCE_JNDI_CREDENTIALS,
??? ??? ???
??? ??? ???
??? ??? dsJndiCredentials);
??? ??? ??? ??? }
??? ??? ???
??? JNDIConnectionProvider cp = new
JNDIConnectionProvider(dsJndi,
??? ??? ???
??? ??? ??? props,
dsAlwaysLookup);
??? ??? ??? ??? dbMgr = DBConnectionManager.getInstance();
??? ??? ??? ??? dbMgr.addConnectionProvider(dsNames[i], cp);
??? ??? ??? } else if (providerClass
??? ??? ???
??? ???
.equals("org.quartz.utils.HibernateConnectionProvider")) {
??? ??? ???
??? HibernateConnectionProvider cp = new
HibernateConnectionProvider();
??? ??? ??? ??? dbMgr = DBConnectionManager.getInstance();
??? ??? ??? ??? dbMgr.addConnectionProvider(dsNames[i], cp);
??? ??? ??? } else {
??? ??? ??? ??? initException = new SchedulerException(
??? ??? ???
??? ??? ???
"Provider_Class not Supported: " + providerClass);
??? ??? ??? ??? throw initException;
??? ??? ??? }
??? ??? }
??? 最后就是修改配置文件quartz.properties,加入
#org.quartz.dataSource.myDS.provider_class = org.quartz.utils.JNDIConnectionProvider
#org.quartz.dataSource.myDS.provider_class = org.quartz.utils.PoolingConnectionProvider
org.quartz.dataSource.myDS.provider_class = org.quartz.utils.HibernateConnectionProvider加#的供參考.
??? 經過測試,需要對hibernate連接池的一些參數進行微調,這樣就完成了Quartz與Hibernate在數據庫的連接方面的結合,如果有更好的解決方案,請聯系我.
???
由于項目的需要,需要對項目環境進行一些配置,主要是apache和tomcat的整合,并加入集群的功能,在apache中加入ssl,增加其安全性,
我在網上找了很長的時間,找到一些資料,但是都不完整,一般只介紹其中的一部分而已,在這些教程的基礎上,加上官方網站的資料,經過努力終于搞定了。這些
都來自網絡,我只是把他們都整合到一起,希望對你有所幫助,如果你有什么更好的配置方法,請聯系我,謝謝。
目標:apache、tomcat,ssl,的整合,加入集群的功能
操作系統:FC4-i386,redhat as 4
所需軟件:httpd-2.2.0,jakarta-tomcat-5.0.30,jdk1.4或者jdk1.5,openssl-0.9.8,ssl.ca-0.1.tar.gz
安裝openssl
? $ tar zxf?? openssl-0.9.8.tar.gz
? $ cd openssl-0.98
? $ ./config --prefix=/usr/local/ssl
? $ make
? $ make test
? $ make install
安裝httpd,并支持ssl
# tar zxf httpd-2.2.0.tar.gz
# cd httpd-2.2.0
apr和apr-util的安裝
安裝apr
# cd srclib/apr
# ./configure --prefix=/usr/local/apr
# make
# make install
安裝apr-util
# cd ../apr-util/
# ./configure --prefix=/usr/local/apr-util \
??? --with-apr=/usr/local/apr
# make
# make install
# cd ../../
安裝apache
# ./configure --prefix=/usr/local/apache \
??? --enable-so \
--enable-proxy-balancer \
??? --enable-rewrite=share \
??? --enable-proxy=share \
??? --enable-proxy-ajp=share \
??? --enable-dav=share \
??? --with-apr=/usr/local/apr \
??? --with-apr-util=/usr/local/apr-util/? \
??? --enable-ssl=static \
??? --with-ssl=/usr/local/ssl
??? --enable-mods-shared=all
# make
# make install
安裝ssl臨時證書:
ssl.ca-0.1.tar.gz
# cd /usr/local/apache2/conf
# tar zxvf ssl.ca-0.1.tar.gz
# cd ssl.ca-0.1
# ./new-root-ca.sh????????????????? ?
No Root CA key round. Generating one
Generating RSA private key, 1024 bit long modulus
...........................++++++
....++++++
e is 65537 (0x10001)
Enter pass phrase for ca.key:??????????? ?
Verifying - Enter pass phrase for ca.key: ?
......
Self-sign the root CA...???????????????? ?
Enter pass phrase for ca.key:????? ?
........
........?????????????????????????????
?
Country Name (2 letter code) [MY]:CN
State or Province Name (full name) [Perak]:ZheJiang
Locality Name (eg, city) [Sitiawan]:HangZhou
Organization Name (eg, company) [My Directory Sdn Bhd]:sc
Organizational Unit Name (eg, section) [Certification Services Division]:sc
Common Name (eg, MD Root CA) []:2
Email Address []:admin@admin.com
這樣就生成了ca.key和ca.crt兩個文件,接下來生成一個證書:
# ./new-server-cert.sh server???? ?
......
......
Country Name (2 letter code) [MY]:CN
State or Province Name (full name) [Perak]:ZheJiang
Locality Name (eg, city) [Sitiawan]:HangZhou
Organization Name (eg, company) [My Directory Sdn Bhd]:sc
Organizational Unit Name (eg, section) [Secure Web Server]:sc
Common Name (eg, www.domain.com) []:2
Email Address []:admin@admin.com
這樣就生成了server.csr和server.key這兩個文件。
還需要簽署一下才能使用的:
# ./sign-server-cert.sh server
CA signing: server.csr -> server.crt:
Using configuration from ca.config
Enter pass phrase for ./ca.key:??????? ?
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName?????????? :PRINTABLE:'CN'
stateOrProvinceName?? :PRINTABLE:'JiangSu'
localityName????????? :PRINTABLE:'NanJing'
organizationName????? :PRINTABLE:'Wiscom System Co.,Ltd'
organizationalUnitName:PRINTABLE:'ACSTAR'
commonName??????????? :PRINTABLE:'acmail.wiscom.com.cn'
emailAddress????????? :IA5STRING:'acmail@wiscom.com.cn'
Certificate is to be certified until Jul 16 12:55:34 2005 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
CA verifying: server.crt <-> CA cert
server.crt: OK
下面要按照ssl.conf里面的設置,將證書放在適當的位置。
最后是配置conf/httpd.conf
此文件中找到
# Secure (SSL/TLS) connections
#Include conf/extra/httpd-ssl.conf
把#Include conf/extra/httpd-ssl.conf前面的'#'號去掉保存
啟動服務器,測試
$cd bin
$./apachectl start???? ?
瀏覽器中打入http://127.0.0.1/和https://127.0.0.1,如果看到同一個成功畫面,說明apache+ssl配置成功.
jdk的安裝
把jdk1.4或者jdk1.5復制到/usr/local
$chmod 755 jdk....bin
$./jdk....bin
配置全局變量,打開/etc/profile文件,加入
JAVA_HOME=這里為你jdk安裝目錄
JRE_HOME=$JAVA_HOME/jre
PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH:$HOME/bin
export JAVA_HOME JRE_HOME PATH
#ant
PATH=/usr/local/ant/bin:$PATH
export PATH
重起電腦.
配置完畢.
tomcat安裝
首先把tomcat復制到目錄/usr/local
$tar zxf jakarta-tomcat-5.0.30.tar.gz
$cd jakarta-tomcat-5.0.30/bin
$./startup.sh
瀏覽器中打入http://127.0.0.1:8080/,如果看到tomcat的歡迎畫面,表示安裝成功.
配置apache目錄下conf/httpd.conf文件,
此文件中找到
#Include conf/extra/httpd-vhosts.conf
把#Include conf/extra/httpd-ssl.conf前面的'#'號去掉保存,然后打開conf/extra/httpd-vhosts.conf文件的找到<VirtualHost _default_:443>,在其里面加入
??? ServerAdmin admin@easyea.com
??? ProxyPass / ajp://localhost:8009/
??? ProxyPassReverse / ajp://localhost:8009/
??? ServerName localhost
??? ServerAlias www.easyea.com
??? ErrorLog logs/easyea.com-error_log
??? CustomLog logs/easyea.com-access_log common
加入的設置有些是與它原先的默認設置是沖突的,請刪掉相應沖突的設置.
啟動服務器,測試,瀏覽器中打入https://127.0.0.1,如果看到tomcat的歡迎畫面,表示配置成功.
集群和sesion復制
集群
在conf/extra/httpd-vhosts.conf文件的找到<VirtualHost _default_:443>,在其里面加入
<Proxy balancer://128.8.153.203>
?????? BalancerMember ajp://localhost:8009
?????? BalancerMember ajp://128.8.153.81:8009
</Proxy>
<Location /sc/>
?????? ProxyPass balancer://128.8.153.203/sc/
</Location>
sesion復制
??? tomcat的conf/server.xml文件中,把Cluster
部分的注釋去掉,最后一步是把你所要的session復制的項目中的web.xml中加入<distributable
/>,測試的話你需要兩個配置一樣的tomcat
配置到這里配置完成,在裝的過程中因為環境的問題,配置可能有所不同.
?????????????????????????????????????????????????????????
aspirin
???????????????????????????????????????????????????????????
2006-3-14
第一封信:從誠信談起
我在蘋果公司工作時,曾有一位剛被我提拔的經理,由于受到下屬的批評,非常沮喪地要我再找一個人來接替他。我問他:“你認為你的長處是什么?”
他說,“我自信自己是一個非常正直的人。”我告訴他:“當初我提拔你做經理,就是因為你是一個公正無私的人。管理經驗和溝通能力是可以在日后工作中學習
的,但一顆正直的心是無價的。”我支持他繼續干下去,并在管理和溝通技巧方面給予他很多指點和幫助。最終,他不負眾望,成為一個出色的管理人才。
與之相反,我曾面試過一位求職者。他在技術、管理方面都相當的出色。但是,在談論之余,他表示,如果我錄取他,他甚至可以把在原來公司工作時的
一項發明帶過來。隨后他似乎覺察到這樣說有些不妥,特作聲明:那些工作是他在下班之后做的,他的老板并不知道。這一番談話之后,不論他的能力和工作水平怎
樣,我都肯定不會錄用他。原因是他缺乏最基本的處世準則和最起碼的職業道德“誠實”和“講信用”。如果雇用這樣的人,誰能保證他不會在這里工作一段時間
后,把在這里的成果也當作所謂“業余之作”而變成向其他公司討好的“貢品”呢?這說明:一個人品不完善的人是不可能成為一個真正有所作為的人的。
最后想提的是一些喜歡貪小便宜的人。他們用學校或公司的電話打私人長途、多報銷票。
也許有人認為,學生以成績、事業為重,其他細節只是一些小事,隨心所欲地做了,也沒什么大不了的。然而,就是那些身邊的所謂“小事”,往往成為一個人塑造
人格和積累誠信的關鍵。一些貪小便宜、耍小聰明的行為只會把自己定性為一個貪圖小利、沒有出息的人的形象,最終因小失大。對于這些行為,一言以蔽之,就是
“勿以惡小而為之”。
第二封信:從優秀到卓越
一位企業的領導者在成功的基礎上,要想進一步提高自己,使自己的企業保持持續增長,使自己的個人能力從優秀向卓越邁進,就必須努力培養自己在“謙虛”、“執著”和“勇氣”這三個方面的品質。
謙虛使人進步。許多領導者在工作中唯我獨尊,不能聽取他人的規諫,不能容忍他人和自己意見相左,這些不懂得謙虛謹慎的領導者也許可以取得暫時的
成功,但卻無法在事業上不斷進步,達到卓越的境界。這是因為,一個人的力量終究有限,在瞬息萬變的商業環境中,領導者必須不斷學習,善于綜合他人的意見,
否則就將陷入一意孤行的泥潭,被市場所淘汰。
執著是指我們堅持正確方向,矢志不移的決心和意志。無論是公司也好,還是個人也好,一旦認明了工作的方向,就必須在該方向的指引下鍥而不舍地努力工作。在工作中輕言放棄或者朝三暮四的做法都不能取得真正的成功。
成功者需要有足夠的勇氣來面對挑戰。任何事業上的成就都不是輕易就可以取得的。一個人想要在工作中出類拔萃,就必須面對各種各樣的艱難險阻,必
須正視事業上的挫折和失敗。只有那些有勇氣正視現實,有勇氣迎接挑戰的人才能真正實現超越自我的目標,達到卓越的境界。正如馬克·吐溫所說:“勇氣不是缺
少恐懼心理,而是對恐懼心理的抵御和控制能力。”
第三封信:成功、自信、快樂
美國作家威廉·福克納說過:“不要竭盡全力去和你的同僚競爭。你應該在乎的是,你要比現在的你強。”
中國社會有個通病,就是希望每個人都照一個模
式發展,衡量每個人是否“成功”采用的也是一元化的標準:在學校看成績,進入社會看名利。尤其是在今天的中國,人們對一個人的成功的評價,更多地以個人財
富為指標。但是,有了最好的成績就能對社會有所貢獻嗎?有名利就一定能快樂嗎?
真正的成功應是多元化的。成功可能是你創造了新的財富或技術,可能是你為他人帶來了快樂,可能是你在工作崗位上得到了別人的信任,也可能是你找到了回歸自我、與世無爭的生活方式。每個人的成功都是獨一無二的。
第四封信:大學應這樣過
就讀大學時,你應當掌握七項學習,包括自修之道、基礎知識、實踐貫通、培養興趣、積極主動、掌控時間、為人處世。
經過大學四年,你會從思考中確立自我,從學習中尋求真理,從獨立中體驗自主,從計劃中把握時間,從表達中鍛煉口才,從交友中品味成熟,從實踐中贏得價值,從興趣中獲取快樂,從追求中獲得力量。
離開大學時,只要做到了這些,你最大的收獲將是“對什么都可以擁有的自信和渴望”。你就能成為一個有潛力、有思想、有價值、有前途的中國未來的主人翁。
第五封信:做個積極主動的你
如果你想做一個積極主動、對自己負責的人,我建議你立即行動起來,按照以下幾點嚴格要求自己:
●以一整天時間,傾聽自己以及四周人們的語言,注意是否有“但愿”“我辦不到”
●依據過去的經驗,設想一下,自己近期內是否會遭遇一些令人退縮逃避的情況?這種情況處在你自己的影響范圍之內嗎?你應該如何本著積極主動的原則加以應對?請在腦海中一一模擬。
●從工作或日常生活中,找出一個令你備感挫折的事情。想一想,它屬于哪一類,是可以直接控制的事情,還是可以間接控制的事情,抑或根本無法控制的事情?然后在自己的影響范圍內尋找解決方案并付諸行動。
●鍛煉自己積極主動的意識。在30天內,專注于自己影響范圍內的事物,對自己許下承諾,并予以兌現;做一支照亮他人的蠟燭,而非評判對錯的法
官;以身作則,不要只顧批評;解決問題,不要制造問題;不必怪罪別人或為自己文過飾非,不怨天,不尤人;別活在父母、同事或社會的蔭庇之下,善用天賦的獨
立意志,為自己的行為與幸福負責。
只有積極主動的人才能在瞬息萬變的競爭環境中贏得成功,只有善于展示自己的人才能在工作中獲得真正的機會。
最后,我將公司總裁的一段話贈給中國的學生:
你們的時間有限,所以不要浪費時間活在別人的生活里。
不要被信條所惑———盲從信條是活在別人的生活里。
不要讓任何人的意見淹沒了你內在的心聲。
最重要的,擁有跟隨內心和直覺的勇氣。
你的內心與直覺知道你真正想成為什么樣的人。
任何其他事物都是次要的。
?????? 這個文件是在項目過程中慢慢積累的,功能不是很多,但是完全滿足了現在的項目需求,以后還會慢慢加全,希望大家支持。
/* ?AspirinCheck v1.0 ?code by aspirin ?thinking814@hotmail.com */ function AspirinCheck(){ ?var i =1; ?var ipCk = ipCk=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}$)/g; ?var numberCk=/^\d+$/g; ?//Email:/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ //例子<input name="Email" dataType="Email" msg="信箱格式不正確"> ?/*參考的ip控件 ??<span class="ipInput" id="bip"> ???<input
name="broadCastIpOne" MAXLENGTH=3 onkeydown="nextFocus(event)"
>.<input name="broadCastIpTwo" MAXLENGTH=3
onkeydown="nextFocus(event)" >.<input name="broadCastIpThree"
MAXLENGTH=3 onkeydown="nextFocus(event)" >.<input
name="broadCastIpFour" MAXLENGTH=3 onkeydown="nextFocus(event)" > ??</span> ??<script> ??function nextFocus(event){ ???if(event.keyCode==110 || event.keyCode==46 || event.keyCode==190){? ????event.keyCode=9; ???} ??} ??</script> ?*/ ?this.ipCheck = function(ip){ ??if(this.isEmpty(email))return true; ??var ipArray = ip.split("."); ??return
ipCk.test(ip) && new Number(ipArray[0])<=255 && new
Number(ipArray[1])<=255 && new Number(ipArray[2])<=255
&& new Number(ipArray[3])<=255; ?} ? ?this.numberOnly = function (str){ ??if(this.isEmpty(email))return true; ??return numberCk.test(str); ?} ? ?this.limit = function (len,min,max){ ??min = min || 0; ??max = max || Number.MAX_VALUE; ??return min <= len && len <= max; ?} ? ?this.isRepeat = function (one,two){ ??return one==two; ?}
?this.checkemail = function (email){ ??if(this.isEmpty(email))return true; ??var emailCk = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; ??/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/ ??if (!emailCk.test(email)) return false; ??return true; ?} ? ?this.checkmobile = function (mobile){ ??if(this.isEmpty(email))return true; ??var mobileCk = /^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/; ??if (!mobileCk.test(mobile)) return false; ??return true; ?}
?this.isEmpty = function (obj){ ??return (obj=="" || obj.split(" ").join("") == "")?true:false; ?} } /*引入方式(star) <script type="text/javascript"> ?function _import(className){ ??window.document.write("<scr"+"ipt
type=\"text/javascript\"
src=\"前段路徑\""+className+".js\"></sc"+"ript>"); ?} ?_import("AspirinCheck"); </script> */
// 動態DHCP獲得 # 啟動系統激活設備. # Loop回環地址. auto lo iface lo inet loopback # 啟動系統激活設備. # 網卡eth0設置為DHCP類型. auto eth0 iface eth0 inet dhcp // 靜態Static獲得 # 啟動系統激活設備. # 網卡eth0設置為Static類型. auto eth0 iface eth0 inet static # 指定IP地址.子網掩碼.廣播.網關. address 192.168.0.1 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.1 # 指定DNS服務器地址 dns-nameservers 202.103.0.117 dns-search somedomain.org DNS服務器設置: /etc/resolv.conf // 必須設置.否則無法訪問任何URL nameserver 202.103.0.117 nameserver 211.95.193.97 Apt-get 命令: apt-setup 設置Apt源.可選擇列表或者手工導入 apt-get update 系統軟件包更新 apt-get upgrade 更新所有軟件包并且自動升級成最新 apt-get dist-upgrade 更新軟件包并解決軟件依賴關系 apt-cache search keyword 查找指定軟件包信息 apt-cache show package_name 詳細顯示指定軟件包的信息 apt-get install 安裝指定軟件包 apt-get remove 移除指定軟件包 常用命令: base-config 配置基本系統 apt-get install zhcon 安裝 Zhcon 中文字符支持包. zhcon 運行 Zhcon UC-DOS 中文系統 apt-get remove netatalk 刪除不必要的 Appletalk. apt-get remove exim4 刪除MTA.提高啟動速度. vi /etc/zhcon.conf 配置 Zhcon 設置 vi /etc/apt/source.list 配置 Apt 源址 base-config #進入基本系統配置設置. apt-setup #重新設置APT源文件. apt-get install zhcon #安裝 Zhcon 中日韓文外掛. apt-get install vim #安裝VIM編輯器.比VI好用很多. apt-get install rar #安裝Rar.推薦安裝. apt-get install gcc #安裝GCC apt-get install make #安裝Make apt-get install x-window-system-core #安裝X-Window核心 >> 你可以選擇安裝全部 apt-get install x-window-system apt-get install xdebconfigurator #安裝X自動配置工具 >> xdebconfigurator #自動檢測硬件 >> dexconf #配置 /etc/X11/XF86Config-4 dpkg-reconfigure xserver-xfree86 # 重新配置X參數.重要. apt-get install gnome-core #安裝Gnome核心.你也可以選擇全部安裝. apt-get install modconf # 安裝硬件管理模塊工具. apt-get install rcconf # 安裝啟動管理模塊工具. apt-get install deborphan # 顯示未關聯和使用的軟件包. tasksel # 基礎的軟件包管理工具 apt-get remove packages-name # 刪除一個軟件包. dpkg -P packages-name # 徹底刪除一個軟件包以及配置文件. tzconfig # 修改系統默認時區 debconf # Deb配置命令 (具體不詳) fc-cache -f -v # 運行于字體目錄中.更新字體信息緩存 fc-cache -v # 運行于字體目錄中.更新字體信息緩存 mkfontscale # 生成 font.scale 文件.與字體在同一目錄下運行. cp fonts.scale fonts.dir #將生成的 fonts.scale 復制為系統需要的 fonts.dir 配置文件. apt-get install locales # 安裝最新版的 locales 軟件包 >> 安裝以后將會在 /usr/lib/locale/ 自動生成所需要的 locale >> 執行 locale 查看現有的配置內容 >> 路徑為 /etc/locale.gen >> 可用命令 locale-gen dpkg-reconfigure locales # 重新配置 locale 設置 apt-get install fvwm # 安裝fvwm 1. 設置你的系統啟動方式是命令行啟動模式. 在 /etc/inittab 文件中.設置以命令行的方式來啟動: id:3:initdefault 2. 將 etc/X11/xinit/xinitrc 這個文件備份.比如 xinitrc.old cp xinitrc xinitrc.old 然后在 /root/ 或者是 /home/usrname/ 下面建立一個 .xinitrc 文件. 在里面寫入: exec fvwm 并保存. 最后執行: startx 進入 fvwm 1. 安裝Debian的時候.選擇中文簡體. 2. 設置時區的時候選擇: "Asia" 以及 "Shanghai" 3. 設置Apt源地址包含: DebianSecurity CN99 GeekBone Nctu.edu.tw 地址. 4. 運行 apt-get update 命令更新系統軟件包. 5. 運行 apt-get upgrade 命令安裝更新軟件包. 6. 運行 apt-get install zhcon 命令安裝 zhcon 中文控制臺. 7. 運行 apt-get install vim 為了方便可安裝 VIM 編輯器. 8. 修改配置文件 /etc/profile 增加如下內容: export LANG=zh_CN.GB2312 export LC_ALL=zh_CN.GB2312 10. 重新登陸 Debian. 進入 zhcon. 11. 執行 apt-get install locales 安裝或者更新最新版本. 12. 安裝 locales 后會自動進入設置 locale 對話框. 語言設置選中: "en_US ISO-8859-1" 和 "zh_CN" 如果你需要支持更多的也可以選擇 "BIG" 和 "UIF-8" 等等. 最后記得將 "zh_CN" 設置為 locale 的默認編碼. 13. 退出zhcon環境(Ctrl+D). 退出Debian控制臺(Exit) 重新登陸 Debian. 進入 zhcon. 運行 locale 查看是否設置生效. 14. 運行 apt-get install libpango1.0-common 安裝 defoma. 安裝完以后.會提示你將其設置為字體管理工具.選擇 Yes. 15. 因為我們已經有了defoma.所以只需要安裝新的中文環境和字體. 設置字體和配置字體文件等復雜工作我們都不需要做了. 運行 apt-get install xfonts-intl-chinese 安裝簡體中文的環境字體. (重要) 運行 apt-get install xfonts-intl-chinese-big 安裝支持繁體中文環境字體. (可選) (你可以參考: http://www.debian.org/intl/zh/software 支持中文的所有軟件.) 16. 安裝兩個官方推薦的簡體中文的字體: apt-get install ttf-arphic-gbsn00lp apt-get install ttf-arphic-gkai00mp 17. 安裝中文輸入法.如小企鵝或者XCIN. apt-get install xcin 18. 設置 /etc/X11/xinit/xinitrc 中自動運行中文輸入法.增加如下內容: export XMODIFIERS="@im=xcin" xcin & 19. 到這里建議重新啟動一下Debian.然后開始安裝 GNOME 或者 FVWM. 我建議還是安裝 FVWM 這個比較穩定和專業一點. apt-get install fvwm 想漂亮繼續裝個fvwm的主題 apt-get install fvwm-themes 20. OK.現在我們可以直接輸入 startx 進入 fvwm. 如果沒有問題的話.應該可以看到是中文環境了. # 安裝軟件包并且自動檢測并安裝相關軟件. aptitude -R -G install Package # 檢測軟件包的相關資料. # 這里將檢測 Package 軟件包的信息. aptitude show Package # 安裝指定軟件并且指定安裝該軟件的版本. # 這里將安裝 Packge 軟件.版本是2.2.5. aptitude install Package=2.2.5 # 刪除指定軟件.但是不會刪除配置文件. aptitude remove # 刪除軟件包以及所有配置文件. [完全刪除] # 推薦使用.這個命令會自動檢測依賴關系. aptitude purge Debian Linux Install VMware and Xfce www.Debian.org 下載最新的 Debian 3.1 r01 ISO鏡像. Download: http://debian.cn99.com/debian-cd/debian-31r0a-i386-netinst.iso提示: 請確保下載的是 Stable 的版本.否則.如果你使用 Testing 的版本將無法使用 GCC 3.3.5 下載完以后開始安裝.可以選擇安裝英文版的或者是簡體中文版的. 安裝完以后.我們首先安裝 GCC 3.3.5 和 Make.因為VMware將會依賴這兩個軟件包. aptitude install gcc make 提示: 執行命令后請注意確認一下 GCC 的版本號.正確的應該是 GCC 3.3.5. 如果是 GCC 4.0 的那就說明 Debian 是 Testing 的.需要更換正確的版本重新安裝. 安裝完以后推薦安裝VIM來代替VI.如果需要的話安裝FTP Client. aptitude install vim aptitude install ftp 下面進入關鍵的一步.我們需要安裝 Debian 的 kernel-headers 文件. 因為 Debian 下的 VMware 需要該內核頭部文件.并且版本要與你現在的內核一致. 查看當前系統的內核信息: (我的是:2.4.27-2) ls /boot 安裝與自己匹配的 kernel-headers. aptitude install kernel-headers-2.4.27-2 kernel-headers-2.4.27-2-386 因為該文件太長了.我每次都是用通配符匹配的.先查到自己的內核版.比如: aptitude install kernel-headers-2.4.27-2* 注意紅色的部分為自己的內核版本然后加通配符. aptitdue 會自動尋找匹配的文件.一般找到的全部安裝也沒問題. 到這里為止就完成了系統的基本配置.接下來開始安裝X和XFCE. aptitude install x-window-system-core aptitude install xfce4 安裝完畢以后登陸XFCE.通過X的Terminal進行VMare的安裝就可以了.
首先,我尚且不懂javascript,以下心得,完全是通過學習正則表達式的文檔和實踐得出,
寫該文的目的之一也是試圖消除大家對正則表達式的畏懼心理,從簡單之處先入門。
而這其中必定有貽笑大方之處,懇請高手們斧正!
在看本文之前,我在附件中附上了帶我進入正則表達式之門的一個基礎教程,
和一個“正則表達式的練習器”,建議大家先讀此文并粗略的實踐一下,因為
下面的文字都站在這篇文章的基礎上。
---------------------------------------------------------------------------------------------
通過對正則表達式的文檔的研究,以及對本人Maxthon積累下來的廣告過濾條目對應的url的分析,
我有以下幾點心得:
1.正則表達式的優勢,在于高整合度和高精確度,記做到了代碼的簡潔,又疏而不漏,唯一的缺點,不過是
可讀性略差了一點。
2.理論上說,所有的過濾條目都可以用|符號整合到一條正則表達式過濾器里面去,可是這樣既雪上加霜地降低了
可讀性,還不可避免地失去了正則表達式高整合度的優勢。所以,為了能寫出好的正則表達式,分析需要匹配的
文本(在這里就是url了)是必不可少的。
*************************************************************************************
我們常見的url無非是:aaa.bbb.ccc/123456789/........htm,gif等等
需要過濾的地址,由抽象到具體來說,往往有以下特點:
I.全部過濾一個不漏,只要出現就喀嚓,往往是令人深惡痛絕的url。
例(例子中都是用原始的帶通配符的表達式):*.ad.*; */ad/*; *.3721.*/*或者*3721*
II.過濾網址主體,也就是第一個/號之前的所有。
例:www.1000downloads.com/*; www.w163.com/*
III.過濾具體到網頁子目錄,進入若干個/號內
例:http://imguv.21cn.com/images/*; http://union.homeway.com.cn/images/*
之所以能這樣,一般是因為一眼看過去就知道這樣的目錄下沒有好東西,或者看到很多條過濾器中
都出現如下的結構(也表明了網頁作者的風格類似),如這里的images
IV.過濾具體到文件,一般就是*.gif,*.swf,*.js類的文件了
例:http://images.chinabyte.com/*.swf; http://www.5ud.com/images/*.gif
綜上,只要把問題分開考慮即可:
**************************************************************************************
1.一段體
創建一個如下的表達式(注:本文的正則表達式如果不帶前后的兩個/號,加入adblock時需加上)
(\.|\/)(您的輸入)(\.|\/|_) (感謝zlowly給出這個filter模型)
前后兩個括號中表示的是在你的字段前出現"."或"/",字段后出現".","/"或"_"時候考慮你的字段,
沒有這兩個限制的話過濾范圍就過寬了,例:只寫(ad)的話,任何帶有ad二字的url均會被過濾。
例:
/(\.|\/)(tomnews|dns99|ad|banner|3721|taobao|unionsky)(s)?(\d)*(\.|\/|_)/
--其中的(s)?是表示s出現0次或1次,則該filter通配ad或者ads,banner或banners,但由于
可以出現0次,所以其他成分仍然可以往中間的括號里加入,即便沒有unionskys,taobaos。
--后面的(\d)*表示0-9之間的數字,*號表示0次或多次。
正如zlowly所說,為的是對抗網站根據日期顯示不同廣告,例如
.../ad20041020/...
然后無非是在中間那個括號中,用|號分開你所有想要匹配的字段了。
知道了這一點,后面的情況就勢如破竹了。
2.二段體
創建一個這樣的表達式雛形:
\.()\.()
由于已經具體到網址的主體部分,所以前后的/或者.也就不需再出現了
例:
\.(boyis|***|cjt1|w163|ppzxw|1000downloads)\.(net|com)
它等價于
http://*.***.com/*
*.boyis.com*
*.cjt1.net*
*.w163.com*
*.ppzxw.com*
*.1000downloads.com*
這樣看來,應該比較清晰了吧?
3.三段體
例:
(union|adimg|unstat|ulinkjs)\.(baidu|tom|163|sogou)\.(com)
等價于
*adimg.163.com*
*unstat.baidu.com*
*ulinkjs.tom.com*
*union.sogou.com*
或許有朋友問,為什么分開三種情況呢?整合到一起去有沒有可能?
一個很自然的想法是用一個"?"號來表示三段體中的第一段或者出現,或者不出現,
例如想要整合admig.163.com和*.boyis.com,這樣寫的話:
(adimg)?\.(163|boyis)\.(com)
因為adimg這個字段可出現也可不出現,所以實際上www.163.com這樣的地址自然也會被匹配上了,這可不是我們的初衷,
這也就是為什么我覺得應該把各種情況分開考慮,當然更期待高手能解決這個
問題。
其次,鑒于"|"符號會導致自由組合,整合度不應太高。三段體例子中,第一個括號中最好不要放進通用性太強的字段,
如www,否則"|"符號產生自由組合,若要過濾www.ads8.com和adimage.163.com,自由組合的結果當然www.163.com也被過濾了……
有鑒于此,鎖定某一段應該是一個不錯的選擇,我看第三段應該鎖定,也就是說里面沒有“或”符號
例如:結尾為com的全部單獨寫一條,而不要結尾(com|net|org|biz|gov)全加上,
或許會有意想不到的組合的(大家看看whitehouse.com/net/gov就知道了 )
4.具體到文件的,swf/gif類(如有FlashBlock這個擴展的,可以不需要重復過濾swf)
下面是一條很個人的filter,原則也就是在()\.()\.()\/的基本型后面加上了一個.*\.(gif|swf)的文件類型判斷,
鑒于這個時候網站網址變化很大,這個filter的整合度就不高了,很多都是直接貼進去然后用"|"符號分開而已。
(www\.(mydrivers|btbbt|shd|5ud)\.com(\.cn)?|search(\d)?\.btchina\.net|image\.cgame\.cn|
onlinedown\.net|218\.106\.83\.10|down\.20cl\.com)\/(image(s)?|photo)?\/.*\.(gif|swf)
等價于:
http://*.onlinedown.net/*.swf
http://*.onlinedown.net/images/*.gif
http://down.20cl.com/*.gif
http://image.cgame.cn/photo/*.gif
http://search3.btchina.net/images/*.gif
http://www.btbbt.com/*.gif
http://www.shd.com.cn/*.gif
http://www.mydrivers.com/images/*.gif
http://www.mydrivers.com/images/*.swf
http://218.106.83.10/images/*.gif
*****************************************************************************************************************
希望拙作能給大家體會正則表達式的強大、學習使用正則表達式帶來幫助。
在此最有必要感謝的是AdBlock的(作者(們)?)(0次或1次……呵呵),我在AdBlock的設置中也沒找到他(們)?的名字,
網站上也沒找到,對這樣默默無聞的人表示敬佩。
順帶謝謝提供廣告幫助測試AdBlock的所有廣告提供商……
下決心開始學oracle了,用mysql已經有不短的時間了,今天寫下這些算是對自己的一個mysql之旅的一個交代吧.以下僅僅是本人在使用mysql過程中的一點個人的體會,也許存在許多紕漏和錯誤,還請指正!!
首先,為了使一個系統更快,最重要的部分就是基礎設計,不過有些東西是現有情況下無法逾越的,比如說系統常見的瓶頸.
我所能想到的:
1:磁盤尋道能力,以高速硬盤(7200轉/秒),理論上每秒尋道7200次.這是沒有辦法改變的,優化的方法是----用多個硬盤,或者把數據分散存儲.
2:硬盤的讀寫速度,這個速度非常的快(限于本人的知識所限,只知道在每秒幾十甚至上百MB).這個更容易解決--可以從多個硬盤上并行讀寫.
3:cpu.cpu處理內存中的數據,當有相對內存較小的表時,這是最常見的限制因素.
4:內存的限制.當cpu需要超出適合cpu緩存的數據時,緩存的帶寬就成了內存的一個瓶頸---不過現在內存大的驚人,一般不會出現這個問題.
第二步:
(本人使用的是學校網站的linux平臺(Linux ADVX.Mandrakesoft.com 2.4.3-19mdk ))
1:調節服務器參數
用shell>mysqld-help這個命令聲廠一張所有mysql選項和可配置變量的表.輸出以下信息:
possible variables for option--set-variable(-o) are:
back_log current value:5 //要求mysql能有的連接數量.back_log指出在mysql暫停接受連接的時間內有多少個連接請求可以被存在堆棧中
connect_timeout current value:5 //mysql服務器在用bad handshake(不好翻譯)應答前等待一個連接的時間
delayed_insert_timeout current value:200 //一個insert delayed在終止前等待insert的時間
delayed_insert_limit current value:50 //insert delayed處理器將檢查是否有任何select語句未執行,如果有,繼續前執行這些語句
delayed_queue_size current value:1000 //為insert delayed分配多大的隊
flush_time current value:0 //如果被設置為非0,那么每個flush_time 時間,所有表都被關閉
interactive_timeout current value:28800 //服務器在關上它之前在洋交互連接上等待的時間
join_buffer_size current value:131072 //用與全部連接的緩沖區大小
key_buffer_size current value:1048540 //用語索引塊的緩沖區的大小,增加它可以更好的處理索引
lower_case_table_names current value:0 //
long_query_time current value:10 //如果一個查詢所用時間大于此時間,slow_queried計數將增加
max_allowed_packet current value:1048576 //一個包的大小
max_connections current value:300 //允許同時連接的數量
max_connect_errors current value:10 //如果有多于該數量的中斷連接,將阻止進一步的連接,可以用flush hosts來解決
max_delayed_threads current value:15 //可以啟動的處理insert delayed的數量
max_heap_table_size current value:16777216 //
max_join_size current value:4294967295 //允許讀取的連接的數量
max_sort_length current value:1024 //在排序blob或者text時使用的字節數量
max_tmp_tables current value:32 //一個連接同時打開的臨時表的數量
max_write_lock_count current value:4294967295 //指定一個值(通常很小)來啟動mysqld,使得在一定數量的write鎖定之后出現read鎖定
net_buffer_length current value:16384 //通信緩沖區的大小--在查詢時被重置為該大小
query_buffer_size current value:0 //查詢時緩沖區大小
record_buffer current value:131072 //每個順序掃描的連接為其掃描的每張表分配的緩沖區的大小
sort_buffer current value:2097116 //每個進行排序的連接分配的緩沖區的大小
table_cache current value:64 //為所有連接打開的表的數量
thread_concurrency current value:10 //
tmp_table_size current value:1048576 //臨時表的大小
thread_stack current value:131072 //每個線程的大小
wait_timeout current value:28800 //服務器在關閉它3之前的一個連接上等待的時間
根據自己的需要配置以上信息會對你幫助.
第三:
1:如果你在一個數據庫中創建大量的表,那么執行打開,關閉,創建(表)的操作就會很慢.
2:mysql使用內存
a: 關鍵字緩存區(key_buffer_size)由所有線程共享
b:
每個連接使用一些特定的線程空間.一個棧(默認為64k,變量thread_stack),一個連接緩沖區(變量net_buffer_length)和
一個結果緩沖區(net_buffer_length).特定情況下,連接緩沖區和結果緩沖區被動態擴大到max_allowed_packet.
c:所有線程共享一個基存儲器
d:沒有內存影射
e:每個做順序掃描的請求分配一個讀緩沖區(record_buffer)
f:所有聯結均有一遍完成并且大多數聯結甚至可以不用一個臨時表完成.最臨時的表是基于內存的(heap)表
g:排序請求分配一個排序緩沖區和2個臨時表
h:所有語法分析和計算都在一個本地存儲器完成
i:每個索引文件只被打開一次,并且數據文件為每個并發運行的線程打開一次
j:對每個blob列的表,一個緩沖區動態的被擴大以便讀入blob值
k:所有正在使用的表的表處理器被保存在一個緩沖器中并且作為一個fifo管理.
l:一個mysqladmin flush-tables命令關閉所有不在使用的表并且在當前執行的線程結束時標記所有在使用的表準備關閉
3:mysql鎖定表
mysql中所有鎖定不會成為死鎖.
wirte鎖定:
mysql的鎖定原理:a:如果表沒有鎖定,那么鎖定;b否則,把鎖定請求放入寫鎖定隊列中
read鎖定:
mysql的鎖定原理:a:如果表沒有鎖定,那么鎖定;b否則,把鎖定請求放入讀鎖定隊列中
有時候會在一個表中進行很多的select,insert操作,可以在一個臨時表中插入行并且偶爾用臨時表的記錄更新真正的表
a:用low_priority屬性給一個特定的insert,update或者delete較低的優先級
b:max_write_lock_count指定一個值(通常很小)來啟動mysqld,使得在一定數量的write鎖定之后出現read鎖定
c:通過使用set sql_low_priority_updates=1可以從一個特定的線程指定所有的更改應該由較低的優先級完成
d:用high_priority指定一個select
e:如果使用insert....select....出現問題,使用myisam表------因為它支持因為它支持并發的select和insert
4:最基本的優化是使數據在硬盤上占據的空間最小.如果索引做在最小的列上,那么索引也最小.實現方法:
a:使用盡可能小的數據類型
b:如果可能,聲明表列為NOT NULL.
c:如果有可能使用變成的數據類型,如varchar(但是速度會受一定的影響)
d:每個表應該有盡可能短的主索引
e:創建確實需要的索引
f:如果一個索引在頭幾個字符上有唯一的前綴,那么僅僅索引這個前綴----mysql支持在一個字符列的一部分上的索引
g:如果一個表經常被掃描,那么試圖拆分它為更多的表
第四步
1:索引的使用,索引的重要性就不說了,功能也不說了,只說怎么做.
首先要明確所有的mysql索引(primary,unique,index)在b樹中有存儲.索引主要用語:
a:快速找到where指定條件的記錄
b:執行聯結時,從其他表檢索行
c:對特定的索引列找出max()和min()值
d:如果排序或者分組在一個可用鍵的最前面加前綴,排序或分組一個表
e:一個查詢可能被用來優化檢索值,而不用訪問數據文件.如果某些表的列是數字型并且正好是某個列的前綴,為了更快,值可以從索引樹中取出
2:存儲或者更新數據的查詢速度
grant的執行會稍稍的減低效率.
mysql的函數應該被高度的優化.可以用benchmark(loop_count,expression)來找出是否查詢有問題
select
的查詢速度:如果想要讓一個select...where...更快,我能想到的只有建立索引.可以在一個表上運行myisamchk--analyze
來更好的優化查詢.可以用myisamchk--sort-index--sort-records=1來設置用一個索引排序一個索引和數據.
3:mysql優化where子句
3.1:刪除不必要的括號:
((a AND b) AND c OR (((a AND b) AND (a AND d))))>(a AND b AND c) OR (a AND b AND c AND d)
3.2:使用常數
(a<b AND b=c) AND a=100 > b>5 AND b=c AND a=5
3.3:刪除常數條件
(b>=5 AND b=5) OR (b=6 AND 5=5) OR (b=100 AND 2=3) > b=5 OR b=6
3.4:索引使用的常數表達式僅計算一次
3.5:在一個表中,沒有一個where的count(*)直接從表中檢索信息
3.6:所有常數的表在查詢中在任何其他表之前讀出
3.7:對外聯結表最好聯結組合是嘗試了所有可能性找到的
3.8:如果有一個order by字句和一個不同的group by子句或者order by或者group by包含不是來自聯結的第一個表的列,那么創建一個臨時表
3.9:如果使用了sql_small_result,那么msyql使用在內存中的一個表
3.10:每個表的索引給查詢并且使用跨越少于30%的行的索引.
3.11在每個記錄輸出前,跳過不匹配having子句的行
4:優化left join
在mysql中 a left join b按以下方式實現
a:表b依賴于表a
b:表a依賴于所有用在left join條件的表(除了b)
c:所有left join條件被移到where子句中
d:進行所有的聯結優化,除了一個表總是在所有他依賴的表后讀取.如果有一個循環依賴,那么將發生錯誤
e:進行所有的標準的where優化
f:如果在a中有一行匹配where子句,但是在b中沒有任何匹配left join條件,那么,在b中生成的所有設置為NULL的一行
g:如果使用left join來找出某些表中不存在的行并且在where部分有column_name IS NULL測試(column_name為NOT NULL列).那么,mysql在它已經找到了匹配left join條件的一行后,將停止在更多的行后尋找
5:優化limit
a:如果用limit只選擇一行,當mysql需要掃描整個表時,它的作用相當于索引
b:如果使用limit#與order by,mysql如果找到了第#行,將結束排序,而不會排序正個表
c:當結合limit#和distinct時,mysql如果找到了第#行,將停止
d:只要mysql已經發送了第一個#行到客戶,mysql將放棄查詢
e:limit 0一直會很快的返回一個空集合.
f:臨時表的大小使用limit#計算需要多少空間來解決查詢
6:優化insert
插入一條記錄的是由以下構成:
a:連接(3)
b:發送查詢給服務器(2)
c:分析查詢(2)
d:插入記錄(1*記錄大小)
e:插入索引(1*索引)
f:關閉(1)
以上數字可以看成和總時間成比例
改善插入速度的一些方法:
6.1:如果同時從一個連接插入許多行,使用多個值的insert,這比用多個語句要快
6.2:如果從不同連接插入很多行,使用insert delayed語句速度更快
6.3: 用myisam,如果在表中沒有刪除的行,能在select:s正在運行的同時插入行
6.4: 當從一個文本文件裝載一個表時,用load data infile.這個通常比insert快20
倍
6.5:
可以鎖定表然后插入--主要的速度差別是在所有insert語句完成后,索引緩沖區僅被存入到硬盤一次.一般與有不同的insert語句那樣多次存入要
快.如果能用一個單個語句插入所有的行,鎖定就不需要.鎖定也降低連接的整體時間.但是對某些線程最大等待時間將上升.例如:
thread 1 does 1000 inserts
thread 2,3 and 4 does 1 insert
thread 5 does 1000 inserts
如
果不使用鎖定,2,3,4將在1和5之前完成.如果使用鎖定,2,3,4,將可能在1和5之后完成.但是整體時間應該快40%.因為insert,
update,delete操作在mysql中是很快的,通過為多于大約5次連續不斷的插入或更新一行的東西加鎖,將獲得更好的整體性能.如果做很多一行
的插入,可以做一個lock tables,偶爾隨后做一個unlock tables(大約每1000行)以允許另外的線程存取表.這仍然將導致獲得好
的性能.load data infile對裝載數據仍然是很快的.
為了對load data infile和insert得到一些更快的速度,擴大關鍵字緩沖區.
7優化update的速度
它的速度依賴于被更新數據的大小和被更新索引的數量
使update更快的另一個方法是推遲修改,然后一行一行的做很多修改.如果鎖定表,做一行一行的很多修改比一次做一個快
8優化delete速度
刪除一個記錄的時間與索引數量成正比.為了更快的刪除記錄,可以增加索引緩存的大小
從一個表刪除所有行比刪除這個表的大部分要快的多
第五步
1:選擇一種表類型
1.1靜態myisam
這
種格式是最簡單且最安全的格式,它是磁盤格式中最快的.速度來自于數據能在磁盤上被找到的難易程度.當鎖定有一個索引和靜態格式的東西是,它很簡單,只是
行長度乘以數量.而且在掃描一張表時,每次用磁盤讀取來讀入常數個記錄是很容易的.安全性來源于如果當寫入一個靜態myisam文件時導致計算機down
掉,myisamchk很容易指出每行在哪里開始和結束,因此,它通常能收回所有記錄,除了部分被寫入的記錄.在mysql中所有索引總能被重建
1.2動態myisam
這
種格式每一行必須有一個頭說明它有多長.當一個記錄在更改期間變長時,它可以在多于一個位置上結束.能使用optimize tablename或
myisamchk整理一張表.如果在同一個表中有像某些varchar或者blob列那樣存取/改變的靜態數據,將動態列移入另外一個表以避免碎片.
1.2.1壓縮myisam,用可選的myisampack工具生成
1.2.2內存
這種格式對小型/中型表很有用.對拷貝/創建一個常用的查找表到洋heap表有可能加快多個表聯結,用同樣數據可能要快好幾倍時間.
select tablename.a,tablename2.a from tablename,tablanem2,tablename3 where
tablaneme.a=tablename2.a and tablename2.a=tablename3.a and tablename2.c!=0;
為了加速它,可以用tablename2和tablename3的聯結創建一個臨時表,因為用相同列(tablename1.a)查找.
CREATE TEMPORARY TABLE test TYPE=HEAP
SELECT
tablename2.a as a2,tablename3.a as a3
FROM
tablenam2,tablename3
WHERE
tablename2.a=tablename3.a and c=0;
SELECT tablename.a,test.a3 from tablename,test where tablename.a=test.a1;
SELECT tablename.a,test,a3,from tablename,test where tablename.a=test.a1 and ....;
1.3靜態表的特點
1.3.1默認格式.用在表不包含varchar,blob,text列的時候
1.3.2所有的char,numeric和decimal列填充到列寬度
1.3.3非常快
1.3.4容易緩沖
1.3.5容易在down后重建,因為記錄位于固定的位置
1.3.6不必被重新組織(用myisamchk),除非是一個巨量的記錄被刪除并且優化存儲大小
1.3.7通常比動態表需要更多的存儲空間
1.4動態表的特點
1.4.1如果表包含任何varchar,blob,text列,使用該格式
1.4.2所有字符串列是動態的
1.4.3每個記錄前置一個位.
1.4.4通常比定長表需要更多的磁盤空間
1.4.5每個記錄僅僅使用所需要的空間,如果一個記錄變的很大,它按需要被分成很多段,這導致了記錄碎片
1.4.6如果用超過行長度的信息更新行,行被分段.
1.4.7在系統down掉以后不好重建表,因為一個記錄可以是多段
1.4.8對動態尺寸記錄的期望行長度是3+(number of columns+7)/8+(number
of char columns)+packed size of numeric columns+length of strings +(number of
NULL columns+7)/8
對
每個連接有6個字節的懲罰.無論何時更改引起記錄的變大,都有一個動態記錄被連接.每個新連接至少有20個字節,因此下一個變大將可能在同一個連接中.如
果不是,將有另外一個連接.可以用myisamchk -惡毒檢查有多少連接.所有連接可以用myisamchk -r刪除.
1.5壓縮表的特點
1.5.1一張用myisampack實用程序制作的只讀表.
1.5.2解壓縮代碼存在于所有mysql分發中,以便使沒有myisampack的連接也能讀取用myisampack壓縮的表
1.5.3占據很小的磁盤空間
1.5.4每個記錄被單獨壓縮.一個記錄的頭是一個定長的(1~~3個字節)這取決于表的最大記錄.每列以不同的方式被壓縮.一些常用的壓縮類型是:
a:通常對每列有一張不同的哈夫曼表
b:后綴空白壓縮
c:前綴空白壓縮
d:用值0的數字使用1位存儲
e:如果整數列的值有一個小范圍,列使用最小的可能類型來存儲.例如:如果所有的值在0到255之間,一個bigint可以作為一個tinyint存儲
g:如果列僅有可能值的一個小集合,列類型被轉換到enum
h:列可以使用上面的壓縮方法的組合
1.5.5能處理定長或動態長度的記錄,去不能處理blob或者text列
1.5.6能用myisamchk解壓縮
mysql能支持不同的索引類型,但一般的類型是isam,這是一個B樹索引并且能粗略的為索引文件計算大小為(key_length+4)*0.67,在所有的鍵上的總和.
字符串索引是空白壓縮的。如果第一個索引是一個字符串,它可將壓縮前綴如果字符串列有很多尾部空白或是一個總部能甬道全長的varchar列,空白壓縮使索引文件更小.如果很多字符串有相同的前綴.
1.6內存表的特點
mysql內部的heap表使用每偶溢出去的100%動態哈希并且沒有與刪除有關的問題.只能通過使用在堆表中的一個索引來用等式存取東西(通常用'='操作符)
堆表的缺點是:
1.6.1想要同時使用的所有堆表需要足夠的額外內存
1.6.2不能在索引的一個部分搜索
1.6.3不能按順序搜索下一個條目(即,使用這個索引做一個order by)
1.6.4mysql不能算出在2個值之間大概有多少行.這被優化器使用是用來決定使用哪個索引的,但是在另一個方面甚至不需要磁盤尋道
版權聲明:可以任意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明 http://www.chedong.com/tech/apache_install.html
關鍵詞: apache install php resin mod_gzip mod_expire webalizer cronolog
內容摘要:
Apache是一個歷史悠久并且功能十分強大的WEB服務器,但其豐富的功能對于一個新手來說往往不知道從何下手。我個人感覺Apache的設計充
分體現了模塊化設計的優勢,通過在動態模塊加載(DSO)模式下的安裝,任何子應用模塊都可以通過配置文件的簡單修改進行積木式的靈活配置。安裝的過程可
以從簡單的靜態html服務開始,一個模塊一個模塊的學習使用。從單純的HTML靜態服務(core),到復雜的動態頁面服務(core
+ php, core + resin, core + php + mod_gzip, core + resin + mod_expire)。
本文主要從簡化安裝==>性能調優==>維護方便的角度,介紹了WEB服務的規劃、HTTPD安裝/應用模塊配置、升級/維護等過程。
讓Apache和PHP,Resin等應用模塊的獨立升級,完全互不影響。
-
WEB應用容量規劃:根據硬件配置和WEB應用的特點進行WEB服務的規劃及一些簡單的估算公
式;
-
Apache安裝過程:apache的通用的簡化安裝選項,方便以后的應用的模塊化配置;
修改 HARD_SERVER_LIMIT:
vi /path/to/apache_src/src/include/httpd.h
#define HARD_SERVER_LIMIT 2560 <===將原來的 HARD_SERVER_LIMIT 256 后面加個“0”
apache編譯:
./configure --prefix=/home/apache --enable-shared=max
--enable-module=most
-
可選應用模塊/工具的安裝:php resin mod_gzip
mod_expire及各個模塊之間的配合;
mod_php安裝:./configure --with-apxs=/home/apache/bin/apxs
--enable-track-vars --with-mysql
mod_resin安裝:./configure --with-apxs=/home/apache/bin/apxs
mod_gzip安裝:修改Makefile中的 apxs路徑:然后make make install
工具:日志輪循工具cronolog安裝:http://www.cronolog.org
-
升級/維護:看看通用和模塊化的安裝過程如何簡化了日常的升級/維護工作;
按照以上的方法:系統管理員和應用管理員的職責可以清楚的分開,互相獨立。
系統安裝:系統管理員的職責就是安裝好一臺DSO模式的Apache,然后COLON即可,
應用安裝:由應用管理員負責具體應用所需要的模塊,比如PHP Resin等,并設置httpd.conf中相關的配置。
系統升級:系統管理員:升級操作系統/升級Apache
應用升級:應用管理員:升級應用模塊,PHP Resin等。
WEB應用的容量規劃
Apache主要是一個內存消耗型的服務應用,我個人總結的經驗公式:
apache_max_process_with_good_perfermance < (total_hardware_memory /
apache_memory_per_process ) * 2
apache_max_process = apache_max_process_with_good_perfermance * 1.5
為什么會有一個apache_max_process_with_good_perfermance和apache_max_process呢?原
因是在低負載下系統可以使用更多的內存用于文件系統的緩存,從而進一步提高單個請求的響應速度。在高負載下,系統的單個請求響應速度會慢不少,而超過
apache_max_process,系統會因為開始使用硬盤做虛擬內存交換空間而導致系統效率急劇下降。此外,同樣的服務:2G內存的機器的
apache_max_process一般只設置到1G內存的1.7倍,因為Apache本身會因為進程過多導致性能下降。
例子1:
一個apache + mod_php的服務器:一個apache進程一般需要4M內存
因此在一個1G內存的機器上:apache_max_process_with_good_perfermance < (1g / 4m) *
2 = 500
apache_max_process = 500 * 1.5 = 750
所以規劃你的應用讓服務盡量跑在500個進程以下以保持比較高的效率,并設置Apache的軟上限在800個。
例子2:
一個apache + mod_resin的服務器: 一個apache進程一般需要2M內存
在一個2G內存的機器上:
apache_max_process_with_good_perfermance < (2g / 2m ) * 2 = 2000
apache_max_process = 2000 * 1.5 = 3000
以上估算都是按小文件服務估算的(一個請求一般大小在20k以下)。對于文件下載類型站點,可能還會受其他因素:比如帶寬等的影響。
Apache安裝過程
服務器個數的硬上限HARD_SERVER_LIMIT的修改:
在Apache的源代碼中缺省的最大進程數是256個,需要修改apache_1.3.xx/src/include/httpd.h
#ifndef HARD_SERVER_LIMIT
#ifdef WIN32
#define HARD_SERVER_LIMIT 1024
#elif defined(NETWARE)
#define HARD_SERVER_LIMIT 2048
#else
#define HARD_SERVER_LIMIT 2560 <===將原來的HARD_SERVER_LIMIT 256 后面加個“0”
#endif
#endif
解釋:
Apache缺省的最大用戶數是256個:這個配置對于服務器內存還是256M左右的時代是一個非常好的缺省設置,但隨著內存成本的急劇下降,現在大型站
點的服務器內存配置一般比當時要高一個數量級不止。所以256個進程的硬限制對于一臺1G內存的機器來說是太浪費了,而且Apache的軟上限
max_client是受限于HARD_SERVER_LIMIT的,因此如果WEB服務器內存大于256M,都應該調高Apache的
HARD_SERVER_LIMIT。根據個人的經驗:2560已經可以滿足大部分小于2G內存的服務器的容量規劃了(Apache的軟上限的規劃請看后
面)。
Apache的編譯:以下通用的編譯選項能滿足以后任意模塊的安裝
./configure --prefix=/another_driver/apache/ --enable-shared=max
--enable-module=most
比如:
./configure --prefix=/home/apache/ --enable-shared=max
--enable-module=most
解釋:
--prefix=/another_driver/apache/:建議將apache服務安裝在另外一個驅動設備上的目的在于硬盤往往是一個系統使用
壽命最低的設備,因此:將服務數據和系統完全分開,不僅能提高了數據的訪問速度,更重要的,大大方便系統升級,應用備份和恢復過程。
--shared-module=max:使用動態加載方式載入子模塊會帶來5%的性能下降,
但和帶來的配置方便相比更本不算什么:比如模塊升級方
便,系統升級風險降低,安裝過程標準化等
--enable-module=most:用most可以將一些不常用的module編譯進來,比如后面講到的mod_expire是就不在
apache的缺省常用模塊中
如果不想build so, 也可以這樣:
./configure \
"--with-layout=Apache" \
"--prefix=/path/to/apache" \
"--disable-module=access" \
"--disable-module=actions" \
"--disable-module=autoindex" \
"--disable-module=env" \
"--disable-module=imap" \
"--disable-module=negotiation" \
"--disable-module=setenvif" \
"--disable-module=status" \
"--disable-module=userdir" \
"--disable-module=cgi" \
"--disable-module=include" \
"--disable-module=auth" \
"--disable-module=asis"
但結果會發現,這樣編譯對服務性能只能有微小的提高(5%左右),但卻失去了以后系統升級和模塊升級的靈活性,無論是模塊還是Apache本身升級
都必須把Apache和PHP的SOURCE加在一起重新編譯。
apache的缺省配置文件一般比較大:可以使用去掉注釋的方法精簡一下:然后再進入具體的培植過程能讓你更快的定制出你所需要的。
grep -v "#" httpd.conf.default >httpd.conf
需要修改的通用項目有以下幾個:
#服務端口,缺省是8080,建議將整個Apache配置調整好后再將服務端口改到正式服務的端口
Port 8080 => 80
#服務器名:缺省沒有
ServerName name.example.com
#最大服務進程數:根據服務容量預測設置
MaxClients 256 => 800
#缺省啟動服務后的服務進程數:等服務比較平穩后,按平均負載下的httpd個數設置就可以
StartServers 5 => 200
不要修改:
以前有建議說修改:
MinSpareServers 5 => 100
MaxSpareServers 10 => 200
但從我的經驗看來:缺省值已經是非常優化的了,而且讓Apache自己調整子共享進程個數還是比較好的。
特別修改:
在solaris或一些比較容易出現內存泄露的應用上:
MaxRequestsPerChild 0 =>3000
應用模塊和工具的安裝配置:
由于使用模塊動態加載的模式,所以可以方便的通過簡單的配置調整來把Apache定制成你需要的:最好把不常用模塊全部清除(無論處于安全還是效
率)。
比如:對于靜態頁面服務器:就什么其他子模塊都不加載,對于PHP應用就加上PHP模塊,對于JAVA應用就把Resin模塊加載上。而且各種模塊的插拔
非常簡單,這樣調試過程中就可以簡單的通過注釋掉不需要的模塊,而不用重新編譯。
一般說來,可以不需要的模塊包括:
#LoadModule env_module libexec/mod_env.so
#LoadModule negotiation_module libexec/mod_negotiation.so
#LoadModule status_module libexec/mod_status.so
#server side include已經過時了
#LoadModule includes_module libexec/mod_include.so
#不需要將沒有缺省index文件的目錄下所有文件列出
#LoadModule autoindex_module libexec/mod_autoindex.so
#盡量不使用CGI:一直是Apache安全問題最多的地方
#LoadModule cgi_module libexec/mod_cgi.so
#LoadModule asis_module libexec/mod_asis.so
#LoadModule imap_module libexec/mod_imap.so
#LoadModule action_module libexec/mod_actions.so
#不使用安全認證可以大大提高訪問速度
#LoadModule access_module libexec/mod_access.so
#LoadModule auth_module libexec/mod_auth.so
#LoadModule setenvif_module libexec/mod_setenvif.so
最好保留的有:
#用于定制log格式
LoadModule config_log_module libexec/mod_log_config.so
#用于增加文件應用的關聯
LoadModule mime_module libexec/mod_mime.so
#用于缺省index文件:index.php等
LoadModule dir_module libexec/mod_dir.so
可用可不用的有:
#比如:需要在~/username/下調試php可以將
LoadModule userdir_module libexec/mod_userdir.so
#比如:需要將以前的URL進行轉向或者需要使用CGI script-alias
LoadModule alias_module libexec/mod_alias.so
常用的模塊:
最常用的可能就是php和JAVA應用服務器的前端,此外,從性能上講利用mod_gzip可以減少40%左右的流量,減少機器用于傳輸的負載,而
mod_expires可以減少10%左右的重復請求,讓重復的用戶對指定的頁面請求結果都CACHE在本地,根本不向服務器發出請求。
建議將所有MODULE的配置都放到相應模塊的配置內部:<IfModule some_module.c>some_module
config </IfModule>
PHP的安裝:
/path/to/php_src/configure --with-apxs=/path/to/apache/bin/apxs
--with-other-modules-you-need
需要修改的配置:
AddType application/x-httpd-php .php .php3 .any_file_in_php
resin的安裝設置:
/path/to/resin/src/configure --with-apxs=/path/to/apache/bin/apxs
具體的resin設置放在另外一個文件中:比如/home/resin/conf/resin.conf
<IfModule mod_caucho.c>
CauchoConfigFile /path/to/apache/conf/resin.conf
</IfModule>
mod_expires的安裝配置:
<IfModule mod_expires.c>
? ? ExpiresActive on
? ? ExpiresByType image/gif "access plus 1 month"
? ? ExpiresByType text/css "now plus 1 month"
? ? ExpiresDefault "now plus 1 day"
</IfModule>
注釋:
所有的.gif文件1個月以后過期
所有的文件缺省1天以后過期
mod_gzip的安裝
http://www.chedong.com/tech/compress.html
日志的輪循:cronolog的安裝和設置 cronolog可以非常整齊的將日志按天輪循存儲
缺省編譯安裝到/usr/local/bin/下,只需要將配置改成: CustomLog "|/usr/local/sbin/cronolog
/home/apache/logs/%w/access_log" combined
日志將按天截斷并存放在以星期為目錄名的目錄下:比如:log/1是周一,log/5是周五, log/0是周日
用gzip壓縮每天的日志:
30 4 * * * /usr/bin/gzip -f /home/apache/logs/`date -d yesterday
+%w`/access_log
日志的定期刪除:
30 5 * * */usr/bin/find /home/apache/logs/ -name access_log.gz -mtime
+3 |xargs -r /bin/rm -f 升級維護: 由于使用動態模塊加載方式(DSO模式)安裝Apache,Apache的HTTPD核心服務和應用模塊以及應用模塊之間都變的非常靈活,建議將所
有獨立模塊的配置都放在
<IfModule mod_name>
CONFIGURATIONS..
</IfModule>
里,這樣配置非常容易通過屏蔽某個模塊來進行功能調整:比如:
#AddModule mod_gzip.c
就屏蔽了mod_gzip,而其他模塊不首任何影響。 安裝和維護過程: - 系統安裝:系統管理員的職責就是安裝系統和一個按照DSO模式安裝的Apache,然后COLON。
- 應用安裝:由應用管理員負責具體應用所需要的模塊并設置HTTPD。
- 系統升級:系統管理員:升級系統/升級Apache
- 應用升級:應用管理員:升級應用模塊:PHP CAUCHO等
- 系統備份/恢復:如果Apache不在缺省的系統盤上,只需要將Apache目錄備份就可以了,遇到系統分區的硬件問題直接使用預先準備好的
系統COLON,再直接將Apache所在物理盤恢復就行了。
系統管理員:Apache的最簡化安裝 | OS + Apache (httpd core only) | 應用管理員:應用模塊定制 | 純靜態頁面服務
core
| PHP動態頁面
core+so
+php
| JAVA應用
core+so
+caucho
+ssl | 應用例子: | www.example.com
image.example.com
| bbs.example.com | mall.example.com |
例子:Apache和PHP模塊的獨立升級。 如果Apache是按照以下方式安裝:
./configure --prefix=/home/apache --enable-shared=max
--enable-module=most
PHP是按照以下方式安裝:
./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars
--with-mysql
以后單獨升級Apache的時候,仍然是:
./configure --prefix=/home/apache --enable-shared=max
--enable-module=most
make
su
#/home/apache/bin/apachectl stop
#make install
單獨升級php時,仍然是:
./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars
--with-mysql
make
su
#/home/apache/bin/apachectl stop
#make install
#/home/apache/bin/apachectl start
基于反相代理的WEB加速:
squid和mod_proxy都可以實現反相代理加速。而基于緩存的代理加速比起原有WEB服務,速度會有數量級的提升。
小提示: Apache安裝后,缺省根目錄下沒有但很有用的2個文件: 參考文檔: Apache項目 http://httpd.apache.org PHP http://www.php.net Resin http://www.caucho.com mod_gzip http://sourceforge.net/projects/mod-gzip/ Cronolog http://www.cronolog.org mod_expires http://httpd.apache.org/docs/mod/mod_expires.html
面向搜索引擎的CMS設計: http://www.chedong.com/tech/cms.html
原文出處:http://www.chedong.com/tech/apache_install.html">http://www.chedong.com/tech/apache_install.html
??? 如果你碰到重復的情況,就要開始總結了,然后進一步抽象,最后把這個抽象應用到其他普遍情況。慢慢你的功力就提升了
??? ???
極限編程和敏捷軟件開發可以說是一種比較松散的開發管理,一種好的開發狀態,好的迭代和版本控的等工具的使用是基礎,更重要的是個人的創新和團體的交流。
個人的開發狀態是全身心的投入編程,在開發中不斷創新,加入自己的想法,體現到設計中,給人一種驚喜地效果。
??? ??? 團體的交流可以交換各自的想法,很快的找出錯誤,找到更好的設計方法。在一個融且的團體中,團隊中的每個人都是自信的,開心的,而且是高效率的。 ???
???
總結的重要性:在每天,每一個功能的實現,每一個迭代完成,每個項目結束,如果你感覺自己沒進步,那是一件很失敗的事情,你就可以想象你干了十年之后還是
現在的水平,至少我是不希望這樣的。我把這個blog作為一個媒體,記錄下我的每一點進步,每一點的想法,總結自己的不足,希望在不長的一段時間里面看到
一個不同自己。 ??? ???
軟件開發的思想:在實現每個人功能,每一個項目首先一點就是就是要問一下自己,我為什么要完成這個功能?這個功能到底是干嘛的?如果你自己都不清楚的話你
就不能讓客戶明白是怎么回事,也許你完成了功能,客戶也可以利用這個功能完成一些工作,但這個并非一個成功的項目開發。一個成功的項目開發,在開發中都加
入了自己的理解,自己的理念,把自己理念貫穿到每一個功能的開發,這樣開發出來的軟件會是完全不同的軟件。我現在還沒有找到自己的理念到底是什么,現在能
做的就是使自己在那種高效的開發狀態,總結創新,我想我可以找到自己的理念。 ??? ???
軟件開發的目標:在每一個開發開始,自己都要找到一個方向,是方向不是具體的目標,然后開發中不斷向著那個方向前進,最后不一定回到那個方向,你到達的是
有稍許偏差的方向,但是不要緊,如果你真的到了那個原來的方向,那你是失敗的。這也是一個認識過程,不在熟悉一個事物之前的認識肯定是相當初級的,只有你
在不斷的實踐中那個方向才會不斷地清楚起來。其實我們的職業生涯也是如此,我現在對我的目標的認識也在初級階段,希望自己在軟件開發領域能有自己一片天
地,但是方向并不是很明確,但是我并不急,這也是個過程,一個認識的過程。 ?????? 上面是我們把平時聽到的學到的一部分,在加上我自己的理解,記下來以供以后慢慢學習。
?? ? ? 最近同事在碰到一個棘手的問題,用了一天還是調試不出到底哪里出錯了,郁悶中時老大過來就說了一個很好的解決方法,用日志跟蹤.沒過半小時,問題就找到了,定位很準確.這讓我看到日志的重要性了.
??????
一開始我還是寫一些log的,但是那時候覺得好像沒什么必要,后來就從來沒有寫過,因為我想不出他的好處.現在在知道日志真正的作用,而且也是一個很強大
的工具.平時在寫代碼的時候,花個幾秒鐘寫個log,也許會覺得很煩,但是我覺得還是值得的.
?????? 這也是一個習慣的問題,好的程序員之所以是個好的程序員是因為他有好的習慣,這些好的習慣帶來的好處也是很多的.寫日志只是其中一個好習慣,我也要慢慢留意一些好的習慣,慢慢總結.
??? ?? Quartz作為一個開源的作業調度框架,已經廣泛應用于j2ee中,在這里提供一些資料以供參考:
??? ?? 首先是官方網站: http://www.opensymphony.com/quartz/ 這里可以下載源代碼,還有論壇,jira等最原始的資料。?? ??
??? ?? 一個寫的不錯的介紹Quartz的中文文章: 詳細講解Quartz如何從入門到精通,英文不好的可以參考這個。這篇文章大致的講了Quartz的框架,很多細節并沒有涉及,這也難怪,一篇文章不可能都寫上去的。
??? ??
如果你想繼續了解Quartz,官方網站有面向開發人員的文檔,但是放在不起眼的角落,我以前閑逛時找到,現在一時找不到,什么時候什么找到了在加上去,我在
另外地方找到其中的幾章,這兩章是其中最重要的兩章,可以作為參考,http://javaforge.com/proj/doc.do?doc_id=
1740
??? ?? 如果你還要繼續深入研究,就請自己到cvs去下載最新源碼,自己研讀了,祝大家成功,我會接下去寫一些自己從中學到的東西。
在完全剛裝好的fc4上用jdbc進行數據庫操作出現了一下錯誤: ?java.net.SocketException: Invalid argument or cannot assign requested address at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:305) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:171) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:158) at java.net.Socket.connect(Socket.java:452) at java.net.Socket.connect(Socket.java:402) at java.net.Socket.<init>(Socket.java:309) at java.net.Socket.<init>(Socket.java:124)? ?????? 這是IP地址的問題,在FC4中默認的是IPv6 socket,JDK1.4支持的應該是IPv4,具體原因可以查看SUN公司給出的解釋. 解決辦法是在運行JAVA程序時加上 -Djava.net.preferIPv4Stack=true 如:
java -Djava.net.preferIPv4Stack=true application.
但是這個在每次都要加上這句話,另有解決方法是 修改 /etc/modprobe.conf 文件,增加
alias net-pf-10 off alias ipv6 off
這樣就不用增加參數 "-Djava.net.preferIPv4Stack=true ",重起即可.
但是既要ipv6又能解決這個問題的方法還沒找到。希望高人指點
附:最近在弄cc,也找了一些ant資料,順便轉載記錄一下
轉自http://ant.apache.org/manual/OptionalTasks/junit.html
Description
This task runs tests from the JUnit testing framework. The latest version of
the framework can be found at http://www.junit.org. This task has been tested
with JUnit 3.0 up to JUnit 3.8.1; it won't work with versions prior to JUnit
3.0.
Note: This task depends on external libraries not included
in the Ant distribution. See Library Dependencies for more
information.
Note: You must have junit.jar and the class
files for the <junit> task in the same classpath. You can do
one of:
- Put both
junit.jar and the optional tasks jar file in
ANT_HOME/lib .
- Do not put either in
ANT_HOME/lib , and instead include their
locations in your CLASSPATH environment variable.
- Do neither of the above, and instead, specify their locations using a
<classpath> element in the build file. See the FAQ for
details.
Tests are defined by nested test or batchtest tags
(see nested elements).
Parameters
Attribute
|
Description
|
Required
|
printsummary |
Print one-line statistics for each testcase. Can take the values
on , off , and withOutAndErr .
withOutAndErr is the same as on but also includes the
output of the test as written to System.out and
System.err . |
No; default is off . |
fork |
Run the tests in a separate VM. |
No; default is off . |
forkmode |
Controls how many Java Virtual Machines get created if you want
to fork some tests. Possible values are "perTest" (the default), "perBatch" and
"once". "once" creates only a single Java VM for all tests while "perTest"
creates a new VM for each TestCase class. "perBatch" creates a VM for each
nested <batchtest> and one collecting all nested
<test> s. Note that only tests with the same settings of
filtertrace , haltonerror , haltonfailure ,
errorproperty and failureproperty can share a VM, so
even if you set forkmode to "once", Ant may have to create more
than a single Java VM. This attribute is ignored for tests that don't get forked
into a new Java VM. since Ant 1.6.2 |
No; default is perTest . |
haltonerror |
Stop the build process if an error occurs during the test
run. |
No; default is off . |
errorproperty |
The name of a property to set in the event of an error. |
No |
haltonfailure |
Stop the build process if a test fails (errors are considered
failures as well). |
No; default is off . |
failureproperty |
The name of a property to set in the event of a failure (errors
are considered failures as well). |
No. |
filtertrace |
Filter out Junit and Ant stack frames from error and failure
stack traces. |
No; default is on . |
timeout |
Cancel the individual tests if they don't finish in the given
time (measured in milliseconds). Ignored if fork is disabled. |
No |
maxmemory |
Maximum amount of memory to allocate to the forked VM. Ignored if
fork is disabled. |
No |
jvm |
The command used to invoke the Java Virtual Machine, default is
'java'. The command is resolved by java.lang.Runtime.exec() .
Ignored if fork is disabled. |
No; default is java . |
dir |
The directory in which to invoke the VM. Ignored if
fork is disabled. |
No |
newenvironment |
Do not propagate the old environment when new environment
variables are specified. Ignored if fork is disabled. |
No; default is false . |
includeantruntime |
Implicitly add the Ant classes required to run the tests and
JUnit to the classpath in forked mode. Note: Please read the Ant FAQ if you want to set this
to false and use the XML formatter at the same time. |
No; default is true . |
showoutput |
Send any output generated by tests to Ant's logging system as
well as to the formatters. By default only the formatters receive the
output. |
No |
tempdir |
Where Ant should place temporary files. Since Ant
1.6. |
No; default is the project's base
directory. |
reloading |
Whether or not a new classloader should be instantiated for each
test case. Ignore if fork is set to true. Since Ant
1.6. |
No; default is
true . |
By using the errorproperty and failureproperty
attributes, it is possible to perform setup work (such as starting an external
server), execute the test, clean up, and still fail the build in the event of a
failure.
The filtertrace attribute condenses error and failure stack
traces before reporting them. It works with both the plain and XML formatters.
It filters out any lines that begin with the following string patterns:
"junit.framework.TestCase" "junit.framework.TestResult" "junit.framework.TestSuite" "junit.framework.Assert." "junit.swingui.TestRunner" "junit.awtui.TestRunner" "junit.textui.TestRunner" "java.lang.reflect.Method.invoke(" "sun.reflect." "org.apache.tools.ant."
The <junit> task supports a nested
<classpath> element that represents a PATH like structure.
jvmarg
If fork is enabled, additional parameters may be passed to the
new VM via nested <jvmarg> elements. For example:
<junit fork="yes"> <jvmarg value="/-Djava.compiler=NONE"/> ... </junit>
would run the test in a VM without JIT.
<jvmarg> allows all attributes described in Command-line Arguments.
sysproperty
Use nested <sysproperty> elements to specify system
properties required by the class. These properties will be made available to the
VM during the execution of the test (either ANT's VM or the forked VM, if
fork is enabled). The attributes for this element are the same as
for environment variables.
<junit fork="no"> <sysproperty key="basedir" value="${basedir}"/> ... </junit>
would run the test in ANT's VM and make the basedir property
available to the test.
syspropertyset
You can specify a set of properties to be used as system properties with syspropertysets.
since Ant 1.6.
env
It is possible to specify environment variables to pass to the forked VM via
nested <env> elements. For a description of the
<env> element's attributes, see the description in the exec task.
Settings will be ignored if fork is disabled.
bootclasspath
The location of bootstrap class files can be specified using this PATH like structure - will be ignored if
fork is not true or the target VM doesn't support it (i.e.
Java 1.1).
since Ant 1.6.
permissions
Security permissions can be revoked and granted during the execution of the
class via a nested permissions element. For more information please see
permissions
Settings will be ignored if fork is enabled.
since Ant 1.6.
assertions
You can control enablement of Java 1.4 assertions with an <assertions>
subelement.
Assertion statements are currently ignored in non-forked mode.
since Ant 1.6.
formatter
The results of the tests can be printed in different formats. Output will
always be sent to a file, unless you set the usefile attribute to
false . The name of the file is determined by the name of the test
and can be set by the outfile attribute of
<test> .
There are three predefined formatters - one prints the test results in XML
format, the other emits plain text. The formatter named brief will
only print detailed information for testcases that failed, while
plain gives a little statistics line for all test cases. Custom
formatters that need to implement
org.apache.tools.ant.taskdefs.optional.junit.JUnitResultFormatter
can be specified.
If you use the XML formatter, it may not include the same output that your
tests have written as some characters are illegal in XML documents and will be
dropped.
Note: Please read the Ant FAQ if you want to set the
fork attribute to true , the includeAntRuntime attribute to
false and use the XML formatter at the same time.
Attribute
|
Description
|
Required
|
type |
Use a predefined formatter (either xml ,
plain , or brief ). |
Exactly one of these. |
classname |
Name of a custom formatter class. |
extension |
Extension to append to the output filename. |
Yes, if classname has been used. |
usefile |
Boolean that determines whether output should be sent to a
file. |
No; default is true . |
if |
Only use formatter if the named property is set. |
No; default is true . |
unless |
Only use formatter if the named property is not set. |
No; default is true . |
test
Defines a single test class.
Attribute
|
Description
|
Required
|
name |
Name of the test class. |
Yes |
fork |
Run the tests in a separate VM. Overrides value set in
<junit> . |
No |
haltonerror |
Stop the build process if an error occurs during the test run.
Overrides value set in <junit> . |
No |
errorproperty |
The name of a property to set in the event of an error. Overrides
value set in <junit> . |
No |
haltonfailure |
Stop the build process if a test fails (errors are considered
failures as well). Overrides value set in <junit> . |
No |
failureproperty |
The name of a property to set in the event of a failure (errors
are considered failures as well). Overrides value set in
<junit> . |
No |
filtertrace |
Filter out Junit and Ant stack frames from error and failure
stack traces. Overrides value set in <junit> . |
No; default is on . |
todir |
Directory to write the reports to. |
No; default is the current directory. |
outfile |
Base name of the test result. The full filename is determined by
this attribute and the extension of formatter . |
No; default is TEST- name,
where name is the name of the test specified in the name
attribute. |
if |
Only run test if the named property is set. |
No |
unless |
Only run test if the named property is not set. |
No |
Tests can define their own formatters via nested
<formatter> elements.
batchtest
Define a number of tests based on pattern matching.
batchtest collects the included files from any number of nested
<fileset> s. It then
generates a test class name for each file that ends in .java or
.class .
Attribute
|
Description
|
Required
|
fork |
Run the tests in a separate VM. Overrides value set in
<junit> . |
No |
haltonerror |
Stop the build process if an error occurs during the test run.
Overrides value set in <junit> . |
No |
errorproperty |
The name of a property to set in the event of an error. Overrides
value set in <junit> . |
No |
haltonfailure |
Stop the build process if a test fails (errors are considered
failures as well). Overrides value set in <junit> . |
No |
failureproperty |
The name of a property to set in the event of a failure (errors
are considered failures as well). Overrides value set in
<junit> |
No |
filtertrace |
Filter out Junit and Ant stack frames from error and failure
stack traces. Overrides value set in <junit> . |
No; default is on . |
todir |
Directory to write the reports to. |
No; default is the current directory. |
if |
Only run tests if the named property is set. |
No |
unless |
Only run tests if the named property is not
set. |
No |
Batchtests can define their own formatters via nested
<formatter> elements.
Examples
<junit> <test name="my.test.TestCase"/> </junit>
Runs the test defined in my.test.TestCase in the same VM. No
output will be generated unless the test fails.
<junit printsummary="yes" fork="yes" haltonfailure="yes"> <formatter type="plain"/> <test name="my.test.TestCase"/> </junit>
Runs the test defined in my.test.TestCase in a separate VM. At
the end of the test, a one-line summary will be printed. A detailed report of
the test can be found in TEST-my.test.TestCase.txt . The build
process will be stopped if the test fails.
<junit printsummary="yes" haltonfailure="yes"> <classpath> <pathelement location="${build.tests}"/> <pathelement path="${java.class.path}"/> </classpath>
<formatter type="plain"/>
<test name="my.test.TestCase" haltonfailure="no" outfile="result"> <formatter type="xml"/> </test>
<batchtest fork="yes" todir="${reports.tests}"> <fileset dir="${src.tests}"> <include name="**/*Test*.java"/> <exclude name="**/AllTests.java"/> </fileset> </batchtest> </junit>
Runs my.test.TestCase in the same VM, ignoring the given
CLASSPATH; only a warning is printed if this test fails. In addition to the
plain text test results, for this test a XML result will be output to
result.xml . Then, for each matching file in the directory defined
for ${src.tests} a test is run in a separate VM. If a test fails,
the build process is aborted. Results are collected in files named
TEST- name.txt and written to
${reports.tests} .
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
26 | 27 | 28 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|
常用鏈接
留言簿(6)
隨筆分類
隨筆檔案
文章檔案
相冊
我關注的文章
我聽的音樂
我瀏覽的網站
我的好友
我看的書
我看社會
搜索
最新評論

閱讀排行榜
評論排行榜
|
|