Hatena::ブログ(Diary)

bushimichiの日記 RSSフィード

この日記のはてなブックマーク数

2016-08-24

Lua5.1 用 metatable のマジックメソッド __next を実装する

| 09:59 |  Lua5.1 用 metatable のマジックメソッド __next を実装するを含むブックマーク

Lua5.1には、metatableで利用できる、__next が無いらしいので独自に拡張する。


以下を参考

GeneralizedPairsAndIpairs


-- next関数の拡張
rawnext = next
function next(t,k)
  local m = getmetatable(t)
  local n = m and m.__next or rawnext
  return n(t,k)
end

-- nextの拡張だけで以下のようにできる
local priv = {a = 1, b = 2, c = 3}
local mt = {
  __next = function(t, k) 
    --
    -- ここに適当な処理を追加できる
    --
    return next(priv, k) 
  end
}
local t = setmetatable({}, mt)

for k,v in next, t do print(k,v) end

すばらしい。


cocos2d-x Lua メモリ改竄チート対策でデータをジャミングしたい時などに、このmetatable使って処理するとやりやすいかも。

--
--
--
function encodeXXX()
  return -- デコード処理
end
--
--
--
function decodeXXX()
  return -- デコード処理
end
--
--
--
function createEncTable()
  local t1 = {}
  
  local t2 = setmetatable({},{
    __index = function(t, key)
      return decodeXXX(t1[key])
    end,
    __newindex = function(t, key, val)
      t1[key] = encodeXXX(val)
    end,
    __next = function(t, k)
      local t2 = {}
      for k,v in pairs(t1) do
        t2[k] = decodeXXX(v)
      end
      return next(t2,k)
    end
  })

  return t2
end

基本的な対策としてはジャミングが目的なので

エンコード部分は適当なXORとかの簡易なものでもいいと思う。

2016-08-23

CocosCreator 以前のツールのダウンロード

| 22:26 | CocosCreator 以前のツールのダウンロードを含むブックマーク

Cocos CocosForWin CocosForMac CocosStudio CocosCodeIDE など公式からダウンロードできなくなったソフトは以下からまだダウンロードできるみたいです。


https://github.com/fusijie/Cocos-Resource#cocos-studio-%E4%B8%8B%E8%BD%BD

ccui.EditBox に、openKeyboard closeKeyboard がなかったので追加

| 15:25 |  ccui.EditBox に、openKeyboard closeKeyboard がなかったので追加を含むブックマーク

なぜか、C++のファイルにキーボードをON/OFFする関数が定義されてなかったので追加した。

Implファイルにはあるのでプラットフォームごとの定義はある。

ただ、Lua-bindings を利用している場合は、UIEditBox.h UIEditBox.cpp から、

bindを自動生成しているのでこちらに記述がないとLuaから使えないので追加した。



cocos2d-x/cocos/ui/UIEditBox/UIEditBox.h

public: 

 virtual void openKeyboard();
 virtual void closeKeyboard();




cocos2d-x/cocos/ui/UIEditBox/UIEditBox.cpp

void EditBox::openKeyboard()
{
	if (_editBoxImpl != nullptr)
	{
		_editBoxImpl->openKeyboard();
	}
}

void EditBox::closeKeyboard()
{
	if (_editBoxImpl != nullptr)
	{
		_editBoxImpl->closeKeyboard();
	}
}

2016-08-18

wxSqlite3で暗号化 sqlite3をセキュアに利用する

| 14:09 | wxSqlite3で暗号化 sqlite3をセキュアに利用するを含むブックマーク

環境 Centos6


wsqlite3をダウンロードして解凍コンパイルする。

https://sourceforge.net/projects/wxcode/files/Components/wxSQLite3/


cd [wxSqlite3 dir]/sqlite3/secure/src/

gcc -o sqlite3 -DSQLITE_HAS_CODEC=1 -DSQLITE_USER_AUTHENTICATION=0 shell.c sqlite3secure.c -ldl -lpthread

使い方


./sqlite3  test.db

>PRAGMA KEY='passcode';  # 最初にパスコードを指定する
>create table test(a,b);
>insert into test(a,b)values(1,2);
>select * from test;
>1|2
>.q # 終了

./sqlite3 test.db 
># パスコードを指定しない
>select * from test;
>Error: file is encrypted or is not a database
>.q #終了

./sqlite3 test.db
>PRAGMA KEY='passcode'; #  最初にパスコードを指定する
>select * from test;
>1|2
>.q #終了

これを利用するとcocos2d-xでwxsqlite3を利用するときに、外部でwxsqlite3を暗号化したデータベースを読み込ませることができる。

2016-07-28

cocos2d-x Lua lua-binding に setOnJSCallback を追加した

14:53 | cocos2d-x Lua lua-binding に setOnJSCallback を追加したを含むブックマーク

cocos2d-x 3.12

WebViewクラスのsetOnJSCallback に相当するbind関数

js-bindings の方には、追加されているが、lua-bindings には無かったので

適当に追加してみた。experimental なのであまり細かく調整されていないのかもしれないな。

Lua使ってる人少なそうだし。

# frameworks/cocos2d-x/cocos/scripting/lua-bindings/manula/ui/lua_cocos2dx_experimental_webview_manual.cpp


static int lua_cocos2dx_experimental_WebView_setOnJSCallback(lua_State* L)
{
    
    int argc = 0;
    cocos2d::experimental::ui::WebView* self = nullptr;
    
#if COCOS2D_DEBUG >= 1
    tolua_Error tolua_err;
    if (!tolua_isusertype(L,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror;
#endif
    
    self = static_cast<cocos2d::experimental::ui::WebView*>(tolua_tousertype(L,1,0));
    
#if COCOS2D_DEBUG >= 1
    if (nullptr == self) {
        tolua_error(L,"invalid 'self' in function 'lua_cocos2dx_experimental_WebView_setOnJSCallback'\n", nullptr);
        return 0;
    }
#endif
    
    argc = lua_gettop(L) - 1;
    
    if (argc == 1)
    {
#if COCOS2D_DEBUG >= 1
        if (!toluafix_isfunction(L,2,"LUA_FUNCTION",0,&tolua_err))
        {
            goto tolua_lerror;
        }
#endif
        
        LUA_FUNCTION handler = (  toluafix_ref_function(L,2,0));
        std::function<void(experimental::ui::WebView *sender, const std::string &url)> callback = [L,handler](experimental::ui::WebView *sender, const std::string &message){
            toluafix_pushusertype_ccobject(L, sender->_ID, &(sender->_luaID), (void*)sender,"ccexp.WebView");
            tolua_pushcppstring(L, message);
            LuaEngine::getInstance()->getLuaStack()->executeFunctionByHandler(handler, 2);
        };
        
        ScriptHandlerMgr::getInstance()->addCustomHandler((void*)self, handler);
        self->setOnJSCallback(callback);
        return 0;
    }
    luaL_error(L, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.WebView:setOnJSCallback",argc, 1);
    return 0;
#if COCOS2D_DEBUG >= 1
tolua_lerror:
    tolua_error(L, "#ferror in function 'lua_cocos2dx_experimental_WebView_setOnJSCallback'.", &tolua_err);
#endif
    return 0;
}


static void extendWebView(lua_State* L)
{
    lua_pushstring(L, "ccexp.WebView");
    lua_rawget(L, LUA_REGISTRYINDEX);
    if (lua_istable(L,-1))
    {
        tolua_function(L, "setOnShouldStartLoading", lua_cocos2dx_experimental_WebView_setOnShouldStartLoading);
        tolua_function(L, "setOnDidFinishLoading", lua_cocos2dx_experimental_WebView_setOnDidFinishLoading);
        tolua_function(L, "setOnDidFailLoading", lua_cocos2dx_experimental_WebView_setOnDidFailLoading);
        tolua_function(L, "setOnJSCallback", lua_cocos2dx_experimental_WebView_setOnJSCallback);
    }
    lua_pop(L, 1);
}


cocos2d-x Lua で開発してます。

C++も多少いじりますが、あくまでLuaにこだわってやってます。

2016-06-17 google-api-python-client を利用するときに気を付けること このエントリーを含むブックマーク

サンプルのソースの言語設定が en-US になっているので、ja-JP にしないとAPIのレスポンスで403が返ってくる

まぁ、各言語圏用に自分でカスタマイズしないといけないのは仕方がないが、引数で渡せるようにとかの配慮は少しほしいところ。

情報が少なすぎてエラー調べるのに苦労したわ。


# コマンドからGooglePlayShopにアップロード
python upload_apks_with_listing.py xxxxxxx(packageName) xxxxxxx.apk(アップロードするAPK)

=========================================================

Authentication successful.
Version code 532 has been uploaded
Track alpha is set for version code(s) [532]
Listing for language en-US was updated.
Traceback (most recent call last):
  File "python/upload_apks_with_listing.py", line 89, in <module>
    main(sys.argv)
  File "python/upload_apks_with_listing.py", line 80, in main
    editId=edit_id, packageName=package_name).execute()
  File "build\bdist.win32\egg\oauth2client\util.py", line 135, in positional_wrapper
  File "build\bdist.win32\egg\googleapiclient\http.py", line 832, in execute
googleapiclient.errors.HttpError: <HttpError 403 when requesting https://www.googleapis.com/androidpublisher/v2/applications/com.example.app/edits/xxxxxxxxxx:commit?alt=json returned "Tried to set recent changes text for APK version 532 for language en-US. Language is not associated with the app.">


upload_apks_with_listing.py の en-USをja-JP にしたら、コミットできた。


    listing_response = service.edits().apklistings().update(
        editId=edit_id, packageName=package_name, language='en-US',
        apkVersionCode=apk_response['versionCode'],
        body={'recentChanges': 'Apk recent changes in en-US'}).execute()

=============================================================================

    listing_response = service.edits().apklistings().update(
        editId=edit_id, packageName=package_name, language='ja-JP',
        apkVersionCode=apk_response['versionCode'],
        body={'recentChanges': 'Apk recent changes in ja-JP'}).execute()

おそらく他のpyファイルも同様だと思う。

2016-02-17

Xcode Could not launch failed to get the task for prosess xxxxxx

20:04 | Xcode Could not launch failed to get the task for prosess xxxxxxを含むブックマーク

Xcodeに直接実機をつないで動作確認をしようとしたときに出るエラー。

code Signing の Provisioning Profile が、Developerになっているか確認したほうが良いです。

Release用のAdHocとかになっている場合エラーになります。

2016-01-08

config.inc.php が見当たらない時

| 20:53 |  config.inc.php が見当たらない時を含むブックマーク

yumphpMyAdminインストールすると

設定ファイル config.inc.php が、

/etc/phpMyAdmin/config.inc.php

に設置されます。

/usr/share/phpMyAdmin/ 以下にはないので注意


備忘録

PHPからTCP経由で外部のDBにアクセスできない場合

| 20:52 | PHPからTCP経由で外部のDBにアクセスできない場合を含むブックマーク

iptable や、DB側の接続制限がどこもおかしくなく

直接コンソールからのDBへ接続できる場合

ApacheからのDB接続をSELinuxが制限している場合があります。

SELinuxの詳しい説明は割愛します。解除方法は以下

setsebool -P httpd_can_network_connect_db 1

git で post-receive 。別のレポジトリにもpush

| 12:55 | git で post-receive 。別のレポジトリにもpushを含むブックマーク

gitlab にpushした後に、自動でBitbucketにもpushしてほしい時の post-receive

gitlab の hooks は、custom_hooksに置く


vi xxx.git/custom_hooks/post-receive

GIT_REMOTE="bitbucket"

while read OLDREV NEWREV REFNAME
do
        BRANCH=`git rev-parse --symbolic --abbrev-ref "${REFNAME}"`

        echo "Push '${BRANCH}' branch to remote '${GIT_REMOTE}'"
        git push --tag ${GIT_REMOTE} ${BRANCH}
done

これで、ローカルからgitlab にpushすると、Bitbucketにも連鎖的にpushされるようになる。


レポジトリへのpush処理の時間がかかりそうで

バックグラウンドプロセスで実行する場合は


vi xxx.git/custom_hooks/post-receive

GIT_REMOTE="bitbucket"

while read OLDREV NEWREV REFNAME
do
        BRANCH=`git rev-parse --symbolic --abbrev-ref "${REFNAME}"`

        echo "Push '${BRANCH}' branch to remote '${GIT_REMOTE}'"

        nohup git push --tag ${GIT_REMOTE} ${BRANCH} > out.log 2> err.log &
done


.git フォルダを別名で利用する

| 12:16 |  .git フォルダを別名で利用するを含むブックマーク

GitLabのレポジトリ構成がプロジェクトごとに.gitの別名フォルダ xxx.git が作成され

設定などはそこに保存されていました。

.gitフォルダの別名を指定した場合の 利用方法がわからなかったので

git gc とかがちょっとやりたい時に四苦八苦しました。

.gitフォルダの指定方法

git --git-dir 

git-dir オプションなんてものがあったのですね。

しかも gitコマンドのすぐ後につけないと動かない。


# gitコマンドの後に --git-dir を指定
git --git-dir=xxx.git status
git --git-dir=xxx.git gc
git --git-dir=xxx.git commit -m "xxxx"

# これはオプションが有効にならない
git status --git-dir=xxx.git

良く忘れてしまうので、備忘録です。

2015-10-08

fml で Message ID をオリジナルではなく書き換える場合の設定

| 13:16 | fml で Message ID をオリジナルではなく書き換える場合の設定を含むブックマーク

GMAILでFMLを使うと送信メールと受信メールが同じMessage ID の場合、受信メールを受け取らない仕様があるため、MLの連番がわからなくなるという問題があったのでそのときの対処方法

config.ph の $USE_ORIGINAL_MESSAGE_ID の設定を変更

# Message-Id: use original Message-Id or Server Defined Message-Id ?
# if 1, original and
# if 0, fml generates a message-id like $day.FMLAAA.$pid.$MAIL_LIST
# value: 1/0
# $USE_ORIGINAL_MESSAGE_ID     = 0;
$USE_ORIGINAL_MESSAGE_ID = 0;

デフォルトはオリジナルのMessage ID になるようなので

それをOFFにする。

2015-08-27 [cocos2d-x] AtlasLabel キーコード割り当ての備忘録 このエントリーを含むブックマーク

cocos2d-x AtlasLabel 文字の割り当てキーコードについて

ドキュメントがなかなか見つからないので取りあえず

わかった分だけ備忘録

ASCII文字列順番

 !”#$%&’()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

bushimichibushimichi 2016/08/24 18:20 よく見たら、plistに初期のcharコードセットできるみたいですね。先頭を32にする必要なかったようだ。

2015-08-20

git で大文字小文字を区別したい時

20:35 | git で大文字小文字を区別したい時を含むブックマーク

WindowsGitを使っているとよく、大文字小文字を意識していないファイルが混在してしまうことがよくありました。

ファイル名をリネームしてもgit側は関知してくれないのでいろいろめんどくさい。

どうも区別するconfigがあるみたいなので以下を変更しました。

# デフォルト
git config core.ignorecase true


# 大文字小文字を区別する場合
git config core.ignorecase false

これにて一件落着