Feeds:
文章
迴響

今天程式發生了一個小插曲, 本該正常的功能出錯了, 本以為是之前權限調整忘了同步異動, 可是權限正常. 後來仔細檢查發現居然是功能使用中的函數被刪掉… 對…被刪掉… 還蠻扯的. 真是什麼情況都會發生

還好有 Git, 本來想用 SmartGit | Blame 不過不好找, 後來發現有個簡單的方法

1. 將受害檔案的 commit 差異轉存檔案

* git log -p LossFunction.php > log.txt

2. 用文字編輯器查找消失的函數名稱, 就可以找到兇手了

 

MongoDB 適合大量讀寫?

純粹個人經驗, 可能有錯, 大量並發應用環境

1. Centos7 64bits

2. MongoDB 3.4 Enterprise (WiredTiger Engine, 有分片處理)

3. 儲存的資料有 log, cache, session

 

PHP Driver 預設長連接

  1. 大量並發, 如果 php-fpm 數量過多, 會導致 mgo 連線數不夠
  2. 長連接無法手動斷線或重連
  3. 手動重編改成短連接, 可解決 mgo 連線數問題, 但是會產生大量 TIME_WAIT 需要優化, 否則會發生 mgo 連不上的問題

 

MongoDB 的 upsert=true 可能會發生 duplicate key

  1.  這個問題太冏了. 只能自己處理

 

MongoDB 頻繁更新/讀取相同資料效能低落

  1. 使用 w=majority, journal=false, timeout=1s, 會發生  “waiting for replication timed out"
  2. 使用 w=1,journal=false,timeout=0 會發生"Operation timed out"
  3. session 不適合存 mongodb
    1. 更新頻繁, 寫入操作緩慢需要排隊, 操作逾時
    2. 可能發生 duplicate key

 

 

Code: https://github.com/mongodb/mongo-php-driver/blob/4b49b1ad80a300000cc7beab927ea43bdc6673fb/php_phongo.c

 

// 模組初始化
PHP_GINIT_FUNCTION(mongodb)
{
    // 初始化 hash
    zend_hash_init_ex(&mongodb_globals->clients, 0, NULL, php_phongo_client_dtor, 1, 0);
}

static void php_phongo_client_dtor(zval *zv)
{
   // http://mongoc.org/libmongoc/1.4.0/mongoc_client_destroy.html
   // Release all resources associated with client and free the structure.
    mongoc_client_destroy((mongoc_client_t *) Z_PTR_P(zv));
}

// Manager 初始化
void phongo_manager_init(php_phongo_manager_t *manager, const char *uri_string, zval *options, zval *driverOptions TSRMLS_DC) /* {{{ */
{
    mongoc_client_t  *client_ptr;

   // 產生hash
    hash = php_phongo_manager_make_client_hash(uri_string, options, driverOptions, &hash_len TSRMLS_CC)
   
   // 找尋 hash 吻合的連線, 吻合返回快取
    if ((client_ptr = zend_hash_str_find_ptr(&MONGODB_G(clients), hash, hash_len)) != NULL) {
        manager->client = client_ptr;
        goto cleanup;
    }
   
   // 建立新的 client
    manager->client = php_phongo_make_mongo_client(uri, ssl_opt TSRMLS_CC);
   
   // 更新 hash
    zend_hash_str_update_ptr(&MONGODB_G(clients), hash, hash_len, manager->client);

}

// 模組卸載
PHP_MSHUTDOWN_FUNCTION(mongodb)
{
   // 釋放所有的連線 
   // 觸發 php_phongo_client_dtor()
    zend_hash_destroy(&MONGODB_G(clients));
   
    mongoc_cleanup();

    return SUCCESS;
}

該遊戲使用 Unity 開發, 原本改完 IL 準備好好的玩一場, 結果發現重打包會導致Google Play Game Service 無法登入, 於是換了條路改走離線存檔, 該遊戲的存檔在

/data/data/com.turbochilli.gks/shared_prefs/com.turbochilli.gks.v2.playerprefs.xml

內文類似如下

2016111703

紅色標記就是遊戲的儲存資料, 使用 URL Encode, 轉成可讀的內文如下(我玩到49關的紀錄),  其實最重要的就是錢( Coins) 改高一點就可以玩的很輕鬆, 如果要提高經驗值就改 XP 的值. 改完後逆向操作就在重新打開遊戲立即生效(我的存檔)

20161105

 

2016111704

 

 

雖然 MongoDB 屬於 Schema Free, 但還是會有想知道 Collection 儲存了那些欄位的需求, 有人開發了 variety 搭配 mongo 命令使用依據統計列出欄位和型別資訊, 效果如下

2016111701

另外也有提供命令列版本  variety-cli 其實就是把 mongo 指令也包在程式當中方便使用

2016110702

 

有個需求是想將 .vue 打包成 .js 可在 <script> 使用, 已獨立元件使用而不是整個 App, 參考 vue-spinner 原來有幾個關鍵

  1. 將要可使用的元件 exports 成獨立 .js 
  2. 設定 webpack.config.js
    1. entry : 指向 exports 的 index.js
    2. output.library : 指定公開的名稱, 如 output.library.VueSpinner, Web 可用 window.VueSpinner
    3. output.libraryTarget: 指定模組格式

.NET Core 1.0 初體驗

看到 .NET Core 1.0 (Runtime) 正式發布消息, 於是趕來嘗鮮一下, 結果 sdk 還是 preview 2…

https://www.microsoft.com/net/download#core

算了… 還是試玩一下, 下載 “.NET Core SDK binaries only" 解壓縮即可使用

我的開發環境如下
* Windows 10 x64
* Docker Toolbox 1.11.1
* .NET Core SDK 1.0 Preview 2 x32

.NET Core SDK 目錄結構

建立一個 hello 目錄

依據執行 dotnet new, dotnet restore, dotnet run 就可以看到 Hello World 如下圖

執行到這裡已經產生可跨平台執行的 .dll, 待會用 docker 驗證

目前hello目錄下已經產生如下的目錄結構

其中 hello.dll 就是編譯輸出後的檔案, 可用 dotnet.exe hello.dll 執行

Program.cs 是主程式檔, 如果有多個 .cs 會自動編譯

project.json 是專案描述檔, 編譯就靠這個檔, 如果有調整就需要執行一次 dotnet restore 產生新的 project.lock.json 才能依據新的設定編譯

接下來就啟動 Docker Terminal

先 docker pull microsoft/dotnet:latest

再建立 container, docker run -it -v /c/Users/cwchiu/:/cwchiu microsoft/dotnet:latest

執行剛剛 Windows 上產生的 .dll 如下圖

還有個問題就是每次執行程式都需要 dotnet.exe 才能執行產生 .dll, .NET Core 有提供 self-contained application 可以產生"當下"編譯環境的可執行檔

將 project.json

修改為

依據執行 dotnet restore 和 dotnet build 產生 hello.exe, 可不需要 dotnet.exe

雖然我的 OS 是 Win10 x64, 但因為我使用的是 x86 .NET Core SDK 所以編譯最後選擇產生的是 win10-x86

docker 上的 dotnet 要編譯可執行檔需要使用 runtime 為 debian.8-x64, 其他 runtime 識別碼可參考

https://docs.microsoft.com/en-us/dotnet/articles/core/rid-catalog

2016.7.6補充輸出非開發平台的原生程式

dotnet publish -r “debian.8-x64″

可以直接輸出目標平台的原生程式, 無需依賴 .NET Core

從 Docker 中執行如下

實際佈署到 CentOS 7.2 可能出現

Failed to load /root/dotnet/bin/libcoreclr.so, error: libunwind.so.8: cannot open shared object file: No such file or directory"

依據網路解法, 安裝 yum install -y icu libunwind

終於看到執行結果