Cocos2d-JS (3) 開發前閱讀

手冊
http://cocos2d-x.org/docs/catalog/framework/html5/zh

  • 程式執行順序
    1. index.html
    2. frameworks/Cocos2d-html5/CCBoot.js => 讀入 project.json 設定
    3. main.js => 載入與初始化 project.json 中 modules/jsList 指定的 JavaScript 檔

  • 螢幕設定
    http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/html5/v2/resolution-policy-design/zh.md

  • 啓動流程
    http://cocos2d-x.org/docs/manual/framework/html5/v3/cc-game/zh

基本啓動
main.js
cc.game.onStart = function(){
    //load resources
    cc.LoaderScene.preload(resource_list, function () {
        cc.director.runScene(new MyScene());
    }, this);
};
cc.game.run();

延遲啓動
cc.game.onStart = function(){
    //load resources
    cc.LoaderScene.preload(resource_list, function () {
        cc.director.runScene(new MyScene());
    }, this);
};
cc.game.prepare();

document.getElementById(“myBtn”).addEventListener(“click”, function(){
    cc.game.run();
});

  • 場景
    1. http://cn.cocos2d-x.org/tutorial/show?id=1212
    2. http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/native/v2/basic-concepts/director-scene-layer-and-sprite/zh.md

 

Cocos2d-JS (2) 安裝 & Hello World

作業系統:Mac
Cocos2d-JS:3.8

參考網址:http://www.cocos.com/doc/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/cocos2d-js/2-working-environment-and-workflow/2-2-cross-native-browser-game-with-cocos-console/zh.md

安裝步驟

  1. 下載 http://cn.cocos2d-x.org/download ,本次安裝 cocos2d-x-3.8
  2. 解開 zip,打開終端機
  3. cd path_to/cocos2d-x-3.8
  4. ./setup.py
  5. 要求輸入 NDK,Android SDK和ANT 路徑,這是開發Android用的,先按enter跳過
  6. 輸入完,~/.bash_profile 中會加入剛剛幾個路徑
  7. !! 若是資料夾名稱有空格須先手動修改.bash_profile,加單引號,例 ‘…Sync Drive…’
  8. source ~/.bash_profile 讓路徑生效
  9. 接下來就可以使用cocos console 建立專案了

建立專案

  1. cd work  #專案放置資料夾
  2. cocos new -l js –no-native hello #建立一個僅含Cocos2d-html5 的專案
  3. cd hello
  4. cocos run -p web
    Browser 會自動開啟並執行本專案

 

Cocos2d-JS (1) 版本選擇

遊戲要跨平台 (Web/手機):
採用 Cocos2d-JS Full Package 版本
下載:www.cocos.com/download/
參考:http://www.cocos.com/doc/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/cocos2d-js/2-working-environment-and-workflow/2-2-cross-native-browser-game-with-cocos-console/zh.md

針對 Web:
分為 Lite Version / Full Version / Customized Version
只要引入單檔 js,可以像使用 jQuery 一般,直接使用,若是針對 Web 開發,是最方便的方式。
下載:http://cocos2d-x.org/filecenter/jsbuilder/
參考:http://www.cocos.com/doc/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/cocos2d-js/2-working-environment-and-workflow/2-1-cocos2d-js-lite-workflow/zh.md

Cocos2d-JS单文件引擎使用指引
http://www.cocos2d-x.org/docs/manual/framework/html5/v3/lite-version/zh

Yii 安全性

  • XSS 攻擊
    Yii 的教學文章提到很多做法,基本上都是使用 CHtmlPurifier 來過濾,只是做的時間點不同,有的是save之前,有的是display之前,建議寫在 Model 的 rules 使用 filter 濾掉,不要每次打開頁面時在view裡頭做,浪費效能。

Model

public function rules(){
    return array(
        array('text','filter','filter'=>array($obj=new CHtmlPurifier(), 'purify'))
    );
}

config/main.php
加上 httponly 避免 cookie 被 javascript 讀取

'components'=>array(           
    'user'=>array(
        // enable cookie-based authentication
        'class' => 'WebUser',
        'allowAutoLogin' => true,
        'identityCookie' => array('domain' => 'www.abc.com', 'path' => '/', 'httpOnly' => true),
        'loginUrl' => array('site/top2login'),
    ),
    'session' => array(
        'cookieParams' => array(
            'httponly' => true,  //o小寫
        ),
    ),
),

 

  • SQL Injections
    若是使用 model 本身的方法來操作,並不需要特別注意這個問題,因為Yii 自己會進行處理,風險通常來自於自己寫SQL時,針對這點處理方式如下
$sql = "SELECT CONCAT(prefix, title) AS title, author_id, post_id, date "
    . "FROM t_comment "
    . "WHERE (date > :date OR date IS NULL) AND title LIKE :text"
 
$command = Yii::app()->db->createCommand($sql);
$results = $command->execute(array(':date' => $date, ':text' => "%{$text}%"));

使用 model 搭配 SQL 的變數處理

$comments = Comment::model->findAllBySql($sql, array(':date' => $date, ':text' => "%{$text}%"));

 

  • Cross-site Request Forgery (CSRF)
    !! 使用 Yii cookie 組件來操作 cookie,不要使用 $_COOKIES
    !! 使用 CHtml::form 建立表單,不要自己寫 Html form tag

config/main.php

'request'=>array(
    'enableCsrfValidation'=>true,  //CHtml::form
    'enableCookieValidation'=>true,//CHttpCookie
    'csrfCookie'=>array(
        'httpOnly'=>true,  //O大寫
    ),
),

 

參考
http://www.yiiframework.com/doc/guide/1.1/zh_cn/topics.security

PHP 如何產生 Unique ID

Unique ID 的做法有很多,重點是適用於何種狀況,主要的類型可區分

有規則的: 例如利用 MySQL 的 AUTO_INCREMENT,適用於平台內部非公開的key,或者公開但不敏感的資料,就算被User 猜中也沒關係的資料。

無規則的: 也就是真正的亂數,User 無法簡單猜到,適用於較敏感而且公開的資料,當然仍須防範User 使用暴力破解法,用程式不斷亂槍打鳥,最後仍有被猜中的風險。

以下介紹幾種製作 Unique ID 的做法

  1. Flicker 使用的方法 (有規則 / MySQL / 簡單效率好)
    參考網址:http://code.flickr.net/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/

  2. 基於 Twitter Snowflake 演算法 (亂數 / 需安裝)
    參考網址:https://github.com/liexusong/ukey
    缺點:需安裝,非自有server無法安裝套件。

  3. PHP Function uniqid (亂數)
    缺點:大量執行緒下,可能產生重複的id, 第二個參數 more_entropy 設為 true 可產生格外的長度到 23 字元,更確保唯一性,但是網路上看過有說法表示,即便如此,仍有重複可能,只是重複機率極低而已。

  4. UUID (亂數)
    參考網址:https://github.com/lootils/uuid MySQL 也有 uuid function

  5. PHP Function shmop_open (有規則)
    利用記憶體共享,將最後一個序號記在記憶體中,每個執行緒來讀取後+1寫回
    缺點:僅適用短時間內,萬一重複也沒有問題的地方,因為Server restart後序號就會歸零重來。

  6. Hashids 第三方library (亂數 / 類似 youtube 影片參數)
    參考網址:http://hashids.org/php/
    沒有實測過,是否真的唯一,或者只是重複率低。

  7. 如何產生亂數8碼數字唯一ID? 只有8碼數字,理論上產生重複的機率是比較高的,目前並未看到網路介紹演算法能有效處理,因此在沒有更好的方式之前,我們可以使用亂數表來做。
    1. 建立表格
      CREATE TABLE `資料庫名稱`.`tickets` ( `id` INT UNSIGNED NOT NULL , `sid` VARCHAR(50) NOT NULL , PRIMARY KEY (`id`), INDEX (`sid`)) ENGINE = MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci
    2.  迴圈連續執行以下SQL到要的數量,例如 5 萬筆
      INSERT INTO tickets SET id=FLOOR(RAND() * (99999999-10000000+1)) + 10000000 ON DUPLICATE KEY UPDATE sid=tickets.sid
    3. 使用上面提到的製作UUID的方法,取得 $SID = 某UUID,然後執行
      UPDATE tickets SET sid='$SID' WHERE sid='' LIMIT 1
    4. 取回剛剛UUID 所 update row 的 id,就是我們要的唯一ID
      SELECT id FROM tickets WHERE sid='$SID' LIMIT 1