2016年04月19日

Windows10 の初期化時に行ったこと

Windows10 の Insider Preview を Transbook T90 にインストールしてみたけれど、スペック的に厳しいとわかったので再び PC の初期化を行った。

ASUS ノートパソコン TransBook T90CHI-3775 Windows10/8.9インチ/ダークブルー

とりあえず、以下のことをした。
おそらく、また初期化することがあると思うので備忘録的に残しておく。

■アンインストール

不要なアプリをいろいろ消した。

■インストール

- Google 日本語入力
- JDK8
- Android Studio
- Git2.8.1
- Firefox
- アンチウイルスソフト

■CapsLock→Ctrlへの変更
http://ascii.jp/elem/000/000/927/927191/

■各種フォルダの移動
http://zakkinks.com/windows10_ssd_optimization2/

何か忘れているような気がするけれど、とりあえずはこんなものだろうか。
この PC の性能は低いとわかったので、本当に最低限のことだけするように気をつけよう(自戒)。
あれもこれもインストールしないこと。


タグ:Windows
posted by t2low at 11:32| その他

2016年04月16日

Windows10 に git をインストール

久しぶりの更新です。
今日は Windows10 PC に git 2.8.1 をインストールしました。

昨年末に小さなタブレットPCを買ったんですが、最近初期化しまして、もう一度開発環境を整えようと思ってのことです。ちなみに使用しているPCは以下のものです。

ASUS ノートパソコン TransBook T90CHI-3775 Windows10/8.9インチ/ダークブルー

正直、開発するには向きません。が、このサイズは気に入っているので、もう少しがんばって(我慢して)使ってみようと思っています。
普段は mac を使っているので、あまり Windows の勝手がわからず、いろいろと参考になるサイトを探しながら作業しています。

今回、参考にさせていただいたのは以下のサイトです。

■ 私家版 Git For Windowsのインストール手順 | OPC Diary
http://opcdiary.net/?page_id=27065

以前に Windows10 PC に git をインストールした際は、あまり説明も読まずに標準設定のままインストールして、いろいろと困った記憶があったので、今回は確認しながら進めました。
上記サイトは画面ごとにスクリーンショットが貼られていて、しかも、画面の説明を日本語で丁寧に解説してくれています。大変助かりました。

今回は以下の設定でインストールしました。
- PATHの設定 → WindowsのコマンドプロンプトにもUNIXツールのパスを設定
- 改行について → 改行はそのまま。「Checkout as-is, commit as-is」
- コンソールの選択 → MSYS2
- その他 → デフォルト設定

SSHキーも作成し、GitHubにアクセスできるようにしました。
上記サイトでは、posh-gitというものもインストールしてはどうかと提案していましたが、ターミナルからのコマンド入力はそれなりに慣れているので、これはインストールしませんでした。

まだ git のインストールをしただけで、文字コードや改行コードが意図したとおりになっているかわからないですが、とりあえず git のインストールはうまくいったようです。良かった良かった。
丁寧にまとめてくださる人がいるのは大変ありがたいですね。


タグ:Windows git
posted by t2low at 09:00| その他

2014年09月18日

[Android] 環境再構築

しばらく家での開発をサボっていて、久しぶりにPCを開いてみたら、いろいろと環境が古い状態だった。
これはイカンと環境を再構築することにした。
最初からやり直してみたかったので、既存のEclipseはポイっとゴミ箱へ。
最新のEclipseは4.4(Luna)になっていた。フラットデザインだ。

・ Eclipse Downloads https://www.eclipse.org/downloads/

今回はAndroid SDKをきちんと管理できるようにしたかったので、Homebrewを使ってAndroid SDKをインストールすることにした。
こちらのサイトを参考にさせていただいた。

・ 橋本商会 ≫ Android開発環境をインストールしなおした http://shokai.org/blog/archives/6407

Android SDKが簡単にインストールできるのは嬉しいのだけど、インストールされるパスが微妙ではなかろうか。
「/usr/local/Cellar/android-sdk/23.0.2/bin/android」のような感じで、途中にバージョンコードが入ってる。
23.0.2のディレクトリのままアップデートするのも微妙だし、バージョンごとにディレクトリ変えるのも微妙。
普通はインストール先を変えるものなのかな?

続いて、EclipseへADTをインストール。

・ Installing the Eclipse Plugin | Android Developers http://developer.android.com/sdk/installing/installing-adt.html

で、Eclipseの各種設定をしておしまい。
こちらのサイトを参考にしながら、適当に設定する。

・ モダン(かもしれない)なEclipse環境(Java)の構築方法 - wyukawa’s blog http://d.hatena.ne.jp/wyukawa/20100725/1280036738

新しい環境というのはいい感じだね。
posted by t2low at 02:35| Android

2014年03月30日

[Cocos2d-x] CCMenuItemをタッチしてもスクロールできるようにしたい(やり直し)

以前、このような記事を書きました。

tappli blog: [Cocos2d-x] CCMenuItemをタッチしてもスクロールできるようにしたい

これを書いた時点では気づいていなかったのですが、だいぶひどいバグがありました。
2つのボタンをタップすると、動作がおかしくなってしまうのです。
マルチタップを考慮してなかったせいでした。

その点に関して修正した(と思われる)ものをGitHubにアップロードしました。

t2low/CocosScrollViewSample

もうちょっとちゃんとしたサンプルが作れたらよかったのですが、とりあえずはスクロールビューとボタンを配置しただけのサンプルです。
iOSとAndroid用のプロジェクトを残してありますが、iOSの方しか動作確認してませんです。
自分は現在Cocos2d-x 2.2.3の環境でやっています。
おかしなところがあったら、ご報告いただけるとありがたいです。
タグ:cocos2d-x
posted by t2low at 23:33| Cocos2d-x

2014年03月18日

[Cocos2d-x] ミリ秒で時間を取得したい

JavaのSystem.currentTimeMillis()のようにミリ秒(というか、秒以下の精度)で時刻を取得したくなりました。
time()関数の単位は秒なので使えません。
clock()関数は精度はtime()関数より高いようですが、時刻を取得するものではないようです。
いろいろ検索してみると、gettimeofday()関数を使えば良いらしいということがわかりました。
#include <stdio.h>
#include <sys/time.h>

int main(int argc, char *argv[]) {
struct timeval t;
gettimeofday(&t, NULL);
unsigned long long now = t.tv_sec * 1000ull + t.tv_usec / 1000ull;
printf("Time: %llu\n", now);
return 0;
}

tv_secは秒なので1000倍、tv_usecはマイクロ秒なので1000で割ったものを足しています。

Javaで同じように出力するプログラムを書いて比較してみました。
class Main {
public static void main(String[] args) {
System.out.println("Time: " + System.currentTimeMillis());
}
}

全く同時には実行できないので返す結果は少し異なりましたが、数値を見る限り大丈夫そうな感じでした。
これで時刻をミリ秒で扱えます。良かった、良かった。
posted by t2low at 22:00| Cocos2d-x

2014年03月05日

[Cocos2d-x] 外部のフォントファイル(.otf)を表示する

今日、外部のフォントファイル(.otf)を使って、文字を表示する部分を作成していました。
フォントファイルはResources/fontsに入れ、CCLabelTTFクラスを使って表示するだけです。
それだけなんですが、えらい苦労しました。

iOS



  • 参考にさせてもらったいくつかのサイトに「ターゲット」の「Fonts provided by application」にフォント名を追記する、というようなことが書かれていたが、どこのことだかわからない

  • いくつかのサイトに載っていた画面とは異なるが、プロジェクトの「ios/info.plist」に「Fonts provided by application」があることを教えてもらった


Android



  • AndroidはCClabelTTFにフォントファイル名を設定したが表示されない。

  • 他の.ttfファイルなら表示できるので、ファイルが.otfだからっぽいということはわかった。

  • この.otfファイルをTextViewで利用した時は表示できるのでCocos2d-xが対応してないっぽい?

  • 最終的に「拡張子を.ttfにすればいけるらしい」ということを聞いて、試したら本当に表示された。信じられない。


こんな感じ。
表示できないotfのフォントを使おうとしている方は、ファイル名を〜.ttfにすると良いですよ。
posted by t2low at 02:00| Cocos2d-x

2014年02月26日

[Cocos2d-x] CCMenuItemをタッチしてもスクロールできるようにしたい

以下のソースには不具合があります。
修正したソースは以下の記事から参照できます。
tappli blog: [Cocos2d-x] CCMenuItemをタッチしてもスクロールできるようにしたい(やり直し)


CCScrollViewとCCMenuを組み合わせて利用した時に、最初のタッチ位置がCCMenuItemだとスクロールさせることが出来ません。
CCMenuItemがタッチイベントを奪ってしまって、CCScrollViewまで届いていないようです。
解決策がないかと検索してみたところ、以下の記事が見つかりました。
というよりもこれくらいしか見つけられませんでした。
あまりCCScrollViewとCCMenuを組み合わせて使うような使い方はされていないのかも知れません。

Make Ccscrollview Work With Ccmenuitemimage - iOS Coder Talk

全てのコードは載っていないのですが、やっていることは単純でした。

  • CCMenuItemより先にCCScrollViewがタッチイベントを取得するようにする

  • ccTouchEnded時にタッチの移動距離を計算し、一定以下ならCCMenuにタッチイベントを渡す

  • CCMenu側では指定された範囲外だったら無視する


という感じ。

足りないコードを補完して、この実装をしてみると一つ問題がありました。
スクロールはできるし、ボタン押下のイベントも来るのですが、ボタンの見た目が変化しないのです。
それはそのはずで、CCScrollViewExのccTouchEndedでCCMenuのccTouchBeganとccTouchEndedを両方処理しているのです。
これではダメだと書き換えたのが以下のコードです。

.h


class CCMenuEx : public cocos2d::CCMenu {
public:
CREATE_FUNC(CCMenuEx);
virtual bool ccTouchBegan(cocos2d::CCTouch *touch, cocos2d::CCEvent *event);
void setValidTouchRectInWorldSpace(cocos2d::CCRect rect) { this->validTouchRectInWorldSpace = rect; };
private:
cocos2d::CCRect validTouchRectInWorldSpace;
};

class CCScrollViewEx : public cocos2d::extension::CCScrollView {
public:
virtual void registerWithTouchDispatcher();
virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtual void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtual void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtual void ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
CREATE_FUNC(CCScrollViewEx);
void setMenu(cocos2d::CCMenu *menu);

enum {
kCCScrollViewExPriority = (cocos2d::kCCMenuHandlerPriority - 1)
};
protected:
cocos2d::CCPoint pressPoint;
cocos2d::CCMenu *menu;
bool waitingTouchEnd;
};

.cpp


bool CCMenuEx::ccTouchBegan(CCTouch *touch, CCEvent *event) {
if (!validTouchRectInWorldSpace.size.width || !validTouchRectInWorldSpace.size.height) {
return CCMenu::ccTouchBegan(touch, event);
}

CCPoint touchLocation = touch->getLocation();
if (!validTouchRectInWorldSpace.containsPoint(touchLocation)) {
return false;
}

return CCMenu::ccTouchBegan(touch, event);
}

void CCScrollViewEx::registerWithTouchDispatcher() {
CCTouchDispatcher *dispatcher = CCDirector::sharedDirector()->getTouchDispatcher();
dispatcher->addTargetedDelegate(this, kCCScrollViewExPriority, true);
}

bool CCScrollViewEx::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) {
pressPoint = pTouch->getLocationInView();
if (menu) {
waitingTouchEnd = menu->ccTouchBegan(pTouch, pEvent);
}
return CCScrollView::ccTouchBegan(pTouch, pEvent);
}

void CCScrollViewEx::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) {
if (waitingTouchEnd) {
const float MIN_DISTANCE = 10;
CCPoint endPoint = pTouch->getLocationInView();
float distance = sqrtf((endPoint.x - pressPoint.x) * (endPoint.x - pressPoint.x) + (endPoint.y - pressPoint.y) * (endPoint.y - pressPoint.y));

if(distance < MIN_DISTANCE) {
if (menu) {
menu->ccTouchMoved(pTouch, pEvent);
}
} else {
if (menu) {
menu->ccTouchCancelled(pTouch, pEvent);
waitingTouchEnd = false;
}
}
}
CCScrollView::ccTouchMoved(pTouch, pEvent);
}

void CCScrollViewEx::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
if (waitingTouchEnd) {
const float MIN_DISTANCE = 10;
CCPoint endPoint = pTouch->getLocationInView();
float distance = sqrtf((endPoint.x - pressPoint.x) * (endPoint.x - pressPoint.x) + (endPoint.y - pressPoint.y) * (endPoint.y - pressPoint.y));

if(distance < MIN_DISTANCE) {
if (menu) {
menu->ccTouchEnded(pTouch, pEvent);
}
} else {
if (menu) {
menu->ccTouchCancelled(pTouch, pEvent);
waitingTouchEnd = false;
}
}
}
CCScrollView::ccTouchEnded(pTouch, pEvent);
}

void CCScrollViewEx::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent) {
if (menu && waitingTouchEnd) {
menu->ccTouchCancelled(pTouch, pEvent);
waitingTouchEnd = false;
}
CCScrollView::ccTouchCancelled(pTouch, pEvent);
}

void CCScrollViewEx::setMenu(CCMenu *menu) {
this->menu = menu;
CCMenuEx *ex = dynamic_cast<CCMenuEx *>(menu);
if (ex) {
ex->setValidTouchRectInWorldSpace(getViewRect());
}
}


ccTouchMovedとccTouchEndedにコピペコードがあるのはご愛嬌。
変更したのは、以下のとおり。

  • CCMenuにはccTouchBeganでイベントを流す

  • タッチ位置が一定以上移動したらCCMenuのタッチイベントはキャンセル(ccTouchCancelled)する

  • setMenu()にCCMenuExが渡されたら、CCScrollViewExの表示サイズをタッチ可能領域とする


期待通りの動作はしているので、これで良しとします。

確認はしていないですが、Cocos2d-x 3.0ではタッチイベント周りがかなり改善されているようなので、こんなことしなくても良いかも知れません。
3.0はまだβ版のようなので、まだ必要としている人がいるかも、と記事にしてみました。


posted by t2low at 22:00| Cocos2d-x

2014年02月19日

[Cocos2d-x] std::vectorの中身の保存

CCHttpClientを使って取得したデータをファイルに保存するコードを書いていました。

std::vector<char> *data = response->getResponseData();

std::string path = CCFileUtils::sharedFileUtils()->getWritablePath() + "hoge.txt";
FILE *fp = fopen(path.c_str(), "w");
size_t count = fwrite(&data[0], sizeof(char), data->size(), fp);
fclose(fp);

こんなコードを書いたのですが、ファイルの内容は正しくありませんでした。
しかし、fwrite()の戻り値はdata->size()と一致するのです。
しばらく悩んで気付きました。
size_t count = fwrite(&(*data)[0], sizeof(char), data->size(), fp);

こうですね。
そりゃあ変なデータが書き込まれるわけですね。

posted by t2low at 22:00| Cocos2d-x

2014年02月18日

[Cocos2d-x] OS毎に処理を分ける

「Cocos2d-x 開発のレシピ」にOS毎に処理を分ける方法が載っていました。

マクロで分岐させる方法と
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
...
#elif (CC_TARGET_PLATFORM ==CC_PLATFORM_ANDROID)
...
#endif

実行時に分岐させる方法
TargetPlatform platform = CCApplication::sharedApplication()->getTargetPlatform();
if (platform == kTargetIphone || platform == kTargetIpad) {
...
} else if (platform == kTargetAndroid) {
...
}

使い分けとしては、関数でできるなら関数、ヘッダで使うとき等はマクロで、とのことだけど、実行時に分岐させたいことってあるのかな?
すぐには思いつかないな…。
可読性が落ちるというのはわかる。




posted by t2low at 22:00| Cocos2d-x

2014年02月17日

[Cocos2d-x] C++で忘れがちなこと

Javaをやってた時間が長いので、よく忘れてしまうのです。
staticなメンバ変数の使い方。

Hoge.h
class Hoge {
public:
static Hoge *getInstance();
private:
Hoge() {};
static Hoge *instance;
};

Hoge.cpp
Hoge *Hoge::getInstance() {
if (!instance) {
instance = new Hoge();
}
return instance;
}

こんなコードを書くとエラーになりますよね。
Hoge.cppに
Hoge *Hoge::instance;

の1行が必要です。
エラーが出てstaticなメンバ変数が原因だということがわかっても、毎度のようにしばらく解決できないことがあるので、今度こそ忘れないようにとメモしておきます。
posted by t2low at 22:00| Cocos2d-x