fc2ブログ

[Titanium Studio]Androidエミュレータでのデバッグにハマる

Titanium Mobileの勉強を細々とやってます。
サンプルコードがうまく動かないので、Titanium Studioでデバッグしようとしたら失敗した。

結論を先に書くと、「AndroidデバイスをUSB接続中に、Androidエミュレータでのデバッグを実行すると失敗する

AndroidデバイスをUSB接続中でも、Androidエミュレータでの実行は問題なくできる。デバッグだとダメ。

需要があるかわからないが、Titanium StudioでのAndroidエミュレータデバッグ起動手順について書く。

1. デバッグ開始
project explorerのdebugボタンを押して開始。Ver1.0ではエミュレータでのデバッグしかできない。
debugボタン

2. debug perspectiveを開く
「debug perspectiveを開きますか?」と聞いてくるので、yesで開ける。聞かれなかったら、メニューバーのwindow→open perspectiveから開く。

3. アプリケーションがインストールされるまでひたすら待つ
デバッグビューのApplication installerが<terminated,exit value:0>となるまで待つ。
debugビュー
通常の起動に比べて、デバッグ時はインストールされるまで時間がかかる。
タイムアウトしたら、エミュレータを終了してやり直す。(結構な頻度でタイムアウトする)

なお、AndroidデバイスをUSB接続中の場合は、<terminated,exit value:1>となり、コンソールに
[ERROR] Exception: error: more than one device and emulator
と表示される。

4. エミュレータのロック解除
アプリケーションはインストール完了後に自動で起動される。
鍵マークをドラッグしてロック解除して、アプリケーションを表示する。
(アプリケーションがインストールされる前にロック解除してもよい)
エミュレータのロック解除

これでデバッグを開始できる。ブレークポイントの設定やステップ実行手順はeclipseと同じ。

はじめはFastdevが怪しいと思って色々と調べたのだが、Fastdevは悪くなかった。
Fastdevのコンソールに
Error killing app, result: ['App not connected']
と表示されることがあるが、これはFastdevサーバ上にアプリケーションが見つからないだけで問題ない。
スポンサーサイト



HP Pavilionのデバイスまわりの設定をする

ちょっとしたバイトをしてちょっとした収入を得たので、新しいノートPCを買った。(実際にお金が振り込まれるのは来月末なのだが)
買ったのは、HP Pavilion dv7
解像度が最低でも縦900px欲しくて、手が届きそうな価格ということでHPのPCになった。

デバイスまわりの設定を少しいじったので書いておく。1ヶ月以上ブログ更新してなかったし。

・Webカメラを無効化
何かの拍子に勝手に動き出したら嫌なので。
<設定方法>
コントロールパネルからデバイスマネージャーを起動し、イメージングデバイスの配下にある「HP TrueVision HD」のプロパティからデバイスを無効にする。

・タッチパッドを無効化
キー入力中にタッチパッドに触れると、カーソルが勝手に飛ぶのが嫌なので。
タッチパッド左上をダブルタップすると無効化されるのだが、OSを起動するたびに無効化しなければならない。
デバイスマネージャーでも無効化できるが、「マウスをつないでるときだけタッチパッド無効化」の方が使い勝手がいい。1度設定すれば、電源を落としても有効。
<設定方法>
コントロールパネルからマウスを起動し、デバイス設定タブで「USBマウス接続時に内蔵ポインティングデバイスを無効にする」をチェック。

・function keyを、fnキーを押さなくても実行する
デフォルトでは、例えばf10キーを押すと音量がアップする。f10キーの機能を使うには、fn+f10と入力する必要がある。
自分はfunction keyを使うことが多いので、fnキーを押さなくてもfunction keyの機能を使えるようにした。
<設定方法>
BIOS設定画面で、System Configuration の Action Keys Mode を DISABLEDにする。
電源を入れた直後のhpマークが出ているときにescキーを押すと、BIOS設定画面が出てくる。

ctrlキーとfnキーの入れ替えもしたかったが、Pavilionでは対応していなかった。しょうがないのでキー配置を変えるソフトでctrlキーとwindowsキーを入れ替えた。
でもwindowsキーの位置だとしっくり来ない。
ノートPCのFnとCtrlを入れ替える代替案
で紹介されている方法が魅力的だ。プラスチック板よりも金具の方がいいのか。今度ホームセンター行ったら物色してみよう。

デスクトップアプリも新しいのを使おうと探して、Rainmeterを使うことにした。スキンを自分用に改造したので、気が向いたら解説エントリを書くかもしれない。

jQuery Mobile を触ってみる

スマートフォン向けのサイトを作ろうと思って少し調べてみた。
jQuery Mobileを使えば手軽に作れそうだ。

入門記事はないかと探して、西畑一馬のjQuery Mobileデザイン入門をザザっと読んでみた。
「デザイン入門」なので、マークアップとCSSが中心でJavaScriptについてはあまり触れていない。
結局、リファレンスをひと通り読むことにした。

ページ遷移はjQuery Mobileがやってくれるので、リンクを貼るだけでいい。
遷移後のonloadや$(document).ready()に該当するものがわかりづらいが、data-role="page" のdivのpageinitイベントにバインドすればいいとわかった。
ただし、
$('#id').bind('pageinit', function(event){...
だとバインドされなかった。
$('#id').live('pageinit', function(event){...
だとバインドされた。意味が分からない。

とりあえず、
・メニューのリストから"ベジェ曲線を使ってみた"をタップすると、ベジェ曲線を使ってみたのCanvasが表示される。
・画面をタップするとボールが動く。もう一度タップすると止まる。
という動きをするMulti-pageを作ってみた。

作ってみたのだが、確認しようにもスマートフォンを持っていない
パソコンからスマホ用サイトの表示をチェックできるMobilizerをインストールしてみたが、CPU負荷が100%に張り付いて動かない。
スマートフォンよりも開発用PCを買うのが先だな。
結局、Safariをインストールして、開発メニューからUser-AgentをiPhoneにして一応動くことを確認した。(HTTPヘッダのUser-Agentを変えているだけなら意味が無さそう)

ページイベント周りがよくわからないから、あとで整理したい。

キートップをはずしてキーボードの掃除をする

珍しくプログラミング以外のことを書く。

年末気分でノートPCキーボードの掃除をしようと思い、初めてキートップを外した本格的な掃除をした。
掃除後
これは掃除後。
掃除前はダニアレルギーになりそうなぐらいひどかったので写真は載せない。

キートップはドライバーではずした。
ドライバーなど
白い柄のドライバーが重宝した。
毛抜きは髪の毛を取るのに使った。

キーによってドライバーを入れる方向が異なる。
ドライバーを入れる方向
ホームポジションのFとJは縦にドライバーを入れる必要があった。
数字キーも1だけは縦だった。

ドライバーに力を入れすぎると、キーを引っ掛ける部分がはずれる。
引っ掛ける部分が外れたキー
慣れれば簡単に元の位置にハメ込めるのだが、最初は戻すのに苦労した。
ハメ込むときにちょっと沈みこませるのがコツ。

spaceやEnterのような大きなキーには針金がついていた。
enterキーなど
この針金でキーボードに固定しているのだが、Enterには縦横に2本の針金がついているため、キーを外すのも付けるのも苦労した。

ホコリを取るのに役に立ったのが綿棒。
綿棒
何年も前に買ったのに全然減っていないが、今回の掃除だけで5本使った。
こびりついた汚れをゴシゴシこすって取った。

エアダスターが無いのでドライヤーでホコリを飛ばそうと思ったが、うちのドライヤーは冷風の強風ができないので使い物にならなかった。

仕上げにこのブラシを軽くかけたが、ゴム周りのホコリが少し残った。
ブラシ

全てのキーを少し湿らせたティッシュと綿棒で拭いたので、キーボード掃除に3時間ぐらいかかった。
次回はもっと効率良くやりたいが、何年後のことになるやら。

昔作ったゲームを作り直そうか

このごろJavaScriptばかりやっているので、そろそろサーバサイドのプログラミングもしたい。
だが、以前作った戦車ゲームを作り直したい気分になっている。
やりたいことは以下
・地形を画像にする
・エンジン部分を、自作のライブラリに置き換える
・当たり判定まわりなど、負荷が高そうな部分を見直す
見かけはさほど変わらないので、自己満足のための作業だと思うが、サクっとやってしまいたい。

ライツアウト亜種の攻略法を考える

ライツアウト(lights out)とは、全てのマスのライトをつけるパズルゲーム。
クリックすると上下左右のマスのオン/オフが切り替わる。
Tacoyaki+ - Flash game は、ブラウザでできるライツアウトのひとつ。

ライツアウトの解法は検索すればすぐに見つかる。
点灯パズル自動解答(ライツアウト) のような、とても便利なページもある。

このライツアウトの亜種で、クリックすると斜め45度のマスが全て切り替わるパズルゲームがある。
Tacoyaki - Flash game
この解法は、ネットで調べても見つけられなかった。

しょうがないので攻略法を考えるべく、シミュレートするプログラムを作った。
以下はシミュレート結果の例
○○○○○
☆○●○○
○○○●○
○○○○☆
○○○★○
○●○○○
●○☆○○
○☆○●○
○○●○●
○○○●○
○○★○○
○●○●○
○○○○○
○●○●○
○○★○○
○○○○○
○○★○○
○★○★○
○○★○○
○○○○○
初期状態はすべて白で、星がクリックしたマス。
ゲームページ下のTipsにも書いてあるが、
「斜め45度の辺からなる任意の四角形の頂点4つを全てクリックすると、頂点のオン/オフだけ切り替わる」
という法則がある。これがわかるだけで解くのがかなり楽になる。
シミュレートで見つけたパターンと運に助けられて、7×7マスのステージをクリアできた。

JavaScriptで作ったシミュレートクラスのプログラムを載せておく。
Array.indexOf()をサポートしていないブラウザでは動かないので注意。
/**
 * @namespace
 */
var mitako1 = {};

/**
 * Takoyakiクラス
 * @param {number} num 一辺のマスの数
 * @constructor
 */
mitako1.Tako = function(num) {
  /**
   * 一辺のマスの数
   * @type {number}
   */
  this.num = num;
  /**
   * 各マスのオン・オフ状態。オンなら1,オフなら-1
   * 座標(x, y)のマスはboxst[x][y]になる
   * @type {Array.<Array.<number>>}
   */
  this.boxst = [];
  /**
   * 移動方向配列
   * [x軸方向,y軸方向]
   * @type {Array.<Array.<number>>}
   * @private
   */
  this.dirc_ = [[-1, -1], [-1, 1], [1, -1], [1, 1]];
};
/**
 * 初期化
 */
mitako1.Tako.prototype.init = function() {
  this.boxst = [], num = this.num;
  for (var i = 0; i < num; i++) {
    this.boxst.push([]);
    for (var j = 0; j < num; j++) {
      this.boxst[i][j] = -1;
    }
  }
};
/**
 * マスをクリックする
 * @param {number} x マスのX座標。左端を0とする
 * @param {number} y マスのY座標。上端を0とする
 */
mitako1.Tako.prototype.click = function(x, y) {
  this.boxst[x][y] *= -1;
  var tx, ty, num = this.num;
  for (var i = 0; i < this.dirc_.length; i++) {
    tx = x;
    ty = y;
    dx = this.dirc_[i][0];
    dy = this.dirc_[i][1];
    tx += dx;
    ty += dy;
    while (tx >= 0 && tx < num && ty >= 0 && ty < num) {
      this.boxst[tx][ty] *= -1;
      tx += dx;
      ty += dy;
    }
  }
};
/**
 * マスの状態を表示する
 * @param {Array.<Array.<number>>=} star 星型にする座標配列
 * @return {string} 出力結果。オンが黒、オフが白
 */
mitako1.Tako.prototype.disp = function(star) {
  var outstr = '', num = this.num;
  var sxy = [];
  if (star) {
    for (var i = 0; i < star.length; i++) {
      sxy.push(star[i][0] * num + star[i][1]);
   }
  }
  for (var i = 0; i < num; i++) {
    for (var j = 0; j < num; j++) {
      if (this.boxst[j][i] > 0) {
        if (sxy.indexOf(j * num + i) >= 0) {
         outstr += '★';
        } else {
         outstr += '●';
        }
      } else {
        if (sxy.indexOf(j * num + i) >= 0) {
         outstr += '☆';
        } else {
         outstr += '○';
        }
      }
    }
    outstr += '<br>';
  }
  return outstr;
};

もっと時間をかければ、ちゃんとした攻略法を見つけられそうな気がするがどうしようか。

JavaScriptゲームエンジンもどきを作ろうとする

前のエントリで「LimeJSを使ってゲームを作ろうかな」と書いたのだが、細かいところ(Canvasの一部だけ更新するなど)で自分のやりたいことと合わなそうだ。
そこで、以前作ったCanvasアニメーション用ライブラリを修正してゲームエンジンもどきを作ることにした。

以前作ったライブラリの機能はこんな感じ
・メインループを管理(ループの開始、停止、fpsの設定など)
・Canvasのプロパティを管理(サイズやcontextなど)
・Canvasに表示するエンティティを管理
ループするたびに各エンティティのdrawメソッドを実行する。
エンティティの実装はライブラリ外で行う。

これに、以下の機能を追加することにした
・Canvasではエンティティではなくシーンを管理
・各シーンごとに、シーンに表示するエンティティを管理
・Canvasで発生したイベント(とりあえずクリックイベントのみ)を、エンティティに振り分ける
ループするたびに、現在のシーン配下のエンティティのdrawメソッドを実行する。
既存ライブラリでは、画面を変えるときはエンティティを入れ替える必要があったが、シーンを切り替えるだけで済む。
Canvas内で表示するボタンなどのイベントも、シーンを切り替えることで対応できる。

細かいテストはまだだが、ボタンを押して画面を切り替える動作確認はできた。
メインループを開始してアニメーションを行うこともできた。
ボタンやテキストのエンティティを作成するクラスもライブラリに組み込んだ。

「いろいろある軽量JavaScriptゲームエンジンの劣化版」という感じだが、とりあえずこの自作ゲームエンジンをブラッシュアップしながらゲームを作ってみよう。
それからほかのゲームエンジンを使ったりソースを読んだりすれば、また別の発見があると思う。

JavaScriptゲームエンジンについて調べてみたが・・・

先日のエントリで書いた囲碁プログラムの修正が一段落したので、HTML5でゲームでも作ろうと思った。
単純なゲームにするつもりだが、フレームワークというかゲームエンジンを使ってみよう。
ゲームエンジンについては半年前にちょっと調べたのだが、改めて調べてみることにした。

検索して見つけたのがこれ
List of JS game engines
このページだと右が切れていて、wikiページでもコメントが切れていたので、markdownファイルをダウンロードしてコメントを読んだ。
読んだのだが・・・多すぎてどれがいいのかわからない。

みんなが知らない 10 Excellent HTML5 coding Toolsにも取り上げられたLimeJSを使ってみようか。以前ちょっとソース読んだし。

囲碁プログラムの手を戻す機能を修正

囲碁定石トレーニングの修正版をアップした。
前のバージョンに比べて、入力した手を戻す機能が向上した。

<修正前>
・直前の分岐に戻るだけ。それより前の分岐には戻れない。
・戻れるのは黒の分岐のみ。

<修正後>
・ボタンを連続で押すことで、分岐をさかのぼることができる。
・白の分岐にも戻れる。白の分岐を含むかは選択可能。

修正前は、「戻る用のスナップショットをひとつだけ取得し、戻るボタンを押したらそれを反映させる」という実装だった。
スナップショットをたくさん取得すれば分岐をさかのぼることができるが、それだとリソースの負荷が大きくなる。

参考のため棋譜再生プログラムのソースを調べたところ、「入力履歴を作成し、戻ったときは初手から入力して盤面を再現する」という実装だった。
100手目から99手目に戻った場合、プログラムは1手目から99手目までを入力して盤面を再現することになる。
(「100手目を盤面から消すだけでいい」と思うかも知れないが、それだと取られた石を再現できないし、コウ判定もできない)

自分のプログラムも、同じ方式で戻る機能を実装することにした。
定石用データなので、手数はそれほど多く無い。
初手からの再現も、盤面表示せずにデータをいじるだけなので大した負荷にはならない。

以下の点を考慮する必要があったので、少し複雑な実装になった
・「前の手」ではなく、「前の分岐」に戻るため、分岐データも含める必要がある
・白の分岐時の入力は、プログラムによるランダム選択と、ユーザーによる選択の2通りある
特に白の分岐時の履歴作成では苦労した。

これで使い勝手が良くなったと思うが、実際にトレーニングを続けてみないとわからないな。

碁盤に座標を描く実装でちょっと悩む

引き続き、囲碁定石トレーニングの修正をしている。

今日は碁盤に座標を描くことにした。
実装方式について少し考えた。

(1)座標を含めて碁盤を画像にする
画像さえ作ってしまえば実装は簡単。
ただし、
・碁盤の交点のCSS座標が取得できない。
・13路盤など、サイズが異なる碁盤は別の画像を用意する必要がある。
という問題がある。
拡大縮小で画像の交点とCSS座標がズレるようなことは無いと思うが、できれば位置情報を正確に取得したい。

(2)Canvasで座標を描画する
現在の碁盤は HTML5 Canvas で実装しているので、context.fillText() で座標を描いてしまえばいい。
碁盤の線を引くために計算した情報を使えば、fillText用のxy座標を求めるのは難しくない。
ただし、
・Canvasを再描画する際、座標も再描画する必要がある。
という問題がある。
マウスポインタの位置に半透明碁石を表示しているとき、12fpsで碁盤を再描画している。
12fpsで座標を描いても大した負荷にはならないと思うが、無駄な処理は減らしたい。

結局、次の実装方式にした。
(3)DOMを使って座標文字用divを作成する
碁盤を描いたときに計算した情報を取得し、divのCSS座標を計算する。
同じフォントとフォントサイズでもブラウザによって表示が微妙に異なるため、divは表示位置ごとに作成した。19路盤だと19×2=38個。
石と重なっても座標が下に来るように、z-indexを 碁盤の背景色 < 碁盤の座標 < 碁盤のCanvas となるようにした。

できた碁盤は以下のとおり。(これはキャプチャ画像です)
座標つき碁盤
IE(FlashCanvas), firefox, Google Chromeでちゃんと表示されることを確認した。
プロフィール

himax64

Author: 南西
30代後半の無職です。
就活もせずダラダラ生きてます。
作ったもの

最新記事
人気記事
検索フォーム
カテゴリ
月別アーカイブ
最新コメント
最新トラックバック
RSSリンクの表示
QRコード
QRコード
カウンター