td2sk の日記

技術メモとかゲームとか

千の刃濤、桃花染の皇姫 体験版考察/プレイメモ

蛮族がストーリーに大きく関わってくる前提でいろいろ妄想考察。
思いついたこと、気になった点をとりあえず箇条書きで書きだしてみる。
発売したら答え合わせしよう。

蛮族とは

  • 今回のSF(すこし不思議)要素?
  • 倒したでも、封印したでもなく、"手なづけた"という表現
    • 滅んだわけではなさそうで、現代まで生き延びた蛮族が作中に登場しそう
    • 主要キャラにも関係者が複数いるかも
  • 呪術使えそう
    • そもそも呪術的な力は蛮族由来?
    • 呪術により蛮族を手なづけた、という記述と矛盾するのでこの線は薄いかも


小此木は本当に悪人なのか

善人説
  • 朱璃を泳がせている理由がウソっぽい
    • 単なる権力欲による行動ではなさそう
    • 自白を録音させたのもわざと?
  • 小此木は蘇芳帝を殺していない?
    • 蘇芳帝はしきたりに従って自害したかも(後述)
  • 帝国に従うほうがまだマシな事態が裏で進行している?
    • 蛮族の復活とか
    • 刀を研ぎ直そうとしているのは蛮族対策?
    • 蘇芳帝が蛮族と手を組んだor蛮族の封印を維持できなかったため排除した?
悪人説
  • 徹底的な弾圧はポーズにしてもやり過ぎ?
    • 善人なら死者を弔う行事ぐらいは認めそう
  • 蛮族と関係?
    • 蛮族と手を結んで国を奪った
    • 実は蛮族の末裔
    • 蛮族の呪術で操られているor蛮族の力を得た
      • 目に埋め込まれた宝石?

善人だとして、悪人のフリをする理由はちょっとわからない。
また、善人/悪人にかかわらず、皇国人=蛮族、みたいな認識はあるかもしれない。
それゆえの弾圧?

ロシェルと部下の女

  • 名前は出ていないが力の入った立ち絵
  • 初見でユースティアのガウを思い出した
    • あるいはルキウスとシスティナ
    • シナリオ上の立ち位置も似通ってるかも
  • 蛮族の末裔っぽい
    • ロシェルは飼い主? それとも末裔?
  • 時折入る謎の声の2人、こいつらでは
    • 主人公が叫ぶシーン
    • ラスト





歴代皇帝が遵守してきた責務

"国の平穏を守れないときは、その命をもって許しを請う" という伝統に呪術的な意味はあるか

  • 例えば蛮族を手なづけた封印の強化など
  • 小此木や誘拐犯が朱璃に危害を加えない理由?
    • 下手に殺すのではなく、封印を解かせたいとか
  • 刀の声(?)に操られた滸は朱璃を本気で殺そうとしていたように思える
    • 誘拐犯は危害は加えなかった
    • 異なる目的を持ったグループ?

実家跡で拾った櫛

  • 義妹の確認に使うだけ? 他に役割は

時折入る回想の意味

  • 前世の縁?
    • 皇姫とそれを守る武人として代々(血とは別の意味で)つながりがあるとか
    • 記憶を失う前の主人公の「そうか、やはり君は」というセリフは前世の記憶?

朱璃が刀を使える理由

  • わからん^^
  • 義妹は囮で実は主人公と朱璃で兄妹だったりして。ないか

腕が治った理由

  • わからん^^

店長

  • 彼の呪術はどうも蛮族側に由来しそう。とはいえ主人公の味方っぽい
  • 蛮族の末裔か何か?

最後に来た人影

  • エルザっぽい


子柚

  • 奉刀会側のスパイがいるように、皇国or蛮族側にも奉刀会へのスパイがいるかも?
  • とはいえ奉刀会で名前の出たキャラほとんどいないし、いても候補は相当限られる

睦美さん

  • ユースティアでいうところのメルトポジ
  • サブヒロインなので死なないとは思うが、ルートによってはわからん……
  • オーガスト作品の妙に美味そうな料理描写担当

稲生滸ちゃん

  • くっそかわいいんだけど何の呪術ですか

これだけ書いて蛮族関係なかったら恥ずかしい……。

大画面4KテレビをPCディスプレイとして利用する際に考慮すること

はじめに

このたび、PC用ディスプレイとして、43インチの4Kテレビを購入した。
安くない買い物なので、失敗のないよう選ぶ観点などを簡単にまとめておく。

2016/5/11 追記

フィリップスから、下で説明する条件をすべて満たす4Kディスプレイが登場した。
http://www.philips.co.jp/c-p/BDM4350UC_11/brilliance-4k-ultra-hd-lcd-display
テレビ機能が不要な場合は、スペックを確認ののちこちらの購入検討を推奨。*1

2016/6/4 追記

フィリップスのディスプレイだが、発売2ヶ月足らずでメーカーの製品情報ページから削除されたようだ。
原因は分からないが、早くも生産終了に向かっているのかもしれない。*2

免責

本記事には間違いがあるかもしれないので、購入の際はそれぞれの製品の仕様、規格について改めて確認すること。
筆者は一切の保証をしない。

4Kテレビを選ぶ理由

一般に高解像度のディスプレイでは、DPIを調整してレンダリングの質を向上させることが多い。この場合、実質的な解像度は下がってしまう。
一方、DPI調整を行わなければ、4Kの解像度をそのまま広大な作業空間として利用できる。
しかし、そのためには文字を視認するために40インチ級の画面サイズが必要になる。
残念ながら、40インチを越えるPCディスプレイはほとんどなく、4Kテレビから探すことになる。

インチ数について

PC用4Kディスプレイは、下は23インチから上は50インチ程度まで様々なモデルが存在するが、23〜28インチの製品が多い。
DPI調整をしない場合、28インチの4Kディスプレイは14インチのフルHDディスプレイ四枚分ということになる。ノートPCで見慣れている解像度ではあるが、デスクトップ用途にはやや小さい感じがする。

一方、46インチ以上では、画面の横幅は1mを超える。PC用ディスプレイとしてデスクに置き、1m離れて使うには、大きすぎて画面全体を視認するのが難しいだろう。

結果として、30インチ台後半 〜 40インチ台前半が望ましいといえる。
このサイズでは選択肢がテレビしかないのは前述の通りだ。

4Kテレビとして出回っているものの中で、最小のものは40インチ(実寸39.5インチ)だろう。
しかし、40インチを始めとする特定サイズのパネルは、製造原価をおさえるために画素が正方形ではなく、わずか1.7%程度ではあるが本来の16:9より横長になっているようだ。映像用途であればともかく、PC用途ではこの微妙な歪みを許容できない人もいるだろう。
今回はそのような心配がないと思われる、43インチのテレビを選択した。

必要とするサイズは人によって異なる。電器屋で実機を見たり、新聞紙の切り貼りで再現したパネルを部屋に置くなどして、適切なサイズを絞り込もう。

液晶の種類について

テレビの液晶パネルでは、主に VA と IPS が用いられている。
VA は黒のコントラスト、IPS は視野角に優れており、一般的なテレビ用途では一長一短といえる。

しかし、PCディスプレイとして用いる場合は注意が必要になる。
VA パネルでは視界の中央と端で色味が変わってしまうのだ。
これは、大画面を至近距離で見ることになるため、画面中央と画面端で視線の入射角が大きく異なることによる。
そのため、PCディスプレイ用途では IPS のほうが良いだろう。VA タイプの製品を選ぶ場合は、店頭で至近距離から見て色味を確認すること。

接続方式について

4K映像を出力できるインタフェースとして、HDMI 2.0 と DisplayPort 1.2 がある。

4K(3860x2160)を越える解像度*3のディスプレイを選ぶ場合は、DisplayPort しか選択肢がない。
一方、大画面4Kの場合はテレビを使うことになるが、国内で DisplayPort 端子のあるテレビはほとんどなく、HDMI 2.0 を使うことになる。

信号

色信号のフォーマットには YCbCr444、YCbCr422、YCbCr420、RGB444 などがある。
それぞれの詳細な説明は省くが、PC環境では RGB444 を使うとよい。
PC とテレビを単純に接続しただけでは YCbCr420 となって滲みが生じたりする。

また、信号の階調としてフル(0〜255)とリミテッド(16〜235)がある。
映像信号ではリミテッドが主流なようだが、PC用ディスプレイとしてはフルが使えるものを選びたい。

PC側

4Kディスプレイを使うには、GPU の性能もそれなりに必要だ。
私の環境では MSI の GTX 970 GAMING 4G を使っている。

Haswell 以降の Intel HD Graphics も4K出力ができるそうだが、筆者環境では試していない。

グラボ選択の際には以下の点を確認すること。

  • HDMI 2.0 出力端子があること
  • 4K60p RGB444 出力に対応していること
  • 目的のアプリケーションが快適に動作すること*4

テレビ側

ほとんどのテレビはグレアパネルである。
ノングレア派としては残念だが、できる限り映り込みの少ないテレビを選択するしかない。
家電量販店で、店員に了解を取りテレビの電源を切るなどして、事前に納得行くまで確認しよう。
テレビ購入の際には以下の点に注意する。

  • HDMI 2.0 対応端子があること
  • 4K60p 表示できること
  • PC モードがあること
    • 低遅延かつ余計な映像処理をしないモード
  • フルレンジの RGB444 信号を表示できること
  • 画素が正方形であること
  • 映り込みがきつくないこと

今回はこの条件を満たすテレビとして、東芝の43G20Xを選択した*5。購入時価格は11万円前半。

2016/5/11 追記
43G20Xだが、購入後3ヶ月で故障した。そういったことが起こるのは仕方ないことだが
なぜだか新品への交換手配で2ヶ月近く待たされている。*6
このようなサポート体制では、2〜3ヶ月テレビが使えなくても困らない奇特な人以外には購入をおすすめできない。

テレビ側設定

43G20X で、PCをHDMI 1に接続した際の設定例を紹介する。

  • 映像設定
    • 映像メニュー: PC
    • 映像調整
      • バックライト: 20
  • 機能設定
    • 外部入力設定
      • 外部入力表示設定
        • HDMI1: PC
      • HDMI 1 モード設定: 高速信号モード
      • HDMI 自動画質モード設定
      • RGB レンジ設定
        • HDMI1: オート
    • 信号フォーマット詳細表示設定: オン

モード設定で高速信号モード*7を選ぶことで、PC 側で YCbCr444 や RGB444 を選択できるようになる。

PC側設定

私の使っている GTX970 では、NVIDIA のコントロールパネルから設定ができる。
今回は以下のように設定した。

  • 解像度: 4k x 2k (3860x2160)
  • リフレッシュレート: 60Hz
  • 色深度: 最高(32bit)
  • 出力時色深度: 8bpc
  • 出力カラーフォーマット: RGB
  • 出力ダイナミックレンジ: フル

カラーフォーマットやダイナミックレンジの変更ができない場合、テレビ側の設定が間違っている可能性がある。
テレビの設定を見直すこと。

確認

テレビリモコンの画面表示ボタンを押すと現状の設定を確認することができる。
以下の設定になっていればよい。

  • コンテンツタイプ: グラフィックス
  • 解像度: 3840 x 2160
  • 走査方式: プログレッシブ
  • 垂直周波数: 60Hz
  • アスペクト比: 16:9
  • 色深度: 24bit
  • 色空間: sRGB
  • RGB/Y色差: RGB(フル)
  • クロマフォーマット: (空欄)
  • 音声フォーマット: PCM

RGB(リミテッド) や、クロマフォーマットの項にYCbCrなどの表記がある場合は、正しく設定できていない。

まとめ

(TODO 後日追記予定)

*1:サブピクセル配列がBGRであること、わずかな遅延があることが報告されているため、事前に確認すること。

*2:価格com等で初期不良の話を見かけるのと関係があるのかも……?

*3:4160x2160 や 5120x2880

*4:4K解像度で最新のハイエンドゲームを遊ぶ場合、60fpsを維持するにはGTX980の2枚刺しやそれ以上の性能が必要になる。軽めのゲームならIntel HD Graphics でも動く

*5:43G20X が本当に RGB444 のフルレンジをそのまま表示できるのか、筆者は保証しない

*6:現行モデルのため、市中在庫も十分にあるはずだが……

*7:モード名はメーカーや機種毎に異なるようだ

【Makefile】依存関係を自動生成する試み2014

かつて書いたMakefile、改めて見なおしてみるとどうにも醜い。
10分ほど試行錯誤したら、汚いハックをあっさり取り除けたので訂正して公開。
2年前の自分は何考えてたんだ……。

以下、パブリックドメインとするので、煮るなり焼くなり好きにしてください。

PROGRAM_NAME := $(shell basename `pwd`)
 
# compiler
CXX := clang++
CXXFLAGS := -O2 -Wextra
LIBS :=
 
# out
OUT_DIR := out
 
# program
PROGRAM_DIR := $(OUT_DIR)/bin
PROGRAM := $(PROGRAM_DIR)/$(PROGRAM_NAME)
 
# sources
SOURCE_DIR := src
SOURCES := $(wildcard $(SOURCE_DIR)/*.cpp)
SOURCE_NAMES = $(notdir $(SOURCES))
 
# headers
HEADER_DIR := include
HEADERS := $(wildcard $(HEADER_DIR)/*.hpp)
 
# objs
OBJ_DIR := $(OUT_DIR)/obj
OBJS := $(addprefix $(OBJ_DIR)/,$(SOURCE_NAMES:.cpp=.o))
 
# dependencies
DEPEND_DIR := $(OUT_DIR)/depend
DEPENDS := $(addprefix $(DEPEND_DIR)/,$(SOURCE_NAMES:.cpp=.depend))
 
.PHONY: all
all: $(DEPENDS) $(PROGRAM)
$(PROGRAM): $(OBJS)
        @mkdir -p $(PROGRAM_DIR)
        $(CXX) $(CXXFLAGS) $(LIBS) $^ -o $(PROGRAM)
 
$(DEPEND_DIR)/%.depend: $(SOURCE_DIR)/%.cpp $(HEADERS)
        @echo "generating $@"
        @mkdir -p $(DEPEND_DIR)
        @$(CXX) $(CXXFLAGS) $(LIBS) -I$(HEADER_DIR) -MM $< > $@
 
$(OBJ_DIR)/%.o: $(SOURCE_DIR)/%.cpp
        @mkdir -p $(OBJ_DIR)
        $(CXX) $(CXXFLAGS) $(LIBS) -I$(HEADER_DIR) -c $^ -o $@
 
 
ifneq "$(MAKECMDGOALS)" "clean"
-include $(DEPENDS)
endif
 
.PHONY : clean
clean:
        $(RM) -r $(OUT_DIR)

makedepend? なにそれおいしいの?

CM12 for HTCJ

概要

CyanogenMod 12 (Android 5.0) が起動できたのでご報告

動作状況

安定しているもの
  • Android5.0
  • SDカード
  • 標準アプリ
  • 充電ランプ
  • WiFi
  • Bluetooth (未検証)
  • センサー
    • 明るさ
    • 回転
既知の問題

お願い

  • 起動しなくても文句言わない
  • 高級文鎮になっても文句言わない
  • 不具合報告はどんどん投げよう
  • 不具合報告に対応しなくても文句言わない
    • 自分でパッチを投げよう

ビルド手順

# ファイル取得
cd $ANDROID_ROOT

repo init -u git://github.com/CyanogenMod/android.git -b cm-12.0
repo sync -j32

git clone git://github.com/CyanogenMod/android_device_htc_msm8960-common -b cm-12.0 device/htc/msm8960-common
git clone git://github.com/CyanogenMod/android_device_htc_s4-common -b cm-12.0 device/htc/s4-common
git clone git://github.com/td2sk/android_device_htc_valentewx -b cm-12.0 device/htc/valentewx

git clone git://github.com/kbc-developers/android_kernel_htc_msm8960 -b cm-11.0 kernel/htc/msm8960
git clone git://github.com/TheMuppets/proprietary_vendor_htc -b cm-12.0 vendor/htc

git clone git://github.com/kbc-developers/proprietary_vendor_htc -b cm-12.0 vendor/htc_cm-11.0 --depth 1
mv $ANDROID_ROOT/vendor/htc_cm-11.0/valentewx $ANDROID_ROOT/vendor/htc/

cd $ANDROID_ROOT/vendor/cm
./get-prebuilts
echo "add_lunch_combo cm_valentewx-userdebug" >> vendorsetup.sh

# 動かないので、さよなら
cd $ANDROID_ROOT/device/htc/s4-common
rm camera -rf

# ifneq のデバイス名判定に valentewx を追加する
cd $ANDROID_ROOT/device/htc/s4-common
vi Android.mk
vi wcnss_htc/Android.mk


# ビルド
cd $ANDROID_ROOT
brunch

できたもの

kienu
AndroidFileHost

焼き方

# 0. ファイルを準備する
# 自分でビルドする or 上のリンクから取得

# 1. 改変リカバリでブート
fastboot boot custom-recovery.img

# 2. /bin/sh を送り込む
#   自分でビルドしたひとはそのまま実行
#   ダウンロードしたものを焼く人は
#     * cm12-alpha.7z にある out フォルダのパスを、環境変数 ANDROID_PRODUCT_ROOT に設定
adb sync

# 3. /system 以下を整理
#   data以下は必要に応じて削除 (アプリ類を消さないと動かないかも)
adb shell
(adb) mount system
(adb) mount data
(adb) rm -rf /system/*
(adb) rm -rf /data/app/*
(adb) rm -rf /data/app-private/*
(adb) rm -rf /data/dalvik-cache/*
(adb) rm -rf /data/data/*

# 4. adb sync で流し込み
adb sync

# 5. bootloader へ再起動し、改変イメージでブート
#  初回起動には時間がかかるので、気長に待つ
fastboot boot boot.img

改変内容

リカバリ
  • fstab の system の項目を ro から rw に変更
ブート
  • USB デバッグしやすいように、下記属性を設定
    • ro.adb.secure=0
    • ro.secure=0
カーネル
  • SELinux を Disable に設定
    • デフォルトで permissive になるはずなので設定不要?

画面


HTCJ CM12 ビルド方法

(11/23更新) より新しい手順を公開しました。

取り急ぎ共有まで。
不要な差分とか絶対パス()は適宜修正してください。

バイス固有ファイル

git clone http://github.com/kbc-developers/android_device_htc_valentewx -b cm.11.0 $ANDROID_ROOT/device/htc/valentewx
git clone http://github.com/kbc-developers/android_device_htc_msm8960-common -b cm.11.0 $ANDROID_ROOT/device/htc/valentewx
git clone http://github.com/kbc-developers/android_device_htc_s4-common -b cm.11.0 $ANDROID_ROOT/device/htc/valentewx
git clone http://github.com/kbc-developers/android_kernel_htc_msm8960 -b cm-11.0 $ANDROID_ROOT/kernel/htc/valentewx
git clone http://github.com/kbc-developers/proprietary_vendor_htc -b cm-11.0 $ANDROID_ROOT/vendor/htc

Android L for J 画面が点かない問題について

概要

  • L for J で画面がつかない
  • 以下のエラーログ
<sharedmem_gpumem_alloc:991>: sharedmem_gpumem_alloc: mmap failed errno 22 Invalid argument

原因

暫定対応

Android L for J 作業ログ

概要

下記手順でビルドすると

  • android ロゴ表示
  • adb で接続可能
  • AndroidRuntime が非業の死からの輪廻転生

まで動く。

完成品はこちら

作業途中のため、

  • 手順漏れ
  • 不要手順
  • 絶対パス(ユーザ名入り)

などなど散々なメモなので注意。ただいま簡略化中。

ハードウェア部分取得

proprietary

diff --git a/valentewx/valentewx-vendor-blobs.mk b/valentewx/valentewx-vendor-blobs.mk
index f526d00..7a0d51f 100644
--- a/valentewx/valentewx-vendor-blobs.mk
+++ b/valentewx/valentewx-vendor-blobs.mk
@@ -56,10 +56,4 @@ PRODUCT_COPY_FILES += \
        vendor/htc/valentewx/proprietary/bin/felica_startup:/system/bin/felica_startup \
        vendor/htc/valentewx/proprietary/etc/felica/common.cfg:/system/etc/felica/common.cfg \
        vendor/htc/valentewx/proprietary/etc/felica/mfm.cfg:/system/etc/felica/mfm.cfg \
-       vendor/htc/valentewx/proprietary/etc/felica/mfs.cfg:/system/etc/felica/mfs.cfg \
-       vendor/htc/valentewx/proprietary/app/GMobileTV.apk:/system/app/GMobileTV.apk \
-        vendor/htc/valentewx/proprietary/app/KDDI_Felicalock.apk:/system/app/KDDI_Felicalock.apk \
-        vendor/htc/valentewx/proprietary/app/MobileFeliCaClient.apk:/system/app/MobileFeliCaClient.apk \
-        vendor/htc/valentewx/proprietary/app/MobileFeliCaMenuApp.apk:/system/app/MobileFeliCaMenuApp.apk \
-        vendor/htc/valentewx/proprietary/app/MobileFeliCaSettingApp.apk:/system/app/MobileFeliCaSettingApp.apk \
-        vendor/htc/valentewx/proprietary/app/MobileFeliCaWebPluginBoot.apk:/system/app/MobileFeliCaWebPluginBoot.apk
+       vendor/htc/valentewx/proprietary/etc/felica/mfs.cfg:/system/etc/felica/mfs.cfg

kernel

diff --git a/AndroidKernel.mk b/AndroidKernel.mk
index 36c139e..51c366c 100644
--- a/AndroidKernel.mk
+++ b/AndroidKernel.mk
@@ -3,7 +3,7 @@ PERL            = perl
 
 ifeq ($(TARGET_PREBUILT_KERNEL),)
 
-KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ
+KERNEL_OUT := /home/td2sk/aosp/out/target/product/valentewx/obj/KERNEL_OBJ
 KERNEL_CONFIG := $(KERNEL_OUT)/.config
 TARGET_PREBUILT_INT_KERNEL := $(KERNEL_OUT)/arch/arm/boot/zImage
 KERNEL_HEADERS_INSTALL := $(KERNEL_OUT)/usr
@@ -62,30 +62,30 @@ $(KERNEL_OUT):
        mkdir -p $(KERNEL_OUT)
 
 $(KERNEL_CONFIG): $(KERNEL_OUT)
-       $(MAKE) -C kernel O=../$(KERNEL_OUT) ARCH=arm CROSS_COMPILE=arm-eabi- $(KERNEL_DEFCONFIG)
+       $(MAKE) -C kernel/htc/valentewx O=../$(KERNEL_OUT) ARCH=arm CROSS_COMPILE=arm-eabi- $(KERNEL_DEFCONFIG)
 
 $(KERNEL_OUT)/piggy : $(TARGET_PREBUILT_INT_KERNEL)
        $(hide) gunzip -c $(KERNEL_OUT)/arch/arm/boot/compressed/piggy.gzip > $(KERNEL_OUT)/piggy
 
 $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_OUT) $(KERNEL_CONFIG) $(KERNEL_HEADERS_INSTALL)
-       $(MAKE) -C kernel O=../$(KERNEL_OUT) ARCH=arm CROSS_COMPILE=arm-eabi-
-       $(MAKE) -C kernel O=../$(KERNEL_OUT) ARCH=arm CROSS_COMPILE=arm-eabi- modules
-       $(MAKE) -C kernel O=../$(KERNEL_OUT) INSTALL_MOD_PATH=../../$(KERNEL_MODULES_INSTALL) INSTALL_MOD_STRIP=1 ARCH=arm CR+       $(MAKE) -C kernel/htc/valentewx O=../$(KERNEL_OUT) ARCH=arm CROSS_COMPILE=arm-eabi-
+       $(MAKE) -C kernel/htc/valentewx O=../$(KERNEL_OUT) ARCH=arm CROSS_COMPILE=arm-eabi- modules
+       $(MAKE) -C kernel/htc/valentewx O=../$(KERNEL_OUT) INSTALL_MOD_PATH=../../$(KERNEL_MODULES_INSTALL) INSTALL_MOD_STRIP        $(mv-modules)
        $(clean-module-folder)
        $(append-dtb)
 
 $(KERNEL_HEADERS_INSTALL): $(KERNEL_OUT) $(KERNEL_CONFIG)
-       $(MAKE) -C kernel O=../$(KERNEL_OUT) ARCH=arm CROSS_COMPILE=arm-eabi- headers_install
+       $(MAKE) -C kernel/htc/valentewx O=../$(KERNEL_OUT) ARCH=arm CROSS_COMPILE=arm-eabi- headers_install

その他