<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 175  文章 - 202  trackbacks - 0
    <2011年8月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    第一個Blog,記錄哈哈的生活

    常用鏈接

    留言簿(16)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    Java links

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    @import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

    二進(jìn)海底,龍宮那邊新多出一個海螺,進(jìn)去就是龍宮密道,里面有DOMO組員楊志豪,把他弄走,就在原地來回跑,會定期出現(xiàn)一大魚一大蝦,毆之,每次法寶加40點。我在這里練藍(lán)格怪衣,這個每用一次也加5點。
    posted @ 2014-05-10 21:21 哈哈的日子 閱讀(491) | 評論 (0)編輯 收藏
    等到符鬼很餓(能喂2個東西的時候),找到兩個相同的喂食物,比如2個獅子精【有一個“獅子吼”技能】,設(shè)此時的符鬼有一個技能是“強音波”,點擊“獅子吼”兩次,符鬼的那個技能就變成了“無” !@import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

    為了成功,保存好,多來幾次!
    posted @ 2014-05-05 21:43 哈哈的日子 閱讀(432) | 評論 (0)編輯 收藏
    @import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); 在月河村的客棧,一直向右,到不能再右,向下一步,然后再點寶物就可以了。
    posted @ 2014-05-05 21:34 哈哈的日子 閱讀(498) | 評論 (0)編輯 收藏
    人成熟與不成熟跟年齡沒有關(guān)系。人成熟不成熟,就是你能不能站在對方的角度去看待事物,就是能不能把我的世界變成你的世界。這個社會有很多的成年人,還沒有脫離幼稚的行為。一點小事情就跟別人爭來爭去。
          人不成熟的第一個特征:就是立即要回報。
          他不懂得只有春天播種,秋天才會收獲。很多人在做任何事情的時候,剛剛付出一點點,馬上就要得到回報。(學(xué)鋼琴,學(xué)英語等等,剛開始就覺得難,發(fā)現(xiàn)不行,立即就要放棄。)很多人做生意,開始沒有什么成績,就想著要放棄,有的人一個月放棄,有的人三個月放棄,有的人半年放棄,有的人一年放棄,我不明白人們?yōu)槭裁摧p易放棄,但是我知道,放棄是一種習(xí)慣,一種典型失敗者的習(xí)慣。所以說你要有眼光,要看得更遠(yuǎn)一些,眼光是用來看未來的!
          對在生活中有放棄習(xí)慣的人,有一句話一定要送給你:"成功者永不放棄,放棄者永不成功"。那為什么很多的人做事容易放棄呢?美國著名成功學(xué)大師拿破侖希爾說過:
    窮人有兩個非常典型的心態(tài):
    1、永遠(yuǎn)對機(jī)會說:"不";
    2、總想"一夜暴富"。
          今天你把什么機(jī)會都放到他的面前,他都會說"不"。就是今天你開飯店很成功,你把你開飯店的成功經(jīng)驗,發(fā)自內(nèi)心的告訴你的親朋好友,讓他們也去開飯店,你能保證他們每個人都會開飯店嗎?是不是照樣有人不干。
          所以這是窮人一個非常典型的心態(tài),他會說:"你行,我可不行!"。一夜暴富的表現(xiàn)在于,你跟他說任何的生意,他的第一個問題就是"掙不掙錢",你說"掙錢",他馬上就問第二個問題"容易不容易",你說"容易",這時他跟著就問第三個問題"快不快",你說"快"!這時他就說"好,我做!"呵呵,你看,他就這么的幼稚!
          大家想一想,在這個世界上有沒有一種:"又掙錢,又容易,又快的",沒有的,即使有也輪不到我們啊,所以說在生活中,我們一定要懂得付出。那為什么你要付出呢?因為你是為了追求你的夢想而付出的,人就是為了希望和夢想活著的,如果一個人沒有夢想,沒有追求的話,那一輩子也就沒有什么意義了!
          在生活中你想獲得什么,你就得先付出什么。你想獲得時間,你就得先付出時間,你想獲得金錢,你得先付出金錢。你想得到愛好,你得先犧牲愛好。你想和家人有更多的時間在一起,你先得和家人少在一起。
    但是,有一點是明確的,你在這個項目中的付出,將會得到加倍的回報。就象一粒種子,你把它種下去以后,然后澆水,施肥,鋤草,殺蟲。最后你收獲的是不是幾十倍,上百倍的回報。
          在生活中,你一定要懂得付出,你不要那么急功近利,馬上想得到回報,天下沒有白吃的午餐,你輕輕松松是不可能成功的。
    一定要懂得先付出!
    人不成熟的第二個特征:就是不自律。
    不自律的主要表現(xiàn)在哪里呢?
    一、不愿改變自己:
          你要改變自己的思考方式和行為模式。你要改變你的壞習(xí)慣。其實,人與人之間能力是沒有多大區(qū)別,區(qū)別在于思考方式的不同。一件事情的發(fā)生,你去問成功者和失敗者,他們的回答是不一樣的,甚至是相違背的。
          我們今天的不成功是因為我們的思考方式不成功。一個好的公式是:當(dāng)你種植一個思考的種子,你就會有行動的收獲,當(dāng)你把行動種植下去,你會有習(xí)慣的收獲,當(dāng)你再把習(xí)慣種植下去,你就會有個性的收獲,當(dāng)你再把個性種植下去,就會決定你的命運。
          但是如果你種植的是一個失敗的種子,你得到的一定是失敗,如果你種植的是一個成功的種子,那么你就一定會成功。
    很多人有很多的壞習(xí)慣,如:看電視,打麻將,喝酒,泡舞廳,他們也知道這樣的習(xí)慣不好,但是他們?yōu)槭裁床辉敢飧淖兡兀恳驗楹芏嗳藢幵溉淌苣切┎缓玫纳罘绞剑膊辉敢馊淌芨淖儙淼耐纯?/div>
    二、愿意背后議論別人:
          如果在生活中,你喜歡議論別人的話,有一天一定會傳回去,中國有一句古話,論人是非者,定是是非人
    三、消極,抱怨:
          你在生活中喜歡那些人呢?是那些整天愁眉苦臉,整天抱怨這個抱怨哪個的人,還是喜歡那些整天開開心心的人。如果你在生活中是那些抱怨的,消極的人的話,你一定要改變你性格中的缺陷。如果你不改變的話,你是很難適應(yīng)這個社會的。你也是很難和別人合作的。
          生活當(dāng)中你要知道,你怎樣對待生活,生活也會怎樣對待你,你怎樣對待別人,別人也會怎樣對待你。所以你不要消極,抱怨。你要積極,永遠(yuǎn)的積極下去,就是那句話:成功者永不抱怨,抱怨者永不成功
    人不成熟的第三個特征:經(jīng)常被情緒所左右。
    一個人成功與否,取決于五個因素:
    學(xué)會控制情緒
    健康的身體
    良好的人際關(guān)系
    時間管理
    財務(wù)管理
          如果你想成功,一定要學(xué)會管理好這五個因素,為什么把情緒放在第一位呢?把健康放在第二位呢?是因為如果你再強的身體,如果你情緒不好,就會影響到你的身體,現(xiàn)在一個人要成功20%靠的是智商,80%靠的是情商,所以你要控制好你的情緒,情緒對人的影響是非常大的。人與人之間,不要為了一點點小事情,就暴跳如雷,這樣是不好的。
    所以在生活中,你要養(yǎng)成什么樣的心態(tài)呢?你要養(yǎng)成"三不","三多":

    不批評、不抱怨、不指責(zé);

    多鼓勵、多表揚、多贊美。

          你就會成為一個受社會大眾歡迎的人。如果你想讓你的伙伴更加的優(yōu)秀,很簡單,永遠(yuǎn)的激勵和贊美他們。
          即使他們的確有毛病,那應(yīng)該怎么辦呢?這時是不是應(yīng)該給他們建議,在生活中你會發(fā)現(xiàn)有這樣一個現(xiàn)象,有人給別人建議的時候,別人能夠接受,但是有建議的時候別人就會生氣。其實建議的方式是最重要的,就是"三明治"贊美,建議,再贊美!
    想一想,你一天贊美了幾個人,有的人可能以為贊美就是吹捧,就是拍馬屁。贊美和吹捧是有區(qū)別的,贊美有四個特點:
    1、是真誠的
    2、是發(fā)自內(nèi)心的
    3、被大眾所接受的
    4、無私的
          如果你帶有很強的目的性去贊美,那就是拍馬屁。當(dāng)你贊美別人時候,你要大聲的說出來,當(dāng)你想批評別人的時候,一定要咬住你的舌頭!
          人不成熟的第四個特征:不愿學(xué)習(xí),自以為是,沒有歸零心態(tài)。
          其實人和動物之間有很多的相似之處,動物的自我保護(hù)意識比人更強(嬰兒與小豬)但是,人和動物最大的區(qū)別在于,人會學(xué)習(xí),人會思考。人是要不斷學(xué)習(xí)的,你千萬不要把你的天賦潛能給埋沒了,一定要學(xué)習(xí),一定要有一個空杯的心態(tài)。我們象誰去學(xué)習(xí)呢?就是直接向成功人士學(xué)習(xí)!
          你要永遠(yuǎn)學(xué)習(xí)積極正面的東西,不看,不聽那些消極,負(fù)面的東西。一旦你吸收了那些有毒的思想,它會腐蝕你的心靈和人生    的。在這個知識經(jīng)濟(jì)的時代里,學(xué)習(xí)是你通向未來的唯一護(hù)照。在這樣一個速度,變化,危機(jī)的時代,你只有不斷的學(xué)習(xí)你才不會被這個時代所拋棄,一定要有學(xué)習(xí),歸零的心態(tài)。去看每一個人的優(yōu)點,"三人行,必有我?guī)熞玻ⅲ?/div>
    人不成熟的第五個特征:做事情不靠信念,靠人言。
          我們說相信是起點,堅持是終點。很多人做事不靠信念,喜歡聽別人怎么說。對自己所做的事業(yè),沒有100%的信心,相信和信念是兩個不同的概念,相信是看得見的,信念是看不見的。
          信念是人類的一種態(tài)度,但是很多的人他們做事,不靠信念的,而是要聽別人怎么說,你要登上山峰,要問那些爬到山頂?shù)娜耍f不能問沒有爬過山的人。
          這里不是說別人的建議不要去聽,你可以去參考,但是你要記住,你來做這個生意是為了實現(xiàn)你的夢想,實現(xiàn)你自己的價值。其他的人是不會關(guān)心你的夢想的,只有你自己關(guān)心你自己的夢想,只有你自己關(guān)心你自己能否真正的成功。這才是最重要的!
    只要你的選擇是正確的,永遠(yuǎn)不要在乎別人怎么說,以上的人不成熟的五個特征,你們自己去對照,那一個特征是你有的,你一定要在最短的時間里改正,只要你相信你自己能夠戰(zhàn)勝自己的不成熟,你就會逐漸的成長,成熟起來,你就會得到你想要的那種生活。你就會實現(xiàn)你時間自由、財務(wù)自由、精神自由的人生夢想! 
    posted @ 2013-11-20 16:17 哈哈的日子 閱讀(240) | 評論 (0)編輯 收藏

    設(shè)置了 scanPeriod 之后,過了好長時間,都不生效,后來 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,其實要每循環(huán) 0xf 次,也就是 15 次,才會去 check 一次是否要更新,也就是說,不管過了多久,如果沒到這 15 次,也不會去檢查是否更新配置。
    也就是說,我多打幾次 log,配置文件就生效了。

    @import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
    posted @ 2013-11-12 14:25 哈哈的日子 閱讀(1615) | 評論 (0)編輯 收藏

    spring security(下簡寫為 ss)控制的安全主要有兩方面,Web 和 Method Call,這兩個方面的權(quán)限控制有比較多的相通的設(shè)計,也有一些特別的功能。比如 Method Call 可以做 After Invocation 控制,而 Web 可以做 Ip 地址控制。

    這里面有兩個最基本的概念:authentication manager 和 access decision manager,前者控制認(rèn)證,后都控制鑒權(quán)。
    1. 在 ss 的認(rèn)證系統(tǒng)中,默認(rèn)的實現(xiàn)幫助我們提供了三個概念,用戶(user),角色(authority,一般存 role)和組(group),三者的關(guān)系是,組、角色與用戶都是多對多關(guān)系,組和角色間沒關(guān)系,默認(rèn)是不啟用組的。后續(xù),在 Acl 權(quán)限管理中,可以看到角色之間,是可以有包含(樹形?)關(guān)系的。
    2. 在 ss 的鑒權(quán)系統(tǒng)中,明顯會比認(rèn)證復(fù)雜得多。有 AccessDecisionManager, AccessDecisionVoter(前置), AfterInvocationProvider(后置), RoleHierarchy, SidRetrievalStrategy, LookupStrategy, PermissionGrantingStrategy, SecurityExpressionHandler, AclService, MutableAclService, AclCache 概念過多了,要一個一個解釋
    a) 中心是 AccessDecisionManager,主要負(fù)責(zé) AccessDecisionVoter 的管理,默認(rèn)提供了3種實現(xiàn):1. AffirmativeBased 如果有任何一個投票器允許訪問,請求將被立刻允許,而不管之前可能有的拒絕決定。2. ConsensusBased 多數(shù)票(允許或拒絕)決定了結(jié)果,平局的投票 和空票(全是棄權(quán)的)的結(jié)果是可配置的。3. UnanimousBased 所有的投票器必須全是允許的,否則訪問將 被拒絕。
    AccessDecisionManager 在用于 Web 和 Method Call 兩種情況下,可能是不一致的,因為功能也不一致。
    b) Method Call 除了使用 AccessDecisionManager 進(jìn)行權(quán)限判斷外,還可以增加 AfterInvocationProvider 來進(jìn)行出口數(shù)據(jù)的判斷,默認(rèn)提供了 3 種。
    1) PostInvocationAdviceProvider: 需要提供一個 PostInvocationAuthorizationAdvice,默認(rèn)實現(xiàn)只有一個,就是 ExpressionBasedPostInvocationAdvice,可以通過 spel 來進(jìn)行權(quán)限判斷。注意 ExpressionBasedPostInvocationAdvice 中需要提供一個 MethodSecurityExpressionHandler,能夠創(chuàng)建出一個 MethodSecurityExpressionOperations,放到 spel context 中,供 spel function 調(diào)用,這樣的方式,在后續(xù)很常見。
    2) AclEntryAfterInvocationProvider 和 AclEntryAfterInvocationCollectionFilteringProvider : 這兩種都差不多,主要依賴 AclService, ObjectIdentityRetrievalStrategy, SidRetrievalStrategy 來配合,檢查返回值的權(quán)限。Collection 版本的,可以把無權(quán)限的數(shù)據(jù)去掉,只留下有權(quán)限的數(shù)據(jù)。
    c) RoleHierarchy 提供了角色之間的關(guān)系,提供了兩個實現(xiàn),一個是沒關(guān)系的,直接把 user 的 role 返回,另外一個是有繼承關(guān)系的。繼承關(guān)系實現(xiàn)挺有意思的,能夠處理多級的 include 關(guān)系,比較好用。
    RoleHierarchy 的使用比較復(fù)雜,會被 AccessDecisionVoter, SidRetrievalStrategy, SecurityExpressionHandler 用到,SecurityExpressionHandler 又會被 AccessDecisionVoter 用到,所以還是有點兒混亂。
    具體的說 SecurityExpressionHandler 會用到 PermissionEvaluator 和 RoleHierarchy,PermissionEvaluator 的一個實現(xiàn) AclPermissionEvaluator 會用到 SidRetrievalStrategy。
    d) SidRetrievalStrategy 和 RoleHierarchy 的功能比較接近,比 RoleHierarchy 高一個抽象層次,功能上也有所區(qū)別,是從一個 authentication 拿到所有相關(guān)的 Sid(包括 Role(GrantedAuthoritySid) 和 User(PrincipalSid)),而 RoleHierarchy 只包括了 Role(GrantedAuthoritySid)的繼承關(guān)系。
    e) LookupStrategy 通過 ObjectIdentity 和 Sid 把相關(guān)的 Acl 查詢出來。可以在 LookupStrategy 擴(kuò)展 Acl 和 Ace 的功能,比如在 Ace 上面加上時間的條件限制,就需要自己定義 LookupStrategy,把時間條件從數(shù)據(jù)庫查詢出來,并放到自定義的 Ace 當(dāng)中。
    但這件事情非常麻煩,因為默認(rèn)實現(xiàn)的 BasicLookupStrategy 是個 Final 的類,所以只能自己直接實現(xiàn)接口,無法使用現(xiàn)有的功能。
    LookupStrategy 會生成 Acl,而最終的權(quán)限驗證是由 Acl 完成的,如果想驗證帶時間條件的 Ace,需要給 Acl 設(shè)置自定義的帶有檢查時間功能的 PermissionGrantingStrategy,實際上,這個 PermissionGrantingStrategy 會首先設(shè)置給 LookupStrategy,LookupStrategy 在創(chuàng)建 Acl 的時候,再放到 Acl 中去。
    f) SecurityExpressionHandler 能夠執(zhí)行 spel,得到是否可以訪問的結(jié)果,它的子類都是繼承自 AbstractSecurityExpressionHandler 的,有一個非常重要的方法是 SecurityExpressionOperations createSecurityExpressionRoot(Authentication authentication, T invocation),創(chuàng)建一個 SecurityExpressionOperations 放到 EvaluationContext 中去,提供 spel 中執(zhí)行的方法實現(xiàn)。比如 SecurityExpressionOperations 的一個抽象實現(xiàn) SecurityExpressionRoot 中,就包含了大量的權(quán)限驗證方法,如 hasRole, hasPermission 等常用的功能。
    g) AclService, MutableAclService, AclCache 概念比較簡單,AclService 是通過 LookupStrategy 查詢 Acl,自已可以查詢 ObjectIdentity 的父子關(guān)聯(lián)關(guān)系,MutableAclService 提供了修改的能力,AclCache 為 AclService 提供緩存,默認(rèn)的實現(xiàn)了一個 EhCacheBasedAclCache。
    3. ss 的鑒權(quán)模型 Sid, ObjectIdentity, Acl, Ace, Permission
    a) Sid: 是中心,所有的授權(quán)會關(guān)聯(lián)在 Sid 上面,Sid 和之前的 Role Base Permission 會有些相同的地方,但也明顯不同,Sid 默認(rèn)實現(xiàn)情況下,分為 GrantedAuthoritySid 和 PrincipalSid,其實就是 Role 和 User,通過 SidRetrievalStrategy 拿到一個 Authentication 的 Sid。
    b) ObjectIdentity: 可以理解成 Resource,就是可訪問的目標(biāo)資源,有 id 和 type 兩個字段,默認(rèn)實現(xiàn)的 ObjectIdentityImpl 會直接調(diào)用目標(biāo) domainObject 的 getClass 和 getId 方法拿到兩個參數(shù)。在 PermissionEvaluator, AfterInvocationProvider 中,會用到 ObjectIdentityRetrievalStrategy 和 ObjectIdentityGenerator,ObjectIdentityRetrievalStrategy 會根據(jù) domainObject 拿到 ObjectIdentity,然后使用 Acl 進(jìn)行鑒權(quán),ObjectIdentityGenerator 會在系統(tǒng)提供的不是 domainObject,而是 type, id 的時候,拿到 ObjectIdentity,然后進(jìn)行 Acl 鑒權(quán),這兩個接口有一個共同的實現(xiàn) ObjectIdentityRetrievalStrategyImpl,如果需要在 ObjectIdentity 進(jìn)行新的抽象,需要用新的實現(xiàn),到得不同的 ObjectIdentity,比如將業(yè)務(wù)對象分類鑒權(quán)這樣的需求。
    c) Acl, 每個 ObjectIdentity 最多對應(yīng)一條 Acl,Acl 中包含了很多,包括 parental,說明 Acl 是有繼承關(guān)系的?其實不是,呵呵,是 ObjectIdentity 有繼承關(guān)系而已。有一個 ObjectIdentity,有很多 Sid,還有一個叫做 Owner 的 Sid,有從 LookupStrategy 傳過來的 PermissionGrantingStrategy,進(jìn)行實際的鑒權(quán),還有 AclAuthorizationStrategy 檢查有沒有權(quán)限進(jìn)行 Acl security check。實現(xiàn)時間條件檢查,就擴(kuò)展 PermissionGrantingStrategy。
    為什么沒有 RoleHierarchy 或是 SidRetrievalStrategy 存在呢?是因為調(diào)用 Acl 進(jìn)行權(quán)限檢查之前,已經(jīng)把相關(guān)的 Sid 得到了,再給 Acl 的。
    d) Ace, Permission: Ace 存儲 Sid, Permission,提供給 Acl 鑒權(quán)用。增加時間條件的話,最基本的,就是要在 Ace 中,增加時間條件字段。Permission 是用二進(jìn)制存儲的,但默認(rèn)實現(xiàn)的數(shù)據(jù)庫存儲并不是,是一個一條,存在數(shù)據(jù)庫里面的。

    好吧,概念還是非常多的,不過鑒于權(quán)限控制本身就是個復(fù)雜的話題,ss 這些設(shè)計的我覺得已經(jīng)非常好,也基本夠用了。

    @import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
    posted @ 2013-11-12 14:25 哈哈的日子 閱讀(658) | 評論 (0)編輯 收藏
    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(nullnew 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];
        }
    }
    posted @ 2013-09-10 12:30 哈哈的日子 閱讀(1590) | 評論 (0)編輯 收藏
    主要是遇到的一些問題吧,順便感謝一下幫助了我的人。安裝之前,聽說安裝正式環(huán)境的 OpenStack 挺麻煩的,所以,出發(fā)點就是安裝一個能測試使用的 Dev 環(huán)境就可以了,不求全,時間緊張,能用就行。所以,定位到 devstack(http://devstack.org),一鍵安裝 OpenStack

    問題
    1. 想用 CentOS 來著,沒原因,習(xí)慣了,后來發(fā)現(xiàn),devstack 默認(rèn)支持 ubuntu,為了簡單,改用 ubuntu
    2. 安裝過程中,需要大量的網(wǎng)絡(luò)下載,網(wǎng)速如果不快,挺急人的。
    3. 安裝到 stack.sh 的 191 行,會報錯 [ERROR] ./stack.sh:191 g-api did not start,這個問題折騰了我好久,最后按照 https://answers.launchpad.net/glance/+question/231020 辦法解決了,非常感謝 Marc PINHEDE (pinhede-marc) ,但在 https://bugs.launchpad.net/devstack/+bug/1119428 里,有人說只要修改 /etc/default/locale LANG="POSIX",就可以了,其實我兩個都改了,也不知道是哪個產(chǎn)生了作用。但,第一種方法,需要安裝到一半,失敗了,才會有提到的 /opt/stack/glance/glance/notifier/notify_kombu.py 文件,但第二種方法,剛開始就可以嘗試,所以我如果下次安裝的話,會先把第二種配置修改好,如果安裝失敗了,再使用第一種方法繼續(xù)。


    posted @ 2013-08-06 10:19 哈哈的日子 閱讀(625) | 評論 (0)編輯 收藏
    在 compile hadoop-common 的時候,提示 protobuf 出錯,查了一下,需要安裝 protobuf(是一個非 Java 的組件)
    先到 homebrew 上找到安裝 homebrew 的方法 ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
    然后不能直接 brew install protobuf,因為會安裝 1.5.0,也沒辦法編譯過的,我試了。
    需要先 brew versions protobuf,然后 cd `brew --prefix`(我默認(rèn)的是 cd /usr/local),直接招待剛才 brew versions 出來的那個 git clone 方法。
    然后再次 brew install protobuf ,就安裝  1.4.1 了,繼續(xù) maven 就沒有問題了。
    posted @ 2013-07-24 13:24 哈哈的日子 閱讀(377) | 評論 (0)編輯 收藏
    在 .bash_profile 中增加一行 export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 就可以了。


    posted @ 2013-07-24 13:20 哈哈的日子 閱讀(389) | 評論 (0)編輯 收藏
    一直以來,總有人說 IDEA 這個 IDE 要比 Eclipse 好。中間也做過幾次嘗試,均告放棄。原因雖然各種各樣,但歸結(jié)起來,就是沒時間,畢竟熟悉一個 IDE 是要時間的,項目中很少會有這么輕松的時候,又不愿意過多使用業(yè)余時間,就這樣放下了。

    最近有了一些時間,又把這東西拾起來看了看。不得不說,有些地方,做得還是很好的,當(dāng)然,也有比 Eclipse 差的地方,我估計已經(jīng)有無數(shù)人對比過了,我也不再比了,focus 在我的關(guān)注點上:“快捷鍵”

    IDEA 因為使用的是原生的 Java 而不是 swt,對于平臺集成方面,不如 Eclipse。
    比如在 Eclipse 中,可以設(shè)置 Option + B 這樣的快捷鍵,而 IDEA 不行,因為 Option + B 在 Mac 下是有輸出字符的。

    為了解決這個問題,我到 KeyRemap4MacBook 中,把 Option + B 改成 Option + Left,同理,把 Option + F 改成 Option + Right
    這時,在 IDEA 中比較常用的快捷鍵 Command + Option + B 就變成了 Command + Option + Left,成了后退了。
    還需要在 KeyRemap4MacBook 中把 Command + Option + B 恢復(fù)成他自己,而且一定要放在 Option + B 前面,否則就沒用了。

    最終,我得到了這樣的 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>
    posted @ 2013-07-22 13:22 哈哈的日子 閱讀(332) | 評論 (0)編輯 收藏
    $(window).scroll(function() {
       if($(window).scrollTop() + $(window).height() == $(document).height()) {
           // load next
       }
    });
    posted @ 2012-12-19 18:10 哈哈的日子 閱讀(434) | 評論 (0)編輯 收藏
    把這個文件放到 WEB-INF/classes 下面,隨便申請一個臨時 License 就可以了,會變成 Enterprice 的,其它信息保留。
    posted @ 2012-12-14 17:23 哈哈的日子 閱讀(553) | 評論 (0)編輯 收藏
    今天想在 log 里加上當(dāng)前機(jī)器的 ip,找了一些文檔,logback 支持 MDC(Mapped Diagnostic Contexts),可以很容易的把 ip 放到 log 中。

    方法: 
    1. 先在代碼中加上一行 MDC.put("ip", InetAddress.getLocalHost().getHostAddress())
    2. 然后在 logback 的 pattern 中加上 %X{ip} 即可

    posted @ 2012-12-14 14:58 哈哈的日子 閱讀(5139) | 評論 (0)編輯 收藏
    vi /etc/yum.conf 將exclude=kernel* 去掉
    posted @ 2012-12-14 13:45 哈哈的日子 閱讀(379) | 評論 (0)編輯 收藏
    1. 建立 winexe 環(huán)境,build winexe 并不麻煩,只不過官方文檔比較少,下載到 source 之后,也不知道要如何 build。后來找到一個文檔,介紹了過程
    cd winexe-1.00/source4
    ./autogen.sh
    ./configure
    make
    ./bin/winexe -U “<user>%<password>” //<windows system> cmd.exe

    2. 如何遠(yuǎn)程執(zhí)行,命令比較很簡單,但又是環(huán)境問題,我們在 windows 下面建立了一個 administrators 組的用戶,但無法執(zhí)行,后來打開了 administrator 這個用戶,終于命令可以執(zhí)行了。
    我們的腳本有兩個步驟,1. 殺掉舊進(jìn)程,2. 啟動新的進(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 &
    啟動新進(jìn)程的時候,遇到了非常麻煩的事情,只能前臺執(zhí)行,nohup , & 這些完全不靈,如果 nohup,就會報錯,后來得到了一個方法,cat < /dev/null | winexe 解決了這個問題。

    3. jenkins 執(zhí)行,jenkins 使用 Post Shell Plugin 來調(diào)用這個腳本,調(diào)用的時候一定要 nohup start.sh > /dev/null &,否則在執(zhí)行完之后,會發(fā)個 sign,會把進(jìn)程結(jié)束掉。
    注意,還必須要 > /dev/null,否則就會出錯,實在搞不明白原因。

    弄好了這個,以后就方便了,心情也挺好。

    posted @ 2012-12-14 13:25 哈哈的日子 閱讀(459) | 評論 (0)編輯 收藏
    呵呵,有圖有真相。
    用 ipad 發(fā)的 imessage,挺有意思的,不知不覺,孩子已經(jīng)這么大了。

    @import url(/css/cuteeditor.css);
    posted @ 2012-11-21 16:24 哈哈的日子 閱讀(651) | 評論 (0)編輯 收藏

    主要完成了下面4個工作

    1. 創(chuàng)建一個本地的目錄結(jié)構(gòu),以存放 rpm 包
    2. 啟動一個 apache,使這些文件能夠遠(yuǎn)程訪問
    3. 寫一個 spec,并且用 rpmbuild 做成一個安裝包,用來在機(jī)器上安裝新的 repository 位置
    4. 使用 yum downloadonly plugin 將需要的 rpm 包放到本地目錄下,然后使用 createrepo 命令創(chuàng)建 metadata

    本來是希望能有一個類似于 nexus 這樣的 proxy host server 將遠(yuǎn)程的 package cache 下來,找來找去,也找到了一個 nexus yum plugin,但這個 plugin 只支持手工的 deploy rpm package 到 nexus 上面,不能做 proxy 方式的。

    寫寫步驟和遇到的問題吧。

    準(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 之類的 http server

    服務(wù)器步驟

    • 首先是創(chuàng)建目錄結(jié)構(gòu),比如 mkdir -p /data/yum/centos/6/x86_64
    • 先增加 chef 的源,rpm -Uvh http://rbel.frameos.org/rbel6
    • 然后是通過 yum -y install rubygem-chef-server –downloadonly –downloaddir=/data/yum/centos/6/x86_64
    • 這時,已經(jīng)可以去掉 chef 的公共源了,rpm -e rbel6-release
    • 創(chuàng)建本地庫的 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,并啟動 httpd -k start,也可以使用 chkconfig –level 3 https on,每次開機(jī)啟動

    客戶端步驟

    • 首先要制作安裝 repository 位置的 rpm 包
    • 創(chuàng)建文件 haha.repo,放到 /root/rpmbuild/SOURCES 目錄下,這個是將來 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,做出一個 rpm 包,位置在 /root/rpmbuild/RPMS/noarch 下面
    • 制作一次 rpm 后,就可以一直使用了,rpm -ivh xxx.rpm 就可以了

    參考了
    1. 自建yum源與制作RPM安裝包yum源
    2. yum只下載rpm包不自動安裝方法
    3. Installing Chef Server 0.10 in RHEL 6

    posted @ 2012-11-07 21:39 哈哈的日子 閱讀(318) | 評論 (0)編輯 收藏
    最近很少用鼠標(biāo)了,觸摸板還是沒有鼠標(biāo)靈活的,所以,很大希望都寄托在鍵盤上面了,快捷鍵就變成了優(yōu)先級最高的關(guān)注點。
    Sublime Text 的快捷鍵總是零零散散記了一些的,今天才發(fā)現(xiàn),原來在 Preferences -> Key Bindings - Default 里面有全部的快捷鍵定義,以后不知道什么的時候,來看一眼就好了。

    posted @ 2012-10-26 15:47 哈哈的日子 閱讀(272) | 評論 (0)編輯 收藏
    想了好久好久了,終于買到了。老婆送的生日禮物,老婆大人實在是太體貼了!
    之前給朋友買了一個紅軸的機(jī)械鍵盤,只玩了幾把 dota 就給人了,也沒感覺到什么,反正我玩 dota 的水平提升了 10%,呵呵。
    先說說拿到 hhkb 的感覺吧。

    1. 個頭,比想象的還要小,60 鍵的小鍵盤實在是太小了,喜歡!
    2. 鍵盤包,我還順便買了一個放 hhkb 的包,也是從日本帶回來的(最近因為某人釣魚的問題,搞得我怪緊張的),拿回來了才發(fā)現(xiàn),made in china,nnd,這東西國內(nèi)居然還買不到!實在是無語
    3. 鍵位,剛開始的時候,對 Delete 的位置很不習(xí)慣,大概用了一個小時左右,大概習(xí)慣了。Ctrl 的位置是之前一直在用的,所以非常舒服。比較糾結(jié)的是方向鍵,我之前還以為左邊會有一個 fn 鍵給我組合,沒想到 pro 沒有,只有 lite 才有,pro 只有右邊有一個 fn,只好在需要方向鍵的時候,手離開主鍵盤區(qū)了。
    4. 手感,手感實在是無與倫比了,用了這個打字之后,就不太愿意回到 mac 的巧克力鍵盤上了,差別的確有些大。
    5. 聲音,這玩意聲音還有點兒大啊,比我之前想得還要大一些,在辦公室的環(huán)境下,應(yīng)該是不會影響到什么的,之前還是有點兒心虛,怕影響到別的,后來漸漸習(xí)慣了,發(fā)現(xiàn)別人根本就聽不到,也就慢慢的放心了。呵呵

    工作中遇到問題吧
    因為主要是 Java 開發(fā),所以 IDE 主要用的是 Eclipse,Eclipse 里面用 hhkb 有兩個比較麻煩的地方:
    1. 經(jīng)常要用到方向鍵,比如語法提示之后,需要用上下來選擇你要的那個,這個我用 keyremap4mac 把 Ctrl + N 和 Ctrl + P 直接改成上下了,可以用了。
    2. Eclipse 經(jīng)常要用到 Fx 鍵,這個相當(dāng)麻煩,比如,切換 Editor 要 Cmd + F6,換 View 要 Cmd + F7,換視圖要 Cmd + F8,執(zhí)行最后執(zhí)行的程序要 Cmd + Shift + F11,這時候,我就會發(fā)現(xiàn),我已經(jīng)有點兒搞不定了,沒辦法,我估計我要去修改 Eclipse 的快捷鍵了,因為那個 Cmd + F11 實在是太常用了。

    遇到開心的事兒
    在 Terminal 下面,用起來非常舒服的,這個鍵盤本來就是為了 vi , emacs 之類的東西存在的,在 Termial 標(biāo)準(zhǔn)的 Emacs 快捷鍵下,用起來非常好,基本不用想什么,就一切都很順利了。
    在 OS X 系統(tǒng)下,大部分時候 Emacs 的快捷鍵 Ctrl + fbnpaek 這些快捷鍵都是好用的,也是比較舒服的原因之一,但 Option + fbd 這類的快捷鍵經(jīng)常不能用,比較郁悶。

    無論如何,這個鍵盤還是帶給了我不少的快樂,首先達(dá)到了 Happy 的效果,以后慢慢的來體會 Hacking 的感覺吧。
    加油!
    posted @ 2012-10-13 09:33 哈哈的日子 閱讀(1751) | 評論 (1)編輯 收藏
    http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-implementation-notes.html @import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);


    ResultSet

    By default, ResultSets are completely retrieved and stored in memory. In most cases this is the most efficient way to operate, and due to the design of the MySQL network protocol is easier to implement. If you are working with ResultSets that have a large number of rows or large values, and cannot allocate heap space in your JVM for the memory required, you can tell the driver to stream the results back one row at a time.

    To enable this functionality, create a Statement instance in the following manner:

    stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
    java.sql.ResultSet.CONCUR_READ_ONLY);
    stmt.setFetchSize(Integer.MIN_VALUE);

    The combination of a forward-only, read-only result set, with a fetch size of Integer.MIN_VALUE serves as a signal to the driver to stream result sets row-by-row. After this, any result sets created with the statement will be retrieved row-by-row.

    There are some caveats with this approach. You must read all of the rows in the result set (or close it) before you can issue any other queries on the connection, or an exception will be thrown.

    The earliest the locks these statements hold can be released (whether they be MyISAM table-level locks or row-level locks in some other storage engine such as InnoDB) is when the statement completes.

    If the statement is within scope of a transaction, then locks are released when the transaction completes (which implies that the statement needs to complete first). As with most other databases, statements are not complete until all the results pending on the statement are read or the active result set for the statement is closed.

    Therefore, if using streaming results, process them as quickly as possible if you want to maintain concurrent access to the tables referenced by the statement producing the result set.

    posted @ 2012-06-29 13:15 哈哈的日子 閱讀(474) | 評論 (0)編輯 收藏
    在 Mac 上配置 Apache 和 SVN 極其方便。

    序:
        之前在 Windows 上,因為心里美的原因,配置過 Apache 和 SVN 集成,使用 http 協(xié)議來訪問 SVN。配置過程有些麻煩,也容易出錯。
        后來,一直使用 svnserve -d,在 windows 上一般還會用 sc 命令做成 service,因為簡單方便。

    后來因為試驗的目的,在 Mac 上配置了 Apache 和 SVN,我的 OS X 是 10.7 Lion
    居然極其簡單,只要在“系統(tǒng)偏好設(shè)置” -> “共享” 中,把 Web 共享打開,然后把個人網(wǎng)站點開(僅僅是不想修改全局配置文件)
    然后修改文件 /private/etc/apache2/users/你的用戶名.conf ,里面加上
    # svn module
    LoadModule dav_svn_module libexec/apache2/mod_dav_svn.so
    LoadModule authz_svn_module libexec/apache2/mod_authz_svn.so

    <Location /svn>
         DAV svn
         SVNListParentPath on
         SVNParentPath "/repository/svn/path"
    </Location>

    就可以了,
    兩個 svn 相關(guān)的 module 已經(jīng)放好了,只要 load 一下就行。
    配置方面還可以增加認(rèn)證等等。為了權(quán)限管理得更細(xì)致,也可以使用 SVNPath 而不是 SVNParentPath。
    唉,真是方便,Mac 用來開發(fā),不錯!

    posted @ 2012-05-10 14:43 哈哈的日子 閱讀(238) | 評論 (0)編輯 收藏
    ssh 免密碼登錄,需要使用公私鑰來認(rèn)證@import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

    首先通過 ssh-keygen 生成一對公私鑰,默認(rèn)在 ~/.ssh/id_rsa.pub 和 ~/.ssh/id_rsa,前面的是公鑰。
    認(rèn)證就是要把這個文件加到遠(yuǎn)程用戶目錄 ~/.ssh/authorized_keys 文件中,而且這個文件的權(quán)限不能被其它人訪問。

    下面的腳本能夠自動把這個文件放到遠(yuǎn)程,方法是 ./addpk ip username password

    #!//usr/bin/expect
    set host [lrange $argv 0 0]
    set user [lrange $argv 1 1]
    set passwd [lrange $argv 2 2]
    proc ssh {cmd} {
        global user host passwd
        spawn ssh $user@$host "$cmd"
        expect {
            "*conne*" {
                send "yes\n"
                expect "*password*"
                send "$passwd\n"
                expect eof
            }
            "*password*" {
                send "$passwd\n"
                expect eof
        }
        }
    }
    proc scp {src dest} {
        global user host passwd
        spawn scp $src $user@$host:$dest
        expect {
            "*conne*" {
                send "yes\n"
                expect "*password*"
                send "$passwd\n"
                expect eof
            }
            "*password*" {
                send "$passwd\n"
                expect eof
            }
        }
    }
    ssh "mkdir -p ~/.ssh"
    scp "/home/user1/.ssh/id_rsa.pub" "~/.ssh/id_rsa.pub"
    ssh "cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys"
    ssh "uniq ~/.ssh/authorized_keys > ~/.ssh/authorized_keys.tmp"
    ssh "mv ~/.ssh/authorized_keys.tmp ~/.ssh/authorized_keys"
    ssh "chmod 700 ~/.ssh"
    ssh "chmod 600 ~/.ssh/*"

    posted @ 2012-05-08 09:38 哈哈的日子 閱讀(735) | 評論 (0)編輯 收藏

    在 Eclipse 中執(zhí)行下面代碼。



            byte[] bytes = new byte[]{-16, -97, -116, -70};

            String s = new String(bytes, "UTF-8");

            System.out.println(s);


    結(jié)果打印出了一朵花,呵呵,實在是太有意思了。

    @import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
    posted @ 2012-04-17 15:25 哈哈的日子 閱讀(179) | 評論 (0)編輯 收藏
    Picasa 像冊真的很給力,2048 像素以下(包含)的照片不計算空間,據(jù)說 15 分鐘以內(nèi)的也不算空間,除了這些,有1G的空間可以使用。
    我現(xiàn)在用的 Aperture 或者是 iPhoto 都有 Picasa Plugin,上傳照片非常方便,除了需要fanqiang外,沒什么其它問題了。
    雖然 Aperture 和 Facebook, Flickr 好像集成的更好,可實際上,F(xiàn)acebook 像素低,還不能選,F(xiàn)lickr 空間有要求。
     
    posted @ 2012-02-27 10:54 哈哈的日子 閱讀(263) | 評論 (0)編輯 收藏
    這個文件已經(jīng)在 /Library/Java/JavaVirtualMachines/1.6.0_29-b11-402.jdk/Contents/Classes/classes.jar
    這里了,我在混淆代碼的時候會用到,只要做個 link 就好了,如下:
    sudo ln -s /Library/Java/JavaVirtualMachines/1.6.0_29-b11-402.jdk/Contents/Classes/classes.jar /Library/Java/JavaVirtualMachines/1.6.0_29-b11-402.jdk/Contents/Home/lib/rt.jar

    @import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
    posted @ 2012-02-10 10:48 哈哈的日子 閱讀(2376) | 評論 (0)編輯 收藏
    目前有一個 10 臺機(jī)器的小網(wǎng),只有其中一臺機(jī)器能夠通過外網(wǎng)訪問,其它機(jī)器需要先 ssh 到外網(wǎng)機(jī)器,然后再 ssh 一下,才能訪問到,很麻煩,一些 scp 之類的軟件也沒法使用。之前,我一直是用 secure crt 端口轉(zhuǎn)發(fā)來做的,也算方便,缺點就是一直要開一個 secure crt 窗口,還不能斷,否則就全斷開了。

    后來同事告訴了我一個辦法,叫 iptables,利用這臺外網(wǎng)機(jī)器自己來進(jìn)行轉(zhuǎn)發(fā),試了一下,的確要更方便一些。

    iptables 本身是用來做 linux 防火墻的,還有一些轉(zhuǎn)發(fā)功能。

    配置起來比較方便。iptables 的配置文件是放在 /etc/sysconfig/iptables 下面的,缺省是沒有這個文件的,需要先執(zhí)行

    外網(wǎng)機(jī)器:
    外網(wǎng) ip: 202.118.1.125
    內(nèi)網(wǎng) ip: 111.111.111.111
    端口: 8112

    內(nèi)網(wǎng)機(jī)器:
    ip: 111.111.111.112

    命令:

    iptables -t nat -A PREROUTING -d 202.118.1.125 -p tcp --dport 8112 -j DNAT --to-destination 111.111.111.112:22
    iptables -t nat -A POSTROUTING -d 111.111.111.112 -p tcp --dport 22 -j SNAT --to 111.111.111.111
    iptables -A FORWARD -o eth0 -d 111.111.111.112 -p tcp --dport 22 -j ACCEPT
    iptables -A FORWARD -i eth0 -s 111.111.111.112 -p tcp --sport 22 -j ACCEPT

    然后再 iptables-save 這個文件就出來了。

    通過 service iptables restart 就可以啟動 iptables 服務(wù)。
    奇怪的是 111.111.111.111 這臺機(jī)器并沒有 listen 8112 的端口,但你只要 ssh 202.118.1.125 8112,就真的能夠連到 111.111.111.112 這臺機(jī)器上,算是留下一個疑問吧。

    @import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
    posted @ 2012-01-29 16:04 哈哈的日子 閱讀(1409) | 評論 (0)編輯 收藏
    L-Larry_Lau@163.com#24777-1i8da63tvtyl2#1119
    L-Larry_Lau@163.com#61624-1dvrt8wj18v1#6260
    L-Larry_Lau@163.com#50028-se4zkrr1m6t1#10246
    L-Larry_Lau@163.com#15600-189y158nwwvuk#339
    L-Larry_Lau@163.com#30640-1lklqdbcjmhxs#4016
    L-Larry_Lau@163.com#57474-53b2wr1311gnz#10228
    L-Larry_Lau@163.com#19667-11r2awc10nqelb#4016
    L-Larry_Lau@163.com#60353-pphob7wraf0y#515
    L-Larry_Lau@163.com#65157-1ae6ytp7ygj8m#0012
    L-Larry_Lau@163.com#16226-1n5h5951019s7s#7343
    posted @ 2011-12-27 21:04 哈哈的日子 閱讀(1524) | 評論 (1)編輯 收藏
    @import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); 問題:
        1. centos 5.5 通過 yum 安裝 mysql,啟動,一切正常。但是,修改 my.cnf 中的 datadir 到自定義目錄,并初始化好數(shù)據(jù)庫,使用原來的 mysql 文件就無法啟動了。
        2. 通過 heartbeat 啟動 mysql 遇到同樣的問題。

    解決:
        修改 /etc/selinux/config 文件中的  SELINUX=disabled,就可以運行了。

    過程:
        定位問題的過程中,發(fā)現(xiàn),只要 copy 出來的 mysql 腳本,就可以執(zhí)行,原來的依然不可以。或者 mysql 數(shù)據(jù)庫文件放到 /var/lib/mysql 下,就可以,其它位置,就不行。
        猜測,文件屬性有什么不一樣的?通過 ls -l 看權(quán)限,和 lsattr 看屬性,都一模一樣。
        但,知道原因后,使用 ls -Z 可以看到 selinux 相關(guān)的屬性,這些文件是不一樣的。
        
    原因:
        不太清楚原因,但肯定的是,selinux 相關(guān)屬性影響的,有空仔細(xì)看看相關(guān)文檔。

    下面這篇寫得不錯:

    http://www.linux.gov.cn/netweb/selinux.htm

    SELinux簡介

    SELinux全稱是Security Enhanced Linux,由美國國家安全部(National Security Agency)領(lǐng)導(dǎo)開發(fā)的GPL項目,它擁有一個靈活而強制性的訪問控制結(jié)構(gòu),旨在提高Linux系統(tǒng)的安全性,提供強健的安全保證,可防御未知攻擊,據(jù)稱相當(dāng)于B1級的軍事安全性能。比MS NT所謂的C2等高得多。

    應(yīng)用SELinux后,可以減輕惡意攻擊或惡意軟件帶來的災(zāi)難,并提供對機(jī)密性和完整性有很高要求的信息很高的安全保障。 SELinux vs Linux 普通Linux安全和傳統(tǒng)Unix系統(tǒng)一樣,基于自主存取控制方法,即DAC,只要符合規(guī)定的權(quán)限,如規(guī)定的所有者和文件屬性等,就可存取資源。在傳統(tǒng)的安全機(jī)制下,一些通過setuid/setgid的程序就產(chǎn)生了嚴(yán)重安全隱患,甚至一些錯誤的配置就可引發(fā)巨大的漏洞,被輕易攻擊。

    而SELinux則基于強制存取控制方法,即MAC,透過強制性的安全策略,應(yīng)用程序或用戶必須同時符合DAC及對應(yīng)SELinux的MAC才能進(jìn)行正常操作,否則都將遭到拒絕或失敗,而這些問題將不會影響其他正常運作的程序和應(yīng)用,并保持它們的安全系統(tǒng)結(jié)構(gòu)。

    SELinux的相關(guān)配置文件

    SELinux的配置相關(guān)文件都在/etc/selinux下,其中/etc/selinux/targeted目錄里就包含了策略的詳細(xì)配置和context定義,以下是主要文件及功用:

    /etc/selinux/targeted/contexts/*_context 默認(rèn)的context設(shè)置 
    /etc/selinux/targeted/contexts/files/* 精確的context類型劃分 
    /etc/selinux/targeted/policy/* 策略文件

    Apache under SELinux

    Apache under SELinux - 讓Apache跑得順起來!
    對于剛使用Redhat Enterprise Linux 4 或Fedora Core 2以上/CentOS 4的用戶,一定會為Apache經(jīng)常無法正常運轉(zhuǎn),報以"Permission denied"等錯誤而大為不解,甚至大為惱火。
    其實這是因為這些系統(tǒng)里激活了SELinux,而用戶的apache配置與SELinux的配置策略有抵觸產(chǎn)生的,只有通過適當(dāng)調(diào)整,使apache的配置和訪問符合策略才能正常使用。
    現(xiàn)在下面來分析一下SELinux中有關(guān)httpd(apache)的context定義(略有刪節(jié))

    /home/[^/]+/((www)|(web)|(public_html))(/.+)? system_u:object_r:httpd_user_content_t
    /var/www(/.*)? system_u:object_r:httpd_sys_content_t
    /var/www/cgi-bin(/.*)? system_u:object_r:httpd_sys_script_exec_t
    /usr/lib/cgi-bin(/.*)? system_u:object_r:httpd_sys_script_exec_t
    /var/www/perl(/.*)? system_u:object_r:httpd_sys_script_exec_t
    /var/www/icons(/.*)? system_u:object_r:httpd_sys_content_t
    /var/cache/httpd(/.*)? system_u:object_r:httpd_cache_t
    /etc/vhosts -- system_u:object_r:httpd_config_t
    /usr/sbin/httpd -- system_u:object_r:httpd_exec_t
    /usr/sbin/apache(2)? -- system_u:object_r:httpd_exec_t
    /usr/sbin/suexec -- system_u:object_r:httpd_suexec_exec_t
    /var/log/httpd(/.*)? system_u:object_r:httpd_log_t
    /var/log/apache(2)?(/.*)? system_u:object_r:httpd_log_t
    /var/log/cgiwrap\.log.* -- system_u:object_r:httpd_log_t
    /var/cache/ssl.*\.sem -- system_u:object_r:httpd_cache_t
    /var/cache/mod_ssl(/.*)? system_u:object_r:httpd_cache_t
    /var/run/apache(2)?\.pid.* -- system_u:object_r:httpd_var_run_t
    /var/lib/httpd(/.*)? system_u:object_r:httpd_var_lib_t
    /var/lib/php/session(/.*)? system_u:object_r:httpd_var_run_t
    /etc/apache-ssl(2)?(/.*)? system_u:object_r:httpd_config_t
    /usr/lib/apache-ssl(/.*)? -- system_u:object_r:httpd_exec_t
    /usr/sbin/apache-ssl(2)? -- system_u:object_r:httpd_exec_t
    /var/log/apache-ssl(2)?(/.*)? system_u:object_r:httpd_log_t
    /var/run/apache-ssl(2)?\.pid.* -- system_u:object_r:httpd_var_run_t
    /var/run/gcache_port -s system_u:object_r:httpd_var_run_t
    /var/lib/squirrelmail/prefs(/.*)? system_u:object_r:httpd_squirrelmail_t
    /usr/bin/htsslpass -- system_u:object_r:httpd_helper_exec_t
    /usr/share/htdig(/.*)? system_u:object_r:httpd_sys_content_t
    /var/lib/htdig(/.*)? system_u:object_r:httpd_sys_content_t

    針對上述的內(nèi)容,可以對如下的幾個常見問題進(jìn)行簡單處理:

    1.phpmyadmin在非默認(rèn)/var/www/html目錄下無法運轉(zhuǎn)

    通常類似的情況都是在配置了虛擬主機(jī)時,訪問/phpmyadmin等提示403訪問拒絕,日志里也提示Permission denied,這是因為phpmyadmin防止的目錄及文件本身屬性不符合context要求。
    假設(shè)phpmyadmin放在/web目錄下,那么執(zhí)行:
    chcon -R -t httpd_user_content_t /web
    則會令/web及其下所有子目錄/文件,包括phpmyadmin文件都獲得了httpd_user_content_t的屬性,如果其傳統(tǒng)的Unix屬性對httpd來說是可讀的話,再重新訪問一下就應(yīng)該可以了。

    2./home目錄下的虛擬主機(jī)無法運轉(zhuǎn)

    與問題1也是類似的,不過根據(jù)上文中context的定義,/home目錄下必須是用戶的$HOME/www或public_html或web目錄才是 httpd_user_content_t類型,因此建議將要作為web頁面的內(nèi)容放置在用戶的$HOME/www或web或public_html里,并確保其屬性是httpd_user_content_t,使用如下命令查看:
    ls -Z /home/abc/
    drwxr-xr-x abc abc user_u:object_r:user_home_dir_t tmp
    drwxrwxr-x abc abc user_u:object_r:httpd_user_content www
    如不是,則可通過chcon來逐級目錄及文件更改,直至最后能訪問:
    chcon -R -t httpd_user_content_t /home/abc/web
    chcon -t user_home_dir_t /home/abc

    3.CGI程序無法運行

    如果cgi程序放在/var/www/cgi-bin/里也無法執(zhí)行,遇到403或500錯誤的話,可以檢查cgi程序的屬性,按SELinux contexts文件里定義的,/var/www/cgi-bin/里必須是httpd_sys_script_exec_t 屬性。通過ls -Z查看,如果不是則通過如下命令更改:
    chcon -t httpd_sys_script_exec_t /var/www/cgi-bin/*.cgi
    如果是虛擬主機(jī)里的cgi,則參考問題2使之能正常使用普通的功能后,再通過chcon設(shè)置cgi文件的context為httpd_sys_script_exec_t即可。

    4.Setuid/gid 程序無法運行

    例如早期的SqWebMail及qmailadmin等,需要setuid/gid的支持,但在SELinux下這將受到嚴(yán)格限制。第一種方法是比較徹底的辦法,能保留系統(tǒng)的安全性,通過:
    audit2allow -l -i /var/log/messages
    將SELinux拒絕的信息轉(zhuǎn)換為相應(yīng)的policy allow指令,將這些指令添加到SELinux policy 的src里相應(yīng)的配置文件,重新生成policy并加載。但這樣做相對比較麻煩。
    另一個方法最簡單,但將使apache得不到保護(hù)。首先確定SELinux 類型是targeted的:
    cat /etc/selinux/config|grep SELINUXTYPE
    然后,使apache脫離SELinux保護(hù):
    setsebool -P httpd_disable_trans 1
    然后重啟動apache:
    /etc/init.d/httpd restart
    這樣所有apache強制的檢查都失效,需要setuid/gid的程序可以正常使用。但這樣帶來了增加漏洞的危險,對于迫切需要運行而又很急的情況,本方法是一個最大限度減少系統(tǒng)安全缺失的最后辦法。對于取消SELinux 未必是一個好方法。

    SElinux的幾個相關(guān)命令

    一.

    ps -Z
    ls -Z
    id -Z

    例:
    [root@ljj cgi-bin]# ls -Z
    -rwxrwxrwx root root root:object_r:httpd_sys_script_exec_t a.cgi
    -rw-r--r-- root root root:object_r:httpd_sys_script_exec_t a.txt

    二. chcon

    修改文件的屬性 fild1:fild2:fild3

    chcon -u fild1 file
    chcon -l fild2 file
    chcon -t fild3 file

    例:
    chcon -u root file1

    三.getsebool

    獲取se相關(guān)的bool值
    例:
    [root@ljj cgi-bin]# getsebool -a | grep httpd
    httpd_builtin_scripting --> inactive
    httpd_disable_trans --> active
    httpd_enable_cgi --> active
    httpd_enable_homedirs --> active
    httpd_ssi_exec --> active
    httpd_tty_comm --> inactive
    httpd_unified --> inactive

    得到了一些與httpd相關(guān)的bool值,配置httpd.conf中的user_dir時,要保證這里的httpd_enable_homedirs是 active的,還要保證:

    chcon -R -t httpd_sys_content_t ~user/public_html;

    • httpd與selinux之間的關(guān)系更多詳見:man httpd_selinux

    四. togglesebool

    給se的相關(guān)bool值取反
    例:
    togglesebool httpd_enable_homedirs


    posted @ 2011-12-22 18:41 哈哈的日子 閱讀(605) | 評論 (0)編輯 收藏

    本次操作環(huán)境:

    Ubuntu Server 10.10  

    SCSI Harddisk:/dev/sda       500GB

    U盤:/dev/sdb    8GB(模擬成USB Harddisk,安裝OS)

     

    介紹2種分區(qū)表:
    MBR分區(qū)表:(MBR含義:主引導(dǎo)記錄)
    所支持的最大卷:2T (T; terabytes,1TB=1024GB)
    對分區(qū)的設(shè)限:最多4個主分區(qū)或3個主分區(qū)加一個擴(kuò)展分區(qū)。

    GPT分區(qū)表:(GPT含義:GUID分區(qū)表)
    支持最大卷:18EB,(E:exabytes,1EB=1024TB)
    每個磁盤最多支持128個分區(qū)

     

    所以如果要大于2TB的卷或分區(qū)就必須得用GPT分區(qū)表。

     

    Linux下fdisk工具不支持GPT,得使用另一個GNU發(fā)布的強大分區(qū)工具parted。

    fdisk工具用的話,會有下面的警告信息:

    WARNING: GPT (GUID Partition Table) detected on '/dev/sda'! The util fdisk doesn't support GPT. Use GNU Parted.

    下面是用parted工具對/dev/sda做GPT分區(qū)的過程:

    root@node01:/mnt# parted /dev/sda
    GNU Parted 2.3
    Using /dev/sda
    Welcome to GNU Parted! Type 'help' to view a list of commands.

     

    (parted) mklabel gpt                                                      
    Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk
    will be lost. Do you want to continue?
    Yes/No? yes         

       

    (parted) print                                                            
    Model: DELL PERC 6/i Adapter (scsi)
    Disk /dev/sda: 500GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt

    Number  Start  End  Size  File system  Name  Flags

     

    (parted)mkpart primary 0KB 500GB
    Warning: You requested a partition from 0.00B to 500GB.                   
    The closest location we can manage is 17.4kB to 500GB.
    Is this still acceptable to you?
    Yes/No? yes                                                               
    Warning: The resulting partition is not properly aligned for best performance.
    Ignore/Cancel? Ignore                          

     

    (parted) print                                                            
    Model: DELL PERC 6/i Adapter (scsi)
    Disk /dev/sda: 500GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt

    Number  Start   End    Size   File system  Name     Flags
     1      17.4kB  500GB  500GB               primary

     

    (parted)quit                                                             
    Information: You may need to update /etc/fstab.                           

    root@node01:/#fdisk -l

    WARNING: GPT (GUID Partition Table) detected on '/dev/sda'! The util fdisk doesn't support GPT. Use GNU Parted.


    Disk /dev/sda: 499.6 GB, 499558383616 bytes
    255 heads, 63 sectors/track, 60734 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x00000000

       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1               1       60735   487849983+  ee  GPT

    root@node01:/#mkfs.ext4 /dev/sda1
    mke2fs 1.41.12 (17-May-2010)
    文件系統(tǒng)標(biāo)簽=
    操作系統(tǒng):Linux
    塊大小=4096 (log=2)
    分塊大小=4096 (log=2)
    Stride=0 blocks, Stripe width=0 blocks
    30490624 inodes, 121962487 blocks
    6098124 blocks (5.00%) reserved for the super user
    第一個數(shù)據(jù)塊=0
    Maximum filesystem blocks=4294967296
    3722 block groups
    32768 blocks per group, 32768 fragments per group
    8192 inodes per group
    Superblock backups stored on blocks: 
            32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
            4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
            102400000

    正在寫入inode表: 完成                            
    Creating journal (32768 blocks): 完成
    Writing superblocks and filesystem accounting information: 完成

    This filesystem will be automatically checked every 24 mounts or
    180 days, whichever comes first.  Use tune2fs -c or -i to override.

     

    root@node01:/#mount /dev/sda1 /export/glusterfs01/


    root@node01:/# df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/node01-root
                          6.8G  987M  5.5G  16% /
    none                  7.9G  208K  7.9G   1% /dev
    none                  7.9G     0  7.9G   0% /dev/shm
    none                  7.9G   32K  7.9G   1% /var/run
    none                  7.9G     0  7.9G   0% /var/lock
    /dev/sdb1             228M   21M  196M  10% /boot
    /dev/sda1             458G  198M  435G   1% /export/glusterfs01

     

    root@node01:/#vi /etc/fstab

    # /etc/fstab: static file system information.
    #
    # Use 'blkid -o value -s UUID' to print the universally unique identifier
    # for a device; this may be used with UUID= as a more robust way to name
    # devices that works even if disks are added and removed. See fstab(5).
    #
    # <file system> <mount point>   <type>  <options>       <dump>  <pass>
    proc            /proc           proc    nodev,noexec,nosuid 0       0
    /dev/mapper/node01-root /               ext4    errors=remount-ro 0       1
    # /boot was on /dev/sdb1 during installation
    UUID=c21707ff-ba0f-43ee-819a-8e72fa0f8500 /boot           ext2    defaults        0       2
    /dev/mapper/node01-swap_1 none            swap    sw              0       0
    /dev/sda1       /export/glusterfs01     ext4    defaults        0       2

     

    重啟就可以自動掛載了!至此完成。

    @import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
    posted @ 2011-12-21 15:56 哈哈的日子 閱讀(16459) | 評論 (0)編輯 收藏
    1. cross join 就是笛卡爾積
    那看起來好象和 inner join 是一樣的,在 SQL 標(biāo)準(zhǔn)中定義的是 cross join 就是沒有條件的 inner join。在 mysql 中,不區(qū)分,這兩個等價。

    2. natural (left) join 是把兩個表名字一樣的列,做相等條件處理,比如:

    t1
    id1 name

    t2
    id2 name

    那么 select t1.id1, t2.id1, t1.name from t1 natural join t2 就等價

    select t1.id1, t2.id1, t1.name from t1 join t2 on (t1.name = t2.name)

    自動把一樣名稱的列(name)做了個相待條件處理,多列也會同時處理。

    所以,這兩種 join 沒人用是有原因的。

    cross join 沒意義,一般用逗號就可以了。

    natural 降低了可讀性,不建議使用。
    posted @ 2011-10-13 18:06 哈哈的日子 閱讀(626) | 評論 (0)編輯 收藏
                    一個好軟件,會讓人覺得賞心悅目
                     會讓人心曠神怡
                     會開心
                     會……

    H2DB 就是這樣的一個好軟件,就一個感覺----舒服!


    比如:group by sort 的實現(xiàn)


        private void queryGroupSorted(int columnCount, ResultTarget result) {

            int rowNumber = 0;

            setCurrentRowNumber(0);

            Value[] previousKeyValues = null;

            while (topTableFilter.next()) {

                setCurrentRowNumber(rowNumber + 1);

                if (condition == null || Boolean.TRUE.equals(condition.getBooleanValue(session))) {

                    rowNumber++;

                    Value[] keyValues = new Value[groupIndex.length];

                    // update group

                    for (int i = 0; i < groupIndex.length; i++) {

                        int idx = groupIndex[i];

                        Expression expr = expressions.get(idx);

                        keyValues[i] = expr.getValue(session);

                    }


                    if (previousKeyValues == null) {

                        previousKeyValues = keyValues;

                        currentGroup = New.hashMap();

                    } else if (!Arrays.equals(previousKeyValues, keyValues)) {

                        addGroupSortedRow(previousKeyValues, columnCount, result);

                        previousKeyValues = keyValues;

                        currentGroup = New.hashMap();

                    }

                    currentGroupRowId++;


                    for (int i = 0; i < columnCount; i++) {

                        if (groupByExpression == null || !groupByExpression[i]) {

                            Expression expr = expressions.get(i);

                            expr.updateAggregate(session);

                        }

                    }

                }

            }

            if (previousKeyValues != null) {

                addGroupSortedRow(previousKeyValues, columnCount, result);

            }

        }



    看著太舒服了。

    posted @ 2011-10-12 13:52 哈哈的日子 閱讀(260) | 評論 (0)編輯 收藏
    http://ivansmirnov.wordpress.com/2011/03/19/java-util-concurrent-locks-thread-dump/

    The Sun JVM setting “-XX:+PrintConcurrentLocks” adds the lock owner information to the thread dump.
    posted @ 2011-08-16 16:18 哈哈的日子 閱讀(191) | 評論 (0)編輯 收藏
    @import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

    http://en.wikipedia.org/wiki/Category:Unix_signals

    1.SIGHUP信號

    UNIX中進(jìn)程組織結(jié)構(gòu)為 session (會話)包含一個前臺進(jìn)程組及一個或多個后臺進(jìn)程組,一個進(jìn)程組包含多個進(jìn)程。一個session可能會有一個session首進(jìn)程,而一個session首進(jìn)程可能會有一個控制終端。一個進(jìn)程組可能會有一個進(jìn)程組首進(jìn)程。進(jìn)程組首進(jìn)程的進(jìn)程ID與該進(jìn)程組ID相等。這兒是可能會有,在一定情況之下是沒有的。與終端交互的進(jìn)程是前臺進(jìn)程,否則便是后臺進(jìn)程。
    SIGHUP會在以下3種情況下被發(fā)送給相應(yīng)的進(jìn)程:
    1、終端關(guān)閉時,該信號被發(fā)送到session首進(jìn)程以及作為job提交的進(jìn)程(即用 & 符號提交的進(jìn)程)
    2、session首進(jìn)程退出時,該信號被發(fā)送到該session中的前臺進(jìn)程組中的每一個進(jìn)程
    3、若父進(jìn)程退出導(dǎo)致進(jìn)程組成為孤兒進(jìn)程組,且該進(jìn)程組中有進(jìn)程處于停止?fàn)顟B(tài)(收到SIGSTOP或SIGTSTP信號),該信號會被發(fā)送到該進(jìn)程組中的每一個進(jìn)程。
    統(tǒng)對SIGHUP信號的默認(rèn)處理是止收到信號的進(jìn)程。所以若程序中沒有捕捉信號,當(dāng)收到信號進(jìn)程就會退出。
    下面觀察幾種因終端關(guān)閉導(dǎo)致進(jìn)程退出的情況,在這兒進(jìn)程退出是因為收到了SIGHUP信號。login shell是session首進(jìn)程。
    首先寫一個測試程序,代碼如下:
    #include <stdio.h>
    #include 
    <signal.h>
    char **args;
    void exithandle(int
     sig)
    {
            printf(
    "%s : sighup received ",args[1
    ]);
    }

    int main(int argc,char **argv)
    {
            args 
    =
     argv;
            signal(SIGHUP,exithandle);
            pause();
           
    return 0
    ;
    }
    程序中捕捉SIGHUP信號后打印一條信息,pause()使程序暫停。
    編譯后的執(zhí)行文件為sigtest。
    1、命 令:sigtest front > tt.txt
       操 作:關(guān)閉終端
       結(jié) 果:tt.txt文件的內(nèi)容為front : sighup received
       原 因: sigtest是前臺進(jìn)程,終端關(guān)閉后,根據(jù)上面提到的第1種情況,login shell作為session首進(jìn)程,會收到SIGHUP信號然后退出。根據(jù)第2種情況,sigtest作為前臺進(jìn)程,會收到login shell發(fā)出的SIGHUP信號。
    2、命 令:sigtest back > tt.txt &
         操 作:關(guān)閉終端
          結(jié) 果:tt.txt文件的內(nèi)容為 back : sighup received
          原 因: sigtest是提交的job,根據(jù)上面提到的第1種情況,sigtest會收到SIGHUP信號。
    3、命 令:寫一個shell,內(nèi)容為[sigtest &],然后執(zhí)行該shell
          操 作:關(guān)閉終端
          結(jié) 果:ps -ef | grep sigtest 會看到該進(jìn)程還在,tt文件為空
          原 因: 執(zhí)行該shell時,sigtest作為job提交,然后該shell退出,致使sigtest變成了孤兒進(jìn)程,不再是當(dāng)前session的job了,因此sigtest即不是session首進(jìn)程也不是job,不會收到SIGHUP。同時孤兒進(jìn)程屬于后臺進(jìn)程,因此login shell退出后不會發(fā)送SIGHUP給sigtest,因為它只將該信號發(fā)送給前臺進(jìn)程。第3條說過若進(jìn)程組變成孤兒進(jìn)程組的時候,若有進(jìn)程處于停止?fàn)顟B(tài),也會收到SIGHUP信號,但sigtest沒有處于停止?fàn)顟B(tài),所以不會收到SIGHUP信號。
    4、命 令:nohup sigtest > tt
          操 作:關(guān)閉終端
          結(jié) 果:tt文件為空
          原 因: nohup可以防止進(jìn)程收到SIGHUP信號
    至此,我們就清楚了何種情況下終端關(guān)閉后進(jìn)程會退出,何種情況下不會退出。


    要想終端關(guān)閉后進(jìn)程不退出有以下幾種方法,均為通過shell的方式:
    1、編寫shell,內(nèi)容如下
           trap "" SIGHUP #該句的作用是屏蔽SIGHUP信號,trap可以屏蔽很多信號
          sigtest
    2、nohup sigtest 可以直接在命令行執(zhí)行,
           若想做完該操作后繼續(xù)別的操作,可以 nohup sigtest &
    3、編寫shell,內(nèi)容如下
           sigtest &
           其實任何將進(jìn)程變?yōu)楣聝哼M(jìn)程的方式都可以,包括fork后父進(jìn)程馬上退出。

    2.SIGCHLD信號

           子進(jìn)程死后,會發(fā)送SIGCHLD信號給父進(jìn)程。

            一個進(jìn)程在調(diào)用exit命令結(jié)束自己的生命的時候,其實它并沒有真正的被銷毀,而是留下一個稱為僵尸進(jìn)程(Zombie)的數(shù)據(jù)結(jié)構(gòu)(系統(tǒng)調(diào)用exit,它的作用是使進(jìn)程退出,但也僅僅限于將一個正常的進(jìn)程變成一個僵尸進(jìn)程,并不能將其完全銷毀)。在Linux進(jìn)程的狀態(tài)中,僵尸進(jìn)程 是非常特殊的一種,它已經(jīng)放棄了幾乎所有內(nèi)存空間,沒有任何可執(zhí)行代碼,也不能被調(diào)度,僅僅在進(jìn)程列表中保留一個位置,記載該進(jìn)程的退出狀態(tài)等信息供其他進(jìn)程收集,除此之外,僵尸進(jìn)程不再占有任何內(nèi)存空間。它需要它的父進(jìn)程來為它收尸,如果他的父進(jìn)程沒安裝SIGCHLD信號處理函數(shù)調(diào)用wait或waitpid()等待子進(jìn)程結(jié)束,又沒有顯式忽略該信號,那么它就一直保持僵尸狀態(tài),如果這時父進(jìn)程結(jié)束了,那么init進(jìn)程自動會接手這個子進(jìn)程,為它收尸,它還是能被清除的。但是如果如果父進(jìn)程是一個循環(huán),不會結(jié)束,那么子進(jìn)程就會一直保持僵尸狀態(tài),這就是為什么系統(tǒng)中有時會有很多的僵尸進(jìn)程。

    2.SIGTERM信號

    kill() 可以發(fā) SIGTERM 過去;kill 命令默認(rèn)也使用 SIGTERM 信號。

    SIGTERM 信號的處理函數(shù),常見的是用來清理、退出;或者程序可以忽略這個信號,以防誤殺。
            SIGTERM is the default signal sent to a process by the kill or killall commands. It causes the termination of a process, but unlike the SIGKILLsignal, it can be caught and interpreted (or ignored) by the process. Therefore, SIGTERM is more akin to asking a process to terminate nicely, allowing cleanup and closure of files. For this reason, on many Unix systems during shutdown, init issues SIGTERM to all processes that are not essential to powering off, waits a few seconds, and then issues SIGKILL to forcibly terminate other processes to allow the computer to halt.




    linux kill信號列表
    2009-04-13 17:00
    $ kill -l
    1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
    5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
    9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
    13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD
    18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
    22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
    26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
    30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1
    36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5
    40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9
    44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
    48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
    52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
    56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5
    60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1
    64) SIGRTMAX

    列表中,編號為1 ~ 31的信號為傳統(tǒng)UNIX支持的信號,是不可靠信號(非實時的),編號為32 ~ 63的信號是后來擴(kuò)充的,稱做可靠信號(實時信號)。不可靠信號和可靠信號的區(qū)別在于前者不支持排隊,可能會造成信號丟失,而后者不會。

    下面我們對編號小于SIGRTMIN的信號進(jìn)行討論。

    1) SIGHUP
    本信號在用戶終端連接(正常或非正常)結(jié)束時發(fā)出, 通常是在終端的控制進(jìn)程結(jié)束時, 通知同一session內(nèi)的各個作業(yè), 這時它們與控制終端不再關(guān)聯(lián)。

    登錄Linux時,系統(tǒng)會分配給登錄用戶一個終端(Session)。在這個終端運行的所有程序,包括前臺進(jìn)程組和后臺進(jìn)程組,一般都屬于這個 Session。當(dāng)用戶退出Linux登錄時,前臺進(jìn)程組和后臺有對終端輸出的進(jìn)程將會收到SIGHUP信號。這個信號的默認(rèn)操作為終止進(jìn)程,因此前臺進(jìn) 程組和后臺有終端輸出的進(jìn)程就會中止。不過可以捕獲這個信號,比如wget能捕獲SIGHUP信號,并忽略它,這樣就算退出了Linux登錄,wget也 能繼續(xù)下載。

    此外,對于與終端脫離關(guān)系的守護(hù)進(jìn)程,這個信號用于通知它重新讀取配置文件。

    2) SIGINT
    程序終止(interrupt)信號, 在用戶鍵入INTR字符(通常是Ctrl-C)時發(fā)出,用于通知前臺進(jìn)程組終止進(jìn)程。

    3) SIGQUIT
    和SIGINT類似, 但由QUIT字符(通常是Ctrl-\)來控制. 進(jìn)程在因收到SIGQUIT退出時會產(chǎn)生core文件, 在這個意義上類似于一個程序錯誤信號。

    4) SIGILL
    執(zhí)行了非法指令. 通常是因為可執(zhí)行文件本身出現(xiàn)錯誤, 或者試圖執(zhí)行數(shù)據(jù)段. 堆棧溢出時也有可能產(chǎn)生這個信號。

    5) SIGTRAP
    由斷點指令或其它trap指令產(chǎn)生. 由debugger使用。

    6) SIGABRT
    調(diào)用abort函數(shù)生成的信號。

    7) SIGBUS
    非法地址, 包括內(nèi)存地址對齊(alignment)出錯。比如訪問一個四個字長的整數(shù), 但其地址不是4的倍數(shù)。它與SIGSEGV的區(qū)別在于后者是由于對合法存儲地址的非法訪問觸發(fā)的(如訪問不屬于自己存儲空間或只讀存儲空間)。

    8) SIGFPE
    在發(fā)生致命的算術(shù)運算錯誤時發(fā)出. 不僅包括浮點運算錯誤, 還包括溢出及除數(shù)為0等其它所有的算術(shù)的錯誤。

    9) SIGKILL
    用來立即結(jié)束程序的運行. 本信號不能被阻塞、處理和忽略。如果管理員發(fā)現(xiàn)某個進(jìn)程終止不了,可嘗試發(fā)送這個信號。

    10) SIGUSR1
    留給用戶使用

    11) SIGSEGV
    試圖訪問未分配給自己的內(nèi)存, 或試圖往沒有寫權(quán)限的內(nèi)存地址寫數(shù)據(jù).

    12) SIGUSR2
    留給用戶使用

    13) SIGPIPE
    管道破裂。這個信號通常在進(jìn)程間通信產(chǎn)生,比如采用FIFO(管道)通信的兩個進(jìn)程,讀管道沒打開或者意外終止就往管道寫,寫進(jìn)程會收到SIGPIPE信號。此外用Socket通信的兩個進(jìn)程,寫進(jìn)程在寫Socket的時候,讀進(jìn)程已經(jīng)終止。

    14) SIGALRM
    時鐘定時信號, 計算的是實際的時間或時鐘時間. alarm函數(shù)使用該信號.

    15) SIGTERM
    程序結(jié)束(terminate)信號, 與SIGKILL不同的是該信號可以被阻塞和處理。通常用來要求程序自己正常退出,shell命令kill缺省產(chǎn)生這個信號。如果進(jìn)程終止不了,我們才會嘗試SIGKILL。

    17) SIGCHLD
    子進(jìn)程結(jié)束時, 父進(jìn)程會收到這個信號。

    如果父進(jìn)程沒有處理這個信號,也沒有等待(wait)子進(jìn)程,子進(jìn)程雖然終止,但是還會在內(nèi)核進(jìn)程表中占有表項,這時的子進(jìn)程稱為僵尸進(jìn)程。這種情 況我們應(yīng)該避免(父進(jìn)程或者忽略SIGCHILD信號,或者捕捉它,或者wait它派生的子進(jìn)程,或者父進(jìn)程先終止,這時子進(jìn)程的終止自動由init進(jìn)程來接管)。

    18) SIGCONT
    讓一個停止(stopped)的進(jìn)程繼續(xù)執(zhí)行. 本信號不能被阻塞. 可以用一個handler來讓程序在由stopped狀態(tài)變?yōu)槔^續(xù)執(zhí)行時完成特定的工作. 例如, 重新顯示提示符...

    19) SIGSTOP
    停止(stopped)進(jìn)程的執(zhí)行. 注意它和terminate以及interrupt的區(qū)別:該進(jìn)程還未結(jié)束, 只是暫停執(zhí)行. 本信號不能被阻塞, 處理或忽略.

    20) SIGTSTP
    停止進(jìn)程的運行, 但該信號可以被處理和忽略. 用戶鍵入SUSP字符時(通常是Ctrl-Z)發(fā)出這個信號

    21) SIGTTIN
    當(dāng)后臺作業(yè)要從用戶終端讀數(shù)據(jù)時, 該作業(yè)中的所有進(jìn)程會收到SIGTTIN信號. 缺省時這些進(jìn)程會停止執(zhí)行.

    22) SIGTTOU
    類似于SIGTTIN, 但在寫終端(或修改終端模式)時收到.

    23) SIGURG
    有"緊急"數(shù)據(jù)或out-of-band數(shù)據(jù)到達(dá)socket時產(chǎn)生.

    24) SIGXCPU
    超過CPU時間資源限制. 這個限制可以由getrlimit/setrlimit來讀取/改變。

    25) SIGXFSZ
    當(dāng)進(jìn)程企圖擴(kuò)大文件以至于超過文件大小資源限制。

    26) SIGVTALRM
    虛擬時鐘信號. 類似于SIGALRM, 但是計算的是該進(jìn)程占用的CPU時間.

    27) SIGPROF
    類似于SIGALRM/SIGVTALRM, 但包括該進(jìn)程用的CPU時間以及系統(tǒng)調(diào)用的時間.

    28) SIGWINCH
    窗口大小改變時發(fā)出.

    29) SIGIO
    文件描述符準(zhǔn)備就緒, 可以開始進(jìn)行輸入/輸出操作.

    30) SIGPWR
    Power failure

    31) SIGSYS
    非法的系統(tǒng)調(diào)用。

    在以上列出的信號中,程序不可捕獲、阻塞或忽略的信號有:SIGKILL,SIGSTOP
    不能恢復(fù)至默認(rèn)動作的信號有:SIGILL,SIGTRAP
    默認(rèn)會導(dǎo)致進(jìn)程流產(chǎn)的信號有:SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ
    默認(rèn)會導(dǎo)致進(jìn)程退出的信號有:SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM
    默認(rèn)會導(dǎo)致進(jìn)程停止的信號有:SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU
    默認(rèn)進(jìn)程忽略的信號有:SIGCHLD,SIGPWR,SIGURG,SIGWINCH

    此外,SIGIO在SVR4是退出,在4.3BSD中是忽略;SIGCONT在進(jìn)程掛起時是繼續(xù),否則是忽略,不能被阻塞。

    posted @ 2011-08-16 11:55 哈哈的日子 閱讀(790) | 評論 (0)編輯 收藏
    會報錯
    sudo: sorry, you must have a tty to run sudo @import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

    只要用 ssh -t 就可以了。

    或者修改 /etc/suoders
    將 requirestty 注釋掉
    posted @ 2011-08-15 12:05 哈哈的日子 閱讀(1473) | 評論 (0)編輯 收藏
    @import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
    1. 使用默認(rèn)隔離級別 repeatable read
    2. 開始,使用 select @@tx_isolation 確認(rèn)當(dāng)前 session 的隔離級別,并且創(chuàng)建個表 create table tt (id int, name varchar(300)) engine=innodb
    3. 啟動 transaction 1(t1),使用 start transaction
    4. 啟動 transaction 2(t2), 再開個 mysql,使用 start transaction
    5. 在 t2 執(zhí)行 select * from tt
    6. 在 t1 執(zhí)行 insert into tt  values(1, 'haha')
    7. 在 t2 再次執(zhí)行 select * from tt,是看不到數(shù)據(jù)的。
    8. 在 t2 執(zhí)行 update tt set name='hehe' where id=1
    9. 在 t2 再再次執(zhí)行 select * from tt,居然看到 id=1 那條 hehe 了!
    10. 我們幻讀了......

    參考自:
    http://blog.bitfly.cn/post/mysql-innodb-phantom-read/

    原作者寫得非常好


    posted @ 2011-08-02 17:59 哈哈的日子 閱讀(1463) | 評論 (4)編輯 收藏
    主站蜘蛛池模板: 亚洲成色www久久网站夜月| 亚洲综合激情九月婷婷| 亚洲第一二三四区| 蜜芽亚洲av无码一区二区三区| 国产精品九九久久免费视频| 天天影院成人免费观看| 亚洲&#228;v永久无码精品天堂久久 | 亚洲国产人成在线观看| 偷自拍亚洲视频在线观看99| 日韩人妻一区二区三区免费| 国产特级淫片免费看| 亚洲一区二区影院| 黄页网站在线观看免费| **真实毛片免费观看 | 国产高清免费在线| 亚洲三级电影网址| 粉色视频免费入口| 久久久精品2019免费观看 | 免费永久国产在线视频| 亚洲黄色网址在线观看| 日本精品久久久久久久久免费| 国产精品爱啪在线线免费观看| 亚洲精品国精品久久99热| 亚洲国产区男人本色在线观看| 大妹子影视剧在线观看全集免费| 手机在线看永久av片免费| 亚洲精品无码乱码成人| 亚洲精品无码av片| 久久精品一本到99热免费| 久久久久国产成人精品亚洲午夜 | 亚洲av无码乱码在线观看野外| 亚洲欧洲日产专区| 中文在线观看永久免费| 日韩免费视频一区| 亚洲成人福利在线| 另类免费视频一区二区在线观看 | 亚洲欧美日韩综合俺去了| 久久ww精品w免费人成| 亚洲人成人网站色www| 黄色大片免费网站| 毛片a级毛片免费观看免下载|