Feeds:
文章
迴響

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

終於看到執行結果

工作可能需要 Node 呼叫 .NET DLL, edge 專案可讓你實現這個功能, 但是目前官方預編譯只到 5.1.0, 嘗試自己編編看

開發環境

  • node 6.2.0
  • node-gyp 3.3.1
  • python 2.7
  • visual studio 2013
  • dnvm v1.0.0-beta5-10384
  • dnx 1.0.0 rc1
  • edge – git clone

目錄結構

  • /project
    • /node_modules
      • /node-gyp
        • /bin
          • node-gyp.js
    • /edge
      • /build
        • /Release
          • edge_coreclr.node
          • CoreCLREmbedding.dll
          • edge_nativeclr.node
      • /lib
        • edge.js
      • /samples

編譯

cd edge

node.exe ..\node_modules\node_gyp\bin\node_gyp.js configure

node.exe ..\node_modules\node_gyp\bin\node_gyp.js build

測試

參考資料

[1] https://github.com/tjanczuk/edge/issues/438

 

 

 

 

 

最近嘗試了 Google Drive API 上傳檔案, 發現支援 io.Base (http.MediaIoBaseUpload) 方式上傳, 因此有機會直接將 URL File 的 Stream 直接儲存到 Google Drive, 可是 requests 的 Response 雖然支援 Stream 但卻不支援 seek 操作, 網路上找到 pyhttpio 不過他是針對 urllib.request, 於是我也針對 requests 改了一版

requests_io.py

所以就可以在 Drive API v3 使用

r =SeekableHTTPFile('http://....', debug=True)

media_body = MediaIoBaseUpload(r,mimetype=mime_type)

file = service.files().create(media_body=media_body).execute()