2022年10月26日水曜日

RecyclerViewでViewとbindingでハマる

すごく疲れたので愚痴ですかねぇ。

RecyclerViewを扱うために、Adapter, Holderを用意して、そこから選択状態などを扱おうとしたところからドはまりの旅が…

Android StudioはDolphin 2021.3.1ベースとなっているプロジェクトの雛形は新規に作り出したものなので、それなりに今風の作りになっているので、ActivityやFragmentではbindingを使う形になっていてリソースのレイアウトを作ると自動的にbindingクラスが用意され、コード上からはそれぞれのクラスが参照できる状態になっていました。

RecyclerViewを追加し、コードはViewベースの実装で行っていましたが、ググった参考記事がbindingが前提となっていたので何も考えずViewベースの記述をbinding形式に変更して変更していったのですが、ドはまりに…

ほとんどの部分では問題なかったのですが、どうもbinding.rootが参照できないという状態に。うまい逃げ方を思い浮かばなかったので、リソースの記述を確認し、不要部分を削ったり書き換えたりしました。が、何も変わらず。AdapterやHolderクラスの記述に問題があるのかもしれないと、色々な個所を書き換えてみましたが変わらず。途方に暮れつつ無駄に2,3日経過。私の中でなんとなくbinding系はまだ実装が不完全なのでは?という結論に。

それと、検索した中に「たまにbindingクラスが不安定」という記述を見受けたので、cleanやリビルドを行ってAndroidStudioの再起動をしてみましたが結果は変わらず。

Android Studioで更新チェックを行い更新してみたのですが、空振りし続けているようなので新たに2021.3.1 Patch 1をインストールし直してみました。

その後、更新チェックを行って環境を更新し、プロジェクトを開くとAGPの更新が通知されたのでそのまま(Android Gradle Plugin version 7.3.1.へ)更新してみました。

更新後コンパイルしてみると見慣れないエラーが表示されるように。

> Task :app:mergeDebugResources FAILED

{"msg":"Found \u003clayout\u003e but data binding is not enabled.\n\nAdd buildFeatures.dataBinding \u003d true to your build.gradle to enable it.",

などなど、どうもなにかbuild.gradleに記述が足りていないということで検索してみるとスタックオーバーフローの記事にそのものずばりの記述が

How to solve 'data binding is not enabled' error while using view binding

 buildFeatures {
        viewBinding true
        dataBinding true
 }

plugins {
     id 'kotlin-kapt'
}

機能を有効にして、プラグインも確認してみては?みたいな。

viewBinding trueはやってたけど、dataBinding trueなの見たことないんですがw

有効にしてみると、見事にbinding.rootが有効になっているようで…

2022年10月19日水曜日

Windows11 クソIME ON/OFF問題 回避?

先日勢いだけで愚痴った内容の続編となります。

今まで結構凌いできたのですが、どうしても回避できなくなったので色々足掻くことにしました。

そもそも使用しているのが英語キーボードレイアウトでIMEのOn/Offは[Shift]+[Caps]で行っています。使い勝手は悪いのですが、サポートのアプリを特に使わずそのまま(我慢して?)使っています。

問題点となるWindows10とWindows11の動作の違い

普通は問題ないのですが次の一点だけどうしてもキーボード操作だけでは回避できませんでした。

IMEがかな入力状態で何らかの方法で英数字を入力し、変換で全角で入力します。

たとえば「あいうえお」と入力してF9キーを押して「aiueo」と入力してエンターキーなどで確定させます。その後[Shift]+[Caps]キーを押してIMEをOffにすると…

Windows10ではIMEがOffになり(設定によっては半角英数字入力モードなのかもしれない)、半角英数字の入力が行え、再びIMEをOnにすると普通にかな入力モードになります。

Windows11ではIMEがOffにならずに全角英数字入力モードになり、再度[Shift]+[Caps]キーを押すと、かな入力モードへ切り替わります。この状態から半角英数字を入力するためには入力状態にしてからF10キーを押して半角英数字に変換して確定させてからIME入力モードを切り替えるか、マウス操作などで入力モードを切り替える必要があり、これが非常にストレスに。

ちなみにこの不可解なクソ仕様は、Bluetoothで日本語レイアウトキーボードを接続し、[半角/全角]キーを使用して確認したところ問題は発生しませんでした。

IME関連のキー設定を変更しても結局上手く行かず。設定項目と処理の内容を考えつつ設定してみました。しかし直接入力の使用のOn/Offも効果もなく、IME On/Offや[Shift]+ImeOffの絡みを変更しても効果がありませんでした。可能な限り設定変更してみましたがそれでも全く効果がありませんでした。(正直バグ臭い)



記憶の片隅に[Ctrl]+[SPACE]でIME On/Offができた気がするのですが、その設定も見当たらなかったので設定の画面から辿ってみると、Windows10の時に設定しておいた「前のバージョンのIMEを使用する」と言う項目が生きていたようで、それをオフにすることで[Ctrl]+[Space]でIMEのOn/Offを切り替えられるように。

(旧バージョンのIMEの使用のチェックを変えると、IMEのオプション設定画面が挿げ変わるのでこの辺は非常に錯覚する。)

早速この状態で「aiueo」と入力してIMEをOffにして入力してみると…Windows11で半角英数字入力ができるようになりました。

そもそも論としてなぜ旧バージョンのIMEをあえて使用していたかと言えば、設定項目が少なすぎるのです。なんていうか…単刀直入に言えばクソです。がWindows11と旧バージョンのIMEの組み合わせも腐っているのでこれで満足する事にしよう。

 

 

そしてさらなる致命的なことに気づくことに…私にとって[Ctrl]+[Space]は結構重要だった。

 

[Ctrl]+[Space]はAndroid Studioでよく使うショートカットキーだった…

コード入力時のプロパティー名などの補完を強制的に表示させるためのショートカットで、Delphiで初めてこの機能を使い始め、Visual Studioではクラスやメソッド/プロパティ名がまったく想像できない環境では必須な機能だった(結構使いづらいが)。現状一番使っている時間が長い環境のAndroid Studioでももちろんないと困る機能だと思う。

 

ダメもとで[Shift]+[Space]を使ってみたがIMEのOn/Offが切り替わるだけでAndroid Studio上では反応なしw

この機能の名前がAndroid Studioでは何なのか分からないが、SettingsのKeymapをチェックしてみたところ[Shift]+[スペース]を見つけるのは非常に手間がかかったが、次の機能が該当してそうだった。

Code Completion/Basic [Ctrl+スペース] 

これに近いショートカットとして

Code Completion/Type-Matching [Ctrl+Shift+スペース]
Version Control Systems/Set Active Changelist [Ctrl+スペース]
Other/Second Basic Completion [Ctrl+Alt+スペース]

が、登録されていた。

何も設定していないが、連想できそうなショートカットを試したところ、[Ctrl+Alt+スペース]や[Ctrl+Shift+スペース]でも反応してくれた。

動作がおかしければCode Completion/Basicに何らかのショートカットを割り当てる必要があるかもしれないが、当面問題なさそうなのでこのまま使ってみることにする。IMEがOnの状態で[Ctrl+Shift+Space]を押すと全角スペースが入力されたりするが、このぐらいなら我慢できそう。

Visual Studioは気が向いたら確認してみよう。

2022年10月18日火曜日

Windows11 エクスプローラーのチェックボックス

Windowsを起動してエクスプローラを起動して違和感


…なんかチェックボックス表示されてね?

オプションで…表示しないようになってるのだが…


まぁ一旦オンにして適用してオフにして適用すれば元に戻るんじゃ?

戻らねぇw表示されているウィンドウをすべて閉じて開いてもダメ。ただデスクトップはチェックボックスは表示されてなかった。

表示からの設定でも操作で切るっぽいけどこっちでもだめだった。

はぁ、またアップデートで勝手にオンになったとかそういうの?

そうではないらしい…

原因不明だが、ダメもとで再起動してみる…


元に戻ったっぽい?

なんじゃこりゃ?さすが未完成品

2022年10月9日日曜日

Windowsの日本語入力

キーボードチャットは行わなくなっているのでそこまでキー入力の違いによるストレスはないのですが、それでもちょっと気になるポイントが…

例えば

「ABCD」と入力して変換キーで「ABCD」とした後、直接入力に切り替えた場合の入力モードが、直接半角入力以外にあり得るのか?と言う話。

Windows11だと全角アルファベットを変換で確定させると、IMEをオフにしたときに全角英数字モードになってショートカットキーがわからないとマウス操作などで入力モードをわざわざ半角英数字モードにする必要が出てくるという。

なんという迷惑な…Windows10でもそうだったのかどうか確認していないけど。

2022年10月8日土曜日

Windows11→Windows10へ 一つは元に戻せた。

Windows11で結構実害が出てきたので、主に使用しているネットブックをWindows10に戻そうと設定画面を見ていたら、開いたときは押せる状態だったはずのボタンがほかの画面へ遷移している最中に押せなくなっていた…

残念。(あとから復元ポイントを確認したら以前の復元ポイントは無くなっていた。問題があったときに戻せるように少し余裕を持っていたはずなのにサイズも小さくなってるような…)

回復させるまでの時間は10日と言うことなので、2つめにアップデートしたPCを慌てて回復させて戻しました。

回復させる時間は予想していたより短く、それだけ更新されたファイルが少なかったのだろうと予想できます。 

回復後に問題が発生したのは、Windows11へのアップデート時にOneDriveで自動で強制的に同期化されてしまったフォルダが影響を受けました。

もともとOneDriveでフォルダの同期は行っていなかったPCなのですが、Windows11へアップデートした時にデスクトップなど主要なフォルダが同期化されてしまいました。ファイルの消滅が怖かったので一切触らないようにしていました。しかし回復させると同期化されたフォルダは同期化させる前に存在したファイルも含めてクライアント側は削除されてしまうようです。(同期化されてOneDrive上に存在するファイルだけかもしれませんが少なくともデスクトップのファイルはすべて消えてしまいました。)

 

私から伝えたいことはただ一つ。

Windows11は全く問題がないという記事を鵜呑みにしてはいけません。

低レベルの部分でのバグがいまだに残っているのでUI以上に深刻な問題を発生するリスクが確実に高まります。

表面上は綺麗になっている感じがしますが、実用に耐えるだけのテストは行われていない感じを受けました。特に、エラー発生後などのイレギュラー処理に関してどのようにリカバリーされるのか未知数です。エラー後のリカバリー処理がまともじゃないので被害がでかくなります。

2022年10月4日火曜日

第08MS小隊

ガンダムの新しいアニメの放映に合わせてなのか、アマプラでもガンダムが結構見れる状態になっていました。マニアではないので特にお金を出してOVAをあさったりしていないのですが、リアルタイムでは見れなかった作品も後追いながら見ています。

で、今までちょいちょい小耳にはさんでいた08小隊をようやく見ることができました。

設定上かなり突っ込みどころが多い感じがしましたが、あまり考えないようにした上で結構楽しめました。

タイトルで「ガンダム」と言っちゃってるけどほんとうにガンダム?とかwマニアじゃないので細かいところはわかりませんが、1年戦争中にガンダムこんないちゃダメなんじゃ…と気にはなっていました。

作中では一言も「ガンダム」とは言っていない気がしましたが、2話目で「ジムとは全然違う、これがガンダムか」とか言っちゃってました…ということでガンダムなんですねこれ。他の小隊もジム以外の頭のモビルスーツが…ガンダムかなり量産化されてていいのだろうか?

他にもドムとかグフっぽいのとかもしれっと出てきてたし。

全体的に線が多めなのとアマプラの情報が正しければかなりの年数を経て完結してるっぽいので、地上波放映ではなくOVAなのかな?

ちなみにこのシリーズ見始めるのに後日談っぽい「ラストリゾート」と言うのから見てしまい正直全くわからんかったわけですがw

wiki見るとミラーズ・リポートというのもあるようで、ちょっと気になる。

2022年10月3日月曜日

まだRoomでデータ操作ができていません

Roomの事を知るにつれて、Roomカバーしている(しようとしている)範疇は結構大きいことにため息しか出ません。

言葉の定義もわざと独自性をだしているのか、自動翻訳に頼っているためなのか分かりませんが、結局これってあれの事だよね的なことなのですが、そうは言ってもAndroidアプリだとこの機能もいるよね、とかそんな感じ。しかもなんか自動的に用意してくれ「そう」な感じはするものの、ほんとに任せて大丈夫なの?とか。

実際問題としてローカルはSQLite3のサンプルしかないわけで、じゃあ実際に別のデータベースに直接アクセスできるの?とかいまだに疑問だったりしています。

そうこうしていると、段々と切実な問題が。AndroidのコンポーネントというかクラスってAndroidが都合の良いように作られていてアプリの都合はお構いなしなのが災いしているのか、Viewの構築の手法もViewModelを組み込んでどうのこうのとかあるようで…今までそういうのは避けてきたわけですが、やはりメインストリームもその辺を何とかする必要があると思った結果なのかもろもろがJetPackと呼ばれているものなのかな?と。

で、どうしてもデータベースアクセスが前提となるとViewModelを使うべきなのはわかりました。が、ViewModel自体は副産物の様で、実際はAndroidのインスタンスのライフサイクルにテコ入れしてもう少し切り離されたものを実装した結果、ViewModelというものが必要になった感じです。

これを使えば、無駄にApplicationクラスを肥大化させることなくアプリレベルのグローバルな単一のしかも安全なライフサイクルを持ったクラスが存在できるようになります。

良くも悪くもというか悪事なことですが、極論を言ってしまえばApplicationクラスを肥大化させることでかなり自由にアプリは作れます。しかしAndroid自体はそういうことを激しく拒絶しています。そもそも論として各クラスはそれなりに存在することが良しとされる世界。しかもできるだけクラスは小さく、かつ相互依存は極力避けることが望ましい。

なのでApplicationクラスにアプリ自体の機能を持つことなど言語道断と言うことですw

そしてRoomもそうなのですがViewModelをさわるとjavaだけで書こうとすると足かせにしかならず、自ずとkotlinで書くしかないかなと感じるわけで…いままでkotlinで作った方が楽になりそうだな?とかそんな感じだったのですが、ここまでくるとjavaで書こうとするとなんかえらい大変じゃない?とかなってしまいました。そしてkotlinの壁と言うわけです。lazyって何?とかもう壁しか見えませんw

Windows11のネットワーク経由のファイル操作やばすぎw

2022年10月3日現時点においで、ハッキリ言って未完成品です。レベル的にはWindows10のInsiderレベル。

スタンドアローン状態で使う分には安定している感じは受けますが、それでも単純にタスクマネージャ上のCPUグラフの表示は完全に嘘っぱちですし、UIに関しては絶望的な未完成感が強いです。

今回本格的になにがやばいかと言えば、Raspberry piで共有しているファイルやWindows10でファイル共有しているファイルをWifi経由でWindows11のローカルHDDへファイル移動を行っていました。が…恒例行事のようにWindows11でも痛い目にあわされました。

 

思い起こせば不穏な前兆はあったなぁ…。ファイルアクセスしたときにやったらWindows10側の処理が重たくなったり。Windows10だけのときは、外部からファイルアクセスされてもほとんど処理が引きずられるなんてことはなかったのですが。

 

直接的な被害はWindows10からファイル移動中にエラーが発生し、エラーが発生したファイルは移動先のWindows11でも移動元のWindows10でもアクセスができなくなりました。

Windows10ではその後の被害も深刻で、システムドライブ、ファイル共有中のドライブの使用率がほぼ100%に陥り、システムも古いものなので操作は困難を極めました。

エラーが発生した側のWindows11もexplorerがハングアップ状態に陥りました。

なんとか移動中をキャンセルしたものの、Windows11ではCPUグラフは100%に。(詳細タブではアイドルプロセスは0~30程度となっていた)

UI自体の操作は可能なので、PCを再起動させてもエラーが発生したファイルをアクセスすると途端にexplorerのCPU占有率が上昇。ローカルドライブはUSBなので一旦切り離そうとしたところロック中でUSB削除は失敗する始末。

何度か再起動を繰り返していると、Windows11が起動中はWindows10側も過負荷状態に陥っていました。なのでWindows10も一旦電源を落としてすこし状況を簡素化させて状況を見てみました。

Windows11だけで起動してエラーのあったファイルをアクセスするとexplorerが過負荷状態に。過負荷になった状態で大きなファイルや複数コピーなどを行うと、状況ダイアログが開きますが、ウィンドウが閉じた後もプロセス表示で消えていなく、強制的にウィンドウ表示を行うとウィンドウバーとステータスバーのみのウィンドウが表示され、ウィンドウを閉じようとするとメッセージが表示されて終了する雰囲気になるものの終了せず。タスクマネージャの詳細からexplorerプロセスを強制的に落とすとデスクトップも落ちますが、ホットキーなどは生きていてその状態でも[CTRL][SHIFT][ESC]でタスクマネージャの起動ができました。Windows11(現状のWindows10も)ではタスクマネージャからPCの再起動が直接できませんでしたが、cmdを起動させてそこからshutdownコマンドで再起動などは行えました。explorerが自動的に再起動されてしまうような気がしたのですが、Windows11では強制終了させてもそのままの状態なのは個人的には悪くないのですが、一般的にどうなんだろう?w

で、なんか書いてて七転八倒しすぎてどれだけ書いても終わりそうにないので、結論を言えば、Windows11でエラーの発生したファイルの削除を行って、Windows11をシャットダウンして、Windows10側も問題の発生したファイルを削除してようやく落ち着きを取り戻した感じになりました。

多分どちらも起動しているとシステムが過負荷状態になりすぎて操作が困難になると思います。

まだファイルは再生成できるものだったので良かったのですが、これバックアップだったら痛すぎる。

とりあえずWindows11のネットワーク経由のファイル操作は危険と言うことで。