2013年11月30日土曜日

[Playstation] DUALSHOCK3の電源が入らなくなったら

How to recover the unresponsive DUALSHOCK3
先日のことですが、数時間前まで使っていたDUALSHOCK3の電源が入らなくなってしまいました。
PSボタンを長押ししようがUSBケーブルでPS3本体と接続しようがLEDランプが光りません。
買って3ヶ月しか経ってなかったのでとてもショックでした。

ですが故障ではなかったのか、意外と簡単に直ったのでそのときの手順をまとめてみました。

1.
本体裏側のリセットボタンを針のような細長いもので押します。
隣のねじ穴と間違えないように注意。
この時点では何反応もありません。

2.
DUALSHOCK3とPS3本体をUSBケーブルで接続します。
これでDUALSHOCK3のLEDランプが光れば故障ではありません。

3.
DUALSHOCK3のPSボタンを押します。
これで復活しました。

なぜリセットが必要になったのか?
DUALSHOCK3はバッテリーとモーターを内蔵し、USBインターフェイスとBluetoothによる双方向通信機能を備えています。
さらに外観からは分かりませんがこれらのハードウェアを制御するためのソフトウェアも内蔵しているはずです。
バッテリーの過充電を防止したりボタン入力状態をPS3本体に送信したり、PS3から受信したタイミングでモーターを回したり止めたりなど
今回の件はソフトウェアがハングアップしてしまったためうんともすんとも言わなくなってしまったのだと思います。

電源が入らなくなったり、正常動作しないDUALSHOCK3があったら一度リセットボタンを押してみることをおすすめします。

以上、参考になれば幸いです。

2013年11月23日土曜日

[JavaScript] テキストボックスやボタンの幅を変えるアニメーション

JavaScript for widgets Animations
JavaScriptでテキストボックスを伸縮させるのWebコンテンツを作ってみました。

次の環境で動作確認しました。
・32bit版Windows7のInternet Explorer10
・64bit版Windows8のInternet Explorer10
・Windows8のFirefox25

これはテキストボックスは通常の大きさです。
このテキストボックスにカーソルをフォーカスすると幅がグイーンと伸びます。
カーソルを移動してフォーカスを失うとアニメーションしながら元の幅に戻ります。

以下ソースです。

stretchElement関数が今回のスクリプトです。
第1引数 : 要素のID名
第2引数 : アニメーション開始時の横幅(px単位)
第3引数 : アニメーション終了時の横幅(px単位)
第4引数 : 10ミリ秒あたりの変化量(px単位)。大きければ速く、小さければ遅くアニメーションします。

使い方はこのようになります。
<input
  type="text"
  id="txt1"
  onfocus="stretchElement('txt1', 200, 400, 8);"
  onblur ="stretchElement('txt1', 400, 200, -8);"
  style="width: 200px;" />

onfocus="stretchElement('txt1', 200, 400, 8);"
が「フォーカスされたら200pxから400pxに伸びる、10ミリ秒あたり8pxの幅で」という意味になります。

onblur ="stretchElement('txt1', 400, 200, -8);"
は「フォーカスを失ったら400pxから200pxに縮む、10ミリ秒あたり8pxの幅で」という意味です。

テキストボックス以外にも適用できます。
たとえば
<input type="button"
  id="btn1"
  onmouseover="stretchElement('btn1', 200, 600, 24);"
  onmouseout ="stretchElement('btn1', 600, 200, -24);"
  style="width: 200px;" value="伸縮するボタン" />
と書けば、マウスポインターを重ねるたびに伸びたり縮んだりするボタンができます。


改善の余地はありますが、ホームページのソースをHTML5に置き換える作業をしていて何となく思いついたので書いてみました。

以上、参考になれば幸いです。

2013年11月16日土曜日

[Android] ストップウォッチアプリの表示をC言語でスムーズに改造する

The simple stopwatch application for Android
前回のストップウォッチアプリ は、経過時間の表示がカクカクになることがあります。

経過時間の文字列を表示するため Handler#handleMessage メソッドの中で
ByteArrayOutputStram

PrintStream
のインスタンスが1秒間に数十回メモリーのヒープと呼ばれる領域に確保されます。表示後はインスタンスが不要になります。
Javaの仕様により不要になったインスタンスがある程度たまるとヒープから解放する処理が行われます。
(解放されたメモリーは別のインスタンスの確保などに再利用されます)
この処理はGC(ガーベジコレクター、ガーベジコレクション)というものですが、GCの処理は意外と時間がかかるようです。
Android OSのバージョンにもよりますが、GCが完了するまでそれ以外の処理は一時停止されます。

前回のアプリは数秒ごとにGCが発生するため表示がカクカクする原因になっていました。
そこで表示をスムーズにする方法を考えてみました。

C言語ではメモリーの解放処理をプログラムする必要がありますが、GCの対象にはならないので表示をスムーズにできると予想できます。
その結果、経過時間の文字列はJavaではなくAndroid-NDKによるC言語で処理することにしました。

このブログを書いている時点の開発環境は次の通りです。
・Windows8 (64bit)
・Eclipse Juno (32bit)(XP互換モードで起動)
・Android SDK r22.2
・Android NDK r9

以下ソースです。
MainActivity.java (アクティビティ)

※初期化漏れがあったので修正しました。2014年6月16日

jni.cpp


Android.mk


※特別な権限(Permission)は不要なのでマニフェストは省略します。
Target SDK Version が4以上の設定でビルドできます。
Android1.6以降で動作します。
Android-NDKのビルド方法は環境に強く依存するので省略させて頂きます。
SH-03C(実機)とBluestacks(エミュレーター)で動作することを確認しています。

動作保証はできませんが最低限の動作はするようです。
前回に比べてレイアウトを少し変更してます。
アプリ動作中のスクリーン消灯もオフにしています。

GCの頻度を減らしただけですがJavaだけで作ったアプリに比べてかなりスムーズになりました。
今回のC言語のプログラムはスタック変数しか使ってないので解放処理が不要でした。

Javaはメモリーの解放処理が(完全ではないものの)GCにより自動化されているため、プログラムしやすい言語です。
その反面、GCを完全になくすことはできません。
AndroidアプリでGCを減らしたい場合、GCが多発する処理をAndroid-NDKによるC言語でプログラムするのもいい方法だと思います。

関連ブログ
[Android] ストップウォッチアプリを作ってみました
[Android] Javaのstaticクラス(Handler)から非sataticクラス(Activity)のメソッドを呼び出すには(弱参照)
[Android] PrintStream#printfの最適化(SDK r08でのエラーを別の方法で解決する)
[Android] ライブ壁紙の作り方
[Android] 方位センサーを使ってコンパスアプリを作る
[Android] OpenGLでプロ生ちゃんをアニメーションさせる
[Windows8][Android] Can't bind to local 8600 for debugger

以上、参考になれば幸いです。

2013年11月9日土曜日

[Android] ストップウォッチアプリを作ってみました

The simple stopwatch application for Android
ストップウォッチのAndroidアプリを作ってみました。

このブログを書いている時点の開発環境は次の通りです。
・Windows8 (64bit)
・Eclipse Juno (32bit)(XP互換モードで起動)
・Android SDK r22.2

アクティビティ(MainActivity.java)

※特別な権限(Permission)は不要なのでマニフェストは省略します。
Android1.6以降で動作します。
Target SDK Version が4以上の設定でビルドできます。
SH-03C(実機)とBluestacks(エミュレーター)で動作することを確認しています。

動作保証はできませんが最低限の動作はするようです。
なぜかBlueStacksでは1000分の1秒の位が常にゼロで表示されます。

Playストアにはスタイリッシュなストップウォッチのアプリが沢山ありますが自分で作ってみるのも楽しいです。

関連ブログ
[Android] Javaのstaticクラス(Handler)から非sataticクラス(Activity)のメソッドを呼び出すには(弱参照)
[Android] PrintStream#printfの最適化(SDK r08でのエラーを別の方法で解決する)
[Android] ライブ壁紙の作り方
[Android] 方位センサーを使ってコンパスアプリを作る
[Android] OpenGLでプロ生ちゃんをアニメーションさせる
[Windows8][Android] Can't bind to local 8600 for debugger

以上、参考になれば幸いです。

2013年11月2日土曜日

[Android] Toastのフォントを変えるには

How to change font styles on Toast
Toastは画面に文字をオーバーレイ表示するのによく使われます。
過去のブログ [Android] Toastに画像やボタンを表示するには では文字以外に画像やボタンを表示する方法を書かせて頂きました。

この機能を応用してTextViewを表示すれば、Toastに表示する文字の大きさや色を変えることができます
今回はToastに赤い大きな文字を表示するサンプルを作ってみました。

このブログを書いている時点の環境は次の通りです。
・Windows8 (64bit)
・Eclipse Indigo SR2 (32bit)
・Android-SDK-r22.0.4

以下ソースです。

アクティビティ(MainActivity.java)

※特別な権限(Permission)は不要なのでマニフェストは省略します。
Target SDK Version が4以上の設定でビルドできます。
Android1.6以降で動作します。

Android-SDK付属のエミュレーターで実行するとこうなります。
解像度やフォントの種類によって見え方が異なることがありますのでご了承ください。

関連ブログ
[Android] Toastに画像やボタンを表示するには
[Android] SurfaceviewにToastを表示するには
[Android] Toastをcancelするには
[Android] OpenGLでプロ生ちゃんをアニメーションさせる
[Android] 端末の傾きに立方体を連動させる
[Android] 方位センサーを使ってコンパスアプリを作る
[Android] Javaのstaticクラスから非sataticメソッドを呼び出すには
[Android][Windows8] Can't bind to local 8600 for debugger
[Android] Android-SDKでやってはいけないこと
[Android] ライブ壁紙の作り方
[Android] Activityに時計を表示する(Activityの非同期更新)

以上、参考になれば幸いです。
n