yukinobe’s blog

アプリ開発、パソコン、スマホ等の技術的な雑記

REGZAのハードディスク復旧

REGZA(レグザ)で使用しているハードディスクが認識しなくなりました。その復旧の方法と顛末。

 

REGZA Z1のテレビ録画に使用しているハードディスクが突然に認識されなくなりました。いろいろ録画してあるのにショックがでかい。で、まずはと復旧方法をググりました。

 

基本的にはこのサイトの情報にとてもお世話になりました。復旧の代行サービスもしているようです。

www.4682.info

 

まずは認識しなくなった元ディスクはそのまま保全するためにデュプリケーターで複製を作成。パソコンいらずでこの機械だけで複製できるので便利です。

以降、復旧作業は複製したディスクを対象とする。

 

 

REGZALinuxなどで使用されているXFSフォーマットを使用しているようで、xfsrepairなどの復旧コマンドを実行するためにUbuntuが必要な模様。

 

インストールしなくてもLiveディスクで良いようなので、ディスクを作成してUbuntuを起動。ハードディスクのパソコンへの接続にもデュプリケーターが使えるのでやはり便利。

先ほどのサイトではxfsrepairコマンドよりもおススメの復旧方法があったですが、ディスクは複製して原本はとっておいてあるし、とりあえずお手軽なxfsrepairコマンドでいいだろうと実行。コマンドは正常終了。

 

あとはテレビにつないでちゃんと認識してくれるか。認識しました!

 

認識しなくなったときはやっちまったなあととてもブルーになっていたので、めちゃくちゃ嬉しかったです。これを機にずっと放置していたテレビ録画環境を整備しないとと一念発起。

RAID1構成のUSDハードディスクやLANハードディスクを導入していくのですが、このとき既存のLink Stationのディスク入れ替えでひと悶着あったので次回はその話で。

 

 

Cocos-2dx V.2 の64ビット化

Google Play では2021/8から、64ビット化されていないアプリは排除されることになっています。

 

“Google Play”のアプリは64bit対応が必須へ ~Googleが移行のロードマップを公開 - 窓の杜

 

今さらCocos-2dxをいじるとかいう徒労はしたくないのが本音ですが、やらないとストアから排除されてしまうので、仕方なく重い腰を上げました。

案の定、かなりの時間を食われて、もう64ビット化は諦めようと何度も思ったのですが、何とか移行に成功したのでその過程を記録に残します。

2021年の今どきにCocos-2dx v2の新規記事ですよ?これはとても貴重ですからね。

 

環境

macOs Catalina 10.15.6

Android Studio 3.4

Cocos-2dx V.2.2.6

 

EclipseAndroid Studio

Cocos-2dxの64ビット化と直接関係はないのですが、そもそもがEclipseで開発していたので、まずはこれをAndroid Studioに移行しました。基本的にはAndroid Studioのインポート機能を使って、 出てくるエラーを潰していったらビルドに成功しました。

出たエラーは以下の通り。
 
・Build.Gradle の以下の設定をtargetSdkVersionに合わせて28にした(これはのちにストアの要求に合わせて29に上げたはず)
compileSdkVersion 28
 
・なんとAndroidはメソッドが65535を越えるとビルドに失敗するらしい。ダサい。Build.Gradleに以下の設定を追加。
 minSdkVersionが20以下ならmultiplexサポートライブラリの追加も必要らしい。

 

    compileSdkVersion 28
    buildToolsVersion "28.0.3"
 
    defaultConfig {
  〜〜〜
        multiDexEnabled true
〜〜〜
dependencies {
 〜〜〜
   compile 'com.android.support:multidex:1.0.3'
}

 

●Cocos-2dx 64ビット化

EclipseではNDKはr11cを使っていたのですがエラーが出て、どうもr10c にしないといけない模様。この辺、関連ページをEvernoteに保存していたはずなのですが、見当たらず。。

まあ、それでNDK r10cをダウンロードしてこようとしたら、なんと10c~10eだけは拡張子binファイルという、何やら古いMacのパッケージ形式らしく、なんと完全64ビット化されたCatalinaでは解凍ができない。

うちにある新旧Mac(Mini2014, 2018)はどちらもCatalinaにバージョンアップ済み。解凍できない!ってことで、Mini2014をタイムマシンを使って一晩かけてHigh Sierraに戻して解凍。

NDK r10c にしたら今度は以下のエラー。

Parameter specified as non-null is null: method com.android.build.gradle.internal.cxx.configure.JsonGenerationVariantConfiguration., parameter ndkVersion

 

調べたら、r11以降のNDKのルートディレクトリにあるsource.propertiesファイルを同じくr10のルートにコピればいいらしい。中身は特に書き換えなくても大丈夫でした。

 

gradle - Android Studio 3.2.1 - NDK r10e sync fail? - Stack Overflow

 

自分の場合はAdMobのRewardのエラーも出ていたのだけれど、これはGoogle Mobile Adsのモジュールの問題はソースとバージョンがうまく合っていなかった模様。
File→File→Project Structure… のDependenciesからplay-services-adsのバージョンをいろいろ試して、12にしたところうまくいきました。

 

cocosの64ビットライブラリのコピーは基本的に以下のサイトを参考にその通りにしました。

 

coffeee.hatenablog.com

 

個人的に引っかかったのは、gradle.propertiesでPROP_APP_ABI=armeabi-v7a:arm64-v8aとすれば問題ないはずなのに、なぜかMIPSやら余計なものまでリンクしようとする動作。

原因はGradleファイルでabiFiltersの2行がコメントアウトされていたから。なんで?

ndk {
    moduleName "cocos2dcpp_shared"
    //abiFilters = []
    //abiFilters.addAll(PROP_APP_ABI.split(':').collect{it as String})
}
 

あと、非常に悩まされたのがopenssl/ssl.hファイルが無いと言われるエラー。

 

cocos2d-x-2.2.6/external/libwebsockets/android/include/libwebsockets.h:247:25: fatal error: openssl/ssl.h: No such file or directory

 

ちゃんとopensslフォルダもv3からexternalフォルダにコピってきたし、ssl.hファイルだってあるのに。

libwebsockets.hからの参照でエラーになってるから、websocketsのビルドに問題があると思っていろいろ調べて試したけど、結局のところそのさらに上の呼び元のextentions/networkフォルダのcppファイルとhファイルをすべてv3→v2でコピーしたらビルドが通りました(ここすごい時間かかったよー)。

 

少なくとも丸4,5日くらいは潰したと思いますが、なんとかCocos-2dx V2の64ビット化に成功しました。もう、願わくばこれ以上の修正を要求するようなことは勘弁してください、ストア様…

 

 

Unityでの理不尽な動作

プログラマーならあるあるだと思いますが、どう考えても正しくない、おかしな動作をするときってありますよね?

そんな現象の解決に余裕で2,3日の時間を取られたり…

まあ、そんな現象に出くわしたので、もうこれ見てくださいよ!って愚痴です。

UnityでFirebaseを使用してログイン処理後に動きなのですが、メンバ変数 ret にログイン成否のステータスを渡して呼び元に返そうという処理ですが、 なぜか ret = "success" だけ値が設定されません。というか、確認したらコード自体が実行されていませんでした。

// ログイン処理
    public Task SignIn(string id, string pw)
    {
        ret = null;
        auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

        Task taskFirebase = 
                auth.SignInWithEmailAndPasswordAsync(id, pw).ContinueWith(task =>
        {
            if (task.IsCanceled)
            {
                Debug.Log("TokenAsync was canceled.");
                ret = "cancel";
                return;
            }

            if (task.IsFaulted)
            {
                Debug.Log("TokenAsync encountered an error");
                ret = "fault";
                return;
            }

            Firebase.Auth.FirebaseUser newUser = task.Result;
            Debug.LogFormat("User signed in successfully: {0} ({1})",
                                          newUser.DisplayName, newUser.UserId);
            ret = "success";    // ← このコードがそもそも実行されない。
            return;
        });

        Debug.Log("SignIn() End.");
        return taskFirebase;

    }

それなのに、順番を上に持ってきただけで ret = "success" が実行されました。

            ret = "success";    // ← 位置を上に持ってきたら実行された。
            Firebase.Auth.FirebaseUser newUser = task.Result;
            Debug.LogFormat("User signed in successfully: {0} ({1})",
                                          newUser.DisplayName, newUser.UserId);
            return;

まあ、こんな問題に対処するのに軽く3日ですよ…

だって、理屈的にはこんなことあり得ないですから。

ただ、ビルドして実機で実行したときには想定通りの動きをしていたので、Unity IDE 上での実行だからという可能性は高いです。

きっと、Firebaseのログイン処理が非同期であることも妖しい動きを誘発しているとは思いますが。

ブログのネタにでもしないとやってられません。  

アプリ開発時の調べ事など

プロフィールにも書いた通りなんですが、ひとりでアプリ開発していると、とても孤独なんですね。

 

アプリが完成するまでは何もアウトプットすることができない。

だったら、その途中にいろいろと調べ事はするわけだから、それをアウトプットして発散すればいいのではないか?と。

 

今までは調べた結果などはEvernoteに殴り書きしていたのですが、

ブログにも書いてみようかと。

技術的なメモならQiitaに書くという選択肢もあるかもしれませんが、もっと気楽に、自分用のメモとして書きたいのでブログにしました。

ごく私的なEvernoteから、少し拡張しようかな?という感じです。

 

Unityを中心に開発をしているので、言語的にはC#が中心になると思います。

でも、過去の遺産もあるので、C++Java の話も出るかもです。