2014年10月31日金曜日

SwitchCompat の inflate でエラー: android.view.InflateException: Binary XML file line #147: Error inflating class SwitchCompat

レイアウト用 xml での宣言を SwitchCompat ではなく android.support.v7.widget.SwitchCompat とフルパスで指定したら解消しました。

Android : NumberPicker の Divider の色を変える


こんな感じに、緑色にしてみました。
java.lang.reflect を使って NumberPicker の mSelectionDivider に独自の drawable を設定することで実現します。

Class<?> numberPickerClass = null;
try{
    numberPickerClass = Class.forName("android.widget.NumberPicker");
} catch (ClassNotFoundException e) {
    Log.e(LOGTAG, e.toString());
}

if(numberPickerClass != null){
    java.lang.reflect.Field selectionDivider;
    try {
        selectionDivider = numberPickerClass.getDeclaredField("mSelectionDivider");
        selectionDivider.setAccessible(true);
        Drawable drawable = getResources().getDrawable(R.drawable.numberpicker_selection_divider);
        selectionDivider.set(number_picker, drawable);
    } catch (NoSuchFieldException e) {
        Log.e(LOGTAG, e.toString());
    } catch (IllegalAccessException e) {
        Log.e(LOGTAG, e.toString());
    }
}

drawable には元の drawable のように右のような 9.patch を使っています →

広告 : 良いAndroidアプリを作る139の鉄則

2014年10月30日木曜日

AndroidStudio : Could not find property 'Compile' on project ... の解決方法

tasks.withType(Compile) {
    options.encoding = 'UTF-8'
}


build.gradle の上記の記述の
Compile を JavaCompile に変更したら治りました。

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}


Android Studio をアップデートして Gradle のバージョンも上がったのですが、
Gradle 2.0 から Compile オプションは廃止されたようです。

2014年10月27日月曜日

__attribute__((naked)) の意味:prologue コードと epilogue コードを生成しない

__attribute__((naked)) void Wait10Cycles(void){
   asm (
    /* bl to here: [4] */
   "nop   \n\t" /* [1] */
   "nop   \n\t" /* [1] */
   "nop   \n\t" /* [1] */
   "bx lr \n\t" /* [3] */
  );
}

ある場所で見かけた「何もせず待つ」という関数の中身を調べたところ↑のようになっていたので _attribute__((naked)) の意味について調べたことをメモしておきます。

参考 : Declaring Attributes of Functions
This attribute is available on the ARM, AVR, MCORE, MSP430, NDS32, RL78, RX and SPU ports. It allows the compiler to construct the requisite function declaration, while allowing the body of the function to be assembly code. The specified function will not have prologue/epilogue sequences generated by the compiler. Only Basic asm statements can safely be included in naked functions (see Basic Asm). While using Extended asm or a mixture of Basic asm and “C” code may appear to work, they cannot be depended upon to work reliably and are not supported. 
まとめると
  • コンパイラに関数定義を作成させつつ、関数の中身は assembly コードで書ける
  • prologue コードと epilogue コードが生成されない
  • 関数内で安全に使用できるのは Basic asm のみ。拡張アセンブラ構文(Extended asm)や Cコードも動くように見えるかもしれないがサポートされていない。
今回の場合は、コンパイラが余計なコードを生成して意図したサイクル数からずれることがないよう naked をつけていたということですね。

Prologue コード(プロローグコード)とは

関数の先頭で、関数内で使用するスタックやレジスタの準備を行うコードのこと

Epilogue コード(エピローグコード)とは

関数の終わりで、スタックやレジスタを関数が呼ばれる前の状態に戻すコードのこと

Function prologue(英語版 Wikipedia へのリンク)

2014年10月26日日曜日

AQM0802A を FRDM-KL25Z + CodeWarrior 環境で使用する

秋月で I2C接続小型LCDモジュールピッチ変換キット (AQM0802A-RN-GBW ピッチ変換基板付き)を購入して、FRDM-KL25Z と接続して表示してみました。



紆余曲折ありつつ、最終的にはなんとか表示できたので、ハマったところのメモを残しておきます。
  • CodeWarrior (Processor Expert) の設定で入力する I2C スレーブアドレスは 0x7C ではなく 0x3E
    • 0x3E は 0x7C >> 1。アドレス部と Read/Write 部を独立して扱っているので、シフトしておく必要があります。
  • 初期設定例だと表示されない
    • コントラストの設定(初期化手順 4 番目)を例の 0x70 から 0x7f に変更すると見えるようになりました。
    • 供給している電源電圧の問題かもしれません。電源入力には FRDM-KL25Z の 5V 出力端子からの電圧を TA48033S で 3.3V にして使用しました。
  • 初期化コマンド間で Wait する
    • 長い時間が指定されている Wait の時間は 26.3uS ということで、特に気にしないで連続でコマンドを発行しても発行にかかる時間で Wait 時間がまかなえるかと思ったのですが、たまに通信に失敗することがありました。他の原因かもしれませんが、とりあえずコマンドの間に長めの Wait(1ms) を入れることで安定しました。

また、Control Byte の Co が若干わかりにくかったのですが、表示したい文字列を送る場合は 0 にして、それ以外の場合はコマンド1つ毎に STOP コンディションを発生させれ Co は 0 でも 1 でも良い、という扱いで良さそうです。コマンド間で Wait も必要なようですし。
仕様書には「データを複数送る場合 Co = 1 で、」とありますが、これは間違いですね。少なくとも Co = 0 にして文字列を送ることはできました。


以下にコードをベタ貼りしておきます。
(※ I2CMasterHelper_***、BusyWait は別の場所で定義した関数なので、このままでは使えませんが、参考程度に。)

#include "AQM0802A.h"
#include "I2CMasterHelper.h"
#include "PE_Types.h"
#include "PE_Error.h"
#include <stdio.h>
#include <string.h>

// co = 0 : Last Control byte to be sent. Only a stream of data bytes is allowed to follow.
// co = 1 : Another Control byte will follow the data byte (unless a STOP condition is received)
// rs = 0 : Send Command
// rs = 1 : Send Data
static byte ControlByte(bool co, bool rs){
 return (co << 7) | (rs << 6);
}

static void SendCommand(byte cmd){
 byte data[2];
 data[0] = ControlByte(FALSE, FALSE);
 data[1] = cmd;
 I2CMasterHelper_SendBlock(data, 2, LDD_I2C_SEND_STOP);
 I2CMasterHelper_WaitSendComplete();
 BusyWaitMS(1);
}

void AQM0802A_Init(){
 // 0x0011_1000 : DL = 1 : 8bit-bus mode, N = 1 : 2-line display mode, DH = 0 : font size is 5 x 8, IS = 0 : normal instruction 
 SendCommand(0x38);
 // IS = 1
 SendCommand(0x39);
 // Internal OSC frequency : 1/4 bias
 SendCommand(0x14);
 // Contrast Set : 000
 SendCommand(0x7f);
 // Power/ICON/Contrast control : ICON display off, Booster circuit on, contrast 10
 SendCommand(0x56);
 // Follower control : follower circuit on, follower amplified ratio = 100
 SendCommand(0x6C);
 
 // wait 200ms for power stable
 BusyWaitMS(200);
 
 SendCommand(0x38);
 // Display on, cursor off, cursor blink off
 SendCommand(0x0C);
 // Clear display
 SendCommand(0x01);
 
 // TODO: wait 1.08ms
 BusyWaitMS(2);
}

// first line address is  0x00 ~ 0x07
// second line address is 0x40 ~ 0x47 
void AQM0802A_DisplayChr(byte addr, char ch){
 // Test for now;
 byte data[4];
 
 // Set Address
 data[0] = ControlByte(TRUE, FALSE);
 data[1] = 0x80 | addr; // the first bit is always 1.
 // Set Character
 data[2] = ControlByte(FALSE, TRUE);
 data[3] = ch;
 I2CMasterHelper_SendBlock(data, 4, LDD_I2C_SEND_STOP);
 I2CMasterHelper_WaitSendComplete();
}

void AQM0802A_DisplayStr(bool secondline, char* str){
 byte data[11];
 
 byte length = strlen(str);
 if(length > 8){
  length = 8;
 }
 
 // Set Address
 data[0] = ControlByte(TRUE, FALSE);
 data[1] = 0x80 | ((secondline == TRUE)?0x40:0x00); // the first bit is always 1.
 // Set data
 data[2] = ControlByte(FALSE, TRUE);
 memcpy(data + 3, str, length);
 I2CMasterHelper_SendBlock(data, length + 3, LDD_I2C_SEND_STOP);
 I2CMasterHelper_WaitSendComplete();
}

void AQM0802A_ClearDisplay(){
 SendCommand(0x01);
}

2014年10月25日土曜日

ゲームで英語:スーパーダンガンロンパ2(Danganronpa 2 Goodbye Despair)



前作の英語版(Trigger Happy Havoc)につづいて、
2 も英語版 Danganronpa 2 Goodbye Despair(北米版) を買ってプレイしました。
前作についての記事はこちら:ゲームで英語:ダンガンロンパ



英語勉強のネタとしての使い勝手は、前作と変わりはありませんがやはり良いです。詳しくは前作についての記事をどうぞ。
  • 会話形式のわかりやすい文章
    • 田中眼蛇夢は除く
  • フルボイスの学級裁判
    • テキストと同じ内容なので完全に聞き取れなくても安心
  • バックログ機能
    • 少し読み飛ばしてしまっても大丈夫
  • スクリーンショット
    • PS Vita の本体機能ですが、全くもって素晴らしいです。3DS にもこれがあれば、逆転裁判英語版が捗るのですが…。

もちろんクリア後はアイランドモードや IF小説もあるのでボリュームも十分。

日本語でやる場合とくらべて、本編のミニゲーム、特にアナグラムが少し難しくなりますが、思いつかないような単語が出てくることはないので、英語版をプレイしようという気が起きる人であれば、詰まって進めなくなるということはない…はずです。少し問苦戦しましたが…。

各キャラクターのボイスも、1 と同じく良い感じ。
イメージと違い違和感を感じ続けるようなキャラクターはいなかったです。

特に罪木蜜柑の声の人が雰囲気あっていて上手いなーと思ったのですが、ステファニー・シェーさんというベテランの方みたいですね。ウサミの中の人(レベッカ・フォースダットさん)もすごいキャリアの持ち主っぽいです。北米の人も、日本の人が日本版の声を楽しんでいるのと同じくらい、英語版の声を楽しめるようなキャストになっているとしたらファンとして嬉しいものです。

まだ本編と IF小説だけしか見ていないので、これから各キャラクターの自由時間会話やスクールモードを楽しもうかと思います。

なんだか英語版のキャストの Wikipedia を見ていたら、他のゲーム・アニメの英語版をやる欲も湧いてきました。

『Big Little Lies』 感想



久々に洋書の小説を読みました。Big Little Lies。サンプルを Kindle に送ろうとしたら間違って購入をしてしまったのですが、せっかくなのでと読み進めて、そのまま読了。最近の洋書小説の安さを考えると少し高い買い物だった気がしますが、とりあえず楽しめたので何よりでした。

3人の、子供を持つ女性を主人公に、家庭内暴力、離婚と再婚、子育て、シングルマザーなどの話題に触れながら、Trivia Night というイベントで起こる事件に向けて物語が進みます。

構成が面白かったですね。章の間などに挟まる登場人物の会話から、Trivia Night というイベントで何らかの悲劇が起こることが初めの方でわかるのですが具体的に何が起こったかはそこではわかりません。そして物語の章立てが 「Trivia Night の何ヶ月前」 という形で進んでいくので、どんな悲劇が起こるんだろう?と想像しながらカウントダウンを進めるような感覚でした。

実際に起こった事件は、悲劇ではあるものの、良くも悪くも妥当な感じで刺激は少なかったのですが、そこに至るまでの、人間関係や心理描写を楽しました。

英語的にも、よくわからない言い回しは少なく読みやすかったです。

同じ作者の本をまた読みたいかと尋ねられれば、「面白かったけど、作者買いするほどではないかな」、というライン。ひとまず次の作家を探そうと思いますが、機会があれば買うかもしれませんね。

2014年10月6日月曜日

FRDM-KL25Z : 標準入出力 printf, scanf, gets を使う (CodeWarrior + Processor Expert)

接続に OpenSDA を使用しています。PC側からの入出力は TeraTerm。

プログラム側(CodeWarrior)

  1. Components Library で ConsoleIO を追加する
  2. ConsoleIO の Component Inspector で Rx new line sequence と Tx new line sequence を両方 Rx にする
  3. ConsoleIO の子の Serial_LDD の Component Inspector で設定を以下のようにする
DeviceUART0
Baud rate38400
RxDTSI0_CH2/PTA1/UART0_RX/TPM2_CH0
TxDTSI0_CH3/PTA2/UART0_TX/TPM2_CH1

後は、コード側で stdio.h をインクルードして printf などを使います。

TeraTerm 側

  1. 設定 → 端末で改行コードを受信:CR+LF、送信:CRに 変更。ローカルエコーにチェックをつける
  2. 設定 → シリアルポートで ボー・レートを 38400 にする


注意事項

printf は reentrant(再入可能)ではないようなので、printf 中に割り込みが入って割り込み先で printf を行う、などするとクラッシュするみたいです。メインループと Events.c 内の関数で printf を使用していると意味不明な出力が続いた後クラッシュしました。

2014年10月4日土曜日

『絶対絶望少女』 感想とレビュー



とりあえず本編をクリアしておまけ小説を読み終わったので感想やら思ったことを。
まだ攻略サイトとかは見てないので、見逃している設定などはあるかもしれませんが、ネタバレ注意!


全体として


こんなところかな、というのが正直なところです。ダンガンロンパ本編は 1 も 2 も神ゲーだと崇めていますが、これはスピンオフでアクションゲームということで、2 を買った時のように神ゲーの続編という期待はしていませんでした。そしてその期待度は概ね正しく、面白かったけど特筆するほどではないという感想です。

後半になるにつれてストーリーは面白くなってきて、最後の「壊す・壊さない」の選択肢ラッシュの演出とかはすごく良かったです。狛枝もファンサービス的な登場かと思ってましたが、旧作からキャラが破綻することなく上手く使われていました。こまるも可愛かったし、腐川もキャラが立ってたし、メインのキャラやストーリーは文句ありません。

一方で、胸糞悪くなるような絶望の世界、快適とは言いがたいゲームシステム(敵の攻撃の当たり判定がわかりにくい…)、物語との関係性がなく浮いた Monoc-man など、マイナス要素が大きかったのがちょっと辛かったです。
(ストーリー的な必然性のない謎解きってあまり好きじゃないです。ダンガンロンパ本編や逆転裁判のような、謎を解くこととストーリーの進行の結びつきが強いゲームは大好きなんですが。)

ダンガンロンパ本編は、閉塞環境、コロシアイ、オシオキ、自由時間を誰と過ごしてもストーリーが変わらないやるせなさといったマイナス要素を吹っ飛ばすだけの、ストーリーの引き込みやクスっと笑えるセリフ(「苗木クン、立ってますね…フラグが!」とか)があって、マイナス要素がプラス要素を引き立てるような感じだったんですが、今回のプラス要素はマイナス要素の増え方と比べるとちょっと物足りませんでした。

100点満点では75点、Amazon 的には星 3.5 くらいが自分の評価ですかね。


旧キャラ関係者の殺し方…


朝比奈弟も、不二咲父も、殺すにしてももう少し上手く使って欲しかったです。
「希望の先にある絶望」というのを印象付けようとしていたのだと思いますが…出会ってから死ぬまでの展開があまりに予想通り過ぎて、彼らの死によって得られたインパクトや緊張感よりも、旧キャラ好きだったので、できることなら救いがあって欲しかったなぁ、という残念感が強かったです。


希望の戦士


設定が重い、重いよー。
キャラクター的な魅力があるかないかはともかく、重すぎる過去は人気的には厳しいのではないかと。もっとめちゃくちゃにぶっ飛んだ性格になっていたら一周回って良かったのかもしれませんが、微妙にまともな面もあったり、結局生き残っているみたいだったりと、中途半端な感じは否めないです。


当たった予想


2代目江ノ島盾子候補はこまる

これは、多分そう予想していた人が多かったのでは。
「自分の力で頑張って進んできたと思った?残念、思惑通りでした!」という、メタルギアソリッド2的な展開。後半、モナカが「あなた達の子供が…」と言って苗木両親の死を仄めかしたり、こまるが会長の首を扱う辺りから、本気で2代目として覚醒するかと心配しましたが、そこまでは行かず、無事ハッピーエンドでめでたしめでたし。

モナカと他の希望の戦士の目的は別

これも多分予想していた人は多いでしょう。黒幕というのはそういうもの。


当たらなかった予想


十神クンは捕まったと見せかけて何か重要なことをしているはず

本当に捕まってただけだったよ!
(まだ何かを見落としていることを期待していますが果たして…)

霧切さんがどこかで(無線越しに)助けてくれる

朝比奈さんと合わせて音沙汰なし…。葉隠はおまけ小説に登場したのに…。設定上優秀なキャラクターは扱いが難しいということでしょうか。あまり活躍させてしまうと主人公ズが霞んでしまいますし。

シロクマは怪しいと見せかけて最後まで善良なキャラ(モノミ系)

もう一段階裏をとられて、怪しいと見せかけて善良なキャラと見せかけてやっぱり悪役、でしたね。「基地の人間は全員身内を殺されている」辺りから怪しい気がしていましたが…。ラスボスとは。


おまけ小説


2 の if と違い、これは正史扱いなんでしょうね。レオン…。とことん、普通の環境にいたら普通(?)のやつだったんだろうなぁ、という感じ。とりあえず面白かったです。



それでは、攻略サイトでも覗きに行きますかね。
いつまでも本編 3に期待。