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

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

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

    碼農往事
    我的代碼為什么這么丑?一定是因為我長的不好看
    posts - 29,comments - 86,trackbacks - 0
    說有一個屋里有多個桌子,有多個人? 如果3個人一桌,多2個人。 如果5個人一桌,多4個人。 如果7個人一桌,多6個人。 如果9個人一桌,多8個人。 如果11個人一桌,正好。 請問這屋里多少人?
    最近比較閑,逛論壇看到隨手做了.
    最小答案是
    代碼如下:
        public static void main(String[] args) {
            for (int i = 0; i < Integer.MAX_VALUE; i++) {
                long value = i * 11;
                if (value % 3 == 2 && value % 5 == 4 && value % 7 == 6 && value % 9 == 8) {
                    System.out.println("i:" + i + ",value:" + value);
                    break;
                }
            }
        }
    計算出來的結果是:i:229,value:2519
    轉念一想,結果可能不止一個,于是換個寫法:
        public static void main(String[] args) {
            int count = 0;
            long value;
            long valueMax = 0;
            long iMax = 0;
            long pram = 11;
            for (int i = 0; i < Integer.MAX_VALUE; i++) {
                value = i * pram;
                if (value % 3 == 2 && value % 5 == 4 && value % 7 == 6 && value % 9 == 8) {
                    count++;
                    if (iMax < i) {
                        iMax = i;
                    }
                    if (valueMax < value) {
                        valueMax = value;
                    }
                }
            }
            System.out.println("count:" + count);
            System.out.println("iMax:" + iMax);
            System.out.println("valueMax:" + valueMax);
        }
    當i在Integer.MAX_VALUE范圍內的計算結果:
    count:6817408
    iMax:2147483434
    valueMax:23622317774
    這邊遇到了一個問題,當代碼中的pram聲明為int類型時計算的結果會與聲明為long類型發生極大偏差,貌似是因為Java乘法對于int類型越界處理的問題,具體原因待查.
    如果你用如下代碼執行:
     int count = 0;
            for (int i = 0; i < Integer.MAX_VALUE; i++) {
                long value = i * 11;
                if (value % 3 == 2 && value % 5 == 4 && value % 7 == 6 && value % 9 == 8) {
                    System.out.println("i:" + i + ",value:" + value);
                    count++;
                }
            }
            System.out.println("count:" + count);
    最后數行看到的結果是這樣:
    i:2147475704,value:2147396264
    i:2147476019,value:2147399729
    i:2147476334,value:2147403194
    i:2147476649,value:2147406659
    i:2147476964,value:2147410124
    i:2147477279,value:2147413589
    i:2147477594,value:2147417054
    i:2147477909,value:2147420519
    i:2147478224,value:2147423984
    i:2147478539,value:2147427449
    i:2147478854,value:2147430914
    i:2147479169,value:2147434379
    i:2147479484,value:2147437844
    i:2147479799,value:2147441309
    i:2147480114,value:2147444774
    i:2147480429,value:2147448239
    i:2147480744,value:2147451704
    i:2147481059,value:2147455169
    i:2147481374,value:2147458634
    i:2147481689,value:2147462099
    i:2147482004,value:2147465564
    i:2147482319,value:2147469029
    i:2147482634,value:2147472494
    i:2147482949,value:2147475959
    i:2147483264,value:2147479424
    i:2147483579,value:2147482889
    count:3718586
    問題產生的原因應該是Java對于int的乘法結果大于上限的情況,自動截取了前10位.
    -----------------------------------------------------------------------------------------------------------------之前的理解不正確.

    根據Java的基礎類型的變窄轉換(Narrowing primitive conversion)規則,對于運算結果超出int范圍的,將超出部分全部丟棄,只保留低32位的.
    posted @ 2016-01-25 17:16 Jimi 閱讀(3412) | 評論 (0)編輯 收藏
    有位朋友問起,我就順便總結一下好了。個人知識有限,有謬誤歡迎指正。
    本人一直從事的服務端相關的工作,對前端只能說是耳聞目染。
    參與的項目主要是頁游和手游。

    從程序開發角度講起,程序一般常分為前端程序和后端程序。

    一.前端
    前端就是指玩家所使用的客戶端,主要包括處理UI事件和向服務端發送請求。
    頁游主流的技術有ActionScript及新興的Unity框架,由html5和JavaScript做的小游戲也不少。
    手游上現在比較火的框架就是cocos2d-x和Unity 3D,cocos2d-x 是開源的,Unity 對開發者收費。
    兩者都支持多平臺,就是說一次開發,ios、android等平臺都可以生成相應代碼。
    我自己只稍微玩過一點cocos2d-x,主要用的語言是C++,也可以跟Lua混合使用。
    Unity平臺則支持C#、Boo、JavaScript、Lua,我沒玩過,不發表評論。
    2者現在都很火,行情都還不錯。
    最近比較大的新聞,就是Unreal Engine虛幻引擎宣布開發者免費,感興趣的可以自行google下。

    二.后端
    通常所說的后端,常指的客戶端發送請求的接收和處理者。語言的選擇就很多了,Java、C++、Python、PHP等等。
    端游等對實時性能要求比較高的場合,一般會選擇C++,與之相應的開發成本更高。相對來講,手游頁游選其它語言的就很多了。
    一般根據對實時性的要求,來選擇合適的通信方式,長連接或短連接,以及合適的通訊協議如http、protobuf、amf3,及自定義協議等。
    大多數時間,你主要的工作在定義協議、寫游戲邏輯然后與客戶端聯調。
    另外,服務端一個重要的工作就是負責數據的存儲,mysql數據庫是一個很常見的選擇,還有這幾年興起的各種Nosql數據庫,其中尤其是redis(有人說它不是數據庫),用的越來越多。
    最后,對于日志的處理,也是至關重要的。常用到的框架有log4j以及logback。簡單粗暴點的,你可以另外開線程,直接丟入數據庫,精細點的可以先寫log文件,然后用腳本解析,轉發到日志服務器然后再存入數據庫。
    如果是放mysql數據庫,記得把二進制日志關掉,不然沒跑幾天硬盤就爆了。
    工作內容上,除了上述事務,經常需要你做的事情還有:
    其一,各種游戲平臺的SDK對接,頁游如騰訊、360、37wan,手游如蘋果官方、谷歌官方以及各種大小平臺;
    其二,制作游戲測試工具,GM命令等;
    其三,開發供運維人員使用的WEB版本的游戲管理平臺。
    小規模的公司,你可能啥都要做,人力配置稍微寬松的公司,這些工作往往會區分開來。
    架構上來說,大型游戲的服務端,會分成登錄服、邏輯服、數據存儲服、日志服、GM管理服甚至更復雜。
    一般服務器承載量不高的情況下,單進程的登錄-邏輯-數據的架構也很常見。

    從團隊結構角度講,常見的職位分配:

    1.策劃類:主策劃、關卡策劃、數值策劃、劇本策劃
    2.美術類:主美、UI、3D建模、動作、特效、場景、原畫
    3.程序類:后端、前端
    4.其它:商務、運營、維護、QA
    一個大規模團隊里往往美術是最多的,現在是看臉的時代,囧RZ!好的美術都是用錢砸的。
    小團隊來說,自然就是需要各種身兼數職的牛人。
    策劃?一個就夠了,
    前端?策劃也能兼,
    后端?一個就夠了
    運維?后端也能干
    美術?不好搞就外包吧
    這個世界上永遠不缺少一個人搞定以上所有事情的大牛。

    答博友問:我們當時的團隊是,策劃兼前端,共3前端,后期只剩倆了,后端,前期倆,后期只剩我一個,還有一位特效,美術外包。
    答畢。

    該休息了

    在此申明,轉載——請注明出處。
    來自:http://www.tkk7.com/rockblue1988/archive/2015/03/10/423328.html

    posted @ 2015-03-10 02:05 Jimi 閱讀(4175) | 評論 (3)編輯 收藏
    現在總結,是有那么點晚了呢。
    只是想把那些容易不經意間忘卻的,大的小的、圓的扁的、重要的不重要的,都稍稍記錄下來。

    這是結完婚后的第一個年頭,酸甜苦辣,冷暖自知(這句我咋就能聯想到鴨子呢?)。

    一.工作
    2月份,13年開始做的頁游創業項目徹底黃了,還沒過年呢,尾牙都不給吃,團隊就“被”滾蛋了。
    過完年回來,花了三個禮拜找工作。
    3月2號,最終選擇到一家手游公司上班,提前轉正。
    由于種種原因,決定換工作,拿了三份Offer,其中有我職業生涯中拿到過的最高的,還是比較欣慰的,這種被人認可的感覺良好,雖然最終沒選擇它。
    11月27號到了當前公司上班,目前為止,工作和交流都很funny,是個令人愉快的選擇。

    二.生活
    在魔都這地方,換租了一套有獨立廚房的居室,租的房子啥都沒,買了各種東西,才有那么點家的樣子。
    每天上班下班,做飯洗碗,生活也有點像個樣子。
    這一年是到影院觀影次數最多的一年,這也是戀愛時候曾經憧憬的。
    給自己買了個nokia x2的手機,可是不到一個月就碎屏了,渣渣傷不起。
    小舅子來到,帶他走向了碼農的不歸路。

    三.技能
    1.廚藝
    研究嘗試了很多沒做過的菜式:
    酸菜大腸、豬肚燉蛤蜊、燉王八、蒜泥扇貝、醬汁鮑魚、清蒸多寶魚、清蒸鱸魚、肉末蒸蛋、土豆燉牛腩、
    啤酒燉羊肉、香鹵牛筋、清蒸豬舌頭、酸菜魚頭、土豆色拉、西式牛排、香煎鱈魚,還做了第一份自制雙皮奶。
    這里一點要說說,一個智能電壓力鍋實在是太值得入手了,煮飯燉湯燜肉都用的上,最重要的是有預約功能,晚上下好米,早上起來就能吃稀飯了。
    2.籃球
    周六無安排的話,堅持到上海大學打籃球,虐與被虐之間,技術還是有所進步的。值得一提的事,公司內部比賽,也算是第一次正式上了場,蠻開心。
    3.吉他
    沒進步,只剩下隨便吼吼的技能,走入社會越久,越啞。這個技能的好處是,年會總有機會上臺去釋放下悶騷的青春,順帶還能帶點小禮品下來。
    4.電子琴
    主要練熟了兩首曲子:《菊次郎的夏天》和《夢中的婚禮》,完成了大學時的小心愿。《克羅地亞狂想曲》挑戰失敗,最近電子琴已擺爛。
    5.駕照
    魔都4月份報名,7500,模擬考什么的花了500左右,每次練車都AA請教練吃飯,加上請假考試,總成本10000左右,好在一次性過----說實話,沒上過幾回車,教練素質一般,考科三中間三個月停練,呆車上的時間也絕對沒達標 ---- 全國的駕校都這樣嗎?都TM沒人管了?
    6.代碼能力
    對于Linux下的操作更加熟練,shell腳本編寫,組織SQL的能力有所提高。
    在不同的公司,讀到不同風格的代碼,隱約覺得內功有所提升----別的不說,抄代碼能力那是肯定增長了。
    作為一個半路出家的程序員,補了《C++ primer》和《C程序設計語言》兩本心法,眼界稍稍增長,至少不會被“java程序員不曉得指針是啥”這類的說辭給躺槍。
    主要的吃飯家伙----Java方面,我再“三”次嘗試了《Java并發編程實踐》這本書,比最初多懂得一點。
    比較用得上的一本書是《Java程序性能優化》,在大牛眼中這書可能比較淺顯,但里面的東西確實比其它一些大部頭里說的簡潔一些,挺多地方一般面試也常問到。
    《Java性能優化權威指南》就是前者的加強版,干貨不少,字太多沒堅持讀完。
    項目中用上了redis,漲了點姿勢。
    比較實用的新技能:Lua算是比較熟練了,可以拿來換飯錢。

    四.開心的事
    1.年會上中了三等獎
    2.論壇上抽中一個機械鍵盤

    五.最重要的事
    兩口之家即將變成三口之家了,希望一切順順利利、平平安安!

    六.2015的目標
    年底再揭曉

    祝觀文的諸位碼友三羊開泰,心想事成!
    PS:沒多少內容的一篇隨筆,竟然花了近兩個小時,必須對產出高質量博文的博主們表達一下由衷的敬佩
    posted @ 2015-03-07 03:09 Jimi 閱讀(5638) | 評論 (11)編輯 收藏
    最近的工作主要涉及LUA,這有個坑必須記一下。
    下面是一個LUA面向對象寫法非常常見的寫法。
    Bird = {
        color = {};canFly = true
    }

    function Bird:new(o)
        o = o or {}
        setmetatable(o, self)
        self.__index = self
        self.color = {}
        return o
    end
    注意,這里Bird類有兩個屬性,1個表,1個是基本類型,然后上測試代碼(Utils類只是簡單的封裝類,可以自己實現一個)
            local A = Bird:new()
            LoggerUtils:debug("------------------------------原始值-----------------------------------");
            LoggerUtils:debug("Bird canFly:" .. StringUtils.boolean2string(A.canFly));
            LoggerUtils:debug("Bird color:");
            CommonUtils.printTable(Bird.color)
            LoggerUtils:debug("a canFly:" .. StringUtils.boolean2string(A.canFly));
            LoggerUtils:debug("a color:");
            CommonUtils.printTable(A.color)
            --改變A的屬性
            A.canFly = false
            A.color[1] = "red"
            A.color[2] = "blue"
            A.color[3] = "green"
            LoggerUtils:debug("------------------------------A改變后----------------------------------");
            LoggerUtils:debug("Bird canFly:" .. StringUtils.boolean2string(Bird.canFly));
            LoggerUtils:debug("Bird color:");
            CommonUtils.printTable(Bird.color)
            LoggerUtils:debug("A canFly after change:" .. StringUtils.boolean2string(A.canFly));
            LoggerUtils:debug("A color after chagne:");
            CommonUtils.printTable(A.color)
            LoggerUtils:debug("-------------------------------B的值----------------------------------");
            local B = Bird:new()
            LoggerUtils:debug("B canFly:" .. StringUtils.boolean2string(B.canFly));
            LoggerUtils:debug("B color:");
            CommonUtils.printTable(B.color)

    代碼執行結果:
    2014-12-29 11:20:40,690 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: ------------------------------原始值-----------------------------------
    2014-12-29 11:20:40,690 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird canFly:true
    2014-12-29 11:20:40,691 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird color:
    2014-12-29 11:20:40,691 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: a canFly:true
    2014-12-29 11:20:40,691 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: a color:
    2014-12-29 11:20:40,691 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: ------------------------------A改變后----------------------------------
    2014-12-29 11:20:40,691 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird canFly:true
    2014-12-29 11:20:40,691 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird color:
    2014-12-29 11:20:40,692 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 1:red
    2014-12-29 11:20:40,692 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 2:blue
    2014-12-29 11:20:40,692 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 3:green
    2014-12-29 11:20:40,692 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: A canFly after change:false
    2014-12-29 11:20:40,692 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: A color after chagne:
    2014-12-29 11:20:40,693 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 1:red
    2014-12-29 11:20:40,693 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 2:blue
    2014-12-29 11:20:40,695 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 3:green
    2014-12-29 11:20:40,695 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: -------------------------------B的值----------------------------------
    2014-12-29 11:20:40,695 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: B canFly:true
    2014-12-29 11:20:40,695 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: B color:
    2014-12-29 11:20:40,695 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 1:red
    2014-12-29 11:20:40,695 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 2:blue
    2014-12-29 11:20:40,696 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 3:green
    發現神馬問題了嗎?
    當A的類型為表的屬性color改變時,原始類的color屬性也改變了,同時這個改變也影響到新建的B,而類型為基本類型的屬性canFly就沒有這個問題。
    我的解決方法是新增一個set方法:
    function Bird:setColor(color)
        self.color = color
    end

    然后修改改變屬性的方式:
    local color ={}
            color[1] = "red"
            color[2] = "blue"
            color[3] = "green"
            A:setColor(color)
    輸出結果:
    2014-12-29 11:31:58,648 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: ------------------------------原始值-----------------------------------
    2014-12-29 11:31:58,648 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird canFly:true
    2014-12-29 11:31:58,649 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird color:
    2014-12-29 11:31:58,649 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: a canFly:true
    2014-12-29 11:31:58,649 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: a color:
    2014-12-29 11:31:58,649 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: ------------------------------A改變后----------------------------------
    2014-12-29 11:31:58,649 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird canFly:true
    2014-12-29 11:31:58,650 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird color:
    2014-12-29 11:31:58,650 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: A canFly after change:false
    2014-12-29 11:31:58,650 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: A color after chagne:
    2014-12-29 11:31:58,650 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 1:red
    2014-12-29 11:31:58,650 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 2:blue
    2014-12-29 11:31:58,650 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 3:green
    2014-12-29 11:31:58,651 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: -------------------------------B的值----------------------------------
    2014-12-29 11:31:58,651 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: B canFly:true
    2014-12-29 11:31:58,653 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: B color:
    另外同事一個解決方法更簡單,直接修改new()方法,其它的地方都不用改:
    function Bird:new(o)
        o = o or {}
        setmetatable(o, self)
        self.__index = self
        o.color = {} 
        return o
    end
    這個問題基本上網上的示例貌似都沒提到,我讀的書里也沒有,實際調試過程中才發現的,會造成新創建的類里會有不該有的屬性,比較蛋疼。
    具體原因不了解,有木有筒子指教一下?順便問問這兩種方法哪種更好?
    posted @ 2014-12-29 11:42 Jimi 閱讀(10774) | 評論 (5)編輯 收藏
    作為一名“萬能”的碼農,這種活兒你遲早要干的。----By Jimi沒有bond

    準備工作:yum

    1.檢查是否已安裝
    rpm -qa subversion
    如果要卸載舊版本:
    yum remove subversion

    2.安裝

    yum install subversion
    PS:yum install httpd httpd-devel subversion mod_dav_svn mod_auth_mysql(這是安裝配合Apache的模塊,我暫時還沒做,做了再補上,你可以只裝subversion,多裝了也無所謂)
    3.檢查是否安裝成功
    svnserve --version
    如果成功會輸出版本號

    4.創建倉庫目錄
    例如:
    mkdir /home/svn/game

    5.創建項目
    svnadmin create /home/svn/game

    6.檢查是否創建成功
    cd /home/svn/game
    ll
    如果成功,game目錄下會多出幾個文件夾


    7.進入conf目錄會看到3個配置文件,生成的文件中都有英文注釋說明
    示例需求:
    策劃組:開策劃、美術讀寫
    后端組:開后端讀寫,策劃只讀
    前端組:開前端讀寫,策劃、美術只讀
    美術組:開美術讀寫,策劃只讀
    管理員組:所有的讀寫
    authz:用戶權限配置
    示例:
    [groups]
    #管理組
    manager = boss
    #服務端用戶組
    server = server1,server2
    #客戶端用戶組
    client = client1,client2
    #美術組
    art = art1,art2
    #策劃組
    design=design1,design2
    [game:/]
    @manager=rw
    [game:/server]
    @server=rw
    [game:/client]
    @client=rw
    @design=r
    @art=r
    [game:/art]
    @design=rw
    @art=rw
    @client=r
    [game:/design]
    @design=rw
    @server=r
    @client=r
    @art=r
    passwd:用戶密碼
    [users]
    boss=123456
    server1=123456
    server2=123456
    client1=123456
    client2=123456
    art1=123456
    art2=123456
    design1=123456
    design2=123456
    svnserve.conf:
    #匿名訪問者權限
    anon-access = none
    #驗證用戶權限
    auth-access = write
    #密碼文件地址
    password-db = /home/svn/game/passwd
    #權限文件地址
    authz-db = /home/svn/game/authz
    #項目名稱(UUID)
    realm =game


    8.開放svn端口
    默認是3690端口,你也可以用別的。已開啟的跳過這一步
    修改
    iptables -I INPUT -p tcp --dport 3690 -j ACCEPT
    保存
    /etc/rc.d/init.d/iptables save
    重啟
    service iptables restart
    查看
    /etc/init.d/iptables status

    9.啟動SVN服務
    svnserve -d -r /home/svn
    -d:守護進程
    -r:svn根目錄
    假設服務端IP為192.168.1.100,那么如下設置后game的訪問目錄就為:
    svn://192.168.1.100/game

    10.安裝客戶端 TortoiseSVN

    11.建立子目錄
    在客戶端PC上找個目錄,用管理員帳戶從svn://192.168.1.100/game遷出game目錄,分別新建art,design,server,client 4個子目錄,然后提交。
    這時候你可以用其他組的帳戶測試下是否正常使用了。

    12.安裝好的svn服務端,默認是不會開機自啟動的,每次開機自己啟動會很麻煩,我們可以把它設成開機啟動
    首先:編寫一個啟動腳本svn_startup.sh,我放在/root/svn_startup.sh
    #!/bin/bash
    /usr/bin/svnserve -d -r /home/svn/
    這里的svnserve路徑保險起見,最好寫絕對路徑,因為啟動的時候,環境變量也許沒加載。
    絕對路徑怎么查?
    which svnserve
    這里還有可能碰到一個問題,如果你在windows下建立和編寫的腳步,拿到linux下,用vi或者vim修改后可能會無法執行,這是文件格式的問題
    vi svn_startup.sh

    輸入:set ff 回車

    如果顯示的結果不是fileformat=unix

    再次輸入

    set ff=unix

    就OK了
    然后修改該腳本的執行權限
    chmod ug+x svn_startup.sh

    或者萬能的

    chmod 777 svn_startup.sh
    最后:加入自動運行
    vi /etc/rc.d/rc.local
    在末尾添加腳本的路徑,如:
    /root/svn_startup.sh
    現在,你可以重啟一下試試了。 不懂得怎么確認成功?敗給你了
    ps -ef|grep svnserve
    好多活兒
    posted @ 2014-11-19 11:50 Jimi 閱讀(58610) | 評論 (9)編輯 收藏
    那種酸爽,根本說不出來—————————————————————————— by: Jimi沒有Bond
    Jimi是誰? 就是灑家啊!

    剛開始學習寫Java的時候,用的eclipse,正式工作后,主要用的myeclipse,去年初在前輩的推薦下,在2折的時候買了正版的 IntelliJ IDEA 和 Pycharm,12.0版終生使用,一年更新。
    使用前早就久聞其名,據說是最好的Java開發工具。
    起先用的非常不習慣,但是花了錢的,硬著頭皮用了下去。
    短短一個禮拜,徹底愛上了它!就是辣么酸爽!--------------------------------------------------------------謹以此文獻給對于擁抱IDEA還存在疑慮的筒子們

    JetBrains(這個公司的名稱翻譯過來就是“大腦噴射?”) 公司的宣傳語是這么說的:Develop with pleasure!(帶著快樂開發!)

    Why?
    他們咋這么有信心呢?
    這到底是怎樣的一個工具?

    跟我一起來數數IDEA特別長的地方:

    一.黑色主題 Darcula

    眼睛舒服,最重要的是酷!
    設置方式:FILE--Settings--Edit--Colors&Fonts--Scheme name



    二.智能提示

    創建或引入項目的時候,會自動引入缺少的包,真找不著的還可以search in the net
    鍵入代碼的時候,區分大小寫的智能提示,自動引入包,如果有重名的會列出所有選擇,但是比 myeclipse 的更聰明,至于怎么個聰明法,你自個兒試試就知道了

    三.工具集成

    基本上正式開發的常用工具基本都集成了,而且基本都在你非常容易觸到的位置。
    說說我比較常用的:

    1.ant
    你懂的

    2.maven
    你也懂的

    3.SVN
    相比之下,IDEA的SVN的提交提供了更多的選項和功能
    提交的界面兩側會顯示當前文件和修改的部分對比,可以非常方便地檢查和修改文件。
    提交前:
    (1).可選擇自動格式化
    (2).可選擇自動忽略沒有使用的imports
    (3).可選擇分析代碼
    (4).檢查是否有TODO
    提交后甚至可以選擇將改變上傳到特定的目錄


    4.系統終端
    有了這個東西,你就不必頻繁地切換窗口了
    打開方式:Tools--Open Terminal
    快捷鍵:Alt+F12

    5.SSH工具
    打開方式:Tools--Start SSH session

    6.數據庫連接工具
    打開方式:View--Tool Windows--Database

    7.IDEA talk
    神奇的東西,你可以聯系局域網內其它的IDEA使用者,可以方便地把你的代碼show給你的同事
    打開方式:View--Tool Windows--IDEA talk

    8.Changes
    非常方便的changes視圖,它會變色顯示你所有改動過的文件,而且可以方便的與 本地歷史 或 線上歷史 做對比
    打開方式:View--Tool Windows--Changes

    還有git、github、cvs、groovy consle以及等等,真沒有的你還可以:
    FILE--Settings--Plugins

    四.強大的繪圖工具

    讀源碼看不懂項目結構?寫文章畫類圖好麻煩?
    右鍵diagram幫助你

    上個例圖:

    右鍵選擇 Show Categories 有驚喜,什么值域、方法、構造器、內部類統統有

    五.無縫接入eclipse和myeclipse

    IDEA可以直接打開有.project文件的項目,也可以將自身項目導出成eclipse的項目。
    而且因為IDEA的項目配置文件為1個.iml文件加一個獨立文件夾.idea,
    所以只要你將兩者放入ignore目錄,即使在你個人使用IDEA而團隊使用其他IDE的情況下,也并不會對其他人造成麻煩。

    導出方法:FILE--Export to eclipse

    六.更小的體積,更快的速度

    用過myeclipse的你明白的

    綜上,我想你應該能夠明白,為啥用IDEA寫代碼,就是那么愉快,就是那么酸爽,就是那么令人停不下來!


    接著分享開發中我比較常用的一些快捷鍵:

    一.找文件找代碼找引用相關

    1.雙擊shift
     在項目的所有目錄查找,就是你想看到你不想看到的和你沒想過你能看到的都給你找出來

    2.ctrl+f
    當前文件查找特定內容

    3.ctrl+shift+f
    當前項目查找包含特定內容的文件

    4.ctrl+n
    查找類

    5.ctrl+shift+n
    查找文件

    6.ctrl+e
    最近的文件

    7.alt+F7
    非常非常頻繁使用的一個快捷鍵,可以幫你找到你的函數或者變量或者類的所有引用到的地方

    二.編輯相關

    1.shift+enter
    另起一行

    2.ctrl+r
    當前文件替換特定內容

    3.ctrl+shift+r
    當前項目替換特定內容

    4.shift+F6
    非常非常省心省力的一個快捷鍵,可以重命名你的類、方法、變量等等,而且這個重命名甚至可以選擇替換掉注釋中的內容

    5.ctrl+d
    復制當前行到下一行

    6.ctrl+x
    剪切當前行

    7.ctrl+c \ ctrl+v 
    大家都懂的

    8.ctrl+z
    撤銷

    9.ctrl+shift+z
    取消撤銷

    10.ctrl+k
    提交代碼到SVN

    11.ctrl+t
    更新代碼

    12.alt+insert
    非常非常以及相當方便的一個組合鍵,不信您往下看
    在類中使用:


    可以自動生成構造器、getter/setter等等常用方法
    在項目目錄上使用:


    可用于新建各種文件。

    13.alt+enter
    又是一個大殺器,有多殺?
    例1:
    發現代碼很“黃”怎么辦?

    鼠標移上去喵一下:

    試試alt+enter:

    選擇simplify看看

    我勒個去,代碼簡潔了有木有啊!

    PS:黃色警告編譯可以通過,不影響程序的正常運行,一般都是一些對于代碼優化的建議,我遇到過的有:
    (1).can be simplify
    代碼可以簡化
    (2).Variable is never use
    聲明的變量從未被使用
    (3)unnecessary boxing
    不必要的聲明包裝

    以及等等等,多留意下,對于編碼的某些細節能夠更了解。

    例2:
    寫個類實現某個接口,加上 implements Runnable 后你就會發現這條紅色的波浪線:

    咱試試在這行上來個 alt+enter:

    感動地哭了有木有?你想到的沒想到的IDEA都幫你想到了。
    看到代碼里提示的各種紅XX,就試試alt+enter吧!什么未拋異常啊沒有try catch啊都能搞得定。

    14.ctrl+alt+L

    自動格式化代碼,我已經養成了寫完代碼就來一發的習慣。
    你可以個性化設置你自己的代碼風格:File--Settings--CodeStyle

    ——————————切——————————切——————————切——————————切——————————切——————————

    凡事有利有弊,IDEA同樣是把雙刃劍,最后說說它不好的地方

    1.最重要的就是“貴”!
    專業版個人許可2折可以接受,5折小貴,不打折桑不起!!!囧RZ~
    美刀的消費水準令國內大多在屌絲線上掙扎的猿類們望而卻步。
    好在JetBrains是有社區版的,最近對于學生也有免費的Key。
    對于使用破解版的小伙伴,建議自己用用就好了,不必太聲張。

    用戶養成良好的軟件付費習慣,才能讓我們的工作變得越來越有價值。

    2.集成太完善了
    集成的工具完全能夠應付大多數的工作需求,對于不求甚解又偷懶的筒子們,直接使用,可能很多工具的細節,你都不會了解,也不會再去了解了。
    比如:maven,ant

    3.不自帶JDK
    不是缺點的缺點,myeclipse是集成的


    差不多了,該擼代碼了。
    以上這些,就是我使用IDEA一年半來幾乎所有的心得了。
    能力有限,磚頭輕拍。
    如果你有殺傷力更強大的手段,歡迎交流。

    后記:最近偶然發現,這篇文章被人轉載了,而且沒注明出處,令人蛋疼。
    在此重申下,轉載,請注明出處。
    來自:http://www.tkk7.com/rockblue1988/archive/2014/10/24/418994.html 



    posted @ 2014-10-24 12:49 Jimi 閱讀(264138) | 評論 (15)編輯 收藏
    1.rm 刪除
    參數:
    -r:遞歸
    -f:強制

    2.cd 打開目錄
    cd ../  打開上級目錄

    3.mv 移動或者重命名文件
    重命名: mv test.txt test_old.txt
    移動文件:mv 文件路徑 新路徑

    4.cp 拷貝文件或目錄 參數與mv類似
    例:cp -r folder folder2
    sz 下載到本地

    5.sz 下載到本地

    6.rz 上傳到服務器

    7.find 查找文件或者文件內容
    查找文件中包含特定內容的行(支持通配符):find . -name "game.log" -type f |xargs grep "hello world" 

    8.df 查看存儲狀態

    9.top查看內存和CPU狀態

    10.ll 列出當前目錄所有文件

    11.ls列出當前目錄所有文件詳情

    12.chmod 777 修改文件讀寫權限(全可讀可寫)

    13.more 查看文件 按空格鍵向下翻頁

    14.less 與more相反,用法一致

    15.sudo -i 提權

    16.netstat -nat|grep -i "9001"|wc -l   查看9001端口連接數

    17.history 查看歷史操作

    18.last 查看歷史登陸,可以看看服務器有沒有陌生IP登陸
    例:last|grep 192.168.1.1  查看192.168.1.1的登陸情況 

    19.sh 執行腳本
    例:sh restart.sh

    20.ps 查看程序快照
    例:ps -ef|grep tomcat 查看運行中名稱包含tomcat的進程
          ps -aux|grep svn 

    21.kill -9 進程號 殺死進程,常與ps命令配合使用
    例:假設要關閉的進程號為 111
    kill -9 111

    22.date 顯示當前時間

    23.mkdir 創建目錄

    24.ssh 用戶名@IP地址 遠程連接
    例:ssh root@192.168.1.111

    25.tail 查看文件尾
    例:tail -100f game.log 查看文件最后100行,持續刷新,適合在服務器上看實時日志時使用


    26.head 與tail相反,用法一致

    27.vi 文本編輯
    最基本的操作:
    按i進入編輯模式,編輯完成后,按ESC退出編輯模式
    輸入:wq 回車后保存修改
    輸入:q!  不保存退出
    輸入ZZ 保存退出

    28.ctrl+c 撤銷或退出當前程序

    29.文件目錄下,按TAB有智能提示

    30.按 ↑ 符號,會顯示使用過的命令

    31.rpm -qa 查看已安裝過的程序
    例:rpm -qa|grep subversion 查看是否已安裝svn

    32.安裝sz/rz命令
    yum install lrzsz

    33.修改用戶密碼
    passwd 用戶名
    例:passwd root

    34.which 查找命令所在的路徑
    例1:which ssh
    例2:which sh

    35.查看編碼方式
    echo $LANG
    posted @ 2014-10-23 16:52 Jimi 閱讀(4878) | 評論 (1)編輯 收藏
    并發模式中,有一個稱做Future模式。啥是Future模式捏? future,翻譯成中文就是“未來,將來”的意思,可以簡單地理解為 “明天的事明天再做” 。
    比方說,你在做晚飯,而只有一個火爐,先燉個豬蹄要1小時,在等待豬蹄的這個時間里,你可以去淘米、洗菜、刷牙、摳腳,待豬蹄燉好了,再繼續炒菜。
    在編碼中體現為:將耗時任務丟入單獨的線程,從而使主線程能夠繼續執行其它的邏輯,待耗時任務執行完成后再做相應的處理。
    Future模式是一鐘十分常用的并發模式,所以JDK的并發包中自帶一套實現。上類圖:



    這個自己畫的,既然畫了不能白畫,囧!!!

    下面這個是用 IntelliJ IDEA 自帶工具生成的,真心太酸爽。


    只看函數名稱,也能基本了解FutureTask所提供的主要能力:
    1、可判斷執行狀態(isDone())
    2、可取消(cancel())
    3、可讀取返回結果(get())
    4、可判斷是否取消(isCancelled)
    現在,我們可以解決上面這個豬腳的問題了:

        public static class TestTask implements Callable<Boolean> {
            @Override
            public Boolean call() throws Exception {
                //模擬時間消耗
                System.out.println("--------漫長的一小時--------");
                Thread.sleep(10000);
                System.out.println("--------豬腳燉完--------");
                return true;
            }
        }

        public static void main(String[] args) throws ExecutionException, InterruptedException {

            System.out.println("--------開始做晚飯--------");
            System.out.println("開始燉豬腳~~~");
            System.out.println("--------豬腳下鍋--------");
            FutureTask<Boolean> futureTask = new FutureTask<Boolean>(new TestTask());
            Thread thread = new Thread(futureTask);
            thread.start();
            Thread.sleep(1000);
            System.out.println("--------淘米--------");
            Thread.sleep(1000);
            System.out.println("--------洗菜--------");
            Thread.sleep(1000);
            System.out.println("--------刷牙--------");
            Thread.sleep(1000);
            System.out.println("--------摳腳--------");
            //如果豬腳燉好了
            if(futureTask.get()==true){
                System.out.println("--------繼續炒菜--------");
            }
        }
    執行結果:
    --------開始做晚飯--------
    開始燉豬腳~~~
    --------豬腳下鍋--------
    --------漫長的一小時--------
    --------淘米--------
    --------洗菜--------
    --------刷牙--------
    --------摳腳--------
    --------豬腳燉完--------
    --------繼續炒菜--------
    posted @ 2014-10-23 16:13 Jimi 閱讀(5268) | 評論 (3)編輯 收藏
    public class InsertionSortAlgorithmTest {

        public static String arrayToString(int[] array){
           StringBuilder sb = new StringBuilder();
            for(int a:array){
                sb.append(a).append(" ");
            }
            return sb.toString();
        }

        public static int[] insertionSort(int[] array){
            int key;
            int j;
            for (int i = 1; i < array.length; i++) {
                key = array[i];
                j = i - 1;
                while (j >= 0 && array[j] > key) {
                    array[j + 1] = array[j];
                    j = j - 1;
                }
                array[j + 1] = key;
                System.out.println(arrayToString(array));
            }
            return array;
        }

        public static void main(String[] args) {
            int[] array = {2, 3, 1, 7, 5, 9, 4, 6, 8};
            insertionSort(array);
        }

    }
    posted @ 2014-02-18 23:23 Jimi 閱讀(1529) | 評論 (0)編輯 收藏
    1.說說ArrayList、Vector、LinkedList的區別
    2.HashMap的實現原理
    3.HashMap出現哈希沖突是如何處理的
    4.觀察者模式的定義和實現
    5.單例模式的定義和實現
    6.spring的事務如何配置
    7.什么是AOP?
    8.寫一個永不停止的線程
    9.mysql的優化
    10.如何查找性能瓶頸
    11.請自我介紹
    12.netty 3 和 netty 4的區別
    13.ArrayBlockingQueue和LinkedBlockingQueue的區別
    14.緩存的實現方式
    15.什么時候會GC?
    16.內存回收模型
    17.spring配置事務
    18.Mysql的事務處理
    19.ant自動上傳服務器
    posted @ 2014-02-18 23:18 Jimi 閱讀(1564) | 評論 (0)編輯 收藏

    --啟用Ad Hoc Distributed Queries 
    --
    (使用以下兩句代碼的原因:下面的sql中,其中有幾個從其他數據庫導入數據的語句,所以必須得先啟用Ad Hoc Distributed Queries,使用結束后,最好關閉它 )
    exec sp_configure 'show advanced options',1
    reconfigure
    exec sp_configure 'Ad Hoc Distributed Queries',1
    reconfigure

     

    GO
    delete from syscode
    insert into syscode 
    select type,code,name,note,value1,value2 FROM opendatasource('SQLOLEDB','Data Source=192.168.1.101;User ID=sa; Password=***').[DATABASE_NAME].dbo.syscode


    --使用完成后,關閉Ad Hoc Distributed Queries:
    exec sp_configure 'Ad Hoc Distributed Queries',0
    reconfigure
    exec sp_configure 'show advanced options',0
    reconfigure
    posted @ 2013-02-03 11:27 Jimi 閱讀(2769) | 評論 (0)編輯 收藏
    import java.util.ArrayList;
    import java.util.Calendar;

    public class CAL {
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Calendar start = Calendar.getInstance();
            System.out.println(start.getTimeInMillis());
            ArrayList<Integer> number = new ArrayList<Integer>();
            number.add(1);number.add(1);
            for (int i = 2; i <= 100000; i++) {
                number.add(number.get(i - 1) + number.get(i - 2));
            }
            Calendar end = Calendar.getInstance();
            System.out.println(end.getTimeInMillis());
            System.out.println("時間:" + (end.getTimeInMillis()-start.getTimeInMillis() ));
            System.out.println("last:"+number.get(100000));
        }

    }
    posted @ 2013-01-25 11:15 Jimi 閱讀(1913) | 評論 (0)編輯 收藏
    項目上有一個這樣的需求:登錄的時候選擇一個單位名稱,然后輸入賬號完成登錄,下次登錄的時候,“單位選擇”框里自動顯示為上次登錄的頁面。
    具體實現如下:

                {
    xtype : 'combo',                              //這里是選擇單位的Combo
    id:'orgname',
    store : orgStore,
    name:'orgname',
    emptyText : '請選擇單位',
    displayField : 'orgname',
    valueField : 'dbname',
    editable : false,
    forceSelection : true,
    triggerAction : 'all',
    shadow : 'frame',
    hiddenName : 'dbname',
    listeners:{
        select:function(){                                                          //增加1個select函數,當選擇的時候,將選擇結果保存入cookie
        savedbname= Ext.getCmp('orgname').getValue();
                                     Ext.util.Cookies.set('savedbname',savedbname);
    }
        }
    }



     
    var orgStore = new Ext.data.JsonStore( {                                 //這是單位選擇Combo的數據源
    url : 'test/LoginOrgSelectServlet',
    root : 'orgselect',
    fields : [ 'orgname', 'dbname' ],
    autoLoad : true,
    listeners:{load:function(){                                                  //給store添加一個load監聽器
      var cookiedata = Ext.util.Cookies.get("savedbname");
      if (cookiedata!=null){Ext.getCmp('orgname').setValue(cookiedata);}   //當cookie中的數據不為空的時候,設置combo的值
    }}
    });
    posted @ 2012-09-12 17:23 Jimi 閱讀(5204) | 評論 (1)編輯 收藏
    public List queryDeviceName(String where) {
    Session session =  this.getSession();
    List list = session.createSQLQuery("select number, name from devrepair " + where).list();
    return list;
    }

    List deviceList = this.getDevrepairService().queryDeviceName(where);
    StringBuilder sb = new StringBuilder();
    sb.append("{devices:[");
    for(Object nameinfo:deviceList){                                                            //查詢的結果為Object
    sb.append("{number:'").append(((Object[])nameinfo)[0]).append("',");          //將查詢結果轉化為Object的集合,取值
    sb.append("name:'").append(((Object[])nameinfo)[1]).append("'}");              
    sb.append(",");
    }
    posted @ 2012-09-03 17:25 Jimi 閱讀(617) | 評論 (0)編輯 收藏

    總體方案:從sql server 中導出建立數據庫的sql文件,在powerdesigner中生成PDM,再將PDM轉化為MySql的版本,然后生成數據庫的sql,在MySql中導入sql文件生成數據庫。將sql server 表中已存在的數據導出為CSV文件,將CSV文件導入MySql中實現數據遷移。
    用到的工具:Excel,PowerDesigner,SQLyog,記事本
    1.在sql server 2005中,右鍵點擊數據庫→任務→生成腳本  按提示點擊下一步,最后將腳本保存到文件xxx.sql



    2.打開powerdesigner,點擊文件→reverse engineer→database

    選擇數據庫類型為sql server 2005

    選擇第一步中生成的sql文件
    點擊確定,生成sql server 2005版本的PDM文件
    3.powerdesigner中,點擊工具→generate physical data model
    選擇類型為mysql 5.0,點擊確定生成mysql 5.0版本的pdm,如果出現如下錯誤

    將detail選項卡中的check model的打鉤去掉
    4.powerdesigner中選擇 數據庫→generate database

    點擊確定生成Mysql 5.0版本的數據庫腳本文件
    5.mysql 中,用source命令從sql文件創建相關的表 “source d:/xxx.sql”檢查上一步驟中生成的腳本文件,由于是從sql server中生成,數據庫名稱可能是dbo,將dbo改為你打算創建的數據庫名稱
    6.sql server中,,右鍵點擊數據庫→任務→導出數據 按提示導出為excel文件,如:xx.xls
    7.excel中打開,選擇文件→另存為csv文件  毋須保留列名,方式選擇utf-8,否則可能出現亂碼的問題
    8.再將csv文件導入mysql,有多種方式,圖形化界面SQLyog中,直接右鍵表→從CSV中導入數據 即可
    posted @ 2012-08-31 10:34 Jimi 閱讀(9155) | 評論 (3)編輯 收藏
    刪除了A項目,運行B項目的時候總是有A項目的啟動信息,甚至物理刪除A項目后都無法解決,猜測是A項目的項目文件被保存在myeclipse自帶的tomcat中,網上查了查,沒有找到相關的解決辦法,憑感覺找到以下目錄:
    \Workspaces\MyEclipse 8.5\.metadata\.me_tcat\webapps
    發現原來刪除的A項目的文件都保存在該目錄下,此外該目錄還包括當前運行的項目,刪除相關A項目的文件即可解決。
    看來 \Workspaces\MyEclipse 8.5\.metadata\.me_tcat\webapps 就是Myeclipse的發布目錄
    posted @ 2012-08-27 11:51 Jimi 閱讀(1947) | 評論 (0)編輯 收藏
    你必須學會翻##墻,感謝領導!
    posted @ 2012-08-07 10:39 Jimi 閱讀(1420) | 評論 (2)編輯 收藏
    小明和小強都是王老師的學生,老師的生日是M月N日,他們都知道老師的生日是以下十組中的一個,老師把M告訴了小明,把N告訴了小強,然后問他們是否知道自己的生日,小明說“如果我不知道小強也不知道”,小強說“本來我不知道,你說了這話我就知道了”,小明說“那我也知道了 ”。問老師的生日是以下的哪個。

    3,4
    3,5
    3,8
    6,4
    6,7
    9,1
    9,5
    12,1
    12,2
    12,8

    正在上班 orz..,偶然看到一個題目,就動動腦子吧。
    按月份排:
    3,4 3,5 3,8
    6,4 6,7
    9,1 9,5
    12,1 12,2 12,8
    按日期排:
    9,1 12,1
    12,2
    3,4 6,4
    3,5 9,5
    6,7
    3,8 12,8

    小明說“如果我不知道小強也不知道”  按月份排,小明一定不知道,小明知道月份以后肯定小強不知道,由于12,2 6,7的日期是唯一的,可見月份不是6月或12月,生日可能是以下5個:
    按月份排:
    3,4 3,5 3,8 
    9,1 9,5 
    小強說“本來我不知道,你說了這話我就知道了”,除去6,7 12,2,小強原本的選擇如下,
    按日期排:
    9,1 12,1
    3,4 6,4
    3,5 9,5
    3,8 12,8
    現在聽完小明說的話,剔除6月和12月的數據,老師的生日可能的日期如下:
    按日期排:
    9,1
    3,4
    3,5 9,5
    3,8
    現在小強知道了,由于3,5 9,5日期重復,所以日期一定不是5,生日的可能的集合為:3,4 3,8 9,1

    小明說“那我也知道了 ” 小明原本可能的選擇如下,
    按月份排:
    3,4 3,5 3,8 
    9,1 9,5 
    現在小明以小強的邏輯推斷,也可推知日期一定不是5,而小明自己知道月份,如果為3月,那么小明自己也無法知道老師的生日,所以只能是9月,
    老師的生日為9,1。



    posted @ 2012-07-25 12:48 Jimi 閱讀(1772) | 評論 (4)編輯 收藏
    JSP頁面定義了如下幾個作用域:
    頁面作用域(page scope)、請求作用域(request scope)、會話作用域(session scope)、應用程序作用域(application scope)
    頁面作用域中的對象僅在當前頁面可用;請求作用域中的對象在所有處理同一請求的頁面中都可用;會話作用域中的對象用于同一瀏覽器發出的所有請求;應用程序作用域中的對象被應用程序的所有用戶共享。
    通過設置<jsp:useBean>行為的scope屬性,制定bean應該放在哪個作用域中,例如:
    <jsp:useBean id="test" scope="request"  class="com.testBean" />
    會話跟蹤過程解釋:由于HTTP是一種無狀態協議,即服務器處理完瀏覽器的請求后將忘掉所發生的事務,當瀏覽器再次發出請求時,Web服務器并不知道新的請求與之前的請求有何關系。解決這個問題主要有兩種方法:
    1、服務器在應答中返回與該用戶有關的所有信息,并讓瀏覽器將其作為下一個請求的一部分發回去
    2、在服務器的任何位置保存狀態信息,并且發回一個標識符,瀏覽器在下一請求中返回該標識符,然后借由該標識符定位服務器上的狀態信息
    在這兩種情況下,可以用以下三種方式將狀態信息發送給瀏覽器:
    1、作為cookie    
    2、嵌入HTML表單作為隱藏字段
    3、進行編碼,編入應答主體的URL中,一般作為連接到其它應用程序的鏈接(也稱作URL復寫,URL rewriting)

    在瀏覽器和服務器間來回發送所有狀態信息的效率是極低的,所以大多數現代服務器都將信息保留在服務器上,只在瀏覽器和服務器間傳遞標識符,這就是會話跟蹤(session tracking),JSP隱藏了cookie會話跟蹤的所以細節,并實現了對URL復寫的支持,此外,JSP規范允許使用安全套接字協議層(Secure Socket Layer,SSL)內置的會話機制。在會話的生命周期中,保存在會話作用域中的信息可被同一瀏覽器的所有頁面所用。
    在線購物(P179):
    內存使用策略:
    1、只把那些真正需要被每個會話單獨擁有的對象放在會話作用域中
    2、將會話的有效期設成比默認值更短
    3、提供一種顯示的結束會話的方法。一個好的示例就是注銷功能,或者是當某件事務完成時,使會話失效。在servlet和其他自定義代碼中,可以使用HttpSession invalidate()方法。
    posted @ 2012-05-21 00:35 Jimi 閱讀(1857) | 評論 (1)編輯 收藏
    JSP有三種類型的元素:指令元素(directive element)、行為元素(action element)、和腳本元素(script element)。
    指令元素:
    <%@ page...%>  定義了獨立于頁面的屬性,例如會話跟蹤、錯誤處理頁面、對緩存的要求等
    <%@ include...>  在翻譯階段引入文件
    <%@ taglib...>    聲明一個在頁面中使用的包含自定義行為的標記庫
    標準行為元素:
    <jsp:usebean>  使一個JavaBeans在當前頁面可用    
    <jsp:getProperty>  從JavaBeans中獲得某個屬性值,并將其添加到應答中
    <jsp:setProperty>  設置JavaBeans的屬性值
    <jsp:include>  在請求處理階段引入來自一個servlet或頁面的應答結果
    <jsp:forward>  將對請求的處理轉交給一個servlet或JSP頁面
    <jsp:param>  使用<jsp:forward> 或<jsp:include> 時,向這個請求添加參數
    <jsp:plugin>
    自定義行為元素和標準標記庫:JSTL,JSP標準標記庫(JSP Standard Tag Library),可以用擴展API開發自定義行為
    腳本元素:
    <%...%>  小腳本,用于嵌入腳本代碼
    <%=...%>  用于嵌入JAVA表達式
    <%!...%>  聲明變量和方法
    posted @ 2012-05-20 03:47 Jimi 閱讀(280) | 評論 (0)編輯 收藏
    http: HyperText Transport Protocol (超文本傳輸協議) 是一種無狀態協議,即服務器發送應答后不會保留關于客戶端的任何信息
    URI:Uniform Resource Identifier (統一資源標示符) 
    URL:Uniform Resource Locator (統一資源定位器)   是URI的特殊化,標準端口號為80 
    Request:
    請求頭信息
    Accepttext/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Encodinggzip, deflate
    Accept-Languagezh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
    Connectionkeep-alive
    Content-Length55
    Content-Typeapplication/x-www-form-urlencoded; charset=UTF-8
    CookieJSESSIONID=6E9A50496EFFEBDB7E0FA60DFE506B74
    Hostlocalhost.:8080
    Refererhttp://localhost.:8080/SWS/login.jsp
    User-AgentMozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0
    X-Requested-WithXMLHttpRequest
    Accept:瀏覽器所能接受的語言和格式方面的信息
    User-Agent:瀏覽器類型
    Host:URL所對應的主機名
    請求參數:兩種傳遞方式
    1、通過查詢字符串的形式添加在URI后面,查詢字符串以“?”開始,由“&”符號分隔的經過URL編碼的(URL-encoded)名稱/值對組成
    2、作為消息主體的一部分發送
    請求方法:GET和POST,GET用于從服務器上取得資源,而不引起服務器的任何其它行為,POST用于請求服務器執行某個處理過程。兩者最明顯的區別之一是參數的傳遞方式,GET請求通常以查詢字符串的形式傳遞參數,而POST通常是把參數作為消息主體的一部分來發送。


    Response:
    響應頭信息
    Content-Type text/html;charset=utf-8 -------應答數據類型
    DateSat, 19 May 2012 18:48:50 GMT
    Server Apache-Coyote/1.1              --------服務器信息
    Transfer-Encoding chunked
    posted @ 2012-05-20 03:14 Jimi 閱讀(608) | 評論 (0)編輯 收藏

    啟動終端: Ctrl + Alt + T 

    切換正在運行中的程序:Alt + Tab 

    切換桌面: Ctrl + Alt + 上/下/左/右 

    快速啟動:微標鍵 

    彈出側邊欄:長按微標鍵 

    快速啟動側邊欄程序:微標鍵 + 對應數字 
     
    進入全屏終端:Ctrl + Alt + F1-F6 

    返回圖形界面:Ctrl + Alt + F7

    移動當前窗口到不同工作臺:Ctrl + Alt + Shift + → / ←


    posted @ 2012-05-05 00:09 Jimi 閱讀(315) | 評論 (0)編輯 收藏
    主站蜘蛛池模板: 午夜无码A级毛片免费视频| 久久国产免费一区二区三区| 亚洲精品视频久久久| 在线免费观看伊人三级电影| 久久夜色精品国产噜噜亚洲AV| 无码人妻久久一区二区三区免费丨| 精品国产日韩亚洲一区在线| 77777亚洲午夜久久多人| 欧洲一级毛片免费| 全黄A免费一级毛片| 亚洲欧洲在线播放| 国产乱人免费视频| 久久国产乱子伦免费精品| AV激情亚洲男人的天堂国语| 亚洲日本中文字幕区| 国产小视频免费观看| 亚洲w码欧洲s码免费| 亚洲av无码偷拍在线观看| 亚洲好看的理论片电影| 男女一边摸一边做爽的免费视频 | 99爱免费观看视频在线| 亚洲国产成人无码AV在线| 亚洲成A人片在线观看WWW| 天天干在线免费视频| 91麻豆国产免费观看| 成年网站免费入口在线观看| 亚洲AV无码乱码在线观看代蜜桃 | 免费无码黄动漫在线观看| 久久精品电影免费动漫| 一级做a爰片性色毛片免费网站| 亚洲一级在线观看| 亚洲成在人天堂一区二区| 亚洲精品高清一二区久久| 最近2019中文字幕免费看最新| 外国成人网在线观看免费视频| 无套内射无矿码免费看黄| 涩涩色中文综合亚洲| 亚洲香蕉免费有线视频| 亚洲AV永久无码精品成人 | 亚洲精品理论电影在线观看| 亚洲综合图片小说区热久久|