2017年06月02日

hp spectre x360 のペン

先日も書いたが、x360のペンが気に入っている。
特に何かを描くというわけではないが、液晶タブレットと同じような使い方ができるということにワクワクしている。
普通のタッチパネルと違って、ペンでタッチしたときに筆圧を感知するのがとても良い。

僕はPhotoshopCS6を持っている。数年前の誕生日に買ってもらった。もったいないことに全然使っていない。
全然元が取れていないが、ペンが使えるのなら、これからはPhotoshopで描き放題だ!と思っていた。

hp spectre x360が届いて、早速Photoshopをインストールした。
いざ!とペンで描いてみると、なぜか線の太さが変わらない。
何か設定がいるのか?と調べたり、弄ったりしてみたが、変化がない。
他の筆圧感知に対応しているというソフトをインストールしては試してみたが、結果は同じだった。

さらにいろいろ調べていたら、これだ、という情報を見つけた。

タブレットPCの筆圧感知について簡単なまとめ
https://togetter.com/li/419472

どうやらWindowsPCの筆圧感知の方式は2方式あるらしい。
WacomなどのWintab系と、Surfaceなど(?)のN-trig系。
Wintabは多くのソフトが対応しているっぽいが、x360はN-trigの方式のようだ。
こんな違いがあるなんて、全然知らなかった。

どうやら互換ドライバというものがあるらしい。まだインストールしてはいないが。
あと、N-trigの方式に対応しているお絵描きソフトもあるようだ。
ClipStudioというソフトの体験版をインストールして試したところ、これなら筆圧を感知できた。
もしかしたらPhotoshopも最新のバージョンなら対応しているのかもしれない。知らないけど。

さぁ、何を描こうかな。

 


posted by t2low at 00:56| 日記

2017年05月31日

hp spectre x360 を買った

奥さんからPCを新調しても良いと許可がおりた。
これまで使用していたMacbook Airが5年も前のモデルで、開発時に轟音を立てていたのがきっかけだった。

購入したのは「hp spectre x360」の「スタンダードプラス」モデル。
Core i7 7500U、16GB、1TBのノートPCだ。
ノートPCだが、タッチパネルを搭載していてタブレットのようにも使える。
スタンダードプラスモデル以上にはペンも付属していて、お絵かきも楽しめる。
このペンが付属するというところに惹かれたのも選んだ理由の一つだ。

注文したのは5/20の夜。
正式受注となったは翌週月曜日の5/22。
そして、自宅に届いたのは金曜日5/26だった。
最速で5営業日ということだったので、最速で届いたようだ。

購入に際し、いくつか他のPCも検討した。

最初に欲しいと思っていたのは、DELLのXPS13だった。見た目がとても好みだった。
しかし、最低でもメモリは16GBは欲しいと考えていたので、XPS13の最上位モデルを選択するしかなく、そこが少しネックに感じた。
XPSの2-in-1も良いように見えたが、同じCore i7でも性能が低いものらしい。あまり詳しくはわかっていないが、そこが引っかかって選外とした。

LenovoのThinkpadも良さそうだと思っていた。
X1 Carbonは見た目も良く、開発用途として使うにはとても良さそうだったが、店頭で確認したとき「これはでかすぎる」と感じた。
持ち歩くことを考えていたので候補からは外れた。
X270もシンプルな見た目で良さそうに思った。本体サイズは小さめだが、スペックは十分で、SIMが挿せるのも良さそうだった。
しかし、見た目がシンプルすぎた。変わらない良さというものはわかるが、今回はかっこいいPCが欲しかった。

CPUが高性能なので、ゲーミングノートPCも考えたが、やはりモバイル用途を考えると選べるものは見つけられなかった。
モバイルアプリ開発者としてはMacを選ぶべきなのかもしれないが、今買いたいと思えるモデルがなかった。

そして、最終的にこの「hp spectre x360」を選んだ。
キーボードの一部が特殊な配置になっているのが少し気になったが、店頭で触ってみた限りではBackspace、Enter等の押し間違いは起きなかった。
きちんとブラインドタッチできる方ではないけれど、これだけ打てれば大丈夫だろうと思った。
欲を言えばメモリは32GB欲しかったが、モバイルノートではまず見当たらないから仕方ない。
パフォーマンスモデルの4Kディスプレイが+1万円で手に入るというのは、すごく魅力的だったが、納期が伸びるのは我慢できそうになかった。
店頭で確認したり、自宅のフルHDのディスプレイを使って疑似体験してみたら、最終的にフルHDで十分だ、という結論に達した。

メインPCがWindowsになるのは久しぶりだ。
いろいろと思い出しながらだったり、調べながらだったり、環境を整えていくのは楽しい。
開発者がデジタイザーペン付きのPCを使うだなんて、なんだか軟派な感じもするけれど、久しぶりにPCを楽しむために買った気がする。
ペン楽しい。

まだ書きたいことはあるので、またブログを更新していけたらいいな、と思っている。



posted by t2low at 01:28| 日記

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