<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://m.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)編輯 收藏
    主站蜘蛛池模板: 亚洲av丰满熟妇在线播放| 免费人妻av无码专区| 亚洲精品无码久久久久去q| 牛牛在线精品观看免费正| 日本免费v片一二三区| 亚洲国产精品成人综合色在线| 丁香花免费高清视频完整版| 在线观看亚洲AV日韩A∨| 成年女人色毛片免费看| 亚洲第一街区偷拍街拍| 凹凸精品视频分类国产品免费| 无遮挡呻吟娇喘视频免费播放| 亚洲日韩中文字幕日韩在线| 成在人线av无码免费高潮水| 亚洲国产精品无码专区影院| 久久久免费精品re6| 亚洲国产人成在线观看| 免费无码不卡视频在线观看| 男性gay黄免费网站| 亚洲午夜国产精品无码| 99免费视频观看| 亚洲国产乱码最新视频| 啊灬啊灬别停啊灬用力啊免费看| 男女作爱免费网站| 亚洲Av无码专区国产乱码DVD| 2022久久国产精品免费热麻豆| 国产亚洲中文日本不卡二区| 四虎影视永久免费观看地址| 日本一区午夜艳熟免费| 亚洲第一永久在线观看| 国产在线19禁免费观看| 福利免费在线观看| 亚洲综合伊人制服丝袜美腿| 免费在线观看你懂的| 久久国产精品免费看| 亚洲老熟女五十路老熟女bbw| 久久久无码精品亚洲日韩软件 | A级毛片内射免费视频| 在线观看亚洲专区| 337p欧洲亚洲大胆艺术| 日本免费中文字幕在线看|