2017年3月23日木曜日

Nox App Player の共有フォルダを変更する

Androidのエミュレーター Nox App PlayerをWindows上で動作も軽く使いやすいので開発に利用している。

ただ、インストール先のディレクトリは選択できるが自動的に設定されるPCとの共有フォルダのパスは、
C:\ユーザディレクトリ\Nox_shared
に固定されているようで変更する方法がわからなかった。
そこで、あらかじめユーザディレクトリにシンボリックリンクでNox_sharedを作成しておき任意の場所に共有フォルダを移動させることにした。
mklink /j C:\ユーザディレクトリ\Nox_shared  D:\Nox_shared

これで、以下のようにAndroidエミュレータとつながる。
/mnt/shared/ -> D:\Nox_shared


そもそも、共有フォルダを任意の場所に移したかったのは、
cocos2d-x Lua のソースを/mnt/shared/ からアクセスできる場所に置くことで
いちいちアーカイブしなくてもアプリの更新を簡単にしたかったからで、これでうまくいった。

2017年2月11日土曜日

2016年12月22日木曜日

cygwinで、viを使うときの注意

vi コマンドで、入力モードの際に十字キーがうまく動かず文字入力されてしまう場合は、

ホームに .exrcファイルを作成して

$ vi ~/.exrc
set nocompatible
set backspace=indent,eol,start

あと、シェルコマンドを実行する際に \r がコマンドとして認識される場合は、以下を追記

$ vi ~/.bash_profile
export SHELLOPTS
set -o igncr

2016年12月16日金曜日

Firebaseの最新情報は英語サイトでみる

FirebaseのC++のSDKの情報をみると日本語サイトが version 1.0.0 のものだった。
最新の2.1.0 は、英語サイトにのみ情報がある。

https://firebase.google.com/docs/cpp/setup?hl=en

?hl=en をつけると英語サイトになる。

2016年12月14日水曜日

cocos コマンド Android Studioのプロジェクト をコンパイル

忘れそうなので、androidプロジェクトにオプションで –android-studioをつける。

cocos compile -p android --android-studio 

2016年12月13日火曜日

GAEでPHPからdatastoreを使うときのメモ

基本的には公式サイトをよく読むのが基本だが一部古い情報などがあるので参照する場所に注意する。

ライブラリ情報

日本語化されてるページはなぜかPHPについての記述が抜けてるとこが多いので英語のドキュメントを見たほうがよさそう。

インストール

https://cloud.google.com/datastore/docs/reference/libraries#client-libraries-install-php

リファレンス

https://googlecloudplatform.github.io/google-cloud-php/#/docs/v0.20.0/datastore/datastoreclient

ソースコード

https://github.com/GoogleCloudPlatform/google-cloud-php

※日本語のドキュメントからソースコードは以下にリンクされているが個人的に使いにくかったです。
https://github.com/google/google-api-php-client

2016年12月1日木曜日

Windowsでのシンボリックリンク

すぐに忘れるのでメモ

管理者権限でコマンドプロンプト実行

ディレクトリーをリンクする場合

 mklink /D [リンク先] [リンク元]
 mklink /D C:\link C:\directory

Gitとかでも認識するようにするにはジャンクションにする。

 mklink /j [リンク先] [リンク元]
 mklink /j C:\link C:\directory

2016年11月30日水曜日

cocos2d-x ios の UIWebView を WKWebViewに変更する。

ios10 にアップデートしたあたりから、UIWebViewの挙動がどうもおかしい。
不意に落ちたり、ほかのアニメーション実行中に落ちたりするような
よくわからないエラーが多数発生するようになった。


UIWebViewをどんだけいじってもらちがあかなさそうだったのでWKWebViewに思い切って変えてやろうと思った。
変更箇所は比較的少なくてすぐに変更はできた。 ライブラリーに WebKitを追加して
#
# cocos2d-x-3.13.1
#
# cocos2d-x/cocos/ui/UIWebViewImpl-ios.mm


#include "ui/UIWebViewImpl-ios.h"
#include "renderer/CCRenderer.h"
#include "base/CCDirector.h"
#include "platform/CCGLView.h"
#include "platform/ios/CCEAGLView-ios.h"
#include "platform/CCFileUtils.h"
#include "ui/UIWebView.h"

#import   // 追記


// 100行目あたり
@interface UIWebViewWrapper ()  //変更
@property(nonatomic, retain) WKWebView *uiWebView; //  変更


// 120行目あたり
- (void)dealloc {
    self.uiWebView.navigationDelegate = nil;   // 変更
    self.uiWebView.UIDelegate = nil;           // 変更 
    [self.uiWebView removeFromSuperview];
    self.uiWebView = nil;
    self.jsScheme = nil;
    [super dealloc];
}

- (void)setupWebView {
    if (!self.uiWebView) {
        self.uiWebView = [[[WKWebView alloc] init] autorelease]; //  変更
        self.uiWebView.navigationDelegate = self; //  変更
        self.uiWebView.UIDelegate = self; //  変更

        [self.uiWebView setOpaque:NO];
        [self.uiWebView setBackgroundColor:[UIColor clearColor]];
        
    }
    if (!self.uiWebView.superview) {
        auto view = cocos2d::Director::getInstance()->getOpenGLView();
        auto eaglview = (CCEAGLView *) view->getEAGLView();
        [eaglview addSubview:self.uiWebView];
    }
}


// 220行目あたり
- (void)evaluateJS:(const std::string &)js {
    if (!self.uiWebView) {[self setupWebView];}
//    [self.uiWebView stringByEvaluatingJavaScriptFromString:@(js.c_str())]; // コメントアウト
    
    // 以下を追記 コールバックは省略
    [self.uiWebView evaluateJavaScript:@(js.c_str()) completionHandler:^(NSString *result, NSError *error){
        NSLog(@"Error %@", error);
        NSLog(@"Result %@", result);
    }];
}

- (void)setScalesPageToFit:(const bool)scalesPageToFit {
    if (!self.uiWebView) {[self setupWebView];}
//    self.uiWebView.scalesPageToFit = scalesPageToFit; // WKWebViewでは使わなさそうなのでとりあえずコメントアウト
}

今はこれで動いているがまぁ問題があればそこでまた考えよう。

2016年11月22日火曜日

cocos2d-x pushSceneからのenterSceneしたいので、pushEnterSceneの作成

pushSceneをした後に、enterSceneをすると、scenesStackごと破棄されてしまうので
今いるSceneを移動するように pushEnterSceneを作成した。


※ replaceScene で同じことができるようなのでいらなかった。。。


# CCDirector.cpp

void Director::pushEnterScene(Scene *scene)
{
CCASSERT(scene, "the scene should not null");

// _sendCleanupToScene = false;

#if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine();
if (sEngine)
{
sEngine->retainScriptObject(this, scene);
}
#endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS
_scenesStack.popBack(); // pushScene にこれを追加しただけ
_scenesStack.pushBack(scene);
_sendCleanupToScene = true;
_nextScene = scene;
}

2016年11月13日日曜日

Bitbucketで、コミット間の差分を確認したい場合


https://bitbucket.org/<OWNER>/<REPO>/branches/compare/<commit-hash>..<commit-hash-older>#diff

ブラウザの操作からは、コミット間の差分表示方法がわかりませんでしたが
直接URLを入力するとできるみたいです。

2016年11月4日金曜日

Lua 例外処理 try-catch

Luaには、直接的な例外処理はないみたいなので
pcallを応用して、try-catch的なものを代替わり案としてみる。

--
-- try-catch関数
--

function try_catch(what)
  local status, result = pcall(what.try)
  if not status then
    what.catch(result)
  end
  return result
end


--
-- 使い方
--
  try_catch{
    try=function()
      -- 何か実行する
    end,
    catch=function(error)
      print("caught error " .. error)
    end
  }

2016年11月2日水曜日

Lua ロングカッコ

[===[文字列]===] 文字列の囲み文字は任意の数のイコールとカッコを使ってあらわされれる。 

[=[文字列]=]
[==[文字列]==]
[===[文字列]===]
[====[文字列]====]
[=====[文字列]=====]
[======[文字列]======]
[=======[文字列]=======]
[========[文字列]=========] 

最初、この文字が出てきたときふざけてるのかと思ったけど ちゃんとしたものでした。
1段開き長括弧、2段開き長括弧とか読むらしい。

2014年6月25日水曜日

webdevのmount

事前にdavfs を設定しておく必要がある。 mount -t davfs http://example.com/webdav/ /tmp/webdav

テキストファイルに含まれる文字列をGREPする

Linux系のコマンドでテキストファイルに含まれる文字列をGREPする場合 find . -type f -name "*.txt" | xargs grep "文字列"

Linux 古いコマンドのキャッシュ削除

ソースからGITを入れた時に起こった現象

git --version
bash: /usr/bin/git: No such file or directory

どうも、削除した古いバージョンのGITの影響らしいので以下でキャッシュ削除
hash -r

swfed.so configure option

configureするときには、オプションを指定する

phpize
./configure --with-png-dir --with-gif-dir --with-zlib-dir


FireFoxの console.log 最高!



FireFoxプラグインのFireBugsで利用できる console.log って便利だ。IEにも同じ機能が欲しい。


単なるログ出力だけでなく、オブジェクトの中身が見れたりして


Javascript開発におけるわかりにくかったところが一度に解決されます。


console.log さまさまです。


しかし、FireFoxで開発を進めて、いざIEで試すとまったく動かない。。。


そんな絶望感は計り知れない。。。


まぁ、とりあえずってことで、


IEでは、if(typeof console == 'undefined') console ={};


とかやって、consoleを書いたままでもエラーが出ないようにしています。





スクラップブックマーク



はてなブックマークのjavascriptをお気に入りに登録させてしまう仕様をみて


ほーそんなこともできるんですね。


灯台下暗しといいますか、クリック一発で登録の手軽さをこういった形で実現してしまうとはさすがです。


そこで、新発見があったのですから応用して、スクラップブック(本文中の記事だけを取得する)用に


出来ないかと考えてみました。


FireFox用



<a href='javascript:
var h = window.document.getElementById("bkmark");
if(!h){
var f=window.document.createElement("form");
f.method="POST";
f.target="bkmark";
f.action="○○○.php");
f.innerHTML="<input type=\"hidden\" name=\"doc\" id=\"bkmark\"><input type=\"hidden\" name=\"title\" id=\"bkmark_title\"><input type=\"hidden\" name=\"url\" id=\"bkmark_url\">";

var ifr=window.document.createElement("iframe");
ifr.name="bkmark";
ifr.width=0;
ifr.height=0;

window.document.body.appendChild(f);
window.document.body.appendChild(ifr);
h = document.getElementById("bkmark");
}
h.value = escape(window.getSelection().getRangeAt(0)) || "";
window.document.getElementById("bkmark_title").value = escape(document.title);
window.document.getElementById("bkmark_url").value = escape(location.href);
if(h.value){f.submit();}
void(0);
'>スクラップブックマーク(FireFox用)</a>



上記のURLをはてなブックマークと同じように、ブラウザのお気に入りに登録します。


始めは、XMLHttpRequest を使っていたのですが、別ドメインへのアクセスが出来ないことが


すぐにわかり(使う前に気がつけよ。。。)断念しました。


はてなブックマークは、local.href でGETでタイトルとURLを送っていましたが


データを一方的に送信するだけでよいので、iframe枠内に見えないところでPOST送信することにしました。


(一番下に黒いぽちがでてますけど。。。)


スクラップブックで長めの文章を送るとなるとGETではバイト数が足りなくなる場合があるからです。





指定の文章の取得には、window.getSelection().getRangeAt(0) 


でマウスで選択したテキスト部分をPHPプログラムへ送信します。


PHP側は、適当に DBに保存するなり、ファイルに書き出すなりして


後で自分で確認できるように作っておけば良いかと思います。


IEの場合は、window.getSelection().getRangeAt(0) の代わりに


(window.document.selection.createRange())[0]  を使えばできるような気がします。(試してません)


自分のサイト以外でこういったJavascriptを実行させるテクニックは面白いですね。


(FireFoxのアドオンとかは基本的にこれなんですけどね。。。気がつけよ。。。)


Greasemonkeyとかがなぜ流行るのかようやくピント来た気がします(遅)





PHPの日付の加算、減算の備忘録





// 現在日付から○日の取得

echo "1日前" . date("Y/m/d", strtotime("-1 day" ));
echo "1ヶ月前" . date("Y/m/d", strtotime("-1 month"));
echo "1年前" . date("Y/m/d", strtotime("-1 year" ));
echo "1週間前" . date("Y/m/d", strtotime("-1 week" ));


// 指定日付から○日の取得

echo "1日前" . date("Y/m/d", strtotime("2007/12/20 -1 day" ));
echo "1ヶ月前" . date("Y/m/d", strtotime("2007/12/20 -1 month"));
echo "1年前" . date("Y/m/d", strtotime("2007/12/20 -1 year" ));
echo "1週間前" . date("Y/m/d", strtotime("2007/12/20 -1 week" ));


こういうのって、すぐに書き方を忘れてしまうので


書き留めておくと便利かも。





関連リンク:PHPで、先月、翌月などのを扱うときの注意