コードハイライト用

せっかく無職になったから、働いてる時に忙しくて出来なかった色々な事をやってみようと場当たり的に始めたブログ。 だったけど就職決まっちゃいました。

2012年12月7日金曜日

[Web][CreateJS] EaselJS のフィルターを使う


今度はフィルターをテストしました。

2点引っかかった個所。
  1. easeljs-0.5.0.min.js には、フィルター関連が入っていない
  2. AlphaMaskFilter が正常に動作しない?
1. は、そのままです。
easeljs-0.5.0.min.js の中には、フィルター関連は一切入っていません。
使用する為には別途読み込む必要があります。
(2012/12/07 現在)

jsdoit でコーディングしていたので、どうしたもんかと思いましたが
フィルター関連のjsをそのままファイルでアップロードして、URL をscriptタグで読み込んで解決できました。


2. は Githubの最新版では既に修正されていますが
EaselJS 0.5.0 パッケージのソースでは、AlphaMaskFilter がバグっています。

具体的には

AlphaMaskFilter.js
line:81
if (!mask) { return true; }

if (!this.mask) { return true; }

です。

Chrome で jsdoit デバッグしてやっと分かりました・・・。

以下は作ったもの。

サンプル

2012年12月3日月曜日

[Web][CreateJS] TweenJS を試す

最近 JavaScript していたと思ったら CoffeeScript を弄っていた。
いいですよ。Coffee。

さて、CoffeeScript で CreateJS を動かす事が多いのですが、最近 TweenJS を触りました。

大まかな僕の理解では、

  • 指定した時間で、あるパラメータを補間する(Rotate,Translate,Scale)
  • よく使われる補間方法はプリセットが用意されている
  • メソッドチェーンで、簡単に補間アニメーションを繋げられる
  • 途中ウェイトを入れる、コールバックを呼ぶ。といった事が簡単

という感じです。

とりあえず補間方法のプリセットを一通り jsdoit で動かしてみたサンプルは以下

サンプル

ちょっとメソッドチェーンの魅力が分かった気がします。

2012年10月6日土曜日

[Web] Heroku を使おう

最近JavaScript+HTML5してます

ローカルでも動作確認できるけど、人に見せたりするのに便利なので
Webでアクセスできるようにしたいなぁ・・・と思い、詳しい同僚に聞いたら面倒くさそうに教えてくれました

こちらのサービスを使います

Heroku
http://www.heroku.com/

Heroku -> へーろく -> へいろく -> 平禄?
って思ってたらそんな事はなかった。読み方は「ヘロク」だそうです
参考:https://groups.google.com/forum/?fromgroups=#!topic/heroku-ja/5VuJ9GVn2i4

変な外人テンションの和風のサイトですが、便利なのです
どういうものかと言うと、Webアプリ実行環境を手軽に用意してくれるクラウドサービスで、基本無料です
5MBのDBもついており、練習、テストには持って来いな感じです

より細かい説明はググると色んな偉い人が説明してくれていますので、
実際に使うまでの手順やらだけ書いていきます

なお、今回の目標は
Herokuサーバのとあるパスにhtmlファイルを置き、そこでJavaScriptを走らせる&公開する事です
phpアプリとして登録して、その実phpは使わずにhtmlを置くだけです

--------------------------------

2012年2月29日水曜日

[Android] MediaPlayer のエラーコード -19

MediaPlayer で再生/停止の連続コールテストしていたら変なエラーコード出た。

E/MediaPlayer(5346): error (-19, 0)

ググったらそれらしいのにはたどり着いたけど、直接的な原因が分からない。

ログを追っていたら、発生タイミングはほぼ同じで
リソース漏れしてる時こんな感じになるよなーとドキュメント読みなおしてたら

MediaPlayer削除するときに MediaPlayer.release() 呼んでなかった。

いと恥ずかしいです。

[Android] メモリの確保状況をデバッグする

GLSurfaceView を実装してテクスチャゴリゴリ書いてたら
一定の周期で画面がカクつきだした。

ググるとガベージコレクションが動作する際に処理が長時間ブロックされる、と。

ログをよく見ると確かにGCが頻繁にログをだしていたので、
こりゃいかんと eclipse でのメモリ確保状況を調べる事にチャレンジ。

以下備忘録兼ねて手順。


1.eclipseからデバッグしたいアプリを実行する


いつもの要領で。



2.DDMSパースペクティブを開く


レイアウトによりますが、とりあえずデフォルトだと右上のこいつ。



3.実行中デバイスのデバッグしたいスレッドを選択


Devices ビューに実行中のデバイス一覧が表示されています。
更にデバイスからスレッドの一覧が表示されているので、デバッグしたいスレッドを選択。
今回は「system_process」にします。



4.「Allocation Tracker」ビューの「Start Tracking」を選択


最初は何も表示されていないと思いますが、「Start Tracking」を押すと
メモリの監視が開始します。



5.「Allocation Tracker」ビューの「Get Allocations」を選択して結果を取得する


「Start Tracking」を押した以降のメモリの確保状況が出力されます。
確保されたクラス、サイズ、スレッドID、どのクラスのどのメソッドから、等かなり詳細に出ます。


更に良い事に、確保項目を選択すると、ビューの下半分に確保時のスタックトレースが表示されます。
今日はこれで大分助けられた。


今回の自分の場合は、テクスチャ描画時のコマンド引数用に
ローカル定義していた byte[] や float[] が大量にリストされており、そいつらの掃除のためにGCが頻繁に動いていました。

それらローカル変数をメンバ変数として、テクスチャ生成時から破棄時まで使いまわす形に修正したところ
目に見えてカクつきが抑えられました。ほんと良かった。

2012年2月27日月曜日

[Android][NDK] CからJavaに配列を渡して書き込んでもらう

ググってたら CallStaticByteMethod での戻り値をそのまま jbyteArray にキャストして使ってるのもあったけど
なんか怖いのでちゃんと配列の型でできないかとやってみた。

Java 側の FromC#loadFile(String filename, byte[] outBuffer) を呼び出しています。

また部分抜き出しなので不明な定義があります。(buffSize やら pBuffer やら)

// ファイル名オブジェクト生成
jstring js = charToJstring(env, pFileName);  // const char* -> jstring
// 受取り用バッファオブジェクト生成
jbyteArray ba = env->NewByteArray(buffSize);
jbyte* pArray = NULL;

if (js && ba)
{
 // クラスを取得
 jclass classObj = env->FindClass( "FromC" );
 jmethodID method = env->GetStaticMethodID(classObj, "loadFile", "(Ljava/lang/String;[B)Z");
 
 do {
  if (method == NULL) {
   LOGE( "method null" );
   break;
  }

  bool result = env->CallStaticBooleanMethod(classObj, method, js, ba);
  if (result == false) {
   LOGE( "failed loadFile" );
   break;
  }

  jboolean isCopy = JNI_FALSE;
  pArray = env->GetByteArrayElements(ba, &isCopy);
  if (isCopy == JNI_TRUE) {
   // TODO
  }

  jsize arraySize = env->GetArrayLength( ba );
  if (pArray && arraySize <= buffSize) {
   
   // 受取り用バッファにコピー
   memcpy( pBuffer, pArray, arraySize );
   
  } else {
   LOGE( "failed copy pArray:0x%08x arraySize:%d", pArray, arraySize );
  }
 } while(0);
 
 env->DeleteLocalRef( classObj );
}

env->DeleteLocalRef( js );
env->ReleaseByteArrayElements(ba, pArray, JNI_ABORT);

LOGD( "file dump %x %x %x %x %x %x %x %x %x %x", 
  pBuffer[0], pBuffer[1], pBuffer[2], pBuffer[3], pBuffer[4], pBuffer[5], pBuffer[6], pBuffer[7], pBuffer[8], pBuffer[9] );

2012年2月15日水曜日

[Android] 通知でバイブレーションさせる

デフォルトで通知出せばバイブレーションするもんだと思ったけど
そのままではダメだったのでメモ。
ソースから直接メソッド切り抜いただけですが。

/** 通知を出す */
private void setNotification( CharSequence notifyMsg, CharSequence contextMsg, Intent intent) {

 Notification notification = new Notification(R.drawable.test, notifyMsg, System.currentTimeMillis());

 PendingIntent pIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
 notification.setLatestEventInfo(
   getApplicationContext(),
   getText(R.string.app_name),
   contextMsg,
   pIntent);

 //
 // バイブ設定
 // long の配列の場合、単位はミリ秒で {無振動, 振動, 無振動, 振動 ... } と指定する。
 // システムのデフォルトの振動方式を使用する場合は、デフォルト値を使用する旨をフラグで指定。
 // 
 //notification.vibrate = new long[] {0, 500, 0, 1000, 0};
 notification.defaults |= Notification.DEFAULT_VIBRATE;

 NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
 nm.notify(1111, notification);
}

2012年2月4日土曜日

ローカルにRedmine(1.3.0)を入れたメモ


色んなメモやらタスク管理にRedmineを使っていこうと思い立つも
会社のRedmineを使っていただけなので全く運用の知識がなかった。

調べてみると結構ローカルでRedmineを動かしてる方がいらっしゃったので
ならってやってみることにしました。

やった事を順番に書いてるだけなのであまりまとまってない気がします。

--------------------------------

[Android] SDK4.0でDesireのUSBドライバがインストール出来なかった

1年ぶりくらいに書く記事として適切か微妙な気がしましたが、
最近会社にAndroid環境を作るときに引っかかった事をメモ。

--------------------------------

以前のSDKではそんなことはなかった気がするけど
SDK4.0に同梱されるUSBドライバには、HTC-Desire用のドライバ記述が足りていないようです。

\android-sdk\extras\google\usb_driver\
android_winusb.inf

上記設定ファイル内の

  • [Google.NTx86]セクション
  • [Google.NTamd64]セクション

それぞれに次の内容を追加します。
; HTC Desire
%SingleAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C87
%CompositeAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C87&MI_01
こちらのページを参考にさせて頂きました。
http://3oclock.com/hello-world/2010/04/htc-desire-usb-driver.html