2014年6月29日日曜日

Android Studio Beta のインストール(Preview からのアップデート)


インストール前に知っておいたほうが良さそうなこと。
  • Android Studio Preview からはアップデートできない
  • Android Studio Beta を最初に起動した時に設定インポートのダイアログが表示される。設定の取得先は Android Studio のインストールディレクトリ
    • Preview を先にアンインストールしていると設定を取得するためのディレクトリがなくなる?
  • SDK は Android Studio のインストールディレクトリ以下に配置されているので、Preview でダウンロードした SDK を使いたければ Preview の sdk ディレクトリ以下の SDK を Beta の sdk ディレクトリにコピーする。SDK Manager からダウンロードし直してもよい(単にダウンロード分の時間が少しかかるだけ)。

以下は、自分が行った手順です。
  1. Beta の exe を Android Studio のページからダウンロード
  2. インストールを実行。Preview版が
    C:\Program Files (x86)\Android\android-studio
    というディレクトリにインストールされていて、上書きするのもアンインストールするのも不安があったのでインストール先を
    C:\Program Files (x86)\Android\android-studio-beta
    に設定。
  3. インストール後、初回起動時に設定をインポートするダイアログが出たので
    C:\Program Files (x86)\Android\android-studio
    を指定
  4. Preview の方でダウンロードした SDK の一部を Beta の方にコピー。build-tools, extra, platforms, system-images の中から新しそうなものを適当にピックアップ。SDK Manager でダウンロードしても良い。(ダウンロード分の時間が少しかかるだけ)
  5. 環境変数に通していた Android Studio 系のツールのパスを Beta の方に切り替える
  6. bin ディレクトリ以下にある studio64.exe.vmoptions をこのように編集してメモリ割り当てを増やす
その後、今まで Preview で作業していたプロジェクトを開いてみましたが、build.gradle の buildToolsVersion を 20.0.0 に変更し、その後出たエラーメッセージの Fix...(自動修復的なものだったような) を選択したら問題なくビルド、実行できるようになりました。
(ただ、Live Templates などの設定は引き継げていないような…?)
Live Template の保存場所はそれぞれ
$ホームディレクトリ$/.AndroidStudioBeta/config/templates
$ホームディレクトリ$/.AndroidStudioPreview/config/templates
でしたので、これをコピー・移動すれば良いようでした。 (ホームディレクトリは、Windows で言えば C:\Users\ユーザ名\ のディレクトリです。)

Android : RatingBar のカスタマイズ 画像の設定とスペースの調整

星画像の設定

android:progressDrawable を設定する。
設定する drawable は layer_list で background が空の星、secondaryProgress が半分の星、progress が完全な星。

style.xml に追加
<style name="RatingBar" parent="android:Widget.RatingBar">
    <item name="android:progressDrawable">@drawable/rate_star</item>
    <item name="android:minHeight">36dp</item>
    <item name="android:maxHeight">36dp</item>
</style>

drawable/rating_star.xml
<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background"
        android:drawable="@drawable/rate_star_off" />
    <item android:id="@android:id/secondaryProgress"
        android:drawable="@drawable/rate_star_half" />
    <item android:id="@android:id/progress"
        android:drawable="@drawable/rate_star_on" />
</layer-list>

星画像の間のスペースの設定

参考 : Spacing between the stars of a rating bar?

残念なことに、星の間のスペースを調整する設定はない。
画像自体を編集し、左右の余白を作る必要がある。

2014年6月28日土曜日

『名探偵に薔薇を』 感想 : 古さを感じさせない傑作探偵物



絶園のテンペスト』と『スパイラル ~推理の絆~』の原作者である城平京さんの小説です。
両漫画が好きだったので『名探偵に薔薇を』がKindle版で販売されているのを見て買って読んでみました。

結構昔の作品(1998年発表)だったのですが、古臭さは全く感じず、読みやすくて面白かったです。
完全犯罪を可能にする架空の毒「小人地獄」がミステリーの軸だったのが、古さを感じさせないという点で良かったのかもしれません。

登場人物が少なく、舞台がコンパクトにまとまっているのも良いですね。余計な方向に話が逸れることがなく、グッと締まっている感じがします。

「Howdunit」(どうやったか)、「Whydunit」(どうしてやったか)もののミステリーとして面白い事に加えて、その事件を軸に描いた名探偵としての在り方、その悲劇もまた読み応えのある物語でした。

ミステリーの類が好きな人ならきっと楽しめるでしょう。
今までそれなりの量の小説を読んできましたが、その中でもかなりのお気に入りとなりました。

また、こんな作品と出会えますように。

2014年6月26日木曜日

Redbooth の使い方(登録方法)

複数人で同人誌制作するときに使ってるツール(全部無料) で紹介されていたプロジェクト管理ソフト Redbooth が気になったので、登録して試してみました。

基本的に個人用途目的だったのでオーバースペックな気もしたのですが、
登録してちょっと触ってみた感触はなかなか良かったです。

プロジェクトそのものについて情報など、タスク化されないような情報を書き込んでおける「メモ」という領域があるのも良いですね。

Android用アプリの方もちゃんと作られていそうな雰囲気がありました。

しばらく使ってみて様子を見ようと思います。

以下、登録方法や使い方についてのメモです。

登録方法

  1. Redbooth のトップページ に email アドレスを入力して GET STARTED ボタンを押すと、パスワードの設定に進みます。
  2. 次に Company Name を求められるのですが、ひとまず個人で使おうと思っているので適当な名前で登録しました。登録後に設定画面から変えられます。従業員数は最小の1~9に。
  3. 次にチームメイトの招待を促されますが、これも、下の方の Do it later テキストをクリックして飛ばします。
  4. 最後に、First name, Last name, Username を入力して START。電話番号は必須ではないので入力しませんでした。氏名もユーザ名も後で設定画面から変えられます。
これで登録完了です。確認のメールが来るのでクリックしておきましょう。

設定(日本語化)

ログインすると、左下に入力した氏名が表示されていますが、そこの△マークから設定画面が出せます。ここから言語を選択でき、日本語もあったので日本語化しました。氏名やユーザ名、組織名の変更などもここの△マークから呼出です。

プロジェクトとタスク

最初から Personal Project という個人用のプロジェクトが作成されていて、いくつかのタスクが登録されています(内容は英語です)。タスクに書いてある内容に従って操作していく事で、使い方を覚えられるようになっていました。各タスクのボリュームは小さく、操作自体もわかりやすいものだったので英語に自信がなくとも大丈夫な気がします。
(※タスクの一つに、右上の▼ボタンを押してタスク名の変更をして下さい、とありましたが、タスク名自体をクリックすれば編集可能でした)

TODO リスト + αくらいの目的で使うのであれば、
タスクを開いて、名前が表示されている部分をクリックすると状態の変更が可能(解決済み、保留中など)
という事さえ覚えておけば、その他のタスク・サブタスクの追加やコメントの記入などはみたまんまなので、なんとなかなると思います。

解決にするには、タスク名の左横のチェックボックスをチェックするようになりました。
わかりやすくはなりましたが、今まで出来ていた「却下」や「保留」といったステータスにする方法がわからなくなってしまいました。。。

あと、タスク名のところに #タグ名 でタグが付けられます(Using Tags And Priorities)。
これは使い方によっては便利そうです。

詳しい使い方は知りたい場合はこちら(残念ながら英語) : Redbooth Help Center

Android : DatePicker で カレンダー(CalendarView) を非表示にする



xml で設定する場合
android:calendarViewShown="false"

コード上から設定する場合
datePicker.setCalendarViewShown(false);

DatePicker はデフォルトでは、左側に年月選択スピナー、右側にカレンダーという表示ですが、
最近の日付しか設定しない場合等はカレンダーを表示しないで日付もスピナーにした方が選択しやすいですね。

ちなみに DatePickerDialog はデフォルトでカレンダーなしのようです。
ただし、DatePickerDialog はタイトルが日付で固定されるので、
タイトルを設定したい場合は AlertDialog に setView で DatePicker を配置する必要があります。

Android : AndroidStudio が重い場合の対処法(メモリ割り当ての調整)

C:\Program Files (x86)\Android\android-studio\bin
以下にある
studio64.exe.vmoptions
をテキストエディタで開き、上の方のパラメータを

-Xms1024m
-Xmx2048m
-XX:MaxPermSize=512m

のように設定しました。

2014年6月25日水曜日

Android : CalendarView のエラー諸々 (* cannot be cast to android.widget.CalendarView$WeekView とか、ずっと GC が走ってアプリが起動しないとか)

Fragment 中に CalendarView を配置しようとしていたところ、なんだかいろいろなエラーが発生しました。

結論としては
  • 同じレイアウト中に android:id/list の id を持ったレイアウト(主にListViewに使われる id) があるとエラーが発生する
    • CalendarView 内の WeekView と何かが Conflict するのでしょうか…?
  • layout_height に wrap_content は使えない。match_parent、もしくは固定の高さである必要がある
といったところのようです。

参考 : Android CalendarView slowing down layout

以下、自分でいろいろ試した結果のメモです。

状態1

  • Fragment のルートのレイアウトは RelativeLayout
  • 同じ Fragment の layout 中には @android:id/list の id を持つ ListView が存在
  • CalendarView は ListView よりも上に配置
  • CalendarView の layout_height は wrap_content

結果

java.lang.ClassCastException: android.widget.RelativeLayout cannot be cast to android.widget.CalendarView$WeekView
が発生。


状態2

状態1から、CalendarView と ListView の配置を入れかえて CalendarView を下にする

結果

GC(Garbage Collection) が走り続けて、いつまでたってもアプリが起動しない


状態3

状態1から、ListView の id を @android:id/list から @+id/list に変更

結果

状態2と同じく、GC(Garbage Collection) が走り続けて、いつまでたってもアプリが起動しない


状態4

状態3から、CalendarView の layout_height を match_parent (もしくは固定の高さ 240dp 等)に変更

結果

アプリが起動するようになった。



2014年6月24日火曜日

超幻想郷級のダンガンロンパ 感想と考察 03 (Part 14)

次回(Part 15 の考察)

まさか自由行動が全員分あるとは。。。凄いボリュームでした。
時間があるときに改めて考察することにして、とりあえず気になったことメモ。
前回までの考察はそれぞれリンク先 : Part 1 ~  9Part 10 ~ 13


The 1st Murderer's Monologue


最初の殺人者が『絶望』…?考えにくいなぁ。
ルール 6. から、『クロ』の指名に失敗した場合は『クロ』の勝ちでゲーム終了なので、次回に続く展開にするには『クロ』の指名は成功する必要があります。(ここではルール6. の「全員に」の意味を、原作に合わせて「多数決で」と捉えています。)
一方でルール 9. から、絶望を正しく『クロ』として指名すると、残っているプレイヤーの勝利でゲーム終了なのでこちらも次に続く展開にはなりません。
絶望が二人いても、一人殺すか『クロ』指名に成功すれば終わりですし。。。

このルールカードを持ったキャラクターが、実は『絶望』ではない、という可能性もありますが、まだ自分で納得の行く説明が思いつきません。ルールカードは自分のものしか起動できなかった設定があった気がしますし、本物の絶望が自分のルールカードを起動してからすり替えようにも、すり替えられるタイミング、各キャラクターが部屋に案内される前の段階では、すり替え先にするべきキャラクター、つまり自分が絶望でない事に気付かないキャラクター(制限のない魔理沙、よくわからない妹紅、能力不明の霊夢くらいでしょうか?)が誰かも、どこの部屋かもわかりません。本当にすり替えがあったとすれば、実行犯=本当の『絶望』は霍青娥となるのかなぁ?この線はもう少し追ってみても面白そうな気はします。(ルールカードの設定とか取得タイミングとか結構うろ覚えなので…)

殺す候補は、最初は「あいつか、あいつ」。ルール No. 14 と関係有るのかな?
「ある人物を絶望として告発する」という手紙をみてから、一人に決定。

「Monologue の当人」、「封筒を置いた人」、「被害者候補」、「手紙が告発すると予告している人」、それぞれこれといった候補は思い付きません。
殺人を防ぐための罠として、封筒を置いたのが射命丸文、という可能性が少しあるかな、というぐらいです。


ルール 14.


黒幕のもう一つの特権で、彼女(絶望)にとってのゲームの意味を180度変えるルールとのこと。
もともとのゲームの意味は、『絶望』であってもそうでなくとも、勝利ボーナスの「願いがひとつ叶つ」(とかそんなものだったような)だと考えられるので、そうなると「殺さないとよくない事が起こる」方向のルール?だとするとちょっとえげつない感じもしますが、果たして。


魔理沙と早苗の凶器処分作戦


一つ見つからなかった凶器はあまり怖くない + 持ち主がわかっている + 魔理沙と早苗いわく、その持ち主はわりといい人。霊夢の葉隠水晶の次に怖くない極上の凶器というと、暗視ゴーグルでしょうか?Part 13. でマミゾウが自分の凶器を「隠してある」、「あまり役に立ちそうにない」と言っていたからマミゾウかな。
自分の凶器が盗まれていない、ということを、特に言っていませんでしたが、まぁ自分から主張するようなことじゃないですし。結局 Part 14 のラストで再配布が完了してしまったので、他人によってどの凶器を持っているかが把握されているのはこの一つだけに。残りは本人のみぞ知る状態。


デッドリー・デッド・ストック・ルームと ルール 15.


デットリー・デッド・ストック・ルームの使用条件を勘違いしていました。
増えていく弾丸数のカウントは、キャラクター毎なんですね。
つまり、前回の考察で考えていた、早苗が5回使って弾丸数を6にして使用不能にする、というのは前提が間違っていた、と。残念無念。

ルール 15. によって再配布が完了して、状況は大荒れに。
しかし葉隠水晶も回収されていたのはなぜだろう?ノーリスクでデッドリーを使える権利を水晶に費やすのは勿体無い気がするけど、霍青娥にリストを貰うのが躊躇われたのかな?
(凶器は番号指定で選ぶので、リストをもらっておかないとどれがもらえるかは運頼みになる)


デッドリー・デッド・ストック・ルームの端末の壊され方


銃痕っぽいけど、どうなんでしょう?
魔理沙と早苗が銃を回収しそこねていた、という事は考えにくいですし、17人目は極上の凶器を持っていないと明言されていますし。処分されていた拳銃をデッドリー・デッド・ストック・ルームを使って回収してから破壊した、というのも、そんな事しなくても破壊くらいはできそうなので違う気が。銃痕であれば、誰かがそう言う気がしますし、銃による破壊ではない、と考えておくことにします。


17人目


やっぱりいるんですね。しかし、他の個室を見張っていた魔理沙、早苗を含めて、他の誰にも気づかれないってそんな存在できるのかな?これも能力が関係?古明地こいしのような能力者が他にも東方にはいるんでしょうか?


夕食当番


くじ引き、というのはどうも疑ってしまいますね。
方法を提案したのも、くじを引いたのもマミゾウというのがどうも引っかかります。
幻惑能力で結果はコントロールできますし、その後キッチンで血が見つかっているからなぁ。。。


古明地さとりの能力『超高校級のテレパス』


今まであまり考えてなかったですが、自由行動を見た感じ、
このゲームにおける彼女の読心能力は、ある程度意図的に発動させる必要があるみたいですね。
少なくとも、対象が見えてないといけない、とか。
皆で議論しているときなども、全員の思考を常に読めている訳ではなさそうなので、意外に隙があるのかもしれません。かといって、捜査・裁判時に極めて強力な能力であることには変わりないです。


因幡テイの能力『超高校級の幸運』


こちらも自由行動から。
幸運能力は、かなり具体的に望む内容を意識しないといけないっぽいですね。
「最高の結果をくれ」みたいな適当な願いはダメで、その結果を手に入れるための内容を考える必要があり、また、既に決まった結果(今回で言えばシャッフル後のデッキの順番)は幸運による操作の対象外、と。(テイが無駄に具体的な幸運を意識し過ぎて自滅した、という線もありますが)。
「奇跡」も同じなのかな?裏読み、先読みが重要で、もしかしたらクロや絶望に騙されて利用されてしまう可能性のあるスキルと言えそうです。

ところで、『幸運』もしくは『奇跡』持ちのキャラならロシアンルーレットで絶望当てられるんじゃないですかね

  • 幸運持ちのキャラが弾を一発込めたリボルバーを持ち、それぞれのキャラクターに対してルーレットを回してから引き金を引く
  • 自分が「クロ」であるという状況で「絶望」でないキャラクターを撃ってしまうのは幸運に反するので、外れる
  • 「絶望」を撃って倒すことができれば、その時点で勝利なためその結果は幸運といえるから、相手が「絶望」のときにヒットする
  • 全員に当たらなければ、絶望はその場にいない古明地こいしか、そもそも存在しないか、引き金を引いていた幸運持ちのキャラクターである
という感じで。まぁリボルバーの持ち主がわからなくなってしまったので実行はできないんですけど。



超長くなったー。

2014年6月22日日曜日

『絶園のテンペスト』 感想



絶園のテンペスト』という漫画を最近 Kindle で大人買いしたのですが、個人的には大当たりでした。
本編9巻 + おまけの10巻目で終わる程よい長さもあいまって、おすすめ度はかなり高め。

適当にストーリーを1行でまとめると、
『「そんなむちゃな」と言いたくなるような世界設定を押し付けられた主人公達が頑張って抵抗する話』
なんですが、「勝った!めでたしめでたし。」では終わらない世界観、雰囲気を持った話と、癖のある登場人物達が好きでした。絵も綺麗。

あとがきいわく、原作者さんの重要なテーマとして
『負けた後も人生は続く、さてそれをどうやって乗り切ったものか』
というものがあるそうですが、確かにそんな感じの漫画ですね。

主人公達は作中ずっと、論理的に、考えに考えて「理不尽な設定」と戦うんですが、
相手は自分たちの理解の及ばない存在なので、その論理が正しいかどうかなんてわからない、それでも、とにかく決断して行動をしなければいけない、と。

そんな中で「やってられるか!」と現実を放棄する事なく、自分で考えて何かを選んで、その選んだ道を正しいものとできるように、その中で失ったものに何とか意味を持たせられるように、選んだ後も頑張り続けるという在り方はいいなーと思いました。

結末(真相)に否定的な意見が出る気持ちはわかりますが、「論理的に考えたら勝てたはず」では作品のテーマが薄れそうですし、自分は気にならなかったです。

好みが分かれる、と評されている漫画のようですが、だからこそ実際に読んでみると良いと思います。

また、楽しい作品に出会えますように。

※同じ原作者が書かれた小説『名探偵に薔薇を』も面白かったのでおすすめです。

2014年6月21日土曜日

Android - AlertDialog の OK ボタンや Cancel ボタンが押された時にダイアログを閉じない

参考 : How to prevent a dialog from closing when a button is clicked

OK ボタンを押した時に入力内容をチェックして、入力内容が不正であればダイアログを閉じずに Toast を出すなどの処理をしたい場合に。
参考先の一番上の方法がわかりやすく使い勝手が良さそうだった。

  1. AlertDialog.Builder の setPositiveButton や setNegativeButton の Listner には null を登録する
  2. Builder.create() で AlertDialog を作成
  3. AlertDialog.setOnShowListener で OnShowListener を登録。onShow の中で、AlertDialog.getButton(AlertDialog.BUTTON_POSITIVE) などで Button を取得。
  4. Button.setOnClickListener でボタンが押された時の処理を登録。閉じる場合は AlertDialog.dismiss() を呼ぶ。

2014年6月11日水曜日

Android : ListView の中に Button や CheckBox, RatingBar を入れた際に OnItemClickListener と OnItemLongClickListener を使う

参考 : ListView with OnItemClickListener android

ボタンなどの入力可能な要素を ListView に入れると、
そのままでは OnItemClickListener や OnItemLongClickListener が呼ばれなくなってしまう。
対策として、ListView の子要素(各項目)の View に使う layout の root 要素に
android:descendantFocusability="blocksDescendants"
属性を追加する方法がある。

android:descendantFocusability に blocksDescendants を設定すると
子要素(この場合ListView の要素の中に入れた Button 等)がフォーカスを取得する事を防ぐ。

2014年6月9日月曜日

Android : RadioGroup のチェックをコードから変更する際に onCheckedChanged が複数回呼ばれるのを防ぐ

参考 : RadioGroup calls onCheckChanged() three times

謎仕様。。。

プログラム上から RadioGroup 内でチェックされたボタンを変更する場合、
RadioGroup.check(id) を使うと setOnCheckedChangeListener で指定した
onCheckedChanged が 3回も呼ばれてしまうので、
RadioButton.setChecked(true) を使用する。

2014年6月5日木曜日

Android : ListView が一番上 / 一番下にスクロールしたかを調べる

一つも要素がなければ、一番上でもあり一番下でもある。
要素がある場合は、子要素の位置と親要素(ListView 本体) の padding 位置を比較する。
OnScrollStateChanged 内でチェックするようにしても問題なく検出できる。
(一番上か一番下に到達してスクロールが止まると IDLE state になるらしい)
ただ、実際に試したところ onScroll 内で実行したほうがぴったりしたタイミングで検出できたので、
タイミングが重要な場合は onScroll 内でチェックしたほうが良い。

mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {

    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        if(view.getChildCount() == 0) {
            mAtTop = true;
            mAtBottom = true;
        } else {
            if(view.getFirstVisiblePosition() == 0 && view.getChildAt(0).getTop() == view.getPaddingTop()){
                mAtTop = true;
            } else {
                mAtTop = false;
            }
            if(view.getLastVisiblePosition() == totalItemCount - 1
            && view.getChildAt(view.getChildCount() - 1).getBottom() <= view.getBottom() - view.getPaddingBottom()){
                mAtBottom = true;
            } else {
                mAtBottom = false;
            }
        }
    }
});

2014年6月2日月曜日

Android : RadioButton を xml でカスタマイズ

<style name="CustomRadioButton" parent="android:Widget.Holo.CompoundButton.RadioButton">
        <item name="android:layout_width">@dimen/radio_item_width</item>
        <item name="android:layout_height">@dimen/radio_item_height</item>
        <item name="android:background">@drawable/radio_item</item>
        <item name="android:button">@null</item>
        <item name="android:gravity">center</item>
</style>

android:button が、デフォルトのチェックマーク(丸ポチ)。
これを @null で消して、background に自作の drawable を使う。
background の drawable には selector を利用する。
(gravity を center にしているのは text を中央にするため)

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:shape="rectangle" android:state_checked="true">
        <shape android:shape="rectangle">
            <stroke android:width="1dp" android:color="#333333" />
            <solid android:color="#ccc" />
        </shape>
    </item>


    <item android:shape="rectangle" android:state_checked="false">
        <shape android:shape="rectangle">
            <stroke android:width="1dp" android:color="#333333" />
            <solid android:color="#eee" />
        </shape>
    </item>
</selector>
button の方をカスタマイズする場合、常に left 側に描かれるよう点に注意する必要がある。
button の drawable を中央に置くことや、button の drawable で border を描画する、
などはできない。(幅と高さが完全に固定なら、shape drawable の size を指定すればできる?試してはいない)
参考: android RadioButton button drawable gravity