2014年12月31日水曜日

Sublime Text : プラグインスクリプトからデフォルト、ユーザ設定値を取得する

view.setting() で Settingクラス(公式APIリファレンス)のインスタンスが取得でき、この Setting に、デフォルト(Preferences -> Settings - Default)やユーザ(Preferences -> Settings - User)の設定値が含まれています。

has("tab_size") や get("tab_size") のように引数を指定すると値が取得できました。


プラグイン作成の練習に作った、現在カーソルがある行の文字数を表示するスクリプト(ダウンロード)で使ってみました(タブを tab_size 分の文字数としてカウントする場合の計算のため)。スクリプト作るのなかなか面白いです。

Sublime Text : 縦線(ルーラ)を表示する



Preferences.sublime-settings で
"rulers": [20, 40, 60, 80]
のように、"rulers" をキーとして縦線を表示したい文字数の配列を設定します。

Sublime Text : プラグインでステータスバーにメッセージを表示する

参考:Sublime Text 3 公式 API リファレンス

sublime.set_status(message) と view.set_message(key, message) の 2通りの方法があります。

それぞれの特徴は以下のとおりです。
  • sublime.set_status
    • 表示位置はステータスバーの後方(Line N, Column M の後ろ)
    • それまでその位置に表示されていた内容は消える
    • 一定時間後に自動で消える
  • view.set_message
    • 表示位置はステータスバーの前方(Line N, Column M の前)
    • 異なる key(str) を設定すれば複数の内容を表示できる(key でソートされ , で区切られる)
    • 同じ key を設定すると更新
    • 時間が経過しても消えない
処理の結果(ファイルを保存しました、など)を表示する場合は set_status、情報(現在の行の文字数など)を表示する場合は set_message を使うと良さそうです。

Sublime Text : コメントアウトコマンド(Toggle Comment)で挿入される文字列を設定する

最終成果物は以下の2つのファイルです。
これらのファイルを Sublime Text の Preferences -> Browse Packages... で開くフォルダに保存すると、Toggle Comment コマンド実行時にテキストファイルでは > が、バッチファイルでは rem が挿入されるようになります。

BatchFileComments.tmPreferences
TextComments.tmPreferences

以下、忘備録を兼ねた解説です。


Sublime Text では Ctrl + / (Toggle Comment) でコメントアウト・アンコメントのトグルができます。

このコマンドでどのような文字列が挿入されるかは、*.tmPreferences というファイルで設定されています。

デフォルトの設定は、SublimeText 3 ではインストール先の Packages ディレクトリ(C:\Program Files\Sublime Text 3\Packages)の *.sublime-package を解凍して開いた中にあります。(ファイル名は Comments.tmPreferences が多いようですが、Python では Miscellaneous.tmPreferences でした。)

テキストファイル(.txt)にはデフォルトの設定がなく、Ctrl + / を押しても何も起こらないようだったので、">" が挿入されるような設定ファイルを作成してみました。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
 <key>name</key>
 <string>CommentCommandToQuoteInText</string>
 <key>scope</key>
 <string>text</string>
 <key>settings</key>
 <dict>
  <key>shellVariables</key>
  <array>
   <dict>
    <key>name</key>
    <string>TM_COMMENT_START</string>
    <key>value</key>
    <string>&gt; </string>
   </dict>
  </array>
 </dict>
</dict>
</plist>

ポイントになるのは対象となるファイルの種類を設定する scope と、挿入する文字列を設定する TM_COMMENT_START です。name は適当で構いません。このファイルを (適当な名前).tmPreferences というファイル名で、Preferences Browse Package... で開くディレクトリ以下に保存しておくと、テキストファイルで Ctrl + / を実行した場合は行頭に ">" が挿入されるようになります。


他にも、例えばバッチファイルの場合に rem を挿入する、とする場合は scope を source.dosbatch、TM_COMMENT_START を rem にするなどで設定できます。

Sublime Text 3 : プラグインで出力ウィンドウに文字列を出力する

基本的に SublimeTextのプラグイン作成方法 が参考になります。

ただし、Sublime Text 3 では 2 と違って begin_edit, end_edit が不要で、edit には run コマンドに渡された edit が使用できます。

また、3 の APIリファレンスでは get_output_panel はなくなっていて、同等の API として create_output_panel がありました。get_output_panel も使用できましたが、create_output_panel を使っておいたほうがよいかもしれません。

TextCommand の run 関数内を想定したコード例は以下のようになります。

window = self.view.window()
output_panel = window.create_output_panel("WindowName")
window.run_command("show_panel", {"panel":"output.WindowName"})

output_panel.insert(edit, output_view.size(), "Hello, Output")


ちなみに print 文はコンソール(Ctrl + ` で開くパネル)に出力されます。 以下のように show_panel で console を指定すればプログラムから開くことができます。
window.run_command("show_panel", {"panel":"console"})
print("Hello, Console")

2014年12月30日火曜日

Sublime Text : view.find_by_classes は int を返す

忘備メモ。
API リファレンスによると Region を返すことになっていますが、実際は int を返すようです。

Sublime Text 3 での Packages/Default フォルダの場所


そもそもフォルダではなくなっていました。

Sublime Text 2 では Packages/Default、Packages/Python などという形で、インストール時にデフォルトで作成されていた Packages 以下のフォルダが、Sublime Text 3 ではその中身がアーカイブファイルとして固められて (パッケージ名).sublime-package として置かれるようになっています。

つまり(デフォルトのインストール先であれば)

C:\Program Files\Sublime Text 3\Packages

以下にある *.sublime-package という名前のファイルを、 7zip などの解凍ソフトで開くとその中身のファイルを見ることができます。

各種言語のデフォルトのスニペット(*.sublime-snippet)やビルド設定(*.sublime-build)もそれぞれの言語名のパッケージ中に含まれています。

見たところ圧縮しているわけではないようなので、誤って編集されるのを防ぐ、プラグインやユーザが自作した設定との区別をより明確にする、などが目的でしょうか。

参考 : Where are the default packages in Sublime Text 3 on Ubuntu?

2014年12月28日日曜日

Sublime Text : Python 実行時の [Decode error - output not utf-8]

以下のページが参考になりました。
Windows の SublimeText3 で整える Python3 開発環境設定 (2014/02/23現在)

使っているものが Python 2系でも、指定するパスを変えるだけで原則は同じです。

Preferences -> Browse Packages... 開くフォルダに Python というフォルダを作り、そのフォルダ以下に Python.sublime-build というファイル名で以下の内容を保存します。
(参考先と比較して、shell_cmd の $file を " で括っている点と、python の path が 2.7系である点が異なります。)

{
    "shell_cmd": "python -u \"$file\"",
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "selector": "source.python",
 
    "windows":
    {
        "encoding": "cp932",   // Windowsコンソールの文字コード指定
        "path": "C:/Python27"  // 自分のPythonへのパスを追記
    }
}

Sublime Text 3 であれば
C:\Users\(ユーザ名)\AppData\Roaming\Sublime Text 3\Packages\Python\Python.sublime-build
のような場所に保存しておけば良いです。

これで Sublime Text 上から Ctrl + B で Python 実行が行えるようになりました。

もう少し詳しく Build について調べる場合は
非公式ドキュメントの Build Systems のページが参考になりそうです。

2014年12月22日月曜日

『虚像の道化師』、『禁断の魔術』 感想とレビュー

ガリレオ短編シリーズは息抜きのための読書として最適ですね。
息抜き以上でもそれ以下でもない感じは否めませんが。。。

忘備録として、全話のネタのメモ。感想は特に無いです。


虚像の道化師


幻惑す(まどわす)

宗教とマイクロ波。

心聴る(きこえる)

脳内音声装置。指向性スピーカーと同系統で技術的にそんなのもある、といったところ。

偽装す(よそおう)

ロッキングチェア、銃、心中。特殊な技術のネタではない。

演技る(えんじる)

凶器の入れ替え、犯人を演じる。これも特殊な技術のネタではない。


禁断の魔術


透視す(みとおす)

赤外線。

曲球る(まがる)

スポーツ科学。犯罪自体と技術ネタは無関係。

念波る(おくる)

テレパシー。結果的には、予言は数を撃てば当たる系。

猛射つ(うつ)

レールガン。

2014年12月20日土曜日

Android : Material Design の color の xml

colors.xml として ここ で公開して作成してださっている方がいました。
右下の Download Gist ボタンでダウンロードして、colors.xml を引っ張ってきて res/values にコピーして使用します。

他の参考情報として、
色のリスト(パレット)は Material Design -> Style -> Color
色を AppTheme にどのように指定するか、指定した色がどこで使われるかは Using the Material Theme をそれぞれ参照です。

『賭けの考え方』 と感想とレビュー



オススメという話を聞いて『賭けの考え方』という本を読んでみました。

「どんなに技術を高めても、結果の多くが運に支配されるゲーム」という事がイメージしやすいポーカーが題材であることで、

  • 長期的な視野で考え、時に短期的なリスクは受け入れる
  • 結果よりも正しい判断ができたかを優先する
  • 合理的な決断のために自尊心、感情は排除する
  • 分析・改善を継続し学び続ける
  • 達成し得る、正しい目標を設定する
    • 結果を達成できるかどうかをコントロールする力は限られている
という、そのまま普通の社会人人生にも当てはめられることを納得しやすい形で学べる本でした。

一般論として重要な事の多くが 2章、3章、10章の後半にまとまっているので、その辺りを繰り返し読み返すと良さそうです。

ポーカーの専門用語が説明なしにバンバン出てきて、調べながら読み進める必要がありましたが、それはそれで新しい言葉を知ることができてなかなか面白かったです(使う機会はないでしょうが)。

そろそろ2014年も終わるので、この本で学んだ事を参考にしながら 2015年の目標でも考えようと思います。

2014年12月19日金曜日

『虚構推理 鋼人七瀬』 感想とレビュー



虚構推理 鋼人七瀬を読みました。著者は、『絶園のテンペスト』(感想記事)や『スパイラル』といった漫画の原作、小説『名探偵に薔薇を』(感想記事。オススメ作品です。)の著者の城平京です。

妖怪と話す能力を持った隻眼隻脚の女性(男性の現彼女)、死んだ時にある一定の未来を選択できる不死身の男性、普通の警察官の女性(男性の元彼女)、という登場人物を軸に、鋼人七瀬という妖怪を消滅されるために「大衆に受け入れられる嘘の推理を生み出す」物語が語られます。

うーん。。。全体的な語り口調、テーマは面白いのですが、どことなく消化不良感があります。

「人は信じたいものを信じる」、「証拠よりも物語性」などをキーワードに大衆に対して推理を展開していくのですが、読者視点で見ると「大衆はこれを受け入れるのか?」と冷めた視点で観察できてしまう事、大衆を導くことを可能にする不死身の男性の能力(死んで復活する際に、直近の、可能性のある未来を決定できるので、ある程度説得力があり、大衆が受け入れる可能性がありそうな推理を展開できれば良いという条件になっている)の効果範囲が曖昧である事あたりが原因かもしれません。

推理に推理を重ねて伏線とする等の工夫はあって、ただのご都合主義ではないのですが、一つの真実をスパッっと提示するような物語の方がスッキリして好みではあります。

今回この本は図書館で借りて読むことができたのですが、借りて読めるなら読んでみると良いかも、くらいのオススメ感です。

2014年12月14日日曜日

超幻想郷級のダンガンロンパ 感想と考察 Part 17

前回 : Part 16 の考察

(長くなりそうなので、少しずつやっていこうと思います)
2014/12/14 : とりあえず視聴完了したので犯行の時系列とマミゾウの能力への疑問について記載
2014/12/22 : 気になるキーワードについて見出しを追加
2014/12/25 : ルールカードのすり替えの可能性について少し記載

いよいよ始まりました裁判パート。クオリティ高い!スクリプトの有無を選べたり、ボイスの有無を(音声出力バランス調整で)選べたりするのも凄いですね。

最後には公式に犯人当てクイズもあったので、当てに行きたいものです。とりあえず Part 17 で明らかになったこと中心に情報をまとめていこうと思います。


犯行の時系列


マミゾウの行動が明らかになったのでだいぶ整理されました。
ルーミアの証言射命丸文のビデオ と Part 15 の後半 辺りを参考にしつつまとめると、霍青娥の部屋での出来事は

  1. マミゾウが模擬刀を持ってシャワー室で待機。この時マミゾウは左手に手袋をしている。また、マスターキーを所持。
  2. [0:55] 文が部屋に入る。部屋に鍵をかけ(実際は鍵は壊れていて施錠不可)部屋を捜索
  3. [0:59] ルーミアが部屋の前で「人が殺されている」と呼びかける
  4. [0:59] 文はカメラを取り出し録画開始
  5. [1:00:00] ルーミアが暗闇能力を発動
  6. [1:00:20くらい] ルーミアが暗視ゴーグルを装備し部屋の中へ。ほぼ同時に、マミゾウが『この部屋には誰も居ない』という条件で能力発動。
  7. [~1:03] ルーミアが忍び足で部屋の中を移動し、シャワー室のドアを開く。マミゾウがルーミアを殴打。模擬刀と手袋とマスターキーを現場に残し退室。
  8. [1:03] 暗闇解除。
  9. [1:04] 文がシャワー室のドアを開けるが、誰もいないと認識。カメラにも誰も写っていない。ここでカメラのバッテリーが切れる。
  10. 犯人が凶器で文を殺害
  11. ルーミアが気がつくと文は死んでいた。偽物のダイイングメッセージを残しルーミアは部屋に戻る
Part 15, 16 の考察辺りで散々悩んだ足音と気配については「ルーミアの忍び足」+「誰もいないという幻惑」で解明。

ルーミアの所持品(ナイフとゴーグル)とマミゾウの所持品(マスターキーと模擬刀)も明らかになりました。

ここでまず気になっているのは『超高校級の幻惑者』の能力です。Part 15 の後半の映像から、ルーミアが部屋の扉を開けたのは 1時0分20秒くらいと分かるので、マミゾウの能力の発動もほぼ同時の1時0分20秒くらいのはずです。で、その後いろいろあった後、文がシャワー室のドアを開けたのは 1時4分台となっています。『超高校級の幻惑者』の能力には「時間制限は3分まで」、「一度能力を発動すると、一時間は能力を使用できない」とありますが、1時0分20秒くらいに『この部屋には誰も居ない』という条件で能力を発動していたら、その幻惑者の効果は1時3分台には切れてしまい、1時4分台に文がルーミアを見つけられないのはおかしいのでは?と思うのですが、どうなんでしょう?

この矛盾の解決方法としてはパッと思いつくのは
  • ルーミアが死角にいて運良く(悪く?)文が見つけられなかっただけ
    • マミゾウのショーダウン後の議論 で「ルーミアがシャワー室にいるのは間違いない」とされているのでこれはなさそうですが…
    • ついでに言えば、カメラのバッテリーはシャワー室の扉を開けてから切れているので、このパターンを否定しておけば幻惑はカメラにも有効と言えそうですね
  • 「時間制限は3分」という解釈の問題
    • 3分59秒大丈夫とか(ぇ
    • もしくはその他、能力の解釈を勘違いしている可能性はあります
  • マミゾウは絶望であり、2度目の幻惑能力を使用した
の3パターンです。

マミゾウが絶望で、例えば「文を霍青娥に見せる幻惑」などで誰かを殺人に唆したとすると結構いろいろスッキリしそうなんですが…そのようなややこしいことをする動機は見当たりません。能力制限がなければ無双できる能力ですからね。

メタな話をするとマミゾウが絶望というのは能力として強力すぎる感があり、一章でマミゾウが絶望だと明らかになってしまうと今後の展開どうなるの?という疑問も湧くので、何か単純な事実を見落としているか勘違いしている気がしています。何か気がついたら更新します。

追記:咲夜が時間停止して回収、という手も有りましたね。もっともこれも動機が全く不明になりますが。。。


The 1st Murderer's Monologue


Part 14 の考察でちょっと考えていましたが、それ以後はまともに考えていませんでした。
メタ情報(視聴者は知っているが、霊夢などの推理メンバーは知り得ない情報)ではありますが、犯人を当てに行くのであれば重要な手がかりとなりそうです。

ポイントは、この絶望のルールカードを持っていたモノローグの話者が、絶望本人なのか、本人でないならルールカードをすり替えたのは誰で、いつ、どうやったか、ですね。

なんとなく、ルールカードをすり替えたのが黒幕、すり替えられたルールカードを見た(このモノローグの話者)が実行犯、という図式が浮かびますが、未検討です。

■ 絶望のルールカードをすり替えられるのは誰か


本命は、時間停止中に自由に活動できる咲夜、幻惑で咲夜とほぼ同条件のマミゾウ、認識されない古明地こいし、そして『超高校級の泥棒』である魔理沙

部屋に侵入し放題の霍青娥も候補ではありますが、自分が絶望だと知られてしまうルールカードを手放す事はないでしょうから上に挙げた本命ほど高い可能性はないと思います。

…と、ここまで考えると、そもそも見られたら絶望だとわかってしまうルールカードを、これほど多くのプレイヤーが奪取できうる、という状況はゲームが破綻してしまうような気もしますね。絶望の告知方法が不明だったとはいえ、危険性が高すぎます。となると

  • 絶望のルールを見るには何らかの条件がある
  • 絶望は個人に固定されない
    • 日替わりで絶望が選ばれ、選ばれたプレイヤーのルールカードに絶望のルールが配信される
    • 絶望のルールカード自体は変わらず、それを所有しているプレイヤーが絶望となる
  • あの絶望のルールカードはフェイクである

のような可能性も考慮したほうがよいのかなぁ。。。
ルールカードの起動について、本人しか起動できないかもしれない(不確定)、という話もあったのでその辺りと絡んでくるかもしれません。


手形


唯一の「残った証拠」でしょうか。まだなにも考えていないです。


ミサンガ


ミサンガのことは Part 16 時点での犯人当て考察(下の方)で少しだけ考えていました。

今回の裁判の引き際での、さとりの「証拠がないから犯人がわからない、という発想を逆転させる」という言葉が、「誰なら証拠を残さず犯行を実行できるか考える」という意味であれば、ミサンガを残していない、という点がキーポイントになるんでしょうか。


破壊されていないカメラ


射命丸文のカメラが壊されていなかった理由も、何かしら説明がついた方が良さそうです。
Part 16 の証拠品一覧にも残っている証拠品の一つです。


二日目夜の行動表


麻雀の点数表とかです。

文の手帳と一緒に消滅して、Part 16 の証拠品一覧からは消えているものの、気になることではあります。これもメタ情報ですが、推理の裏付けとしては使えるのかもしれません。

『夜の国のクーパー』 感想とレビュー



夜の国のクーパー読了。『ガソリン生活』は車が語り手でしたが、こちらは主な語り手が猫。御伽話風という点で『オーデュボンの祈り』に近い印象を受けました。軽妙な台詞回しは控えめで、真面目な小説という感じです。

キーワードは「帰る」、「方針の変換」、「戦争」、「話し合い」、「上の立場と下の立場(猫と鼠、国と国)」、「やりたくないことは他人にさせる」など。

どちらかと言えばもう少し明るい雰囲気の小説の方が好きですが、これはこれで面白く読めました。猫達の動作の描写も臨場感(?)とかわいげがあって楽しかったです。

2014年12月11日木曜日

『ガソリン生活』 感想とレビュー



ガソリン生活』読了。メインの語り手が車という異色な作品でしたが、荒唐無稽でほんわかした感じが良いですね。系統としては『陽気なギャング』シリーズを近い雰囲気を感じました。単純だけど人のよい兄、年不相応に頭の立つ弟、一家を支える母親、隣に住む校長先生など登場人物、家族が乗る緑のデミオ、校長先生のカローラなどの車といった、主要なキャラクターに裏がなく気楽に読めて好きです。

2014年12月6日土曜日

Android : Gradle DSL method not found 'zipAlign()' もしくは 'runProguard()'

Android Studio をアップデートすると度々はまる Gradle 系のエラー。
Android Toos Project Site の更新履歴によると、
zipAlign は zipAlignEnabled、runProguard は minifyEnabled にプロパティ名が変わったようです。
build.gradle で zipAlign true と書いていた部分を
zipAlignEnabled true に書き換えると回復し、ビルドできるようになりました。

2014年12月2日火曜日

Android : アプリで認証したアクセス権の取り消し

Google Developers Console で作成した認証した API を使ったアプリのデバッグ中、再度認証画面を表示したいなどでアクセス権を取り消すにはGoogle のアカウント権限のページを開き、アプリ名を選択して「アクセス権を取り消す」を押すと認証が解除され、アプリ起動時に再び認証画面が出るようになります(アプリを一度アンインストールする必要有り)。

2014年11月25日火曜日

Android : Google Drive 上のファイルの作成・読み込み(一般フォルダ編)

Google Drive 上のファイルとして見えるファイルを作成、読み込みするアプリを開発する方法のメモです。
共通する部分は多数ありますが、アプリケーション専用フォルダ(APP_FOLDER)ではありません。
また、ファイルの編集(すでにあるファイルを読み込み、その内容を変えて保存、というのもこの記事では扱っていません。


準備1. サービスの作成、API の有効化

Set up the game in the Google Play Developer Console を参考にゲームサービスを作成し、作成したプロジェクトの Google Developers Console で Drive API を有効にします。


準備2. GoogleApiClient の作成

まずは GoogleApiClient を作成し、connect を呼んでログインしておく必要があります。
ここで必要な API は Drive.API, Scope は Drive.SCOPE_FILE です。
(ちなみにアプリケーション専用フォルダへの保存の場合はスコープに SCOPE_APPFOLDER が必要になります)
また、以降サンプル内で定義されていない変数・定数についてはクラスのメンバ変数などとしてどこかで定義されていると思ってください。
mGoogleApiClient = new GoogleApiClient.Builder(this)
        .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
            @Override
            public void onConnected(Bundle bundle) {
                Log.i(LOGTAG, "onConnected");
            }

            @Override
            public void onConnectionSuspended(int i) {
                Log.i(LOGTAG, "onConnectionSuspended:" + i);
            }
        })
        .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
            @Override
            public void onConnectionFailed(ConnectionResult connectionResult) {
                Log.i(LOGTAG, "onConnectionFailed:" + connectionResult.toString());
                if(connectionResult.hasResolution()) {
                    try {
                        // 初回起動時などで未認証の場合などはこちらにきます
                        connectionResult.startResolutionForResult(MainActivity.this, GOOGLE_API_CLIENT_RESOLUTION);
                    } catch (Exception e) {
                        Log.e(LOGTAG, e.toString());
                    }
                } else{
                    Log.e(LOGTAG, "hasNoResolution()");
                    int errorCode = connectionResult.getErrorCode();
                    Dialog dialog = GooglePlayServicesUtil.getErrorDialog(errorCode, MainActivity.this, GOOGLE_API_CLIENT_ERROR);
                    if( dialog != null){
                        dialog.show();
                    } else {
                        Log.e(LOGTAG, "no dialog");
                    }
                }
            }
        })
        .addApi(Drive.API).addScope(Drive.SCOPE_FILE)
        .build();
mGoogleApiClient.connect();
startResolutionForResult で OK が返ってきた時に再接続を試みるために onActivityResult に以下のようなコードを書き加えておきます。
※ startResolutionForResult は Activity から startActivity される扱いになるので、Activity の onActivityResult で処理必要があります。Fragment 内から呼んで、Fragment の onActivityResult で処理したい場合は、Activity の onActivityResult からその Fragment の onActivityResult を呼ぶよう明示的にコードを書く必要があります(他の Activity 起動系 API も同様です)。
if(requestCode == GOOGLE_API_CLIENT_RESOLUTION){
    switch (resultCode) {
        case Activity.RESULT_OK:
            mGoogleApiClient.connect();
            break;
        default:
            Log.e(LOGTAG, "" + resultCode);
    }
}


ファイルの作成

DriveApi.newDriveContents に設定したコールバック関数内で、DriveApi.newCreateFileAcitivtyBuilder() にメタデータや初期データを設定、アクティビティを呼ぶ、という流れです。

ResultCallback<DriveApi.DriveContentsResult> newDriveContentsCallback = new
    ResultCallback<DriveApi.DriveContentsResult>() {
        @Override
        public void onResult(DriveApi.DriveContentsResult result) {
            // MimeType は適宜変更する。他にも必要な項目があれば set 関数で set する。
            // setTitle で初期タイトルくらいは決めてあげると良さそう
            MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder()
                    .setMimeType("text/plain").build();

            DriveContents contents = result.getDriveContents();
            // OutputStream を取得して初期データを書き込む。例として、適当な文字列を書き込む。
            try {
                OutputStream os = contents.getOutputStream();
                String hello = "Hello World!";
                os.write(hello.getBytes());
                os.close();
            } catch (Exception e){
                Log.e(LOGTAG, e.toString());
            }

            // デフォルトで用意された UI を表示
            IntentSender intentSender = Drive.DriveApi
                    .newCreateFileActivityBuilder()
                    .setInitialMetadata(metadataChangeSet)
                    .setInitialDriveContents(contents)
                    .build(mGoogleApiClient);
            try {
                startIntentSenderForResult(
                        intentSender, REQUEST_CODE_CREATOR, null, 0, 0, 0);
            } catch (IntentSender.SendIntentException e) {
                Log.w(LOGTAG, "Unable to send intent", e);
            }
        }
    };

Drive.DriveApi.newDriveContents(mGoogleApiClient).setResultCallback(newDriveContentsCallback);

onActivityResult に以下のようなコードを書いておくと作成された Google Drive ファイルの DriveId が取得可能です(作りっぱなしでよいなら取得する必要はありません)。
if(requestCode == REQUEST_CODE_CREATOR){
    Log.i(LOGTAG,"REQUEST_CODE_CREATOR:" + resultCode);
    if(resultCode == RESULT_OK) {
        DriveId driveId = data.getParcelableExtra(CreateFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID);
        Log.i(LOGTAG, "Drive Id:" + driveId.toString());
    }
}


ファイルの読み込み

DriveApi.newOpenFileActivityBuilder() を使用してアクティビティを呼び出し、onActivityResult で DriveId を取得、DriveId からファイルを開いて内容を読み込むという流れです。
まずはファイル選択ダイアログの呼び出し。
// MimeType でフィルタリングされる
IntentSender intentSender = Drive.DriveApi
        .newOpenFileActivityBuilder()
        .setMimeType(new String[] { "text/plain" })
        .build(mGoogleApiClient);
try {
    startIntentSenderForResult(
            intentSender, REQUEST_CODE_OPENER, null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
    Log.w(LOGTAG, "Unable to send intent", e);
}

以下のコードは onActivityResult 内という想定です。DriveId からファイル内容を取得します。
if(requestCode == REQUEST_CODE_OPENER){
    if(resultCode == RESULT_OK){
        DriveId driveId = data.getParcelableExtra(
                OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID);

        // 取得した driveId からファイルの内容を取得。
        // プログレスを取得して何か行う場合は file.open の第三引数にリスナーを設定する。
        DriveFile file = Drive.DriveApi.getFile(mGoogleApiClient, driveId);
        file.open(mGoogleApiClient, DriveFile.MODE_READ_ONLY, null).setResultCallback(new ResultCallback<DriveApi.DriveContentsResult>() {
            @Override
            public void onResult(DriveApi.DriveContentsResult driveContentsResult) {
                if(driveContentsResult.getStatus().isSuccess()){
                    DriveContents driveContents = driveContentsResult.getDriveContents();
                    // DriveContents の getInputStream で内容を取得する。
                    // 以下はファイルの内容がテキストであることを想定した例。
                    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(driveContents.getInputStream()));
                    StringBuilder builder = new StringBuilder();
                    String contents = null;
                    String line;
                    try {
                        while ((line = reader.readLine()) != null) {
                            builder.append(line);
                        }
                        contents = builder.toString();
                    } catch (IOException e) {
                        Log.e(LOGTAG, "IOException while reading from the stream", e);
                    }
                    // 読み込むだけで内容に変更はなし。discard を呼んで閉じておく(意味は無いかも?)
                    driveContents.discard(mGoogleApiClient);

                    Toast.makeText(MainActivity.this, contents, Toast.LENGTH_LONG).show();
                }
            }
        });
    }
}


ちなみに、認証画面をもう一度出したい場合などで、認証を取り消したいときは このリンク先からアプリを 選択してアクセス権を取り消します。

参考
googledrive/android-demos
com.google.android.gms.drive
Google Drive Android API : Create files
Google Drive Android API : Working with File Contents

2014年11月23日日曜日

『Being Mortal』 感想とレビュー




Being Mortal: Medicine and What Matters in the End』を読みました。
"Old age is continuous series of losses."
この一文の引用だけで若干憂鬱になりますが、いつかは死ぬ、immortal(不死)ではない人間として、どうやって最後の時を生きて、どうやって死を迎えようか、というちょっと重い本です。

医療施設の話、筆者が関わった患者の話、筆者自身の父親の話などを通して、自分の親だったら、自分自身だったら、といろいろなことを考えさせられました。

まだまだ考えはまとまりませんが、読んでみて良かったです。
あまり上手くまとめられる気がしないので、内容については特に気に留めている点に触れるだけにとどめておきます。本では、他にも、緩和医療、医療コスト、コミュニティなどいろいろな話題に触れています。

安全と長生きが最優先事項か


病院や施設は、お年寄りの安全(と組織としての効率)を第一に考えた運営がなされているが、それが当人達にとって最善なのか、プライバシーも生きる目的も奪われた状態で管理されて長生きすることが幸せなのか、という問題提起。
"It just isn't home"

At home, you decide how you spend your time, how you share your space, and how you manage your possessions. Away from home, you don't.

治療とリスク、トレードオフ


医療技術は大きく発展したが、それでも治療できない、もしくは治療できる可能性が低い病気はある。また、治療行為にはリスクや副作用も存在する。難しいことではあるが、自分(もしくは家族)が何を大事に思うかと照らしあわせて、どのような可能性のために、どのようなリスクなら受け入れられるか、を考える必要がある、という問いかけ。
What are your fears and what are your hopes? What are the trade-offs you are willing to make and not willing to make?

2014年11月21日金曜日

Android : Saved Games を使う

Saved Games in Android 参照。
便利だけど、ログイン時の許可リクエスト量が多いのが難点。
  • Google Play Game Services : Getting Started for Android Game Development の Step 2 に沿って Google Play Services の設定(後で Internal Error が起こらないようにこの辺りに注意)
  • 作成したプロジェクトの Google Developers Console で Drive API、Google Play Game Management、Google Play Game Services をオンにする
  • GoogleApiClient を作るときは addApi(Games.API).addScope(Games.SCOPE_GAMES) と addApi(Drive.API).addScope(Drive.SCOPE_APPFOLDER) が必要?(コード後述)
    • 足りないと実行時に "appropriate api was not requested." というエラーでる
    • Games.API を指定するとログイン時に Google+ のプロフィールアクセスのような、ただデータを保存したい、という用途には必要のない許可まで求めてしまうが嫌だけど、削れそうにないか…。
  • Google play Developer Console のゲームサービス、「ゲームの詳細」で「保存済みゲーム」をオンにする(Saved Games の訳が保存済みゲーム…?)
    • オンにしていないと実行時に "Cannot use snapshots without enabling the 'Saved Game' feature in the Play console" というエラーが出る
  • Snapshot 新規作成時に snapshot.readFully() を呼ぶと長さ 0 の byte 配列が返る(null ではないので注意)
  • SnapshotMetadataChange の setCoverImage はしなくても大丈夫(デフォルトのコントローラの画像が表示される)
  • デバッグのためなどで、一回認証を解除して再度ログイン画面を出すには Google+ のアプリ設定 から接続を解除する
    • 他に方法はある?

GoogleApiClient 作成のコード例

mGoogleApiClient = new GoogleApiClient.Builder(this)
        .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
            @Override
            public void onConnected(Bundle bundle) {
                Log.i(LOGTAG, "onConnected");
            }

            @Override
            public void onConnectionSuspended(int i) {
                Log.w(LOGTAG, "onConnectionSuspended:" + i);
            }
        })
        .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
            @Override
            public void onConnectionFailed(ConnectionResult connectionResult) {
                Log.e(LOGTAG, "onConnectionFailed:" + connectionResult.toString());
                if(connectionResult.hasResolution()) {
                    try {
                        connectionResult.startResolutionForResult(MainActivity.this, REQUEST_CODE_GOOGLE_API_CLIENT_RESOLUTION);
                    } catch (Exception e) {
                        Log.e(LOGTAG, e.toString());
                    }
                } else{
                    Log.e(LOGTAG, "hasNoResolution()");
                    int errorCode = connectionResult.getErrorCode();
                    Dialog dialog = GooglePlayServicesUtil.getErrorDialog(errorCode, MainActivity.this, REQUEST_CODE_GOOGLE_API_CLIENT_ERROR);
                    if( dialog != null){
                        dialog.show();
                    } else {
                        Log.e(LOGTAG, "no dialog");
                    }
                }
            }
        })
        .addApi(Games.API).addScope(Games.SCOPE_GAMES)
        .addApi(Drive.API).addScope(Drive.SCOPE_APPFOLDER)
        .build();
mGoogleApiClient.connect();

Android : GoogleApiClient (Google Play Services) で発生する Internal Error の原因

いろいろ調べた挙句、自分の場合は「Google Play Developer Console で設定したパッケージ名とアプリのパッケージ名が違う」でした。せっかくなので、それも含めてありえる原因をまとめておきます。

  • AndroidManifest.xml に指定した meta-data の com.google.android.gms.games.APP_ID が Google Play Developer Console のリンク済みアプリに記載されたアプリID とは異なる
  • Google Developer Console (API のオンオフを設定したりする方)に入力した SHA1 の値が間違っている
    • ビルド時と異なる keystore ファイルから SHA1 を取得していた、など。
    • デバッグ版の場合は、debug.keystore がある場所(Windows の場合は通常 C:\Users\%ユーザ名%\.android )で以下のコマンド。keytool は java の bin 以下にあるのでパスを通しておく。
      keytool -exportcert -alias androiddebugkey -keystore debug.keystore -list -v
  • Google Developer Console で同意画面を作成していない(「API と認証」セクション)
  • GoogleApiClient の setScope で設定するスコープが足りない
  • Google Play Developer Console で設定したパッケージ名と実際のアプリのパッケージ名が異なる
    • AndroidStudio の場合、build.gradle の defaultConfig の applicationId を変える必要あり(ここを見落としていて、src の方のディレクトリ構造とパッケージ名や AndroidManifest.xml のパッケージ名を変更していた場合も Internal Error でした。)

凡ミスには気をつけたいものです。。。

2014年11月15日土曜日

『ZERO to ONE』 感想とレビュー




ゼロ・トゥ・ワン 君はゼロから何を生み出せるか』読了しました。

自分なりに本書の主張を箇条書きでまとめると、以下の項目になります。
  • 「リーン」に代表されるような、ユーザの声を聞いて少しずつ改善していくという手法では真に革新的なことはできない。自分なりのビジョンと計画を持って大きく賭けろ
    • 例えば Apple の製品はジョブズのビジョンの結晶である。
  • 競争下では最終的に全体の収益が消失する。他ができないことを行う、という意味での独占は善である
    • 独占しているかしていないか、独自性はあるか、ということを見極める上で、競争範囲の定義は重要である。範囲を狭く定義して独占を主張しても意味が無い。
  • 販売・売り込みは必要。方法には考えが必要。
    • 「あの会社はそんなことせずに成功したじゃないか」と思うのであれば、優れた売り込みに気づいていない。
  • 良い未来は創れるという希望を持ち、自分の頭で考えよう

この辺りの主張については、本書を読み進める中で、十分な説明やエピソードが紹介されており、なるほどと思え納得はしており、それは興味深く読めたのですが、「さてではどうするか」、というのが難しいですね。結局のところ「新しいことを自分の頭で考えよう」の一言に尽きる気はしています。

一人の会社員、社会人としての行動指針に落としこむと

  • 「こうして欲しい」という要望を待たずに「こうすれば良いのは」と提案できるように考える
  • 既存のプロセスを鵜呑みにせず、本質的な問題をより効率よく解決するために他の方法がないか考える
  • (独占的な)強みとなる技術を身につける

といったところでしょうか(なんだかとてもスケールが小さな話になってしまいましたが…)。

Amazon.com、Amazon.co.jp でもランキング上位にあり、結構なレビューの数が付いていることを見ると、起業家(もしくは起業家を目指している人)以外にも多くの人がこの本を読んだのだと思うのですが、そういう人がどのようにこの本を消化して、どのように行動を変えようと思ったのか、という考えを聞いてみたいものです。

また、この本を読んで、以前読んだ『コピーキャット―模倣者こそがイノベーションを起こす』を再読したくなりました。こちらの本はこちらの本で、納得できる内容であり、とても面白かった覚えがあります。


おまけメモ。Amazon で「序文いらない」というレビュー投稿を見たのですが、それにはちょっと同意しました。冒頭で、あなたの書籍の推薦依頼を受けるかどうかのポリシーを語られてもね、という。それ以外の内容は普通で特に気にならないのですが。関係のないこと(特に見方によっては自慢のように思えること)を書くと余計な印象を持たれてしまうかも、という戒めにメモしておきます。

『幻惑の死と使途』 感想 : 「名前」のための殺人の話



幻惑の死と使途』読了。Kindle Voyage を買ったついでに、何か読むものを、と思って買った小説でした。森博嗣作品は『すべてがFになる』と『冷たい密室と博士たち』しか読んでませんが、この3つの中では一番良かったです。手品とか好きですし、トリック・動機も納得のいく方でした。

それから、全体的な「名前」というテーマと、犀川教授の
人はアウトプットするときだけ、個たる「人」であり、それ以外は、「人々」でしかない
という言葉がとても印象的でした。

心に残る一言が一つでもあると、単純な娯楽としての読書以上にその小説は読んでよかった、と思えるので、この本もまた読んでよかったです。

2014年11月14日金曜日

Android : string.xml リソースで太字・斜体などのスタイルを指定する

リソースファイル string.xml では太字を html の bold として <b> タグで指定。
html として処理するので、改行はいつもの \n ではなく <br/> で。
%1$d は %d の引数番号指定。(引数一つしか無いのでここでは特に意味は無いですが…)

<string name="best_score"><![CDATA[Score : %1$d<br/><b>Best Score !</b>]]></string>

コード上からは、

mScoreTextView.setText(Html.fromHtml(getString(R.string.best_score, score)));

のように、getString で取得した値を Html.fromHtml でフォーマットすることで TextView にスタイルを反映できる Spanned インターフェースを作る。

参考:Is it possible to have multiple styles inside a TextView?

2014年11月8日土曜日

Android : AlertDialog のタイトル下の線(Divider)の色を変更する



id から Divider 用のラインに使われている View を取得して setBackgroundColor で色を設定します。
NumberPicker の時と同じような方法です。)

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.dialog)
       .setIcon(R.drawable.ic)
       .setMessage(R.string.dialog_msg);
//The tricky part
Dialog d = builder.create();
d.show();
int dividerId = d.getContext().getResources().getIdentifier("android:id/titleDivider", null, null);
View divider = d.findViewById(dividerId);
divider.setBackgroundColor(getResources().getColor(R.color.my_color));


参考 : How can I change the color of AlertDialog title and the color of the line under it

Android Stduio : Generate Signed APK 時の MissingTranslation エラーを回避する

values 以下の string リソースを持ったファイル(一般的に strings.xml, arrays.xml)の resources タグに以下のような属性を追加します。

<?xml version="1.0" encoding="utf-8"?>
<resources
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="MissingTranslation">

この方法だと、以下のように個別の item に translatable="false" をつけることなく一括で設定できます。

<string name="hello" translatable="false">hello</string>

Settings の Inspections から Incomplete translation の設定を Error から Warning にしても、build.gradle で lintOptions に abortOnError false をつけていても Generate Signed APK で署名付き APK を作るときはどうしてもエラーでビルドが中断してしまっていたので、この方法で解決しました。

参考 : Avoid Android Lint complains about not-translated string

『Race Against The Machine』 感想とレビュー



Race Against The Machine: How the Digital Revolution is Accelerating Innovation, Driving Productivity, and Irreversibly Transforming Employment and the Economy(サブタイトル長!)を読みました。いつか買って放置してしまっていたものを Kindle Voyage 購入をきっかけに再発見して読んだのですが、かなり良かったです。

コンピュータ技術の向上がどれだけ生産性に大きなインパクトを与えているか、という説明と、その結果、機械・テクノロジーが人間の労働機会はどんどん奪われている、という現状について書かれています。

コンピュータ技術は、他のあらゆる産業で使用されているため、その発展の影響力は非常に大きい、ということがよく理解できました。

問題として印象的な点は、現在の労働需要がU字型になってきていて、中間レベルの知識階級の仕事がどんどんコンピュータに取って代わられているという点です。U 字型の上の方はコンピュータによる自動化・ルール化がまだできていない職業、下の方は工場の工員など手作業を伴うような職業なわけですが、自分はまさにその中間層辺りにいる気がするので、危機感を覚えざるを得ません。

社会としての対応策としては、テクノロジーを敵として競うのではなく、テクノロジーを上手く用いて生産性を上げられるようにする、つまり compete against machines ではなく compete with machines ということで、起業(労働機会の創出)方法を含めた教育策の改善を挙げられています。

とりあえず、個人としては、コンピュータが取って代わることのできない領域の知識・経験を身につけ、U字型の労働需要の上を目指すという方向になるのではないかと思いますが、なかなか厳しい道ではあります。

ちなみに、生産性が上がることで「そもそも働かなくてもよくなるのでは?」という考えについては、仕事によってもたらされる、社会に貢献しているという実感は重要であり、「働きたくても働けない状況と、働かないという選択ができる状況は異なる」としてフランクリン・ルーズベルトの以下の言葉を引用されています。
(...) Demoralization caused by vast unemployment is our greatest extravagance. Morally, it is the greatest menace to our social order.
 この辺りは、現在における、退職された方の生きがいについての問題が広がる感じですね。


いろいろ考えさせられる良い本でした。

2014年11月7日金曜日

WPF : Datagrid の一番下の行にスクロールする

参考先にいくつかあった方法の使い分けについて。
サンプルコードは C# です。

方法1. ScrollIntoView を使う


ScrollIntoView の引数はオブジェクトなので最終行に相当するオブジェクトがわかっていればそれを使います。

myDataGrid.ScrollIntoView(itemInRow);


Items プロパティの Count と GetItem で最終行のオブジェクトを取得することができるので、以下のようなコードにすると常に動くのではないかと思います。

myDataGrid.ScrollIntoView(myDataGrid.Items.GetItemAt(myDataGrid.Items.Count - 1));


また、DataGrid の CanUserAddRows プロパティが true の場合は、DataGrid の最終行に追加用の行が挿入されているため、追加用の行を CollectionView.NewItemPlaceholder で指定することでスクロールできます。

myDataGrid.ScrollIntoView(CollectionView.NewItemPlaceholder);


方法2. Daragrid のスクロールビューを取得して操作する


少々煩雑ですが、常に使えるようです。ScrollIntoView が使えないような状況があれば、こちらの使用を検討します。

if (mainDataGrid.Items.Count > 0)
{
    var border = VisualTreeHelper.GetChild(mainDataGrid, 0) as Decorator;
    if (border != null)
    {
        var scroll = border.Child as ScrollViewer;
        if (scroll != null) scroll.ScrollToEnd();
    }
}

参考 : How to autoscroll on WPF datagrid

2014年11月5日水曜日

Kindle Voyage 購入レビュー : ページめくりボタン!

Kindle 3 から始まり新型が出るたびに Kindle を買い続け、Voyage で 5台目になりました(3, PW 2012 Wifi, PW 2012 3G, PW 2013 3G, Voyage)。

スペック的な説明は Engadget : アマゾン Kindle Voyage 正式発表、高解像度で歴代最薄・最軽量の高級モデル や Gizmode : Kindle Voyage、スクリーンの違いはさすがに歴然 のようなガジェット系ニュースサイトを見るのがベストだとして、結局どう感じたの?という個人の感想をつらつら書こうと思います。

ちなみに今回購入したのは Wi-Fi + キャンペーン情報つきモデルです。


Kindle PW (2013)とスペック的な差は感じる? → 意外に軽さはすぐ感じた。ページめくり速度はあまり。


大きさ、重さはカタログスペック的なもので、実感することはないかと思っていましたが、以外にも持った瞬間「お、ちょっと軽い」と思いました。右手で、ディスプレイ側からみて右下1/4で全体を支えるような持ち方をしているので、少し全体がコンパクトになったことも影響してるのかもしれません。これは嬉しい誤算です。

一方、普通の文字ベースの本においてはページめくり速度の違いはあまり感じませんでした。 PW と Voyage を横に並べて試してみても、ほとんど違いはわかりません。ただ、後述するページめくりボタンのお陰で「ページをめくる」という行動全体で見た場合はスムーズです。あと漫画の場合は速度差を感じました。


ページめくりボタンはどう?→ 最高!


ページをめくるたびに指を動かさずに済む、というのはやはりいいです。 3以来。設定で感度を選べて、3のハードウェアボタンよりも軽い力で動かせます。慣れるまで、押したつもりが反応しないということが何度かありましたが、5分くらい弄っているうちに意図通りに動かせるようになりました。

デフォルトで、ページめくりボタン反応時に Kindle が微妙に振動する設定になっているのですがこれはオフに。特にフィードバックがなくても困らないくらいにきちんと動いてくれます。

戻る方のめくりボタンはちょっと上の方にあって自分の手ではすこしずらさないと届かないので、戻るときは画面スワイプの方を使ってます。


自動明るさ調整はどう?→ とりあえず違和感なし。


あまり明るさが変化する環境で読むわけではないのでなんとも言いがたいですが、とりあえず自動設定にしたところ、良い感じに調整されたのでそのまま自動設定を使っています。


漫画は読める? → 読める。解像度の向上とページめくりの速度アップを感じる。


かなり実用的なレベルです。そこそこのスペックのタブレット以上の快適さだと思います。
こうなるとネックになるのは容量(4GB)ですね。多数の漫画コレクションを突っ込むには心もとない容量です。メインの漫画リーダーはタブレットを使いつつ、Kindle には新しい or お気に入りの漫画を数十冊入れておいて不要になったら消す、みたいな使い方をしようと思います。


キャンペーン情報はどう感じる? → 起動中は気にならない。待ち受け時と待ち受け復帰時に少し邪魔。


今回はじめてキャンペーン付きのモデルを買ったのですが、起動中はほとんど邪魔には感じませんでした。リスト表示にしてるんですが下1/10 くらいに広告バーが出ているだけで、しかもコレクションの中に入った時点でその表示も消えると。

ただ、待ち受けがダサくなるのがいただけないですね。さらに待ち受け復帰時に電源ボタンを押した後スワイプ操作が必要になるのもちょっと嫌です(キャンペーンなし版は電源ボタンを押すだけでよい)。Voyage のせっかくのプレミアム感が損なわれますね。差額分のお金を払って消せるなら消したいなー、という感じです。まぁ慣れたら気にならなくなるのかもしれません。実際に害があるというよりは、精神的なものですね。




とりあえず届いてみて数時間触ってみた感触はこんなところ。
「ページめくりボタン」+「小型軽量化」は期待以上で、良い買い物ができました。

よろしければオーナーライブラリー おすすめ本まとめ(洋書含む)+検索方法 と
Kindle 洋書オススメまとめ(とりあえず10冊)もどうぞ。

2014年11月3日月曜日

『アイネクライネナハトムジーク』 感想



今日は移動時間があったので アイネクライネナハトムジーク を購入して読みました。

伊坂幸太郎の、この手の時間軸と登場人物が不規則に入り組んで短編が繋がるタイプの小説、たびたび「誰だっけ?」となって読んでて疲れました。Kindle だとパラパラっと前に戻って確認するのも面倒ですし、今回は特に登場人物が多くて。。。

あとがきに
僕の書く本にしては珍しく、泥棒や強盗、殺し屋や超能力、恐ろしい犯人、特徴的な人物や奇妙な設定、そういったものがほとんど出てこない本になりました。ですから、普段の僕の本に抵抗がある人にも楽しんでもらいやすくなったのでは、そうであってほしい、と期待しています。
とあったのですが、僕はどちらかといえばそういう本(『陽気なギャング』とか『マリアビートル』とか)は大好きなので、今回の本はちょっと物足りない感じも。

まぁ「伊坂作品に期待していたものとは少し違った」というだけで、つまらなかった、読むのをやめようかと思った、というわけではないです。良い時間の使い方ができました。移動中は新しい本を読むのが一番ですね。

2014年11月1日土曜日

『LIFE PACKING』感想とレビュー : 何を大切にするかを考えるきっかけに



2014年11月の Kindle オーナーライブラリでは LIFE PACKING 未来を生きるためのモノと知恵 を無料で読みました。

写真が主体で文章は少なめ、パラパラめくる感じで軽く読了です。普段はこの手の本を手に取ることはあまりないので良い刺激になりました。

紹介されているもの自体は、著者の職業柄からかガジェット類、高級路線の音楽系の機材、調理器具がそこそこの数あったりと「自分もこの人の真似をして断捨離しよう」という参考にはあまりならないでしょう。というかならなかったです。

でも、そういう個性が出る製品を、ある個人の「必需品」として、想いとともに紹介していることにこの本の面白さがあると思います。

アンケート・多数決で決めたような必需品のリストを紹介されても多分つまらないですよね。

「こんなものあるんだ、これはいいかも」とか「これは自分にはいらないなー」などと思いながら読み終わった後に、さて自分の必需品はなんだろう?と考えを巡らせる気にさせてくれる『個』の出方がいい感じです。

自分も近いうちに必需品リストみたいなものを作りたいですね。きっと、自分の価値観の整理にも役に立つんじゃないかと思います。


その他 Kindle オーナーライブラリおすすめリスト はこちらにまとめていますので、よろしければ参考にどうぞ。

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に期待。


2014年9月17日水曜日

『CPUの創りかた』 感想とレビュー



CPUの創りかた を(一応)読み終わりました。もちろん実際には創らず、読み通しただけです。
だいぶ前に「有名みたいだし読んでみようかな」と手を出して「やっぱり電子回路わからない…」と挫折していたのですが、最近ハードウェア寄りの事をし始めたので改めて手を伸ばしました。

結局電子回路の部分はわかったようなわからないような、といった感じですが、この本で私が得た知見は 171ページの

要するに CPU というのは転送命令を繰り返すだけのロジックである。

に集約されている気がします。この言葉で「おお!」と思えただけで、読んだ価値はありました。
以下、同じページに書かれている重要なこと。

  1. データ保持の方法。フリップ・フロップの出力を入力に戻してあげればクロックがきても同じデータを保持できます。
  2. レジスタ間のデータコピーの方法。コンピュータが実行する命令の大半はMOVなどの転送系です。転送元のフリップ・フロップの出力を転送先のフリップ・フロップへ繋ぐ。で、クロックでコピー実行。
  3. 演算の方法。演算はソフトウェアから見ると転送命令とは別のカテゴリですが、CPUの回路としてはMOVなどの転送命令(として処理できる)の一種です。データを転送する途中で演算回路を経由すればよい、ということです。演算命令と転送命令はほとんど同じ。これも非常に重要。

これを知ったことが結局役に立つのかというとよくわかりませんが、全くの謎だった CPU の基本原理が少しわかった気がします。(これでわかったというと本物の CPU 屋さんに怒られそうですが…)

ソフトウェア系の人が、パフォーマンスを出したいなどの観点から実際に役に立つ CPU の知識を身につけたいのであれば、プロセッサを支える技術 -果てしなくスピードを追求する世界 (WEB+DB PRESS plus) がオススメです。自分も偉い人にオススメされて読んでいる途中なのですが、キャッシュの話や Out-of-Order 実行の話など、CPU が高速化のために行っている工夫がわかりやすく書かれていて読みやすいです。

2014年9月11日木曜日

『桜井政博のゲームについて思うこと 2』 感想とレビュー



桜井政博のゲームについて思うこと 2 を読みました。このシリーズ全て Kindle 化されていたんですね。文字サイズが変更できないタイプなので Kindle だと若干読みにくく、Nexus 7 のような 7 インチタブレットくらいが調度良い感じです。

いろいろな話題があって面白かったのですが、ここではゲーム関係の企業に勤めている端くれとして、心に留めておきたいお言葉を引用してメモしておきます。
ゲームに限らずほぼすべての創作物は、根本的には制作者のエゴイズム(自己本位、利己主義)で作られるものだとわたしは思います。(…)でも冷静に見渡してみると、エゴよりももっと優先すべきものがあることに気がつくのです。(…)お客さんに届くものであれば、まして代金をいただくものであれば、作品であるまえに商品であることは無視できません。メーカー名が冠としてつけばなおのこと。だからこそ、「自分の好みの仕事ができない」と狭い視野で嘆くより、みずからが選んだ職種に携われること自体を感謝するべきだろうと思います。
ゲームが好きで今の会社を選んだこと、ゲームに関わる環境に居られることへの感謝を忘れないようにしたいものです。
ゲームの最後にスタッフロールを載せるワケ。わたしにとっては、それはお約束を守るわけでも名前を載せたいだけでもなく、手がけた作品に対しての責任表示だという意図があります。売りたいのはゲームそのものであって、自分の名前ではないのですから。
この責任感が、『スマブラ』のような、恐ろしい量の調整・デバッグを必要としそうなタイトルの完成度の高さを可能にしているのかもしれません。私は外に名前が出るような仕事はしていませんが、名前を載せても恥ずかしくないような仕事ができるよう頑張りたいですね。



スマブラ for 3DS 体験版、面白いです。製品版が待ち遠しい。

2014年9月7日日曜日

『ゲームとゲーミフィケーションのあいだで』 感想とレビュー



ゲームとゲーミフィケーションのあいだで 〈人間と情報〉の関係はいかに更新されてきたか (PLANETS ほぼ惑コレクション for Kindle)
Kindle オーナーライブラリ対象だったので、今月はこれを借りて読んでみました。
ページ数はとても短く、丁寧に読んでも30分程度で読める文量ですが、内容は濃く多岐にわたっていて、借りてよかったと思います。

テーマは『情報技術の発展による「人間」像の更新』ということで、ソーシャルゲーム、エンターテイメント、メディアなど、色々な話題についてケームクリエーター水口哲也さんと、ゲーム研究者井上明人さんが語られています。

引用とメモ。
コンピュータゲームで、主に快楽のため、夢の実現のために追求してきた様々なテクニックや手法は、いま、情報技術の発展で社会構造の中に実装されつつあり、ゲーミフィケーションという名で呼ばれています。
この本におけるゲーミフィケーションの定義。
人間のローカルなコミュニケーションをインターネットが可視化して、それをこれまでよりも深いレベルで、それも大規模にゲーム化することが可能になったとき、ほんとうに何でもない、ほとんど中身のないやりとりをダラダラ続けているだけでなんとなく承認欲求も満たされるし、ゲームも進行して面白い、という一種の麻薬的な「時間つぶし革命」を実現してしまった
主にソーシャルゲームの話。ゲーミフィケーションは「なんでもないこと」、あるいは「悪いこと」にも人々を熱中させられる技術でもあるため、使い方を考えなくてはいけない、ということではないかと思います。
今は目の前にあるこの15分を消費したい、大きな有料の感動より、無料で手軽に遊びたい、という欲求やニーズの方が勝っちゃってるからこそ、ソーシャルゲーム人口も上がっている
WiiU や PS4 といった据え置きの大型タイトルから、「アプリ」へ人が流れている傾向について。大型ゲームが好きな人間としては寂しい一方、社会人になってからは確かに大型タイトルを遊ぶ気力が中々起きず、こうした感覚がわかってしまうのも事実です。振り返った時により大きなものが残るのは、有料かどうかはさておき「大きな感動」の方だと思うので、なんとか気力をだして「暇つぶし」に溺れないようにしたいものです。
明らかにこの種のソーシャルゲームは「作品」よりも「社会」の側に重心が置かれている。だから「ゲームとしてつまらない」という批判はあまり意味がない。これらの企画の目的はコミュニティ形成であって、ゲームはそのための手段でしかないし、ユーザーが享受している快楽もコミュニティサイトを通じた友人間の交流のそれが占める割合が大きい。(中略)『ポケモン』や『モンハン』ではゲームという作品の快楽の追求が目的で、社会=コミュニケーションはその快楽を支える装置=手段えしかない。しかし、ソーシャルゲームではこの関係が逆転している。社会が目的で作品が手段になっている。
ソーシャルゲームにおけるコミュニケーションと、『ポケモン』や『モンハン』といったゲームにおけるコミュニケーションの役割の違いについて。
コンピュータゲームの歴史とは、手段と目的のあいだを撹乱するシステムを洗練する歴史だったはず。どんなゲームも、少しバランスが狂うと「ゲームのためのゲーム」に、つまり「作業ゲー」になってしまう。
RPG で言えば、最終目的は「ストーリーをクリアする」で、そのための手段である「敵を倒す」、「ダンジョンを攻略する」、「アイテムを集める」、「レベルを上げる」という要素それぞれに面白みを持たせようとしてきた、という感じでしょうか?
今まではクリエイティブの神様というのはクリエイターという人たちの中に生息していて、その神をファンが崇拝していた。それが今では「僕も育ててるんだ」というふうに主体がパッシブな三人称から、アクティブな一人称に変わり始めている。
AKB や初音ミクの流行、参加するエンターテイメントへの移行について。『日本代表』のような本当に限られたトップレベルの個人・団体以外は見るエンターテイメントの対象としての価値を失いつつあるのかもしれません。
いわゆるエリート層の人って、自分が置かれた環境に勝手にゲーム的な構造を読み込んで、自分がプレイヤーとして同行動すべきか判断できる人の比率が多い印象を受けます。
確かに「ゲーム的な構造」が与える「何をすればどういう結果が得られるか」という因果関係を自分で紐解く事ができる人はエリート層になりやすい気がします。
「誰もが情報発信できる社会」が定着したとき、その結果何が起こりつつあるかというと、様々な情報や言葉が、有象無象の匿名の言葉と、ひと握りの固有名の言葉に分かれ始めているということです。
匿名の言葉は、一般人の書き込み、固有名の言葉は有名人の書き込み。一般人の書き込みはその内容に重きが置かれ、有名人の書き込みは内容よりもその人が言った、ということに重きが置かれていて、この中間にあったマスメディアは居場所を失っているという話。



最後に、水口哲也さんは、人の好奇心、探究心をとても大事にされていると思いました。そういうことに、ゲーミフィケーションの考え方が活かされると良いですね。

アルドノア・ゼロ 10話 感想

  • 姫様復活(早っ!)
  • レイエ拘束
  • ザーツバルム伯爵の過去話
  • 姫様演説
    • ただしザーツバルム伯爵一派にしか伝わっていない

姫様簡っ単に生き返りましたねぇ。いやもう拍子抜けです。1週間色々な展開を妄想できて楽しかったからまぁいいんですけど。そしてレイエ。今のところいいところがない(強いて言えばロケットパンチにトドメさしたくらい)中での今回の行動で、印象がだだ下がりというか。境遇が特殊過ぎて感情移入もしにくく、どうも魅力を感じられません。今後活躍の場があって欲しいものです。

Bパート。ザーツバルム伯爵の過去話がありましたが、デューカリオンが無事という事はオルレイン子爵がどこかで生きているフラグが。機体が無事でも、衝撃で中の人が死ぬことはありそうですが…その場合、地球側が遺体を秘密裏に処理したことになりますね。このあたり、後半クールの伏線となるんでしょうか?

最後にザーツバルム伯爵、あの角度で手錠だけ撃つの無理では?…というのはさて置いといて、スレインをあそこで開放したのはどういう意図があるんでしょう?もしかして、タルシスを好きに使えってこと…?(スレインは騎士じゃないけど起動権はあるのだろうか)

こっちはこっちでよくわからない行動してますが、とりあえず最終決戦が派手になりそうなのを楽しみにしておきます。
そういえば、今回は作画に違和感を感じる場面が結構多かったような気がしますが、前半クールをきっちり締めてくれたらいいですね。

そしてもうすぐサントラ発売。

2014年9月6日土曜日

Windows 8.1 で FRDM-KL25Z を使う

使えるようになるまでのインストラクションが下の参考先にあったのですが、Windows 8.1 で使用するにはファームウェアアップデートをする必要があり、そのためのファームウェアアップデートを行うには Windows XP/Vista/7 のどれかが必要ということでした。

その通り、 Windows 7 を使ってファームウェアをアップデートした後、Windows 8 に繋いだら普通に認識され、BOOTLOADER としても FRDM-KL25Z としても使えるようになりました。

更新してから初めて Windows 8 マシンに繋いだ時は不明な USB デバイスとなりましたが、一度抜いて別の USB ポートに差し込んだら正しく認識されました。その後元の USB ポートに繋いでも正しく認識されるようになったので、たまたまか、一度抜き差しが必要だったのかもしれません。

参考 : OpenSDA Update Instructions for Freescale Freedom Development Boards for Windows 8.1 and Linux
If you are not running the latest firmware and need to use the board with Linux or Windows 8.1, you need to then update the firmware. You must do this on an OS supported by the current firmware version on your board (typically Windows XP/Vista/7).


『嫌われる勇気』 感想とレビュー



嫌われる勇気』を読みました。インパクト重視と思われるタイトルにあまり良い印象はなかったのですが、かなり売れているようなので食わず嫌いせずに読んでおこうかと。

アドラー心理学というものに触れるのは初めてで、色々と新鮮でした。この本自体は、哲人が青年の説得に使用する例や、それによって青年が説得されていく様子などに違和感を感じてしまいそれほど面白いとは思わなかったのですが、アドラー心理学について自体はまた何かの機会に別の本でも読んでみようと思います。

『目的論』という考え方

未来を変えられる、と考えるための思考方法としては有用だと思うのですが、納得はできない、という印象です。読み終わった後でも、現在の状態の原因は過去にある、トラウマは存在する、という考えは変わりません。その上で、過去の事を言っていても仕方ないから何とかして乗り越えようよう、というスタンスの方がしっくりきます。

まぁ『目的論』についてあまりよく理解できていないので、別の本を読んだ時にでもまた考えてみようと思います。

以下、この本の内容のメモを少し。

アドラー心理学が掲げる目標

  • 行動面の目標
    • 自立すること
    • 社会と調和して暮らせること
  • 心理面の目標
    • わたしには能力がある、という意識
    • 人々はわたしの仲間である、という意識

人生のタスク

  • 仕事のタスク
  • 交友のタスク
  • 愛のタスク

承認欲求の否定と課題の分離

よく言われていることで、アドラー心理学に限った話ではないと思いますが。
あなたにできるのは「自分の信じる最善の道を選ぶこと」、それだけです。一方で、その選択について他者がどのような評価を下すのか。これは他者の課題であって、あなたにはどうにもできない話です。
他者から嫌われることを恐れず、承認されないかもしれないというコストを支払わないかぎり、自分の生き方を貫くことはできない。つまり自由になれないのです。
「他者からどう見られているか」ばかりを気にかける生き方こそ、「わたし」にしか関心を持たない自己中心的なライフスタイルなのです。

2014年8月31日日曜日

アルドノア・ゼロ 感想 第8話、第9話

7話


出来事

  • スレインへの尋問
  • カーム、火星人は皆敵宣言を撤回
  • ザーツバルム伯爵によるスレイン強奪、クルーテオ伯爵死亡(?)
クルーテオ伯爵は、いい人でもなければ有能な人でもなく、良い所なく終わりましたね。一応姫に忠義を誓ってはいたようですが、だからと言ってスレインのように姫の意志を汲むとかそういうタイプでもありませんでしたし。あっさり手のひら返してスレインを見直したり、なんとも理解し難いキャラクターでした。

しかし、ザーツバルム伯爵はなぜ尋問中にスレインを殺すのを制止し、しまいにはスレインを回収したんでしょう。考えてみれば、姫が生きていることを知っているスレインにはさっさと死んでもらったほうが都合が良いのでは?(と8話見るまで思ってました。)

8話


出来事
  • ザーツバルム伯爵、自らスレインに私が暗殺を企てたと宣言
  • (姉いわく)イナホは姫に入れ込んでいるらしい
  • ↑にインコが超反応
  • ライエの目が死んだ
  • 姫死んだ(?)
ザーツバルム伯爵がこうくるとは。スレインを利用するのではなく、あくまで恩人の息子という理由で救出したんですね。その上で、邪魔をするなら容赦はしないと。食事中の会話からしても、ザーツバルム伯爵は魅力的な悪役(敵役?)になれそう。ちょっと期待。(火星の食糧事情悪そうだなぁ…)

イナホが姫に入れ込んでいる、と言う話の後の姉とライエとのやりとりがちょっと意味がわからなかったんですが、あれはなんだったんでよう…?ライエが火星人だと思って鎌を掛けたのか、単に弟の話を続けただけなのか。なんとなく、視聴者をちょっとびっくりさせるための、後者の演出な感じがしてますが果たして。

そしてラストがまさかの展開。姫死んだ?アルドノアドライブの停止条件は?気絶くらいで停止するような技術は危険すぎる気がしますが、まぁ古代文明力なんでそういうアンコントローラブルなものかもしれません。なので生きている可能性はあると思います。こういう劇的でない状況下で突発的に重要人物が死ぬというのは話の展開が予想できなくて面白いですね(生きているかもしれませんが)。来週も期待。

2014年8月29日金曜日

Blender : Cage Mode (Apply modifier to editing cage during Edit mode) とは?


ケージモード(Cage Mode) - Edit Mode で編集中のケージにモディファイアを適用します
説明文の意味がよくわからなかったので調べたところ、要するに、Edit Mode で編集中にも、Modifier によって Modify された結果の頂点などが表示されるようになるみたいです。

(ケージ(Cage) がどういう意味合いなのかはわかりません。モデリング用語?)

Blender : "Manipulate Object Centers Only" ボタンがない

Object Mode 限定のオプションで、Edit Mode では出ないようです。(バージョン 2.7.1 で確認)

Blender Foundation という本に
The effect works both in Object mode and Edit mode
とあったのですが、参考先によるとこの本が書かれたバージョン 2.5  (beta) の頃にはあったものの、それ以降のバージョン 2.6 や 2.7 系ではなくなっているようです。

Object Mode では、3D View のヘッダの Pivot Point ボタンの右隣にあります。
(矢印と点三つのアイコン)。

参考 : "Manipulate Object Centers Only" button missing?!?

2014年8月28日木曜日

Visual Studio : Visual C++ 2012 で #pragma execution_character_set("utf-8") が使えない pragma として Warning が出る

どうやら本当に使えないようで。

参考先のやりとりをみると

「Visual Studio 2012 で使えないから対応して」という要望に対して
Microsoft が
「Visual Studio 2013 で直したよ、Visual Studio 2013 のトライアルバージョンはここからインストールできるよ」
と、どうにも咬み合わない回答をしています。
コメントの日時は 2014/4/29 なので比較的新しいです。

2013 で直しても 2012 ユーザには意味無いよー。

VS2008SP, VS2010 ではアップデートで直しているみたいだけに、
2012 だけ修正していないというのはどうにも納得いかないのですが。。。
今後サポートされる事を願います。

参考 : #pragma execution_character_set("utf-8") didn't support in VC 2012.

Android Studio : Error:(1, 0) Plugin with id 'android' not found.

解決策


builde.gradle の先頭、apply plugin: 'android'の前に以下のように buildscript ブロックを追加してから Sync しました。(build.gradle は1つのプロジェクトに2つありますが、apply plugin: 'android' のある方、階層的に深い位置にある方です。)
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.11.+'
    }
}

android plugin: 'android'
...
参考 : Android Studio: Plugin with id 'android-library' not found
Android Studio Error: (8, 0) Plugin with id 'android' not found

Android Studio : Manifest merger failed : uses-sdk:minSdkVersion 8 cannot be smaller than version 8 declared in library com.google.android.gms:play-services:5.2.08

Android Studio で出る上記タイトルのエラー。

原因は Google Play Services が minSDKVersion が 9 以上でないと使えないとのことなので、素直に build.gradle に記載している minSDKVersion を 9 以上にすれば解決します
(Eclipse を使われている場合は AndroidManifest.xml を直編集だと思います。)

ちなみに、SDK Version 8 は Froyo (バージョン2.2)で、2014/8/28 現在で、割合にして 1% 切ってました(0.7%)。もうほとんどないですね。

一方、SDK Version 9 の Gingerbread (バージョン2.3.3) は、まだ 17.8% とそれなりにあるようです。

参考 : Android Dashboards -> Platform Versions

Android Studio : cannot.find.zip.align=The zipalign tool was not found in the SDK.

cannot.find.zip.align=The zipalign tool was not found in the SDK.

Please update to the latest SDK and re-export your application
or run zipalign manually.

Aligning applications allows Android to use application resources
more efficiently.
久々に Android Studio でパブリッシュ用の Singed APK をビルドしようと思ってら、 上記のようなエラーが出ました。
ビルド中に zipalign が見つからなかったようです。
\sdk\build-tools\(version) 以下にはあるようなのですが…。

解決策


\sdk\build-tools\android-4.4W (どのバージョンにでもあるのでどこでも良いです)

にある zipalign.exe を

\sdk\tools

に配置したら直りました。 
それぞれ、フルパスで書くと

C:\Program Files (x86)\Android\android-studio\sdk\build-tools\android-4.4W



C:\Program Files (x86)\Android\android-studio\sdk\tools

でしたが、これは Android Studio のインストール先によりますので、参考程度に。

参考 : cannot find zip-align when publishing app

参考先によると、SDK Manager でビルドツールをアップデートして Android Studio を再起動すれば直ると書いてあるので、この方法も試してみると良いかもしれません。自分の場合は直らなかったので、zipalign をコピーしました。

2014年8月26日火曜日

英語 : 「バグる」、「バグった」、「バグっている」

名詞としての「バグ」は「bug」で良いのですが、動詞としての「バグる」、「バグった」はどう言えばよいだろう、と思って考えてみました。ちなみに「バグっている」という状態を表したいのであれば "have bugs", "be buggy" などのように名詞の bug や形容詞で be buggy を使えばよいと思います。

※ bug を動詞として使った場合、「悩ませる、盗聴する」という意味はありますが、「バグる」的な意味はないです。

1. behave buggily


Weblio の「バグる」というページはこれでした。
が、"buggily" という単語のエントリは当の Weblio にもなく、Google 検索しても「もしかして: buggy」と言われたり、検索結果にネイティブっぽい文章が見つからなかったりで、少し怪しい英語な気もします。意味は通じると思いますが、あまり一般的ではないのかもしれません。

2. not work correctly


「正常に動作しない」という意味での「バグる」。ビシっと決まった!という感じはしないのですが、汎用的な分使い勝手が良いように思います。単語的にも簡単なので、気取った感じもしなくてなんとなく安心感もあります。ただし、「バグ技」のように意図的にバグらせるという事を表現したい場合には、向かないですね。問題としてのバグの場合向けです。

3. 「バグる」という言葉を省略する、名詞に置き換える


…考えた結果、結局これに行き着きました。
当てはまる言葉が見つからないのであれば、言い換える、というのは英訳の基本ですね。そして、省略しても意味が変わらないのであれば省略してしまう、というのは労力節約の鉄則です。

例えば、「ソフトウェアがバグってクラッシュした」であれば「ソフトウェアがクラッシュした」でも情報の欠落はありません。「バグる」、「バグった」ということは、その結果として具体的な症状がある場合がほとんどなので、そちらの症状を書いておけば大抵省略できると思います

それでも、具体的な内容はさておき「バグった」と言いたいのであれば、やっぱり名詞の bug を使うのが楽に思います。「バージョンアップによってバグった」のであれば、「バージョンアップによってバグが生じた("The version upgrade introduced a new bug.")」にするなど(※バージョンアップは和製英語です)。

あとは、There is a bug in ~ which ... .という構文が結構使いやすい気がします
~ でバグがどこで起きているか、which 以下でバグの内容が説明できて、不要であれば which 以下は省略します。
There is a bug in this function which causes display corruption. などなど。


と、まぁ自分の考えはこんなところなのですが、おすすめの「バグる」、「バグった」の訳し方があれば教えていただきたいものです。

超幻想郷級のダンガンロンパ 感想と考察 Part 16

前回 : Part 15 の考察
次回 : Part 17 の考察

Part 16 は前後編合わせて 60分超。
とりあえず、Part 16 の前後編の流れと気になる台詞・情報にコメントしてから考察へ。
あと、推理に役立ちそうな 一章タイムライン なんてのが公開されてましたね。
全体の流れを追った後、最後に犯人当てしてます。


【前編】

絶対絶望少女 ダンガンロンパ Another Episodeの宣伝。皆さん予約は済んでますか?
ちなみに私はDanganronpa 2 Goodbye Despair(北米版)も予約済み。9月はダンガンロンパとスマブラでゲーム三昧ですね。

紫 「あくまでゲーム内の死」「嘘は、ひとつもないんだけどね?」「みなさんに望むのは『希望』」
うーん。含みがありますねー。
そういえば、『ルール7.追放』によると殺害されたプレイヤーも追放扱いですが、文が死んだ現時点でも追放の詳細についてはわかっていません。

勇儀が一悶着。今後への影響はなさそうなので省略。

モノクマファイル。意図的な書き漏らしはあっても嘘はない、とのこと。

霍青娥 「1時に文を呼び出した。捜査には協力しない」

霊夢 「霍青娥は1時頃自分の部屋にいた。トイレぐらいには行ったけど、犯人ではないと思う。」
個室の部屋割り』によると霊夢の部屋と、犯行現場である霍青娥の部屋は隣なので、何か噛んでいる可能性は残っていそうですが、果たして。。。

魔理沙と早苗以外のプレイヤーにアリバイはなし。

ルーミアが怪我をしていたという情報(詳しくは後編)

マミゾウが告発状を公開。告発状に時間差がある事がわかる。
0時(12時):魔理沙、早苗、妹紅、チルノ(殺人しそうにないタイプ)
1時(13時):その他
霊夢が、マミゾウが告発状を隠していた理由を不信に思っている。
マミゾウも1時組。マミゾウは時間差がある事を察していて、それを他の人に知られたくはなかった?怪しさが増します。。。

さとりが霊夢に捜査の仕切りをお願いする。3人組で捜査開始。

DDSルーム。魔理沙、早苗、妹紅。
ストックは 0。現在ストック 0 なので、凶器の種類は捨てたらわかってしまう。
ロシアンルーレットのボーナス2発の後は、3発目から。

霍青娥の部屋。サトリ、テイ(つんでれ)
文のカメラが残っていた。後編ラストによると、文はシャワールームまで持ちこんでいたから、犯人が気付かなかったという事はなさそうですが。。。

シャワールーム。勇儀、ナズーリン(ドヤァ)
マスターキーと模擬刀。金のペンキで汚れた手袋(会場の備品)。
凶器は模擬刀で間違いなく、左肩への打撃のあとに側頭部の一撃でとどめ。
一撃目で体勢を崩していると思われるので、身長については推測できず。
文を正面からまともに殺せるのは勇儀くらいであり、文が油断したと考えられる。
(カメラには残っていませんでしたが、犯人を見た時の台詞は「あれ、どうしたんですか?」でしたね。)
手帳がなくなっていた。
血文字は学級裁判のネタでしょう。レミリア辺りがドヤ顔で解読して「いや、即死だから」とかそういう展開なんじゃないんですかね(適当)。


【後編】


ドアに金色の手形(右の手のひら?)。大きめ。シリンダーが抜き取られていて、鍵がかからない。

バー。チルノ、マミゾウ(おかん)、レミリア。
マミゾウ 「パーティは目眩ましに過ぎない」
ジュラルミンケースのシリンダーも抜き取られていた。シリンダーを抜き取るのは時間がかかる工作であり、霍青娥くらいにしかできないと思われる。
文が、Part 15. のラストで霍青娥の部屋に来た時に部屋の鍵をかける描写がありましたが、これでは鍵がかからなかった=マスターキーは必要なかった、という事ですね。

保健室。ルーミア(かわいい)と咲夜
ルーミアは頭にひどい打撲。
ルーミア 「霊夢が犯人かもしれないから話せない。」
話せない理由のこじつけの可能性も高いですが、ルーミアも犯人は知らないという事ですね。

食堂。霍青娥。
霍青娥 「霍青娥を殺しに行ったはずの犯人は何故か射命丸文を殺害してしまいましたー」
この部分や、この後の流れを考えるとマミゾウが怪しく思えてきますが。。。

霍青娥は「悪意のない邪悪」

こいし宛の告発状は未開封。時間は1時。

ナズーリンのダウジング。
ルーミアは極上の凶器『ナイフ』と『暗視ゴーグル』。
前回の Part 15. の考察で、暗視ゴーグルはマミゾウが隠していて再回収対象外なんじゃ…と書いてましたが、見事に外しました。。。)
ルーミア関連は後で考察です。
文の手帳の中身は破り捨てられていた。学級裁判では Part 16. の証拠しか使えないという事でしょうか?全証拠を持っていてもわからないというのに。。。逆に言えば、Part 16. にある証拠だけ積み重ねれば犯人は特定可能ということかもしれません。

事件現場に、テイの仕掛けたミサンガが落ちていた。持ち主はルーミアとマミゾウ。
マミゾウ 「裁判の場で話そう」

メダル枚数の確認。一枚も持っていないプレイヤーはいない。
(『バーの領収証』によると、勇儀は3日目でメダルを使いきっていますが…ここは素直に、事件発生は4日目なので再配布された、と考えた方がよい気がします。)

シャワー室が水浸しだった。
そういえば、文がシャワー室に入って犯人と向かい合った時点で、シャワーは流れていましたね。何か意味があるんでしょうか?上手いことハンマーのような形を作りつつ、打撃部分の形を模擬刀にそろえれば、チルノが扱える重さで模擬刀の打撃痕を与えられる氷の凶器ができるかも…?それでも、勢いが必要な分初動は遅くなるし、後始末がある程度知能犯っぽいしという理由から本命のアイディアではないです。もしかしたら、くらいには可能性があるかもです。
動画中で重要そうじゃないという扱いだったから逆に重要というメタ視点の考え方の逆をついてやっぱり重要でないのでは、などと考えてしまうくらい、まとまらないです。

凶器のリストの照合。皆同じ。

文のカメラの再生。(なぜ手帳は処分して、カメラは残っているのか…)
朝の3分のずれは…普通、毎日時間ピッタリという訳ではない気がするので、特に考えません。理由も思いつきませんし、最終的に時間はあっていますし。
金属製の物が床に落ちたような音=ルーミアが持ち込んだナイフ?
暗闇解除後のドアにペンキの手形はない。
再生後、ルーミアが何か安心している様子。ドアの薄さの設定を考えると、ルーミアの「殺人が起きた!」という呼び声は他の人も知っていると思っていたんですが、そうでもなさそうです。

エレベータ。残るキャラクターのバランスを考えてしまいますね。。。

【考察】


気になる点を挙げただけ既にくそ長いんですが、もう少し…。

ルーミアの行動

  • 部屋への侵入にマスターキーが不要だった
  • ルーミアが暗視ゴーグル(+ナイフ)を持っていた
  • ルーミアが殴打されていた(明言はされていませんが、確実といっていいでしょう)
この辺りの情報から、殺人が起きた時間周辺のルーミアの行動をシンプルに考えると
  1. 霍青娥の部屋の前で「殺人が起きた」と呼びかけおびき出そうとする
  2. 出てこないので、暗視ゴーグル装備で暗闇を発動し、部屋に侵入
  3. 誰も見当たらないので、シャワー室へ。シャワー室の扉を開ける。
  4. シャワー室で待ち構えていた「誰か」に殴打される。この時ナイフを落とす。
  5. 「誰か」によってルーミアがどこかに運ばれる(運ばれないと文に見つかる)
となりそうですが…。
ルーミアが暗闇発動後に部屋に侵入している(=鍵が開かない場合はどうする予定だった?)、文の「ドアが開いたのに人が部屋に入ってきた気配がしない」、殴打音の後の「足音がするのに気配がしない」という発言が解けていない、ルーミアを殴打した誰かはその後戻ってきて文を殺害した?、など、いろいろ抜けている点や不自然な点があります。

特に、部屋のドアが開く→シャワー室の扉が開く→殴打音がする、ここまでは気配もしていなければ足音もしていないことになっています

この辺りの「気配がしない」関係が最も謎です。こいしの『超高校級の無意識』の説明文「透明人間であるかのように行動できる」を、音は聞こえるけど気配はしないと解釈すれば、ルーミアを殴打し、連れ去った(?)のはこいしで、文殺害の犯人は別(文が犯人を見ているので)とできたのですが、前半部分は足音もなしですからね。コウモリも、気配くらいはするでしょう。そしてどちらにせよ動機も全く不明です。

しかし、ルーミアが部屋に侵入していないとすると、シャワー室のドアを開け閉めしたプレイヤーとルーミアを殴打したプレイヤーが別になってもうわけがわからないことに。。。

暗視ゴーグルとルーミアにペンキの後があるかどうか、つまりルーミアが何で殴打されたかもわかっていません。

とりあえずこの謎については今のところ降参です。。。


【犯人当て】


ルーミアの行動の考察で降参して気力が0ですが、最後にこれだけはやっておきましょう。

まずは消去法で、模擬刀が使えないルーミア、チルノ、レミリア、テイを除外します

ここでは、「鬼は嘘付かない」みたいな設定もありましたし、前編の紫との一悶着は「勇儀は犯人ではない」という事を示している、いっても良いかもしれないので、『勇儀の証言』を信用しています。というわけで勇儀も除外

次に犯行時刻のアリバイが少なからずある魔理沙、早苗、霊夢、霍青娥を除外
(メタ的な話を入れると、魔理沙は四章で何かありそう、逆に言えば四章まで何もなさそうなんですよね。四章のタイトルは【ウィッチハントあるいはウィッチダニット】ですから。ついでに霍青娥も五章までは生き残りそうな気が。タイトルは Part. 2 の説明欄に書いてあります。)

ここまでで残りはマミゾウ、妹紅、ナズーリン、こいし、さとり、咲夜の6名。以外と少ないですね。

明らかに何かを隠しているマミゾウ、目立たないので逆に怪しい気もする妹紅、ダウジングが期待ほどには役に立たなかったナズーリン、姿を見せないこいし、捜査パートでほとんどテレパスを見せないさとり、利き腕の謎が残る咲夜、というラインナップですが、消去法をもう少し続けます。

文が犯人を認識しているので、『超高校級の無意識』で、透明人間のように行動できるというこいしを除外

更に、文が犯人と対峙した時の反応から、咲夜を除外。咲夜にそこまで好戦的な印象はありませんが、自分の腕を刺すなど派手に動いていたのでそれなりに警戒対象ではあると思います。そもそも、咲夜が犯人であれば時間停止を使って確実に後ろから殺しにいくでしょう。

告発状が0時(12時)のグループである妹紅を除外。それ以外の理由がないので、厳しいですが。。。メタ的な話も入れると、妹紅の能力を使わずに退場させるのは勿体無いかなぁと。

うーん。これ以上は消去法は厳しいでしょうか。
残りはマミゾウ、ナズーリン、さとり
本命はマミゾウなんですが、それはなんというか、Part 16. 時点ではストレート過ぎるんですよね。。。裁判でひっくり返されそうな気がします。「マミゾウは誰かの殺人を止めようとしていた」とか何とか。もしくは、能力によって文を霍青娥に見せていたとか、実行犯ではない形で絡んでいる感じがします。

マミゾウではないとするとナズーリンかさとりですが、その場合「真犯人のミサンガは落ちなかった(もしくは落ちた後に気付いた)」となります。これは、ナズーリンならダウジングで落とした後にミサンガを回収でき、さとりならテイの心を読んでミサンガが取り付けられていたことを察知できていた、と言えるので、どちらでもミサンガ問題は回避できそうです。(ナズーリンは捜査で三回ダウジングしたと言ってますが、一個目はスカですからね。)

で、結局決定打はない(そもそもルーミアの行動の考察諦めてる時点で厳しいです)、もうとりあえずさとりで。動機も方法もさっぱりですが、Part 10 ~ 13 の考察 から書いている通り、テレパスがどうも、味方に置いておくには強力過ぎる気しかしないのです。ここまで来といて、最後はメタと当て感です。

(ここまで来て、Part 14 の考察に書いていた 1st Muerderer's Monologue の辺りを検討に含めるのをすっぽり忘れてたことや、『絶望』について何も検討してない事に気付きましたが、またの機会に…。)

【残っている謎】


文の手帳がなくなったので、証拠品から消えてしまったのですが、どういう扱いになるんでしょうね?破られたページが処分された、とは明確になっていないので、後々復活する可能性は高いと思っていますが、第一章では放置でしょうか。
  • キッチンの血の跡
  • 咲夜の利き腕
  • 麻雀、ボードゲームの点数表
  • 偽物の可能性のある古明地こいしのメッセージ

2014年8月21日木曜日

本 : 『Show Your Work!』 感想とレビュー


Show Your Work!: 10 Ways to Share Your Creativity and Get Discovered

Steal Like an Artist』 が良かったので、同作者の本を読んでみました。セルフプロモーションの代替方法(?)として、自分と自分の作品を世の中に知ってもらうためにはどうしていけば良いか、がテーマとなっています。『Steal Like an Artist』 が他の人から影響を受けよう、という本なのに対して、この本は他の人に影響を与えるには、という立ち位置で、対象読者は、基本的に何か創作活動、モノ作りに関わっている人。

ここでの work は作品だけでなく、その制作のプロセスも含めており、
以下のような内容を肉付けして語っている感じです。

Show your work するべき理由

  • 自分自身と自分の作品に触れてもらえる機会が増える
    • 興味を持ってもらえるかもしれない
    • フィードバックや教えを貰えるかもしれない
  • 誰かの参考になるかもしれない
    • 初心者の試行錯誤の記録などは、同じ悩みを持つ初心者にとってエキスパートの教えよりも役に立つことがある

Show your work する際の注意

  • 自分の名前をクリーンに保つ
    • スパムのような share は行わない
    • 誰かに不快感を抱かせる可能性のあるものの share 範囲には注意する
  • 批判を気にしすぎない

正直なところ『Steal like an artist』ほどはピンと来ませんでしたが、それでも良い本だったと思います。

以下、ハイライトした箇所の一部と自分のコメントです。
Be so good they can't ignore you
冒頭で、コメディアン Steve Margin のこの言葉を引用しつつ、もしあなたが本当に良い作品を作ることに集中していれば、いずれ他の人があなたのところにくるでしょう、しかし、そのためにはあなた(とあなたの作品)は見つけられる状態にある必要があります、と続きます。兎にも角にも、良いものを作るということが前提になるということです。(最初から優れた作品を作れる必要はなく、上達のためのプロセスの一環として、Share your work しよう、という流れになります。)
Mediocrity is, however, still on the spectrum (of creative work); you can move from mediocre to good in increments. The real gap is between doing nothing and doing something. 
凡庸も創作であり、本当の境目は何かするか、何もしないか、ということです。
まったくもってその通りですね。
If you give away everything you have, you are left with nothing. This forces you to look, to be aware, to replenish.... Somehow the more you give away, the more comes back to you.
Share すると次に Share するものを探すようになる、という好循環が発生するという感じでしょうか。
Work is never finished, only abandoned." - Paul Valery
『終わりーなどーはないーさ、終わらーせるーことはでーきるけどー』みたいな。

バッチファイル : if 文条件分岐で AND と OR (複数条件指定)

バッチファイルの if 文には、複数条件を指定するための AND と OR が存在しないので、
何らかの工夫をする必要があります。

AND


IF 文を繋げる方法

ELSE 文を使わない場合はこの方法のみで大丈夫です。
IF 条件A IF 条件B (
    処理1
) ELSE (
    処理2(注意!)
)
なぜ注意が必要かというと、この書き方は以下のように解釈されるため、
条件A が FALSE の場合には実行されないからです。
IF 条件A (
    IF 条件B (
        処理1
    ) ELSE (
        処理2(条件1が TRUE で条件2 が FALSE の場合にのみ実行される)
    )
)

環境変数を使う方法(オススメ)

上記の IF 文を繋げる方法を使用しつつ、環境変数を挟むことで ELSE 文を使いやすくします。
一番汎用性が高いと思います。
set TRUE_FALSE=FALSE
IF 条件A IF 条件B set TRUE_FALSE=TRUE
IF %TRUE_FALSE%==TRUE (
    処理1
) ELSE (
    処理2
)

文字列を複数比較する場合には

条件が両方文字列比較の場合は、文字列を繋げた値を比較すると基本的にうまくいきます。
変数の間に「使わない文字」を入れる必要があります。文字を入れないと、例えば期待値AがA、期待値BがBC であった場合、変数AがA で変数BがBCでも、変数AがAB、変数BがCでも真になってしまうからです。
IF 変数A-変数B==期待値A-期待値B (
    処理1
) ELSE (
    処理2
)

OR


環境変数を使う方法

AND の場合と同じく、環境変数を使う方法が素直でわかりやすいです。
set TRUE_FALSE=FALSE
IF 条件A set TRUE_FALSE=TRUE
IF 条件B set TRUE_FALSE=TRUE
IF %TRUE_FALSE%==TRUE (
    処理1
) ELSE (
    処理2
)
条件A は 条件B の ELSE の中に入れたほうが無駄がないのですが、
並列に書いたほうが見やすい気がします。お好みでどうぞ。


AND も OR も環境変数の代わりに goto とラベルを使用しても良いです。

バッチファイル : 改行コードを変数に入れる

2014年8月19日火曜日

本 : 『3Dゲームをおもしろくする技術』 感想とレビュー


3Dゲームをおもしろくする技術 実例から解き明かすゲームメカニクス・レベルデザイン・カメラのノウハウ

まだ読み終わっていませんが、いろいろなゲームの操作系のコンセプトが考察されていて面白いですね。しかも図がすごく多くてわかりやすい。2Dマリオには慣性があるけど3Dマリオには慣性がないとか、冒頭からなるほどと思うことがたくさんあります。

扱っているゲームもマリオ、ゼルダ、ANUBIS、バイオなど、有名ドコロが多くて取っ付き易いです。作る側に全く縁がない人にも、普通に読み物として楽しめそうです。

2014年8月17日日曜日

アニメ : アルドノア・ゼロ 感想 第7話

超楽かった。

第6話の感想で、緊張感がなくなってきたなー、と書いたし、今回も緊張感がある(負ける・誰か死ぬ気がする)という感じではなかったけど、イナホとスレインの共闘、火星戦艦の獲得というベタな熱い展開で盛り上がったし、最後にイナホとスレインの対峙で先が気になるし。今回BGMも種類多くて豪華だった気がする。

ロケットパンチおばさんとその機体も最後まで見るとロマン(ネタ)機体としてはすごい楽しかったな。眷属(笑)、名前つけてんの!?、グーで殴れよ!とか、突っ込みどころに事欠かない。とどめに「はぁ!」と言わざるを得ない変形。

イナホは何を考えているか

敵の敵として共闘したスレインをあっさり見切る、冷酷に近い冷静さ。スレインが暗殺者側か姫様を守る側か判断がつかない状況で、不確定要素を入れたくなかった?とも考えられるけど、それなら「君は僕の敵だ」という発言はしないよなぁ。「敵」だと宣言するには、相手の目的がわかっている必要があるわけだし。

イナホは本当に姫様を何か(停戦以外)に利用する気で、そのためにはスレインが姫様を殺そうとする火星騎士側であっても、姫様を守ろうとしているとしても邪魔ということも考えられるか…?

性格と有能っぷりにやっぱり裏があるのかな。考えすぎな可能性が高いけど。

スレインはこれからどうするのか

スカイキャリアは海に沈められたのでもう修理できないだろうし、スレイン自身はスカイキャリアから脱出できたところで種子島に取り残されるだけだし。地球側が改めて捕虜として回収する可能性もあるけど、ザーツバルムに回収されて利用されそうかなぁ。

火星のカタクラフト

きっとトラウマを克服した大尉が操縦してくれるはず。というかそうでもしないと大尉の活躍の場が。。。