2015年8月11日 星期二

flash player FLVPlayback skin

C:\Program Files (x86)\Adobe\Adobe Flash CS5\Common\Configuration\FLVPlayback Skins\FLA\ActionScript 3.0
我的資料夾在這,
編譯時會有
Warning: unable to load SWC FLVPlaybackAS2.swc

1046 type was not found or was not compile time constant: NetstreamPlayOptions
這2個問題
https://forums.adobe.com/thread/827827?tstart=0

解決方法改成flashplayer 10 去編就好了

2015年5月8日 星期五

使用pomelo robot進行壓力測試

雖然標題是這麼下,其實只是分享一下學習pomelo robot的過程而已。
https://github.com/NetEase/pomelo/wiki/PomeloRobot-%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3
這是wiki的教學,事實上我看完也是一知半解。
後來看了demo https://github.com/NetEase/pomelo-robot-demo
之後,實際操作一次才了解,
這個demo主要是用來測試pomelo官網上的那個lord的demo game。
所以裡面有很多不需要的東西。
先從大方向解譯一下這個robot的功用。
首先 你可以使用node app來啟動master模式
或是使用node app client來啟動client模式
master模式會運行一個終端,並且可以連上lolcahost:8889來操作及觀看robot的訊息
(wiki文件有詳細的圖)
所以master就是一個集成各個client的終端機
接下來client這個東西,指的是要去跑腳本的程序
一個client可以模擬好幾個測試程序。這個在master介面上的Per Agent Users參數可以調整。
也就是說 我可以將Per Agent Users設成2,然後執行 node app client
這樣就會登入2個測試腳本。
我也可以再同一台機器上 執行另一個node app client,這樣就會總共跑4個腳本(不過這樣做好像沒什麼意義,畢竟腳本一樣的話,消耗的都是同一台機器的資源)
所以就可以做到 我在a機器跟b機器都跑node app client,然後node app master掛在 c 機器上。
當然master你想掛哪一台都沒問題,但是基於我們在壓力測試的時候,可能會預估 嗯~ 每一台機器應該可以模擬100個測試程序,所以就將a跟b機器各跑100個Per Agent Users好了。那這時你如果把MASTER放在A或B其中一個機器上的話,就會照成那一台有額外的負擔,如果掛了就會考慮到這裡。。。畢竟壓力測試要測的是SERVER不是CLIENT嘛,當然要盡量保持CLIENT的穩定性。

我們現在舉一個例子來做,不要用DEMO裡那個LORD GAME了,那個好麻煩 還要DB,還要架好LORD GAME。
我們用聊天室來做ROBOT測試。就這個https://github.com/NetEase/chatofpomelo
首先你當然是先搞定聊天室,開啟聊天室的終端之後,順便開個網頁測試一下聊天室運作。
接著重寫ROBOT裡的lord.js腳本,腳本名稱位置在config裡面有 可以自已修改。

在lord.js裡,我們要連上 聊天室。
在這裡 每一個lord.js都是獨立運行的,也就是你Per Agent Users設多少,就會跑出多少個獨立的app出來。
所以你就盡情的在這裡寫腳本吧。。。
基本上要寫的就是把聊天室client端的腳本照抄一份進來而已。
聊天室是基於socket.io的(demo是ws的),所以你就把socket.io搬進來,具體寫法我也是整個把聊天室client端的復製過來修改一下而已。
然後 首先你會遇到一個問題,在傳送封包的時候,因為不在browser底下的話不會有Uint16Array這個function,所以我在傳訊息時就直接傳送json格式的字串,前面加個json字樣
socket.send("json"+JSON.stringify({id:id,route:route,body:msg}));
然後修改聊天室的接口node_modules\pomelo\lib\connectors\sioconnector.js裡的decode 修改成這樣

Connector.decode = Connector.prototype.decode = function(msg) {
  if(msg.substr(0,4)=="json")//json
  {
    var _msg=msg.substr(4);
    return JSON.parse(_msg);
  }
  else

  {
//這裡就放舊的decode方法

這樣子一來,就不用改原本聊天室client的作法,而且測試程序的訊息也可以解析了。

到這裡,應該就可以使用robot連進聊天室了。
你可以在腳本中使用actor.id來辨別這是第幾個Per Agent Users,每一個不同的actor.id可以用來做登入不同角色的識別。

假設我想a機器登入 db裡的帳號100~199,b機器登入200~299
那我就可以使用actor.id來做。
至於是actor.id+100或是actor.id+200 那個起始值 你可以寫死,或者是從node app client 100 這裡代進去,
當然啦 你的app.js要去接這個值
var baseActorId= process.argv[3];之類的。


CONSOLE上的RUN SCRIPT ,填上正確的路徑的話,可以指定腳本。
詳細用法參考lib/agent/actor.js









2015年3月20日 星期五

flash builder 打包 ios ipa

使用flash打包ipa。
目前試的目的是打包出 一個開發版本的ipa給iphone6使用。
手機上的ios版本是8.2。沒有越獄。

準備工作。
1.p12檔。(從mac上的key china裡輸出)
2.provisioning profile檔(*.mobileprovision)

不論如何 你打包出了ipa
放到itunes裡同步到iphone上

當iphone上的app icon,呈現暗的icon,點擊會顯示正在安裝
然後一直安裝不了,那有可能是p12檔或provisioning profile檔有問題。

當同步的時候 icon有在轉圈圈(安裝中),安裝完後icon就會是亮的。
這個時候如果點進去 發現一片黑,那依我的經驗 就是air sdk太低
如果你用mac調試,他會寫說要debug mode的話,air sdk要在3.4以上。
雖然只是說debug mode,但我發現除此之外,app進去後也會一片黑。
air sdk後來都交給apache 去做了,所以就到apache flex上下載最新的flex sdk吧。

另外幾點可能要注意的:

p12檔不確定對不對 就重新做一個吧,mac底下的flex的export介面下可以幫忙做。

provisioning profile檔裡會選擇 apple id跟device。
apple id就是你app的名字跟bundle。bundle是com.xxx.yyy這個
name的話要對應flex裡xml裡的設定,當然bundle也是。
flex專案裡xml會有2支,2支都改吧,一支看起來是編譯用的,另一支是包進去app用的感覺。

建立專案的時候 有一個選項是自動調節畫面大小 scale。可以選dpi。
就是在 appcation的tag裡加上 applicationDPI="160" 這樣而已。
(iphone 6的dpi有362)

※p12檔 做法,從mac裡建立憑證,丟到apple developer上建立成Certificates,好了之後下載下來安裝,之後在keychain裡可以把它輸出成p12;接著把app id也建好,最後Provisioning Profiles對上Certificates跟app id 就完成了!!

2015年1月29日 星期四

cocos2dx 使用 pomelo 踩坑教學

序:想著pomelo比較好擴充,範例看起來也滿順眼的,所以我選擇了pomelo來當我的socket service. 其實我也搞不懂,為什麼COCOS2DX要連結POMELO居然這麼麻煩。。。

目標:使用quick cocos2dx v2.2.1跟v3.3,在lua中連結上pomelo的chat範例。 
首先我嘗試了https://github.com/luoxinliang/pomelo_quick_x 這個,一個以lua開發的pomelo lib, 但它的版本好像是v2.1,
而我是用v2.21使用的時候,一點點websocket的api有點差異,最主要的是sendBinary這個api我的版本裡沒有....我改成了sendBinaryMsg 感覺好像可以,但我在接到回傳值的時候,無法通過原本的Package.decode = function(binary) 會報local a = bit.lshift(bytes[index],16) 的index索引到nil。 事實上回來的binary是字串,不是table,我不知道為什麼,原lib的作法是先通過Package.decode可以取得type跟body, 可是我回來的就只是個binary的字串。於是我使用string.format("0x%02x", string.byte(binary, i)把每一個字串轉成number, 再用string.char轉成char,最後組成string,就變成有意義的json格式字串了,但前面幾個char是亂碼....我估計這是type。只是我轉不出來 把json decode出來後(捨去type的部份,type固定填1試試),感覺好像能跑了,但是會一直遞迴,想必是type是控制流程的flag, 嘛 算了 搞不出type..... 

另外關於pomelo的chat範例有https://github.com/NetEase/chatofpomelo跟https://github.com/NetEase/chatofpomelo-websocket 
我只有用https://github.com/NetEase/chatofpomelo-websocket,連的上。
前面那個 怎麼講 忘了 沒有再繼續交差比對,反正後面那個比較沒問題 

再來在v3.3的版本上,問題超多,像bit 的lib也要自已載進來,而且有的函式名不一樣,而且也沒有sendBinaryMsg,只有sendString... 雖然這個sendString感覺像多態用法,(我是參考自帶範例中的websocket),不過僅管我再試,也只是server接到訊息,但client收不到。 一直都是 open error close,然後沒有一個有用的訊息(我沒有直接在c++中看線程怎麼跑的) 
估計使用純lua的https://github.com/luoxinliang/pomelo_quick_x太麻煩了,像這種快速方案如果不快速,還是果斷換另一條路吧 

當然這是因為一開始也就知道 正規一點的作法是使用pomelo的 libpomelo來做。
 只不過要寫c++ 比較麻煩就是。
 要碰到c++,思路就是,把先的lib掛上去,確定能work,接著接到lua bind上。然後在lua中調用。 也是得做2個版本,(誰讓我維護2個版本的案子,又懶得全部改到3.3呢) 

先來做v3.3的版本 網上有個範例https://github.com/cokeboL/pomeloTolua4cocos2dxChat ,
這個不錯,他有個源碼下載(含cocos2dx),它好像是v3.0 不過下載來編譯後直接就能work了~好棒棒~ 證明了 libpomelo可以正常運作 而且我們有一個參考用的project。

 接著換我們來把v3.3也搞成一樣的例子。 我是直接開啟quick cocos2dx 3.3的player 專案,(參考http://cn.cocos2d-x.org/tutorial/show?id=1489) 
在E:\Cocos\quick-3.3\external底下git clone https://github.com/NetEase/libpomelo.git E:\Cocos\quick-3.3\external\libpomelo>cd libpomelo 
E:\Cocos\quick-3.3\external\libpomelo>mkdir build 
E:\Cocos\quick-3.3\external\libpomelo>git clone https://github.com/martine/gyp.git build/gyp
E:\Cocos\quick-3.3\external\libpomelo>build\gyp\gyp.bat --depth=. pomelo.gyp -Dlibrary=static_library -DTO=pc E:\Cocos\quick-3.3\external>cd libpomelo\deps\uv

E:\Cocos\quick-3.3\external\libpomelo\deps\uv>vcbuild.bat 

接著把以下的vcxproj加入player 專案裡,我是用vs2013
 E:\Cocos\quick-3.3\external\libpomelo\libpomelo.vcxproj 
 E:\Cocos\quick-3.3\external\libpomelo\deps\jansson\jansson.vcxproj 
 E:\Cocos\quick-3.3\external\libpomelo\deps\uv\libuv.vcxproj 
在vs裡的方案裡點

add exitsing project...,陸續把三個vcxproj都加進去。
再點擊player3專案右鍵屬性頁,
將3個project都加進來,
紅框是我新增的include。

有箭頭的部份是新增的lib連結。
然後開始建置整個方案,過了之後找一下libpomelo.lib跟libuv.lib及jansson.lib在哪裡
把他們復製到E:\Cocos\quick-3.3\quick\player\proj.win32\Debug.win32底下
接著把範例中的
Net.h
NetTolua.cpp
ThreadSafeQueue.h
Net.cpp
加進player3專案裡,
我在Net.h裡的這一行會出錯#include "CCNode.h"
我改成了#include "2d/CCNode.h"

你可以先建置看看。

接著修改AppDelegate.cpp
加入
#include "Net.h"
extern int luaopen_net(lua_State* tolua_S);
extern int luaopen_update(lua_State* tolua_S);
void registerLuas(lua_State* tolua_S)
{
luaopen_net(tolua_S);
}
//在director那邊加上一句(這是讓畫面在更新時會去查看有沒有新的封包進來要處理)
director->setNotificationNode(Net::getInstance());
//然後最後在L建立出來後加上(L是指lua_State* L = engine->getLuaStack()->getLuaState();)
registerLuas(L);

這樣就可以了,
我另外修改了一個地方,
由於一開始我Net.cpp裡的visit一直執行不到,就是畫面更新時,只會跑ccnode的visit,而不會跑net.cpp的visit,我才發現這版的visit的引數已經變了,引數不一樣,就沒辦法override
所以把net裡的visit引數改成跟這版裡的ccnode的visit一樣,就ok了。

接著lua的部份,就沒什麼好講,照範例裡的跟著照抄一份自已的版本就好了。
※在vc裡要debug,不能讓工作目錄指到welcome,要指到你的lua專案才行debug,所以記得更改預開專案的目錄。把ProjectConfig.cpp裡的path.append("quick/welcome");換掉就好了。

其他遇到的坑 'ssize_t' : redefinition; different basic types
cocos2d-x中使用libpomelo编译错误问题 http://blog.csdn.net/chana1101/article/details/40071917

OK V3.3完工,


V2.2.1 待續
OKAY 剛剛試著加入v2.2.1 發現加入libpomelo沒什麼問題,但加入範例的code,net.cpp 要修改的地方太大了。先來寫pomelo好了,寫完之後沒找著相關的參考資料,乾脆就換用v3.3寫吧

2015/04/20 後記
今天才試著發佈android版本。
mk設置的部份參考這個就好了https://github.com/cokeboL/pomeloTolua4cocos2dxChat/blob/master/frameworks/runtime-src/Classes/AppDelegate.cpp
編譯完之後,我試跑了一下,居然crash了,一直crash,後來查了一下是死在net.cpp裡的connect函式的ip=_ip
實在是搞不懂啊。所以就先用寫死ip的方式。
接著又發現 director->setNotificationNode(Net::getInstance());下的位置錯了。把他改成放在auto director = Director::getInstance();底下之後,才可以正常的連線。
接著把剛剛的ip=_ip改回來,居然就好了。太神奇了,不過因為用eclipse跑的時候沒什麼錯誤提示,也是沒辦法的事,能解決真是太好了。緊接著快來試試ios版吧...