@import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
等到符鬼很餓(能喂2個(gè)東西的時(shí)候),找到兩個(gè)相同的喂食物,比如2個(gè)獅子精【有一個(gè)“獅子吼”技能】,設(shè)此時(shí)的符鬼有一個(gè)技能是“強(qiáng)音波”,點(diǎn)擊“獅子吼”兩次,符鬼的那個(gè)技能就變成了“無(wú)” !@import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
@import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
在
人成熟與不成熟跟年齡沒(méi)有關(guān)系。人成熟不成熟,就是你能不能站在對(duì)方的角度去看待事物,就是能不能把我的世界變成你的世界。這個(gè)社會(huì)有很多的成年人,還沒(méi)有脫離幼稚的行為。一點(diǎn)小事情就跟別人爭(zhēng)來(lái)爭(zhēng)去。
他不懂得只有春天播種,秋天才會(huì)收獲。很多人在做任何事情的時(shí)候,剛剛付出一點(diǎn)點(diǎn),馬上就要得到回報(bào)。(學(xué)鋼琴,學(xué)英語(yǔ)等等,剛開(kāi)始就覺(jué)得難,發(fā)現(xiàn)不行,立即就要放棄。)很多人做生意,開(kāi)始沒(méi)有什么成績(jī),就想著要放棄,有的人一個(gè)月放棄,有的人三個(gè)月放棄,有的人半年放棄,有的人一年放棄,我不明白人們?yōu)槭裁摧p易放棄,但是我知道,放棄是一種習(xí)慣,一種典型失敗者的習(xí)慣。所以說(shuō)你要有眼光,要看得更遠(yuǎn)一些,眼光是用來(lái)看未來(lái)的!
對(duì)在生活中有放棄習(xí)慣的人,有一句話一定要送給你:"成功者永不放棄,放棄者永不成功"。那為什么很多的人做事容易放棄呢?美國(guó)著名成功學(xué)大師拿破侖希爾說(shuō)過(guò):
今天你把什么機(jī)會(huì)都放到他的面前,他都會(huì)說(shuō)"不"。就是今天你開(kāi)飯店很成功,你把你開(kāi)飯店的成功經(jīng)驗(yàn),發(fā)自內(nèi)心的告訴你的親朋好友,讓他們也去開(kāi)飯店,你能保證他們每個(gè)人都會(huì)開(kāi)飯店嗎?是不是照樣有人不干。
所以這是窮人一個(gè)非常典型的心態(tài),他會(huì)說(shuō):"你行,我可不行!"。一夜暴富的表現(xiàn)在于,你跟他說(shuō)任何的生意,他的第一個(gè)問(wèn)題就是"掙不掙錢(qián)",你說(shuō)"掙錢(qián)",他馬上就問(wèn)第二個(gè)問(wèn)題"容易不容易",你說(shuō)"容易",這時(shí)他跟著就問(wèn)第三個(gè)問(wèn)題"快不快",你說(shuō)"快"!這時(shí)他就說(shuō)"好,我做!"呵呵,你看,他就這么的幼稚!
大家想一想,在這個(gè)世界上有沒(méi)有一種:"又掙錢(qián),又容易,又快的",沒(méi)有的,即使有也輪不到我們啊,所以說(shuō)在生活中,我們一定要懂得付出。那為什么你要付出呢?因?yàn)槟闶菫榱俗非竽愕膲?mèng)想而付出的,人就是為了希望和夢(mèng)想活著的,如果一個(gè)人沒(méi)有夢(mèng)想,沒(méi)有追求的話,那一輩子也就沒(méi)有什么意義了!
在生活中你想獲得什么,你就得先付出什么。你想獲得時(shí)間,你就得先付出時(shí)間,你想獲得金錢(qián),你得先付出金錢(qián)。你想得到愛(ài)好,你得先犧牲愛(ài)好。你想和家人有更多的時(shí)間在一起,你先得和家人少在一起。
但是,有一點(diǎn)是明確的,你在這個(gè)項(xiàng)目中的付出,將會(huì)得到加倍的回報(bào)。就象一粒種子,你把它種下去以后,然后澆水,施肥,鋤草,殺蟲(chóng)。最后你收獲的是不是幾十倍,上百倍的回報(bào)。
你要改變自己的思考方式和行為模式。你要改變你的壞習(xí)慣。其實(shí),人與人之間能力是沒(méi)有多大區(qū)別,區(qū)別在于思考方式的不同。一件事情的發(fā)生,你去問(wèn)成功者和失敗者,他們的回答是不一樣的,甚至是相違背的。
我們今天的不成功是因?yàn)槲覀兊乃伎挤绞讲怀晒ΑR粋€(gè)好的公式是:當(dāng)你種植一個(gè)思考的種子,你就會(huì)有行動(dòng)的收獲,當(dāng)你把行動(dòng)種植下去,你會(huì)有習(xí)慣的收獲,當(dāng)你再把習(xí)慣種植下去,你就會(huì)有個(gè)性的收獲,當(dāng)你再把個(gè)性種植下去,就會(huì)決定你的命運(yùn)。
很多人有很多的壞習(xí)慣,如:看電視,打麻將,喝酒,泡舞廳,他們也知道這樣的習(xí)慣不好,但是他們?yōu)槭裁床辉敢飧淖兡兀恳驗(yàn)楹芏嗳藢幵溉淌苣切┎缓玫纳罘绞剑膊辉敢馊淌芨淖儙?lái)的痛苦
你在生活中喜歡那些人呢?是那些整天愁眉苦臉,整天抱怨這個(gè)抱怨哪個(gè)的人,還是喜歡那些整天開(kāi)開(kāi)心心的人。如果你在生活中是那些抱怨的,消極的人的話,你一定要改變你性格中的缺陷。如果你不改變的話,你是很難適應(yīng)這個(gè)社會(huì)的。你也是很難和別人合作的。
生活當(dāng)中你要知道,你怎樣對(duì)待生活,生活也會(huì)怎樣對(duì)待你,你怎樣對(duì)待別人,別人也會(huì)怎樣對(duì)待你。所以你不要消極,抱怨。你要積極,永遠(yuǎn)的積極下去,就是那句話:成功者永不抱怨,抱怨者永不成功
如果你想成功,一定要學(xué)會(huì)管理好這五個(gè)因素,為什么把情緒放在第一位呢?把健康放在第二位呢?是因?yàn)槿绻阍購(gòu)?qiáng)的身體,如果你情緒不好,就會(huì)影響到你的身體,現(xiàn)在一個(gè)人要成功20%靠的是智商,80%靠的是情商,所以你要控制好你的情緒,情緒對(duì)人的影響是非常大的。人與人之間,不要為了一點(diǎn)點(diǎn)小事情,就暴跳如雷,這樣是不好的。
你就會(huì)成為一個(gè)受社會(huì)大眾歡迎的人。如果你想讓你的伙伴更加的優(yōu)秀,很簡(jiǎn)單,永遠(yuǎn)的激勵(lì)和贊美他們。
即使他們的確有毛病,那應(yīng)該怎么辦呢?這時(shí)是不是應(yīng)該給他們建議,在生活中你會(huì)發(fā)現(xiàn)有這樣一個(gè)現(xiàn)象,有人給別人建議的時(shí)候,別人能夠接受,但是有建議的時(shí)候別人就會(huì)生氣。其實(shí)建議的方式是最重要的,就是"三明治"贊美,建議,再贊美!
如果你帶有很強(qiáng)的目的性去贊美,那就是拍馬屁。當(dāng)你贊美別人時(shí)候,你要大聲的說(shuō)出來(lái),當(dāng)你想批評(píng)別人的時(shí)候,一定要咬住你的舌頭!
其實(shí)人和動(dòng)物之間有很多的相似之處,動(dòng)物的自我保護(hù)意識(shí)比人更強(qiáng)(嬰兒與小豬)但是,人和動(dòng)物最大的區(qū)別在于,人會(huì)學(xué)習(xí),人會(huì)思考。人是要不斷學(xué)習(xí)的,你千萬(wàn)不要把你的天賦潛能給埋沒(méi)了,一定要學(xué)習(xí),一定要有一個(gè)空杯的心態(tài)。我們象誰(shuí)去學(xué)習(xí)呢?就是直接向成功人士學(xué)習(xí)!
你要永遠(yuǎn)學(xué)習(xí)積極正面的東西,不看,不聽(tīng)那些消極,負(fù)面的東西。一旦你吸收了那些有毒的思想,它會(huì)腐蝕你的心靈和人生 的。在這個(gè)知識(shí)經(jīng)濟(jì)的時(shí)代里,學(xué)習(xí)是你通向未來(lái)的唯一護(hù)照。在這樣一個(gè)速度,變化,危機(jī)的時(shí)代,你只有不斷的學(xué)習(xí)你才不會(huì)被這個(gè)時(shí)代所拋棄,一定要有學(xué)習(xí),歸零的心態(tài)。去看每一個(gè)人的優(yōu)點(diǎn),"三人行,必有我?guī)熞玻ⅲ?/div>
人不成熟的第五個(gè)特征:做事情不靠信念,靠人言。
我們說(shuō)相信是起點(diǎn),堅(jiān)持是終點(diǎn)。很多人做事不靠信念,喜歡聽(tīng)別人怎么說(shuō)。對(duì)自己所做的事業(yè),沒(méi)有100%的信心,相信和信念是兩個(gè)不同的概念,相信是看得見(jiàn)的,信念是看不見(jiàn)的。
信念是人類(lèi)的一種態(tài)度,但是很多的人他們做事,不靠信念的,而是要聽(tīng)別人怎么說(shuō),你要登上山峰,要問(wèn)那些爬到山頂?shù)娜耍f(wàn)不能問(wèn)沒(méi)有爬過(guò)山的人。
這里不是說(shuō)別人的建議不要去聽(tīng),你可以去參考,但是你要記住,你來(lái)做這個(gè)生意是為了實(shí)現(xiàn)你的夢(mèng)想,實(shí)現(xiàn)你自己的價(jià)值。其他的人是不會(huì)關(guān)心你的夢(mèng)想的,只有你自己關(guān)心你自己的夢(mèng)想,只有你自己關(guān)心你自己能否真正的成功。這才是最重要的!
只要你的選擇是正確的,永遠(yuǎn)不要在乎別人怎么說(shuō),以上的人不成熟的五個(gè)特征,你們自己去對(duì)照,那一個(gè)特征是你有的,你一定要在最短的時(shí)間里改正,只要你相信你自己能夠戰(zhàn)勝自己的不成熟,你就會(huì)逐漸的成長(zhǎng),成熟起來(lái),你就會(huì)得到你想要的那種生活。你就會(huì)實(shí)現(xiàn)你時(shí)間自由、財(cái)務(wù)自由、精神自由的人生夢(mèng)想!
設(shè)置了 scanPeriod 之后,過(guò)了好長(zhǎng)時(shí)間,都不生效,后來(lái) debug 代碼。發(fā)現(xiàn)了下面這段。
private volatile long mask = 0xF;
@Override
public FilterReply decide(Marker marker, Logger logger, Level level,
String format, Object[] params, Throwable t) {
if (!isStarted()) {
return FilterReply.NEUTRAL;
}
// for performance reasons, skip change detection (MASK-1) times out of MASK.
// Only once every MASK calls is change detection code executed
// Note that MASK is a variable itself.
if (((invocationCounter++) & mask) != mask) {
return FilterReply.NEUTRAL;
}
long now = System.currentTimeMillis();
synchronized (configurationWatchList) {
updateMaskIfNecessary(now);
if (changeDetected(now)) {
// Even though reconfiguration involves resetting the loggerContext,
// which clears the list of turbo filters including this instance, it is
// still possible for this instance to be subsequently invoked by another
// thread if it was already executing when the context was reset.
disableSubsequentReconfiguration();
detachReconfigurationToNewThread();
}
}
return FilterReply.NEUTRAL;
}
這行 if (((invocationCounter++) & mask) != mask) {
mask = 0xf,其實(shí)要每循環(huán) 0xf 次,也就是 15 次,才會(huì)去 check 一次是否要更新,也就是說(shuō),不管過(guò)了多久,如果沒(méi)到這 15 次,也不會(huì)去檢查是否更新配置。
也就是說(shuō),我多打幾次 log,配置文件就生效了。
@import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
spring security(下簡(jiǎn)寫(xiě)為 ss)控制的安全主要有兩方面,Web 和 Method Call,這兩個(gè)方面的權(quán)限控制有比較多的相通的設(shè)計(jì),也有一些特別的功能。比如 Method Call 可以做 After Invocation 控制,而 Web 可以做 Ip 地址控制。
這里面有兩個(gè)最基本的概念:authentication manager 和 access decision manager,前者控制認(rèn)證,后都控制鑒權(quán)。
1. 在 ss 的認(rèn)證系統(tǒng)中,默認(rèn)的實(shí)現(xiàn)幫助我們提供了三個(gè)概念,用戶(user),角色(authority,一般存 role)和組(group),三者的關(guān)系是,組、角色與用戶都是多對(duì)多關(guān)系,組和角色間沒(méi)關(guān)系,默認(rèn)是不啟用組的。后續(xù),在 Acl 權(quán)限管理中,可以看到角色之間,是可以有包含(樹(shù)形?)關(guān)系的。
2. 在 ss 的鑒權(quán)系統(tǒng)中,明顯會(huì)比認(rèn)證復(fù)雜得多。有 AccessDecisionManager, AccessDecisionVoter(前置), AfterInvocationProvider(后置), RoleHierarchy, SidRetrievalStrategy, LookupStrategy, PermissionGrantingStrategy, SecurityExpressionHandler, AclService, MutableAclService, AclCache 概念過(guò)多了,要一個(gè)一個(gè)解釋
a) 中心是 AccessDecisionManager,主要負(fù)責(zé) AccessDecisionVoter 的管理,默認(rèn)提供了3種實(shí)現(xiàn):1. AffirmativeBased 如果有任何一個(gè)投票器允許訪問(wèn),請(qǐng)求將被立刻允許,而不管之前可能有的拒絕決定。2. ConsensusBased 多數(shù)票(允許或拒絕)決定了結(jié)果,平局的投票 和空票(全是棄權(quán)的)的結(jié)果是可配置的。3. UnanimousBased 所有的投票器必須全是允許的,否則訪問(wèn)將 被拒絕。
AccessDecisionManager 在用于 Web 和 Method Call 兩種情況下,可能是不一致的,因?yàn)楣δ芤膊灰恢隆?br />
b) Method Call 除了使用 AccessDecisionManager 進(jìn)行權(quán)限判斷外,還可以增加 AfterInvocationProvider 來(lái)進(jìn)行出口數(shù)據(jù)的判斷,默認(rèn)提供了 3 種。
1) PostInvocationAdviceProvider: 需要提供一個(gè) PostInvocationAuthorizationAdvice,默認(rèn)實(shí)現(xiàn)只有一個(gè),就是 ExpressionBasedPostInvocationAdvice,可以通過(guò) spel 來(lái)進(jìn)行權(quán)限判斷。注意 ExpressionBasedPostInvocationAdvice 中需要提供一個(gè) MethodSecurityExpressionHandler,能夠創(chuàng)建出一個(gè) MethodSecurityExpressionOperations,放到 spel context 中,供 spel function 調(diào)用,這樣的方式,在后續(xù)很常見(jiàn)。
2) AclEntryAfterInvocationProvider 和 AclEntryAfterInvocationCollectionFilteringProvider : 這兩種都差不多,主要依賴(lài) AclService, ObjectIdentityRetrievalStrategy, SidRetrievalStrategy 來(lái)配合,檢查返回值的權(quán)限。Collection 版本的,可以把無(wú)權(quán)限的數(shù)據(jù)去掉,只留下有權(quán)限的數(shù)據(jù)。
c) RoleHierarchy 提供了角色之間的關(guān)系,提供了兩個(gè)實(shí)現(xiàn),一個(gè)是沒(méi)關(guān)系的,直接把 user 的 role 返回,另外一個(gè)是有繼承關(guān)系的。繼承關(guān)系實(shí)現(xiàn)挺有意思的,能夠處理多級(jí)的 include 關(guān)系,比較好用。
RoleHierarchy 的使用比較復(fù)雜,會(huì)被 AccessDecisionVoter, SidRetrievalStrategy, SecurityExpressionHandler 用到,SecurityExpressionHandler 又會(huì)被 AccessDecisionVoter 用到,所以還是有點(diǎn)兒混亂。
具體的說(shuō) SecurityExpressionHandler 會(huì)用到 PermissionEvaluator 和 RoleHierarchy,PermissionEvaluator 的一個(gè)實(shí)現(xiàn) AclPermissionEvaluator 會(huì)用到 SidRetrievalStrategy。
d) SidRetrievalStrategy 和 RoleHierarchy 的功能比較接近,比 RoleHierarchy 高一個(gè)抽象層次,功能上也有所區(qū)別,是從一個(gè) authentication 拿到所有相關(guān)的 Sid(包括 Role(GrantedAuthoritySid) 和 User(PrincipalSid)),而 RoleHierarchy 只包括了 Role(GrantedAuthoritySid)的繼承關(guān)系。
e) LookupStrategy 通過(guò) ObjectIdentity 和 Sid 把相關(guān)的 Acl 查詢出來(lái)。可以在 LookupStrategy 擴(kuò)展 Acl 和 Ace 的功能,比如在 Ace 上面加上時(shí)間的條件限制,就需要自己定義 LookupStrategy,把時(shí)間條件從數(shù)據(jù)庫(kù)查詢出來(lái),并放到自定義的 Ace 當(dāng)中。
但這件事情非常麻煩,因?yàn)槟J(rèn)實(shí)現(xiàn)的 BasicLookupStrategy 是個(gè) Final 的類(lèi),所以只能自己直接實(shí)現(xiàn)接口,無(wú)法使用現(xiàn)有的功能。
LookupStrategy 會(huì)生成 Acl,而最終的權(quán)限驗(yàn)證是由 Acl 完成的,如果想驗(yàn)證帶時(shí)間條件的 Ace,需要給 Acl 設(shè)置自定義的帶有檢查時(shí)間功能的 PermissionGrantingStrategy,實(shí)際上,這個(gè) PermissionGrantingStrategy 會(huì)首先設(shè)置給 LookupStrategy,LookupStrategy 在創(chuàng)建 Acl 的時(shí)候,再放到 Acl 中去。
f) SecurityExpressionHandler 能夠執(zhí)行 spel,得到是否可以訪問(wèn)的結(jié)果,它的子類(lèi)都是繼承自 AbstractSecurityExpressionHandler 的,有一個(gè)非常重要的方法是 SecurityExpressionOperations createSecurityExpressionRoot(Authentication authentication, T invocation),創(chuàng)建一個(gè) SecurityExpressionOperations 放到 EvaluationContext 中去,提供 spel 中執(zhí)行的方法實(shí)現(xiàn)。比如 SecurityExpressionOperations 的一個(gè)抽象實(shí)現(xiàn) SecurityExpressionRoot 中,就包含了大量的權(quán)限驗(yàn)證方法,如 hasRole, hasPermission 等常用的功能。
g) AclService, MutableAclService, AclCache 概念比較簡(jiǎn)單,AclService 是通過(guò) LookupStrategy 查詢 Acl,自已可以查詢 ObjectIdentity 的父子關(guān)聯(lián)關(guān)系,MutableAclService 提供了修改的能力,AclCache 為 AclService 提供緩存,默認(rèn)的實(shí)現(xiàn)了一個(gè) EhCacheBasedAclCache。
3. ss 的鑒權(quán)模型 Sid, ObjectIdentity, Acl, Ace, Permission
a) Sid: 是中心,所有的授權(quán)會(huì)關(guān)聯(lián)在 Sid 上面,Sid 和之前的 Role Base Permission 會(huì)有些相同的地方,但也明顯不同,Sid 默認(rèn)實(shí)現(xiàn)情況下,分為 GrantedAuthoritySid 和 PrincipalSid,其實(shí)就是 Role 和 User,通過(guò) SidRetrievalStrategy 拿到一個(gè) Authentication 的 Sid。
b) ObjectIdentity: 可以理解成 Resource,就是可訪問(wèn)的目標(biāo)資源,有 id 和 type 兩個(gè)字段,默認(rèn)實(shí)現(xiàn)的 ObjectIdentityImpl 會(huì)直接調(diào)用目標(biāo) domainObject 的 getClass 和 getId 方法拿到兩個(gè)參數(shù)。在 PermissionEvaluator, AfterInvocationProvider 中,會(huì)用到 ObjectIdentityRetrievalStrategy 和 ObjectIdentityGenerator,ObjectIdentityRetrievalStrategy 會(huì)根據(jù) domainObject 拿到 ObjectIdentity,然后使用 Acl 進(jìn)行鑒權(quán),ObjectIdentityGenerator 會(huì)在系統(tǒng)提供的不是 domainObject,而是 type, id 的時(shí)候,拿到 ObjectIdentity,然后進(jìn)行 Acl 鑒權(quán),這兩個(gè)接口有一個(gè)共同的實(shí)現(xiàn) ObjectIdentityRetrievalStrategyImpl,如果需要在 ObjectIdentity 進(jìn)行新的抽象,需要用新的實(shí)現(xiàn),到得不同的 ObjectIdentity,比如將業(yè)務(wù)對(duì)象分類(lèi)鑒權(quán)這樣的需求。
c) Acl, 每個(gè) ObjectIdentity 最多對(duì)應(yīng)一條 Acl,Acl 中包含了很多,包括 parental,說(shuō)明 Acl 是有繼承關(guān)系的?其實(shí)不是,呵呵,是 ObjectIdentity 有繼承關(guān)系而已。有一個(gè) ObjectIdentity,有很多 Sid,還有一個(gè)叫做 Owner 的 Sid,有從 LookupStrategy 傳過(guò)來(lái)的 PermissionGrantingStrategy,進(jìn)行實(shí)際的鑒權(quán),還有 AclAuthorizationStrategy 檢查有沒(méi)有權(quán)限進(jìn)行 Acl security check。實(shí)現(xiàn)時(shí)間條件檢查,就擴(kuò)展 PermissionGrantingStrategy。
為什么沒(méi)有 RoleHierarchy 或是 SidRetrievalStrategy 存在呢?是因?yàn)檎{(diào)用 Acl 進(jìn)行權(quán)限檢查之前,已經(jīng)把相關(guān)的 Sid 得到了,再給 Acl 的。
d) Ace, Permission: Ace 存儲(chǔ) Sid, Permission,提供給 Acl 鑒權(quán)用。增加時(shí)間條件的話,最基本的,就是要在 Ace 中,增加時(shí)間條件字段。Permission 是用二進(jìn)制存儲(chǔ)的,但默認(rèn)實(shí)現(xiàn)的數(shù)據(jù)庫(kù)存儲(chǔ)并不是,是一個(gè)一條,存在數(shù)據(jù)庫(kù)里面的。
好吧,概念還是非常多的,不過(guò)鑒于權(quán)限控制本身就是個(gè)復(fù)雜的話題,ss 這些設(shè)計(jì)的我覺(jué)得已經(jīng)非常好,也基本夠用了。
@import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
Security.setProperty("ssl.SocketFactory.provider", "com.datayes.cloud.util.TrustAllSSLSocketFactory");
package com.datayes.cloud.util;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
public class TrustAllSSLSocketFactory extends SSLSocketFactory {
SSLContext sslContext = SSLContext.getInstance("TLS");
public TrustAllSSLSocketFactory() throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sslContext.init(null, new TrustManager[]{tm}, null);
}
@Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException {
return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
}
@Override
public Socket createSocket(String host, int port) throws IOException {
return sslContext.getSocketFactory().createSocket(host, port);
}
@Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException {
return sslContext.getSocketFactory().createSocket(host, port, localHost, localPort);
}
@Override
public Socket createSocket(InetAddress host, int port) throws IOException {
return sslContext.getSocketFactory().createSocket(host, port);
}
@Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
return sslContext.getSocketFactory().createSocket(address, port, localAddress, localPort);
}
@Override
public Socket createSocket() throws IOException {
return sslContext.getSocketFactory().createSocket();
}
@Override
public String[] getDefaultCipherSuites() {
return new String[0];
}
@Override
public String[] getSupportedCipherSuites() {
return new String[0];
}
}
主要是遇到的一些問(wèn)題吧,順便感謝一下幫助了我的人。安裝之前,聽(tīng)說(shuō)安裝正式環(huán)境的 OpenStack 挺麻煩的,所以,出發(fā)點(diǎn)就是安裝一個(gè)能測(cè)試使用的 Dev 環(huán)境就可以了,不求全,時(shí)間緊張,能用就行。所以,定位到 devstack(http://devstack.org),一鍵安裝 OpenStack
問(wèn)題
1. 想用 CentOS 來(lái)著,沒(méi)原因,習(xí)慣了,后來(lái)發(fā)現(xiàn),devstack 默認(rèn)支持 ubuntu,為了簡(jiǎn)單,改用 ubuntu
2. 安裝過(guò)程中,需要大量的網(wǎng)絡(luò)下載,網(wǎng)速如果不快,挺急人的。
3. 安裝到 stack.sh 的 191 行,會(huì)報(bào)錯(cuò) [ERROR] ./stack.sh:191 g-api did not start,這個(gè)問(wèn)題折騰了我好久,最后按照 https://answers.launchpad.net/glance/+question/231020 辦法解決了,非常感謝 Marc PINHEDE (pinhede-marc) ,但在 https://bugs.launchpad.net/devstack/+bug/1119428 里,有人說(shuō)只要修改 /etc/default/locale LANG="POSIX",就可以了,其實(shí)我兩個(gè)都改了,也不知道是哪個(gè)產(chǎn)生了作用。但,第一種方法,需要安裝到一半,失敗了,才會(huì)有提到的 /opt/stack/glance/glance/notifier/notify_kombu.py 文件,但第二種方法,剛開(kāi)始就可以嘗試,所以我如果下次安裝的話,會(huì)先把第二種配置修改好,如果安裝失敗了,再使用第一種方法繼續(xù)。
在 compile hadoop-common 的時(shí)候,提示 protobuf 出錯(cuò),查了一下,需要安裝 protobuf(是一個(gè)非 Java 的組件)
先到 homebrew 上找到安裝 homebrew 的方法 ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
然后不能直接 brew install protobuf,因?yàn)闀?huì)安裝 1.5.0,也沒(méi)辦法編譯過(guò)的,我試了。
需要先 brew versions protobuf,然后 cd `brew --prefix`(我默認(rèn)的是 cd /usr/local),直接招待剛才 brew versions 出來(lái)的那個(gè) git clone 方法。
然后再次 brew install protobuf ,就安裝 1.4.1 了,繼續(xù) maven 就沒(méi)有問(wèn)題了。
在 .bash_profile 中增加一行 export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 就可以了。
一直以來(lái),總有人說(shuō) IDEA 這個(gè) IDE 要比 Eclipse 好。中間也做過(guò)幾次嘗試,均告放棄。原因雖然各種各樣,但歸結(jié)起來(lái),就是沒(méi)時(shí)間,畢竟熟悉一個(gè) IDE 是要時(shí)間的,項(xiàng)目中很少會(huì)有這么輕松的時(shí)候,又不愿意過(guò)多使用業(yè)余時(shí)間,就這樣放下了。
最近有了一些時(shí)間,又把這東西拾起來(lái)看了看。不得不說(shuō),有些地方,做得還是很好的,當(dāng)然,也有比 Eclipse 差的地方,我估計(jì)已經(jīng)有無(wú)數(shù)人對(duì)比過(guò)了,我也不再比了,focus 在我的關(guān)注點(diǎn)上:“快捷鍵”
IDEA 因?yàn)槭褂玫氖窃?Java 而不是 swt,對(duì)于平臺(tái)集成方面,不如 Eclipse。
比如在 Eclipse 中,可以設(shè)置 Option + B 這樣的快捷鍵,而 IDEA 不行,因?yàn)?Option + B 在 Mac 下是有輸出字符的。
為了解決這個(gè)問(wèn)題,我到 KeyRemap4MacBook 中,把 Option + B 改成 Option + Left,同理,把 Option + F 改成 Option + Right
這時(shí),在 IDEA 中比較常用的快捷鍵 Command + Option + B 就變成了 Command + Option + Left,成了后退了。
還需要在 KeyRemap4MacBook 中把 Command + Option + B 恢復(fù)成他自己,而且一定要放在 Option + B 前面,否則就沒(méi)用了。
最終,我得到了這樣的 private.xml
<?xml version="1.0"?>
<root>
<item>
<name>haha</name>
<identifier>private.haha</identifier>
<autogen>--KeyToKey-- KeyCode::P,VK_CONTROL, KeyCode::CURSOR_UP</autogen>
<autogen>--KeyToKey-- KeyCode::N,VK_CONTROL, KeyCode::CURSOR_DOWN</autogen>
<autogen>__KeyToKey__ KeyCode::F,VK_OPTION, KeyCode::CURSOR_RIGHT,VK_OPTION</autogen>
<autogen>__KeyToKey__ KeyCode::B,VK_OPTION,VK_COMMAND, KeyCode::B,VK_OPTION,VK_COMMAND</autogen>
<autogen>__KeyToKey__ KeyCode::B,VK_OPTION, KeyCode::CURSOR_LEFT,VK_OPTION</autogen>
<autogen>__KeyToKey__ KeyCode::D,VK_OPTION, KeyCode::FORWARD_DELETE,VK_OPTION</autogen>
</item>
</root>
$(window).scroll(function() {
if($(window).scrollTop() + $(window).height() == $(document).height()) {
// load next
}
});
把這個(gè)文件放到 WEB-INF/classes 下面,隨便申請(qǐng)一個(gè)臨時(shí) License 就可以了,會(huì)變成 Enterprice 的,其它信息保留。
今天想在 log 里加上當(dāng)前機(jī)器的 ip,找了一些文檔,logback 支持 MDC(Mapped Diagnostic Contexts),可以很容易的把 ip 放到 log 中。
方法:
1. 先在代碼中加上一行 MDC.put("ip", InetAddress.getLocalHost().getHostAddress())
2. 然后在 logback 的 pattern 中加上 %X{ip} 即可
vi /etc/yum.conf 將exclude=kernel* 去掉
1. 建立 winexe 環(huán)境,build winexe 并不麻煩,只不過(guò)官方文檔比較少,下載到 source 之后,也不知道要如何 build。后來(lái)找到一個(gè)文檔,介紹了過(guò)程
cd winexe-1.00/source4
./autogen.sh
./configure
make
./bin/winexe -U “<user>%<password>” //<windows system> cmd.exe
2. 如何遠(yuǎn)程執(zhí)行,命令比較很簡(jiǎn)單,但又是環(huán)境問(wèn)題,我們?cè)?windows 下面建立了一個(gè) administrators 組的用戶,但無(wú)法執(zhí)行,后來(lái)打開(kāi)了 administrator 這個(gè)用戶,終于命令可以執(zhí)行了。
我們的腳本有兩個(gè)步驟,1. 殺掉舊進(jìn)程,2. 啟動(dòng)新的進(jìn)程,如下:
winexe -U "administrator%admin" //172.16.107.243 "taskkill /F /T /im java.exe"
cat < /dev/null | winexe -U "administrator%admin" //172.16.107.243 "java -jar c:\agent\job-agent.jar" >> /home/glodon/logs/agent243.log 2>&1 &
啟動(dòng)新進(jìn)程的時(shí)候,遇到了非常麻煩的事情,只能前臺(tái)執(zhí)行,nohup , & 這些完全不靈,如果 nohup,就會(huì)報(bào)錯(cuò),后來(lái)得到了一個(gè)方法,cat < /dev/null | winexe 解決了這個(gè)問(wèn)題。
3. jenkins 執(zhí)行,jenkins 使用 Post Shell Plugin 來(lái)調(diào)用這個(gè)腳本,調(diào)用的時(shí)候一定要 nohup start.sh > /dev/null &,否則在執(zhí)行完之后,會(huì)發(fā)個(gè) sign,會(huì)把進(jìn)程結(jié)束掉。
注意,還必須要 > /dev/null,否則就會(huì)出錯(cuò),實(shí)在搞不明白原因。
弄好了這個(gè),以后就方便了,心情也挺好。
呵呵,有圖有真相。
用 ipad 發(fā)的 imessage,挺有意思的,不知不覺(jué),孩子已經(jīng)這么大了。

@import url(/css/cuteeditor.css);
主要完成了下面4個(gè)工作
1. 創(chuàng)建一個(gè)本地的目錄結(jié)構(gòu),以存放 rpm 包
2. 啟動(dòng)一個(gè) apache,使這些文件能夠遠(yuǎn)程訪問(wèn)
3. 寫(xiě)一個(gè) spec,并且用 rpmbuild 做成一個(gè)安裝包,用來(lái)在機(jī)器上安裝新的 repository 位置
4. 使用 yum downloadonly plugin 將需要的 rpm 包放到本地目錄下,然后使用 createrepo 命令創(chuàng)建 metadata
本來(lái)是希望能有一個(gè)類(lèi)似于 nexus 這樣的 proxy host server 將遠(yuǎn)程的 package cache 下來(lái),找來(lái)找去,也找到了一個(gè) nexus yum plugin,但這個(gè) plugin 只支持手工的 deploy rpm package 到 nexus 上面,不能做 proxy 方式的。
寫(xiě)寫(xiě)步驟和遇到的問(wèn)題吧。
準(zhǔn)備工作
- 安裝 createrepo, yum install createrepo
- 安裝 yum download only plugin, yum -y install yum-downloadonly
- 安裝 rpmbuild, yum -y install rpm-build
- 確認(rèn)已經(jīng)安裝了 apache nginx 之類(lèi)的 http server
服務(wù)器步驟
- 首先是創(chuàng)建目錄結(jié)構(gòu),比如 mkdir -p /data/yum/centos/6/x86_64
- 先增加 chef 的源,rpm -Uvh http://rbel.frameos.org/rbel6
- 然后是通過(guò) yum -y install rubygem-chef-server –downloadonly –downloaddir=/data/yum/centos/6/x86_64
- 這時(shí),已經(jīng)可以去掉 chef 的公共源了,rpm -e rbel6-release
- 創(chuàng)建本地庫(kù)的 metadata,createrepo /data/yum/centos/6/x86_64,還有一些參數(shù)可用,比如 -p, pretty xml, -d create sqlite database files
- 配置 apache,修改 /etc/httpd/conf/httpd.conf,修改 DocumentRoot 和 Directory 位置,改為 /data,并啟動(dòng) httpd -k start,也可以使用 chkconfig –level 3 https on,每次開(kāi)機(jī)啟動(dòng)
客戶端步驟
- 首先要制作安裝 repository 位置的 rpm 包
- 創(chuàng)建文件 haha.repo,放到 /root/rpmbuild/SOURCES 目錄下,這個(gè)是將來(lái) copy 到客戶端的 /etc/yum.repos.d/ 目錄下的配置文件,內(nèi)容為
[haha]
name=haha
baseurl=http://192.168.157.131/yum/centos/$releasever/$basearch/
enabled=1
gpgcheck=0
- 再創(chuàng)建文件 build spec 文件,放到 /root/rpmbuild/SOURCES 目錄下,是為了創(chuàng)建 rpm 包用的,haha.spec
Summary: haha
Name: haha
Version: 0.1
Release: 1
Source0: haha
Group: Applications/Internet
License: GPLv2+
URL: http://192.168.157.131/yum/
#BuildRoot: %{_tmppath}/%{name}-%{version}-root
BuildArch: noarch
%description
The haha yum repo
#%prep
#%setup -q
%install
mkdir -p $RPM_BUILD_ROOT/etc/yum.repos.d
install -m 0644 -p %{SOURCE0} $RPM_BUILD_ROOT/etc/yum.repos.d
%clean
rm -rf ${RPM_BUILD_ROOT}
%files
/etc/yum.repos.d/haha.repo
- 使用 rpmbuild -ba haha.spec,做出一個(gè) rpm 包,位置在 /root/rpmbuild/RPMS/noarch 下面
- 制作一次 rpm 后,就可以一直使用了,rpm -ivh xxx.rpm 就可以了
參考了
1. 自建yum源與制作RPM安裝包yum源
2. yum只下載rpm包不自動(dòng)安裝方法
3. Installing Chef Server 0.10 in RHEL 6
最近很少用鼠標(biāo)了,觸摸板還是沒(méi)有鼠標(biāo)靈活的,所以,很大希望都寄托在鍵盤(pán)上面了,快捷鍵就變成了優(yōu)先級(jí)最高的關(guān)注點(diǎn)。
Sublime Text 的快捷鍵總是零零散散記了一些的,今天才發(fā)現(xiàn),原來(lái)在 Preferences -> Key Bindings - Default 里面有全部的快捷鍵定義,以后不知道什么的時(shí)候,來(lái)看一眼就好了。