2013年12月21日土曜日

Nexus 5がWEB版Google Playに表示されない問題及びAndroidデバイスマネージャーに表示されない問題をGoogleに問い合わせてみた話 ( 解決しませんでした )

最初に言っておきますが、解決しませんでした。

ただ、原因が分かった事と、場合によっては改善するかもしれない方法を中の人にご教授頂いたので、それをここに載せておきたいと思います。

Nexus 5がWEB版Google Playに表示されない理由とAndroidデバイスマネージャーに表示されない理由


Nexus 5が上記の問題を引き起こす原因は、Android 4.4にその原因がある。Android 4.4 KitKatにおいて、Google Play開発者サービスに包含されるアプリケーションであるGoogle設定の位置情報の管理方法が変更されたことが直接の原因だ。

Android 4.3のGoogle設定->位置情報

Android 4.4のGoogle設定->位置情報

WEB版Google Playを介して端末にアプリケーションや、その他のコンテンツをダウンロードするには、「位置情報へのアクセス」する必要があるが、「Android 4.4 を搭載する Nexus 端末では利用できない」。

参考 : [Google設定] での位置情報の管理 - Google アカウント ヘルプ

Google Play ヘルプのお問い合わせから問い合わせて、Google Playストアに表示されない問題に対する4つの解決方法(後述)を試した後、Androidのバージョン、Google Playストアのビルドバージョン等の追加情報と共に再度問い合わせた所、Google設定で位置情報アクセスが利用出来ないことが原因である、と伝えられた。

非常に迅速な対応をして頂き、理由が明確に分かったのも素晴らしいが、Android 4.4にバージョンアップしたことで利用できなくなる、というのは甚だ残念だ。出来れば早めに改善して頂けると喜ばしい。

Androidデバイスマネージャーを利用出来ないのも同じ理由だろう。どう考えても同アプリは位置情報へのアクセスが必須であるので、その為利用できないのだろう。


Androidデバイスマネージャーは上記の画面で延々とロードし続ける。

もしNexus 5で上記の問題が発生していない方、解決した方は連絡下さると嬉しいです。

問題を解決しうる4つの方法

残念ながらAndroid 4.4では解決しなかったが、4.3以下では以下の方法で解決しうることをGoogleサポートの中の人からご享受いただいたのでここに載せる(原文ママ)

-------

【 A 】 アカウントの入れ直し
※アカウントの情報が消えることはございませんので、ご安心ください。

1. メニュー > [設定] > [アカウントと同期] に移動します。

2. 削除するアカウントの名前をタップして、メニュー > [アカウントを削除] をタップします。

アカウントの削除後に、次の手順を行うことで再度アカウントを端末に追加することができます。

3. メニュー > [設定] > [アカウントと同期] に移動し、[アカウントを追加] をタップします。

4. 表示される手順どおりにアカウント情報を入力し再度追加します。

-------

【 B 】 端末の再起動

-------

【 C 】 Play ストア アプリのキャッシュとデータの消去

1. [設定] > [アプリ] > [すべて] を開きます。

2. 下にスクロールして [Google Play ストア] をタップします。

3. [キャッシュを消去] [データを消去] をタップします。

-------

【 D 】 Play ストアのアップデートをアン インストール

1. [設定] > [アプリ] > [すべて] を開きます。

2. 下にスクロールして [Google Play ストア] をタップします。

3. [アップデートのアン インストール] をタップし、出荷状態に戻します。

4. 再度 Play ストア アプリ を開き、しばらくすると、最新版に 更新されます。

-------

2013年12月14日土曜日

初めてテンプレートメタプログラミングに触れてみた

初めてテンプレートメタプログラミングというものに触れた。 正直今でも何が起こっているのかは理解できてない。 以下はテンプレートメタプログラミングで整数の整数乗を求めるプログラム。 尚、型は全てint。

#include <iostream>

// default
template< int base, int iexp, bool = iexp >= 0 >
struct Pow{
	// fallback for iexp < 0
	static const int value = 0;
};

// specialization for iexp >= 0
template< int base, int iexp >
struct Pow< base, iexp, true >{
	// base ^ iexp = base * base ^ ( iexp - 1 )
	static const int value = base * Pow< base, iexp - 1 >::value;
};

// specialization for iexp == 0
template< int base >
struct Pow< base, 0, true >{
	// base ^ 0 = 1
	static const int value = 1;
};

int main( void ){
	std::cout << "2 ^ -2 = " << Pow< 2, -2 >::value << std::endl;
	std::cout << "2 ^ -1 = " << Pow< 2, -1 >::value << std::endl;
	std::cout << "2 ^  0 = " << Pow< 2,  0 >::value << std::endl;
	std::cout << "2 ^  1 = " << Pow< 2,  1 >::value << std::endl;
	std::cout << "2 ^  2 = " << Pow< 2,  2 >::value << std::endl;

	return 0;
}
コンパイル時定数では浮動小数点実数は扱えない(constexpr等の例外を除く)らしい(嘘をついているかも)ので、 扱う変数valueの型はstatic const int型としている。

そのため、負数乗は全て0とした。 iexpが0未満の時は全てデフォルトの定義になる。

0乗は1、自然数乗は再帰を行うように定義している。

よく分かっていないのは bool = iexp >= 0 という式。 型だけ書いて変数名(識別子)を書かないのはテンプレートだから許されるのだろうか。 おそらく、関数のプロトタイプ宣言をする時に、形名だけを書くのと似たようなものだろうと思っている。 どちらも同じ「引数」だし。

あと、2つ目の定義と3つ目の定義のどちらを使用するのかをコンパイラがどうやって決めているのかもよく分かんない。 C++怖い。

あ、間違いあったら教えて下さい。

2013.12.16追記 ※constexprが使える環境ならconstexprを使うべきと思われる。
このコードはMSVC++2008で書いたのでconstexprは使えなかった。