隨筆 - 1  文章 - 37  trackbacks - 0
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          留言簿(16)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          test

          搜索

          •  

          最新評論

          20100819
          完成以精武館平臺為中心的跨域登錄模塊。
          精武館圍棋譜頁面重新設計

          20100810
          一個重要的計劃正在實施!

          精武館第一個生產版本,與2010-08-08上線


          20100808
          圍棋打譜加入聲音
          修復圍棋幾個bug

          20100807
          圍棋模塊新增功能:
          1. 進入點目模式后,啟動Timer,2分鐘后自動完成點目,每30秒提醒一次
          2. 完成點目時,有30秒的時間選擇是否接受點目結果,30秒后自動選擇繼續走棋
          3. 一個請求(求和,點目,悔棋),如果被拒絕,則本輪無法再發起該請求


          20100802
          精武館已經通過所有重要測試:
          1. 客戶端:
              1). 無內存泄露
              2). 即便是IE6,也不會很卡
              3). 主流瀏覽器兼容
          2. 服務器端:
              1). 以房間為單位的服務器集群,可容納至少10萬人同時在線
              2). 在百萬級數據下所有查詢操作均在0.2秒以內(未測試千萬數據)
              3). 緩存,全文檢索均工作正常,并能很好的緩解數據庫壓力


          20100801
          Hibernate Search大數據手動建立索引
          數據庫:Mysql
          64萬條數據,創建索引結果:
          2010-08-01 17:33:48,522   INFO org.hibernate.search.impl.SimpleIndexingProgressMonitor:74 - 643600 documents indexed in 340634 ms
          2010-08-01 17:33:48,522   INFO org.hibernate.search.impl.SimpleIndexingProgressMonitor:77 - Indexing speed: 1889.418 documents/second; progress: 99.99922%
          2010-08-01 17:34:10,149   INFO org.hibernate.impl.SessionFactoryImpl:935 - closing

          創建索引的代碼:
          FullTextSession fullTextSession = Search.getFullTextSession(getSession());
                  fullTextSession.createIndexer().
                  batchSizeToLoadObjects(
          40).
                  threadsForSubsequentFetching(
          2).
                  threadsToLoadObjects(
          2).
                  cacheMode(CacheMode.IGNORE)
                  .startAndWait();

          配置:

           

          <property name="hibernateProperties">
                      
          <props>
                          
          <!--   MySQL  -->
                          
          <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>

                          
          <prop key="hibernate.show_sql">false</prop>
                          
          <prop key="hibernate.hbm2ddl.auto">update</prop>
                          
          <prop key="hibernate.current_session_context_class">thread</prop>
                          
          <prop key="hibernate.jdbc.fetch_size">30</prop>
                          
          <prop key="hibernate.jdbc.batch_size">1000</prop>
                          
          <!-- The second level cache -->
                          
          <prop key="hibernate.cache.use_second_level_cache">true</prop>
                          
          <prop key="hibernate.cache.use_query_cache">false</prop>
                          
          <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
                          
          <prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache.xml</prop>
                          
          <!-- Fulltext search -->
                          
          <prop key="hibernate.search.default.directory_provider">org.hibernate.search.store.FSDirectoryProvider</prop>
                          
          <prop key="hibernate.search.default.indexBase">/var/lucene/indexes</prop>
                          
          <prop key="hibernate.search.default.indexwriter.batch.max_buffered_docs">5000</prop>
                          
          <prop key="hibernate.search.default.indexwriter.batch.max_merge_docs">5000</prop>
                          
          <prop key="hibernate.search.default.indexwriter.transaction.ram_buffer_size">5000</prop>
                          
                      
          </props>
                  
          </property>




          <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
                  
          <property name="driver" value="com.mysql.jdbc.Driver" />
                  
          <property name="driverUrl"
                      value
          ="jdbc:mysql://192.168.1.100:3306/dev_weiqipu_com?useCursorFetch=true&amp;useServerPrepStmts=true&amp;useUnicode=true&amp;characterEncoding=UTF8" />
                  



          jvm參數:

          -XX:MaxPermSize=128m
          -XX:PermSize=128m

          -Xmn100m 
          -Xms512m
          -Xmx512m


          由于用的筆記本,因此各項參數都不高,整個重建過程,jvm內存使用率一直徘徊在250m左右


          20100726
          一段oracle造數據的存儲過程

          create or replace
          PROCEDURE "data_gen" IS
          buid 
          varchar2(32);
          huid 
          varchar2(32);
          BEGIN

          For   m   In   1..100   Loop

          select dbms_random.string('X',32into buid from dual;
          select dbms_random.string('X',32into huid from dual;

          For   i   In   1..1000   Loop

          INSERT INTO big_test 
              (gID,
              bUID, 
              hDATE, 
              hUID, 
              )
              
          VALUES
              ((
          select dbms_random.string('X',32from dual),
              buid, 
              sysdate, 
              huid, 
              );
          End   Loop;
          commit;

          End   Loop;

          END "data_gen";


          20100725
          配置好“精武館客服”(support # jingwuguan.com)郵箱
          一段mysql造數據的存儲過程
          SET GLOBAL log_bin_trust_function_creators = 1
          DROP FUNCTION IF EXISTS rand_string;
          DELIMITER $$
          CREATE FUNCTION rand_string(n INT)
          RETURNS VARCHAR(255)
          BEGIN
              
          DECLARE chars_str VARCHAR(100DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
              
          DECLARE return_str VARCHAR(255DEFAULT '';
              
          DECLARE i INT DEFAULT 0;
              
          WHILE i < n DO
                  
          SET return_str = CONCAT(return_str,SUBSTRING(chars_str , FLOOR(1 + RAND()*62 ),1));
                  
          SET i = i +1;
              
          END WHILE;
              
          RETURN return_str;
          END $$
          DELIMITER $$

          DELIMITER $$
          DROP PROCEDURE IF EXISTS `VACCOUNT_PARAMETER_PROC` $$
          CREATE PROCEDURE `VACCOUNT_PARAMETER_PROC`()
          BEGIN

            
          DECLARE iloop SMALLINT DEFAULT 0;
            
          DECLARE iNum MEDIUMINT DEFAULT 0;
              
            
          DECLARE gid VARCHAR(32DEFAULT 'a4028ebb812999ae220b';
            
          DECLARE gameId VARCHAR(32DEFAULT '';
            
          DECLARE Cur_account CURSOR FOR SELECT member_id FROM account;
            
            
          WHILE iNum<=10 DO
              START 
          TRANSACTION;
              
                
          WHILE iloop<=10 DO
                
                
          SET gameId = CONCAT(gid,rand_string(12));
                
              
              
          INSERT INTO dev_weiqi_jingwuguan_com.jwg_game_instances 
              (id, )
              
          VALUES
              (gameId, )

                  
                  
          SET iloop=iloop+1;
                
          END WHILE;
              
              
          COMMIT;
              
          SET iloop=0;
              
          SET iNum=iNum+1;
            
          END WHILE;
          END $$
          DELIMITER ;

          CALL `VACCOUNT_PARAMETER_PROC`();


          20100724
          1. 郵件服務器搭建完成;
          2. 完成3個郵件模板:
          注冊后的歡迎與激活郵件
          密碼重置郵件
          激活碼重置郵件
          3. 已測試郵箱:
          126, gmail, hotmail, 2個企業內部郵箱


          20100712
          加強事務處理
          配置二級緩存
          增加一些小細節,比如個人信息修改,圍棋耍賴投訴等

          20100615
          頁面方面的性能測試,主要是測試當房間中玩家較多的情況下,高密度的頁面dom操作對性能的影響。
          房間數據:房間包含50張桌子,每張桌子2個座位,房間可容納最多130個玩家。
          1. 開啟150個線程,每個線程模擬一個玩家,分別每隔2秒和5秒進行一次進入/離開房間
          2. 開啟150個線程,每個線程模擬一個玩家,分別每隔2秒和5秒進行一次坐下/站起
          測試瀏覽器:ie8, firefox3.6
          ie的性能表現比較糟糕,FF還比較平穩,總體來說,在真實的環境中,即使房間人數爆滿,瀏覽器表現應該會比較平穩。

          20100521
          添加jquery element的remove替代方法,在child div較多的情況下,可提升性能數十倍。

          20100516
          解決內存泄露問題(sIEve-0.0.8 + ie)
          1. Test Case: 進入房間,刷新頁面100次,memory usage曲線平穩,無dom leak
          2. Test Case: 進入/離開 房間100次(頁面不刷新),memory usage曲線平穩,無dom leak
          3. Test Case: 坐下/站起(打開/關閉圍棋窗口) 100次(頁面不刷新),memory usage曲線平穩,無dom leak

          jquery的ajax調用代碼段有內存泄露(jquery1.4.2)
          try {
                      
          var oldAbort = xhr.abort;
                      xhr.abort 
          = function() {
                          
          if ( xhr ) {
                              oldAbort.call( xhr );
                          }


                          onreadystatechange( 
          "abort" );
                      }
          ;
                  }
           catch(e) { }


          20100504
          視頻:如何搭建本地平臺開發環境
          http://video.jingwuguan.com/public/builddevplatform/builddevplatform.html

          20100503
          介紹精武館的視頻制作完成
          part1: http://video.jingwuguan.com/public/intro/part1web/part1web.html
          part2: http://video.jingwuguan.com/public/intro/part2web/part2web.html

          20100418
          打包環境已創建完成

          20100330

          開發者論壇:https://groups.google.com/group/jingwuguan 

          Google Groups
          Subscribe to 精武館開發者論壇
          Email:
          Visit this group


          20100316
          平臺的抽象層代碼基本完成了,接下來是做一些項目管理的配套設施,包括清晰的模塊劃分,SVN,jira,論壇,mail等
          其實這是一件非常有趣的事。

          20100225
          簡單的注冊登錄步驟必然能吸引更多玩家,因此精武館將允許玩家使用以下網站的ID登錄:
          不過首次登錄還是需要填寫一些必要信息。
          1. 使用google帳號
          2. 使用msn帳號 - https://live.azure.com
          3. 使用yahoo帳號 - http://developer.yahoo.com/social/updates/
          4. 使用人人網帳號

          20091230
          精武館開始向開放式游戲平臺轉型,比原計劃要早,因為一個人開發進度太慢了,于是必須提前轉型。
          精武館將為開發者提供以下資源:
          1. 環境文檔,介紹精武館核心架構,介紹如何搭建開發環境和調試環境
          2. java-api文檔,如何擴展使用精武館提供的各種java api
          3. javascript-api文檔,如何擴展使用精武館提供的各種javascript api
          4. 開放“圍棋”模塊源代碼以供開發者參考
          5. 以maven依賴包的形式提供java api包

          開發者可以根據以上資源自由開發游戲模塊,由精武館付費購買其源代碼。

          20091223
          利用googlecodes創建靜態資源的cache捷徑,表情和頭像等圖片資源,可以放到googlecodes上面(不是Hosting,兩者區別很大),然后在nginx中做代理和緩存配置,如下:
          proxy_cache_path  /var/www/cache levels=1:2 keys_zone=img-expression-cache:8m max_size=32m inactive=30d;  
          proxy_temp_path 
          /var/www/cache/tmp;

          server {
                  listen       
          80;
                  server_name  static.mydomain.com;
              expires 30d;
              access_log off;

              location 
          / {
                  proxy_pass      http:
          //yours.googlecode.com/svn/static/;
                      proxy_cache img
          -expression-cache;      
                  proxy_cache_valid  
          200 302 304  30d;
                  proxy_cache_valid  
          404      1m;
                  }
              }


          20091222
          javascript優化基本完成,IE8下所有操作不超過100ms

          20091221
          javascript優化:
          優化前:build游戲大廳40個座位IE花費280ms,FF花費160ms
                          build空圍棋棋盤IE花費350ms,FF花費200ms
          優化后:build游戲大廳60個座位IE和FF均花費60ms左右
                          build空圍棋棋盤IE和FF均花費30ms左右

          目前javascript已接近產品響應級別。

          在VM虛擬機下跑的IE6,測試效果不佳,有待優化。



          20091217
          圍棋游戲功能已經做好了,等待測試,接下來計劃2周內完成“觀戰”模式和開放服務——“打譜”。

          20091210
          開放式服務策略:
          以精武館為例,目前可提供的開放式服務有
          1. 棋類游戲打譜,客戶網站只需引入精武館相關棋類游戲模塊的打譜js,即可以在自己的網站上建立一個即時打譜的窗口。
          2. 即時通信頻道,客戶網站只需引入精武館的及時通信js,即可以在自己的網站上建立一個類似在線客服的即時通訊窗口。

          20091209
          精武館首個即將開放的API——圍棋打譜api
          它將幫助圍棋愛好者網站提供基于javascript/ajax的在線打譜功能,為圍棋愛好者提供更便捷的研究棋譜的方式。
          例如: 某網站 http://www.go.com是一個棋譜搜集網站,它需要使用精武館的圍棋api實現在線打譜功能,只需要引入精武館的goapi.js,并以某棋譜的http絕對路徑為參數,創建并啟動apijs中的打譜對象,就可以實現在線打譜功能。

          20091124
          技術上已經可以實現以游戲模塊或房間為單位的分布式多機集群,基于web的游戲大廳完全可以模擬出基于客戶端的游戲大廳。
          2篇Cometd的性能測試報告:
          http://wiki.exoplatform.com/xwiki/bin/view/WS/Cometd+Cluster+Bench
          http://cometdaily.com/2008/01/07/20000-reasons-that-comet-scales/

          20091122
          1. C-S通信做了些優化,目前只要能較快的打開國內各大門戶網站首頁,那么玩精武館就會很流暢。
          2. 采用cookie來判斷登錄,不過由于后臺使用的是memcached作為用戶對象的集群緩存,目前可以提供的同步方法為:當用戶狀態改變時,及時更新緩存對象。
          3.  頁面增加了一些元素,游戲結束時的計分部分(包含道具系統)已經差不多完工了,不過道具與積分/玩家的對象關系還需進一步改善。
          4.  暫時取消google搜索框,它對頁面的打開速度有影響。

          20091120
          1. 加入后臺虛擬貨幣,積分,道具的對象系統
          2. 網速過慢的客戶端,會導致Cometd重置與服務器之間的連接,產生新的ClientId,導致Channel無效,也就是收不到來自服務器的p2p消息
          3. 精武館將能嵌入開放式平臺中(例如開心網或是Google Wave),使得玩家可以在它們之中任何一個平臺進入精武館游戲。

          20091115
          1. 優化ack通訊
          2. 加入在線人數統計
          3. 加入google自定義搜索,它將為站內搜索提供幫助


          20091112
          1. 修正了游戲窗口ID查找的bug
          2. 玩家圍棋落子后,先顯示落子再提交ajax請求
          3. 修正了斷開連接時多層彈出框
          4. 取消了一個客戶端與服務器端的通道

          20091111
          圍棋:添加Pass
          添加Ack擴展,可以支持離線消息以及server端丟包重發
          修正了Cometd-js中Reload時Ack的一處小BUG

          20091110
          當游戲大廳的Cometd連接時才設置session過期時間,而不是登錄時,這樣可以防止登錄后進入大廳之時由于網速過慢而導致session過期,并且延長過期時間為20秒
          取消了ajax request的10秒超時限制,因為在網速較慢的情況下,它的影響似乎很惡劣。
          添加了與服務器失去連接時的提示,由于客戶端是無狀態的,可以任意刷新。
          圍棋模塊需要先實現SGF導入,這樣可以方便測試點目,精武館圍棋的點目效果與QQ圍棋的點目效果差不多。
          研究圍棋的SGF讀寫功能,發現應該為玩家提供這樣一個服務:可以創建自己的棋譜庫,可以方便的管理并使用它們,而該棋譜庫又是精武館的開放資源。


          20091109
          由于要限制一個賬號同時只能登錄一個實例,目前使用的是session,10秒后過期。實際上也可以用cookie,用戶登錄時生成一個隨機ID,存入memcached,不過這樣就沒有辦法知道用戶何時關閉瀏覽器,不過這是一個代替session集群的最佳方案,可以考慮。
          本周的開發計劃為:完成圍棋模塊的基礎功能,包括:SGF讀入,點目,PASS,認輸。
          posted on 2009-11-10 22:24 Phrancol Yang 閱讀(826) 評論(1)  編輯  收藏

          FeedBack:
          # re: 精武館開發日志 2010-04-07 15:41 周磊
          GOOD  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 长岛县| 石门县| 保定市| 隆德县| 澄江县| 米林县| 福清市| 花莲市| 黄石市| 措勤县| 平乡县| 韶山市| 泽普县| 原平市| 榆树市| 松江区| 滁州市| 寿宁县| 肥西县| 廉江市| 黄梅县| 南平市| 溧阳市| 宿迁市| 仲巴县| 西林县| 北宁市| 台湾省| 疏附县| 龙江县| 丁青县| 五常市| 长宁县| 柏乡县| 大英县| 安多县| 土默特右旗| 宜君县| 德惠市| 延吉市| 常宁市|