将棋プログラミング

(将棋に関する)ソフトウェア開発のノウハウ等。

iOSアプリのリジェクト - We discovered that your app contains obfuscated code...

iOSアプリのアップデイトが次の理由でリジェクトされた。

We discovered that your app contains obfuscated code, selector mangling, 
or features meant to subvert the App Review process by changing this app's concept after approval to the App Store.

リジェクトされた回数は数え切れないが、この理由は初めてで、心当たりもなかった。
そこで、より詳細に説明するように返信したところ、承認された。
心当たりがない場合、説明を求めるべきのようだ。

Android Gradle Plugin のアップデイト(2) - This should not happen under normal circumstances

リリースビルドを作成しようとしたら、次のエラーが起きた。

This should not happen under normal circumstances, please file an issue if it does.
...

Gradle Plugin 3.3.2 で、2MB以上の大きさの画像を使うときに起きる Gradle Plugin のバグらしい。
次の記述の追加で解決した。

// Top-level build file
allprojects {
    // Workaround for https://issuetracker.google.com/117900475
    // Remove when upgrading to AGP 3.4 or higher.
    configurations.matching { it.name == '_internal_aapt2_binary' }.all { config ->
        config.resolutionStrategy.eachDependency { details ->
            details.useVersion("3.5.0-alpha03-5252756")
        }
    }
}

参考サイト:
stackoverflow.com

Android Gradle Plugin のアップデイト - ERROR: Could not find com.android.tools.build:gradle:3.3.2.

次のエラーが起きた。

ERROR: The versions of the Android Gradle plugin and Gradle are not compatible.
Please do one of the following:
Update your plugin to version 2.4. This will require changes to build.gradle due to API changes.

そのため、Gradle Plugin のバージョンを次のように上げた。

// Top-level build file
buildscript {
     dependencies {
       // 2.2.3 -> 3.3.2 に
       classpath 'com.android.tools.build:gradle:3.3.2'
    }
}

すると、次のエラーが起きた。

ERROR: Could not find com.android.tools.build:gradle:3.3.2.

repositories に、google() を追加することで解決した。

// Top-level build file
buildscript {
    repositories {
        google() // 追加
        jcenter()
    }
}

allprojects {
    repositories {
        google() // 追加
        jcenter()
}

参考サイト:
stackoverflow.com

Xcode 10.2 の最適化のバグ

Xcode が 10.2 にアップデイトされ、それでアプリをリリースしたところ、一部の機種で動作が異常になった。
問題を確認できた機種は、iPhone 4siPad 3代目である。恐らく、32bit CPU の機種だろうと思われる。
ソースを変更していない部分で起きた問題なので、Xcode 10.2 の問題だろうと見当をつけ、Xcode 10.1 をダウンロードし、これを使うと、やはり問題なかった。
また、Xcode 10.2 でも、最適化を "None" にすると、問題がない。
以上の結果から、Xcode 10.2 の 32bit CPU に対する最適化のバグだと思われる。

昨年も Xcode をアップデイトしたとき、古い iOS の古い機種で問題が起きたときがあった。
そのときは、しばらく古い Xcode を使っていたが、古い Xcode を使い続けることもできないので、ソースを書き換え、問題を回避した。

何年も前にも、最適化すると問題が起きるアプリがあり、最適化をオフにしたときがあった。

追記:
Xcode 10.2.1 でも修正されていないことを確認した。

追記2:
Xcode 11.3.1 にも、この最適化のバグがある。
Objective-C で、構造体の要素にアクセスする際のバグである。
構造体に無意味な変数を追加することで、この最適化のバグを回避できた。
2020/03/15

Android - ScrollView を2重にする - NestedScrollView

Android で ScrollView を単純に2重に使った場合、一方しかスクロールしないようだ。
NestedScrollView で、2重にスクロール可能となった。
ScrollView では setScrollbarFadingEnabled が使えたが、NestedScrollView では、NullPointerException が発生した。

|java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ScrollBarDrawable.setAlpha(int)' on a null object reference

AlphaZero の棋譜の戦型分析

昨年12月に公開された AlphaZero の棋譜100局の戦型を分析しました。

f:id:ykakinoki:20190105050749p:plain
AlphaZero の棋譜の戦型分析

1.AlphaZero が先手

前回の記事(次)で書いたように、AlphaZero が先手の場合、初手は▲2六歩と▲7八金だけで、49勝1敗です。

ykakinoki.hateblo.jp

   次の手    棋譜数(%)    先手勝率
────────────────────────────
 1.▲2六歩      33 ( 66%)     1.000     33勝      0敗
 2.▲7八金      17 ( 34%)     0.941     16勝      1敗
────────────────────────────
計               50            0.980     49勝      1敗

その戦型は、次のようになりました。

                  戦型        棋譜数  割合(%)  先手勝率
────────────────────────────
                      (なし):     0   0.0%
  1:                  相掛かり:    33  66.0%    1.000
  2:        横歩取り△3三角型:    17  34.0%    0.941
────────────────────────────
計                                 50   100%    0.980

33局が相掛かりで、AlphaZeroが全勝、17局が横歩取り△3三角型(elmo の選択)で16勝1敗です。

横歩取り△3三角型での△3三角の次の手(17手目)は、次のように、すべて▲5八玉の青野流です。

   次の手    棋譜数(%)    先手勝率
────────────────────────────
 1.▲5八玉      17 (100%)     0.941     16勝      1敗
────────────────────────────
計               17            0.941     16勝      1敗

2.AlphaZero が後手

前回の記事で書いたように、AlphaZero が後手の場合、elmo の初手はすべて▲7六歩で、elmoの9勝41敗です。

   次の手    棋譜数(%)    先手勝率
────────────────────────────
 1.▲7六歩      50 (100%)     0.180      9勝     41敗
────────────────────────────
計               50            0.180      9勝     41敗


その戦型は、次のようになりました。

                  戦型        棋譜数  割合(%)  先手勝率
────────────────────────────
                      (なし):     0   0.0%
  1:            角換わりその他:    33  66.0%    0.152
  2:          角換わり腰掛け銀:    13  26.0%    0.308
  3:                      雁木:     2   4.0%    0.000
  4:              その他の戦型:     1   2.0%    0.000
  5:                      矢倉:     1   2.0%    0.000
────────────────────────────
計                                 50   100%    0.180

角換わりが46局と大多数です。他は、雁木が2局、矢倉とその他の戦型が1局でした。

なお、AlphaZero の棋譜は、既にプロ棋士に影響を与えている模様です。
www.toyama-shogi.com

AlphaZero の棋譜をデータベースで解析する

AlphaZero の棋譜が公開されました。
この棋譜を柿木将棋IXに付属している棋譜データベースで解析する方法を説明します。

1.AlphaZero の棋譜の入手

次のサイトの "100 AlphaZero-Elmo games (.zip file)." をダウンロードし、展開します。拡張子が .csa のCSA形式の棋譜ファイルが100局あります。
deepmind.com

2.棋譜データベース KifuBase の入手

柿木将棋IXは、Vector で1080円で販売しています。
www.vector.co.jp
また、今回の棋譜は100局なので、次で公開しているフリー版でも使えます。フリー版でも1000局の棋譜を登録できます。
将棋棋譜データベース KifuBase

3.棋譜データベース KifuBase を起動し、AlphaZero の棋譜を登録する。

(1) 棋譜データベース KifuBase を起動する。

f:id:ykakinoki:20181212071844p:plain
KifuBase の起動

(2) AlphaZero の100局の棋譜を登録する。

表操作/フォルダ指定追加のメニューを実行します。
フォルダで、AlphaZero の100局の棋譜のフォルダを指定します。
種類で、CSAを指定します。

f:id:ykakinoki:20181212072132p:plain
AlphaZero の100局の棋譜を登録する。
次のように、登録されます。
f:id:ykakinoki:20181212072432p:plain
登録後の表示

(3) データベースを保存する。

ファイル/名前を付けて保存のメニューを実行します。
例えば、"AlphaZero100"という名で、バイナリ形式で保存します。

f:id:ykakinoki:20181212072840p:plain
データベースを保存する。

4.初手を分析する。

(1) 初期配置の局面検索

柿木将棋Ⅸを起動し、ツール/棋譜データベースで局面検索のメニューを実行します。

f:id:ykakinoki:20181212073840p:plain
棋譜データベースで局面検索
KifuBase では、次のように表示されます。
f:id:ykakinoki:20181212073950p:plain
局面検索
OKを押すと、初期配置の局面検索が実行され、次の手の欄に、初手が表示されます。
なお、表示/表示項目のメニューで、棋戦等の不要な項目は表示しない設定にしています。

f:id:ykakinoki:20181212074230p:plain
初期配置の局面検索結果

(2) AlphaZero が先手

表操作/条件検索のメニューを実行します。
先手を"AlphaZero"とし、OKを押します。
ツール/次の手分析のメニューを実行します。

f:id:ykakinoki:20181212074926p:plain
AlphaZero が先手の場合の初手

AlphaZero が先手の場合、初手は▲2六歩と▲7八金だけで、49勝1敗です。

(3) AlphaZero が後手

表操作/全棋譜表示のメニューを実行し、条件検索で後手を"AlphaZero"とします。

f:id:ykakinoki:20181212075335p:plain
elmo が先手の初手
elmo が先手の50局では、初手がすべて▲7六歩で、elmoの9勝41敗です。

1局を選択し、ツールバーの"次"を押し、ツール/次の手分析のメニューを実行します。

f:id:ykakinoki:20181212075636p:plain
AlphaZero の2手目
AlphaZeroの2手目は、△8四歩が41局、△3二金が9局です。

(3) AlphaZero の成績

ツールバーの"全"を押し、ツール/対局者の統計計算のメニューを実行します。
対局者に"AlphaZero"を入力します。

f:id:ykakinoki:20181212080021p:plain
AlphaZero の成績

AlphaZero は、90勝10敗、平均手数が 204.180 とかなり長いことがわかります。

(4) その他の機能

その他、棋譜形式を一括で KIF に変換したり、戦型を自動認識し、戦型を分析したりもできます。