2022年12月2日金曜日

windows11のメモ帳

一般的にはおそらくWindows10のメモ帳とWindows11のメモ帳ではWindows11の方が受けはいいとは思う。

ですが!

今までできたことができなくなるって結構致命的だったりします。

検索や置換でタブを含みたい場合は、コピーでクリップボードに入れてから入力フィールドにペーストすれば検索や置換が行えます。これが地味に効果的な場面も多く、微妙な表示が行われるものの、これはWindows11の現時点でのメモ帳でも行えました。

普通の人はこれぐらいだと思うのですが、環境設定や結構強引なプログラムソースなどはテキストファイルを一旦メモ帳に張り付けてから部分的に(とはいえ結構な行数)を一気に置換えたりする作業を行ったりします。その時に地味に改行コードを含めて置換えたりするんですが、これがWindows11のメモ帳ではできなかったり…クソですねw

なぜ改行コードを含めるかと言えば、行頭や行末に一括で挿入することができるのですが、これが行えなくなると地味に苦痛な作業を永遠に行う羽目になったりします。

 

ちなみに、Windows10のメモ帳の実行ファイルをWindows11上にもってきても動きませんでした。Vistaの時はできた記憶があるのだが…

まぁメモ帳だけでなく、地味に他のアプリもクソ化されてたりするのが痛い…その代わり便利になってる点があるといいのですけど。実感ないですねw

2022年11月23日水曜日

Caused by: org.jetbrains.org.objectweb.asm.MethodTooLargeException: Method too large:

最近 記述言語仕様が緩くなっていたので相当やばい作り方でなければ目にすることのなくなった様なコンパイル時エラーが出てきました。

相当やばい書き方…ちょうどしてますw

本来であればデータファイルやテーブルに落として使用するデータを、表計算のデータを CSV風にテキストにしてArray<Any?>として配列として取り込んでます。

そんな阿漕な配列を使ってデータを捏ね繰り回していました。

読み込み仕様を悩んだ場合は、結局値を直に変数として記述すれば扱えるわけですが、クラスの形で作って記述していたところ、途中でエラーが出てしまいました。

class SrouceData {
    companion object {
        val array_data1 = arrayOf(
            :
            :
        )
        val array_data2 = arrayOf(
            :
            :
        )
        :
    }
}

回避策はないかとクラスの枠を取っ払って(言い方が違ってる気がするが)グローバル変数的にしてみても結果はわからず。扱い上はグローバルレベルで一つのクラスとして扱われている気配。

何をやってもダメそうなので、結局データクラスを分離することでエラーが出なくなりました。

class SrouceData1 {
    companion object {
        val array_data1 = arrayOf(
            :
            :
        )
        :
    }
}

class SrouceData2 {
    companion object {
        val array_data2 = arrayOf(
            :
            :
        )
        :
    }
}

一つの配列の限界が来てしまった場合はどうすればいいのか分かりませんが、今回は一つのktファイル内で2つのクラスに分割するだけで回避できました。

2022年11月19日土曜日

Material3 Previewで試してみた

構造が少し異なってたので、もしかすると全く歯が立たないかと思われたものの、意外とあっさりとDrawerを組み込めたので早速確認してみました。

Android12だと少し表示が異なっていましたが、おそらくそれ以前のものはDrawer周りの表示は変わってなさそう。

とりあえず手持ちのAndroid12の画面

アクションバーが表示されていない状態でドロワーが思いっきり画面名いっぱいの大きさで表示されるようになりました。この辺はAndroid自体がアプリが基本的に全画面の表示を行うことを前提にシフトした結果だと思います。まぁ現行のMaterialベースだと中途半端になっていて、Drawerのヘッダが欠けて表示されていたのであれだったんですが。

なにもせずアクションバーが表示された場合は、こんな感じ。これはほぼ現行のものと変わらない状態に。

最後はテーマに<item name="windowActionModeOverlay">true</item>を含めた場合。これもほぼ現行のものと変わらない感じ。

詳しく見てないのではっきりしませんが、Material3はシステムナビゲーションバーの下に入り込む感じになっているのが大きく違ってそうです。

そもそも論になりますが、どうもAndroidのUIは現行のIOSのものに移行しようとしているのが伝わってきます。と、するとDrawer排除の流れは必然なのかもしれないが、正直IOSの操作を見ているとイマイチ直感的でない感じがしています。画面が小さければおそらくIOSのジェスチャーベースの操作の方が一貫性が保てる感じがします。

ただ、そこまで小さな画面でなければ現行の形の方が扱いやすいとは思うんだけど。どうなんでしょうかね?特にタブレットでジェスチャベースって疲れる気がするんですが。  

結局、どうするか悩みどころですねぇ。Drawer使わないほうがいいのかな?とはいえ、アクションバーも単純にtoolbarを上書きする形で実装すればよさげな感じはしてるw調べてないけどありそうな感じ。

2022年11月18日金曜日

Android: NavControllerとDrawerとAppBar(ActionBar) 未解決

最近の流れではAppBar(ActionBar)の中にToolbarを含め、そのToolbarがナビゲーションボタンやメニューを包括しています。

Drawerが無ければほぼ問題がないのですが、やはりDrawerは欲しいわけで。

実際のアプリではRecyclerViewで選択させたときにアクションモードを開始して問題が発生しました。問題を単純化させるために新規プロジェクトで作成してDrawerの雛形からアクションモードを発生させて試してみましたが結果は変わらず。

ちなみに最新情報を検索するのが面倒で開発環境はステーブルを使うようになっています。

何が問題になっているのかと言えば、単純にアクションモードを開始するとこんな感じに

これはこれで若干の問題があるのですがw、それはさておき、ここでアクションモードを設定してDrawerを開くと、

こんな感じに。

状況としてはずりっと画面がズレてToolbarの上部にアクションバーが表示され痛い感じに。

一般受けが良さそうではないので、一般的な形にするにはテーマに次の一行加えて

<item name="windowActionModeOverlay">true</item>

実行するといい感じにToolbarに重なって表示されるようになり、いい感じです。

このいい感じになった状態でDrawerを開くと…

なんかもう仕様書で「ツールバーに重ねて表示」とか書いてPGがやっつけで作ったような感じに。

 仕様書を書いた側は違うんだよなぁとか言いたい感じです。

最新のGMAILアプリを見る限りこの辺の表示方法がガラッと変わっているので全く参考になりませんでしたが、UIのガイドラインを無視すれば、そもそもDrawerをToolbarに重ねなければ表示上問題ないような気がします。スタックオーバーフローにもツールバーに重ねない方法は?という質問が上がっていますし、同様の結論を持っている人がいるようです。

テーマからレイアウトまで手を入れればこの辺は解決するのですが、カスタマイズすると結構核心部で痛い目を見るのであまり手を加えたくないのも事実。てか、この辺の仕様はもう変わらないんだろうなぁ…テーマやレイアウトで切り分けてるくせに、肝心の処理がその構造にべったりだったりして結局すべてに手を加えないといけないっていうクソめんどくささ。

なんかどこかに一発で綺麗になってくれそうな解決策ないかな?新しいマテリアルベースにするとこの辺変わったりするのかな?

2022年11月8日火曜日

prime musicアプリ

昨日少し書き込んだところ、タイムリーなことに今日FireHD10のシステムアップデートがかかりました。アプリ更新で単独で更新がかかるかもと期待していたのですが、ファーム自体アップデートされたようです。

例の微妙なサービス改悪変更がしっかり反映されたのかな?

ちなみに昨日の夜に電源ケーブルを接続したまま再生していたところ、再生が止まることもなくいい感じで再生し続けてくれていました。

で、さっそくアプリを起動して再生してみると、いい感じに再生されている感じでした。が、それも20分ぐらいでしょうか…止まりましたw

何度か再生してみてもしばらくするとやはり止まる。

設定を見直していると、オプションの設定で「自動再生 曲が終わると似たような曲を自動再生します。」という見慣れぬ設定があったのでそれをオフに。

すると今度は曲と曲の間で止まり、なんとなく数十分そのまま放置していたら突然次の曲が流れ始めました…よくわからんw

曲と曲の間は、もしかすると回線とかシステム系の過負荷による無反応かもしれない。

2022/11/08 22:58

~~~~~

設定のキャッシュをクリアを実行して今朝prime musicを電源接続無しで使っていますが結構調子がいいかも。

サーバー過負荷でなければ、キャッシュのクリアが解決策かな?

TextInputLayout/TextInputEditTextではemsが効かない

EditTextで画面が狭いながらもラベルとなるTextViewを付けてみるとlabelForなる属性値に気づく…

確かそんな属性あったけどあんまり効果なかったような気がするのだが…で、検索してみるとこんなページが

編集可能なビューのラベル https://support.google.com/accessibility/android/answer/6378120?hl=ja

その中で、「ヒント: Android Design Support Library にある TextInputLayout を利用すると、EditText と関連するテキストラベルを管理しやすくなり、Android のユーザー補助サービスとの連携が向上します。」とあるので早速リンクから飛んでみるとページには

 DEPRECATED

文字が…むむむ、もう廃止されちゃってないのかな?と思ってさらに検索してみると、クラスのマッピングのページが引っかかりました。

一応androidxに取り込まれているようなのでちょっと使ってみました。が、画面幅いっぱいに広がっているので少し調整してみようとems属性に数字を入れてみたところ変化なし。

色々といじっているとlayout_widthへの設定はラッピングのTextInputLayoutの状態によって変更できなくなっているようで…なにやらこの辺の属性は柵がある様子。

少なくても表示エリアが少なくなるのと「編集可能なビューのラベル」を読む限りユーザー補助などに対しても結構有用そうなので使いたかったのだが…

Android Studio: リファクターで漏れる…

リファクター機能はしっかりとできていれば強力且つケアレスミスが発生しないのでとても有望なのですが、実装に問題があるととんでもないことになるとても危険な機能だったり。

そんなリファクター。私は過去に試しに使って痛い目を見て以来、信用ならない無駄な機能の代表格でした。

しかし、Androidの開発環境がエクリプスからAndroid Studio変わり、しばらくするとリファクターが実装されたときに試しに使ってみると、思いのほか結構しっかりと変更してくれて余計な変更などもなく無事に使え感動した記憶があります。なので、結構頻繁にリファクトしてたりしますが、巨大な範囲に及ぶ作業だとバックアップ取ってからやってますがw

個人的にはリファクターは名称の変更しか用はないのですが、たまに使っているsafe deleteとかは動作が若干怪しかったりするので、その辺は今までの経験則にのっとった方が無難だったりします。

で、調子に乗っていると漏れてました…ただ、結果がわかればこれは致し方ないかなあ?とか思える部分かな。

やったことはFragmentのレイアウトxmlの名前を変更したところ、kotlinのコードのimport部分のdatabindingのクラス名が漏れてました。

まぁ被害としてはコンパイル時にエラーが出て、書き換えてあげれば問題ないので実被害はほぼないのですが、それでもこの手の漏れは疲れているときに発生するときついかもなぁ…

リファクタによる変更でキツイ点は変更されてるなんて思ってもみないところで書き換わってたりすると発見するまでに結構時間経過が経っていて、バックアップやヒストリーが無いと戻せなくなりそうなところ。

2022年11月7日月曜日

アマゾンのアプリが挙動不審な件

前々から気になってたのですが、いつも利用しているprime videoとprime musicアプリがダメになっている点があります。

2022年11月1日火曜日

Android: EditText で例外が発生しアプリが落ちる

意外と簡単に例外が発生して愚痴りたいと思いますw

簡単な入力画面をAndroidで作ってみようかと思って試行錯誤する事、早数か月。

もしかしてAndroidでも事務処理系のアプリで結構できるかもと思い確認作業から始めてみると、

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のネットワーク経由のファイル操作は危険と言うことで。

2022年9月28日水曜日

Roomで(使う前に)ハマったポイント

データベース操作をするならこれからはRoomを使うのが当たり前みたいな流れなので試してみました。

が、これがもうデータ操作をする前の準備段階で結構痛い目を見ています。

参考にできそうな情報が過去と錯綜しているのと、プレビュー段階の物とか。あと、Googleのドキュメントが結構嘘っぱちすぎて辛いです。

2022/09/28現在、Roomのステーブルバージョンは 2.4.3

この状態で日本語のドキュメントと英語のドキュメントのサンプルコードの差異はほぼない感じ。

で す が

このサンプルがかなりあてにならない。

プロジェクトへの導入部分のコードが誤っているとか何というか…モジュールレベルのbuild.gradleへ追記する必要のある定義で問題

その1kspはなかったことにしよう

dependencies {
    def room_version = "2.4.3"

    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"

    // To use Kotlin annotation processing tool (kapt)
    kapt "androidx.room:room-compiler:$room_version"
    // To use Kotlin Symbol Processing (KSP)
    ksp "androidx.room:room-compiler:$room_version"

    // optional - RxJava2 support for Room
    implementation "androidx.room:room-rxjava2:$room_version"

    // optional - RxJava3 support for Room
    implementation "androidx.room:room-rxjava3:$room_version"

    // optional - Guava support for Room, including Optional and ListenableFuture
    implementation "androidx.room:room-guava:$room_version"

    // optional - Test helpers
    testImplementation "androidx.room:room-testing:$room_version"

    // optional - Paging 3 Integration
    implementation "androidx.room:room-paging:2.5.0-alpha03"
}

誤りと言うのは何ともな部分ですが、「ksp "androidx.room:room-compiler:$room_version"」をコメントアウトしないと先に進まない。コメントアウトしても問題が無いのかという判断もできない状態でコメントアウトするのはかなりきつかった。色々見る限り、コンパイル時間が短くなるだけのようなので、不安定になるぐらいならこんなものいらない。ステーブルバージョンとはいったい何なのかと…

その2「implementation "androidx.room:room-paging:2.5.0-alpha03"」

結論から言えば、これが大問題で、バージョンは他と合わせる必要がありました。

なので implementation "androidx.room:room-paging:$room_version" とすれば解決できます。そもそもオプショナルってなっているのでこれもコメントアウトするだけでもいいのかもしれませんが不明。

ちなみに2.5.0-alpha03は現時点でアルファリリース状態のバージョン。

しかもです。こいつが2.5.0ベースのおかげで、SDKレベルも33以上にする必要が出て来てたりこれのおかげでえらい遠回りさせられました。

@ナントかで記述して作法通りに記述する必要があり、いくつかのデータベースプログラミング経験があってもマニュアルがないときつい気がしました。ネット上で探すとそれなりに時間を浪費する。そしてエラーが表示されても文字化けして想像を絶するという。

この文字化けは Android StudioにおけるBuild Outputの文字化けを解消 https://qiita.com/watanaby0/items/bc2459e03c81a4b708c7 で解決できました。Room以外にもたびたび悩まされた文字化けですが、Roomで発生するエラーはコード展開されたあとのコンパイラのエラーなので全く想像つきませんでした。出力は英語のままでもいいのに変なところでローカル化するから…

で表示されたエラーが「(public)より弱いアクセス権限を割り当てようとしました」という感じで、これの英語表記は多分「attempting to assign weaker access privileges; was public」となっていて、これをヒントに検索してみたところ、2.3ベースにすれば解決するっぽい記述が出てたので変更しても変化せず。

悩んだ挙句に「room-paging:2.5.0-alpha03」が原因じゃないかと当たりを付けたところようやく解決したという。

こう言うのがandorid触ってて非常に面倒くさい。windowsも似たようなことはあるのですが、環境設定レベルで動かせないとか知らない人間にとってものすごいハードルが高い気がします。

2022年9月26日月曜日

Windows11 タスクマネージャのCPUのグラフに違和感

[ctrl]+[shift]+[esc]キーで不要なプロセスを終了できるとかブログ記事を見たので試したら、タスクマネージャが開きました…確かそんなショートカットだったなぁと記憶が少しかすりました。windows11で地味に不便なところはスタートメニューを右クリックで開くポップアップメニューは前のままなのですが、タスクバーの部分を右クリックしても「タスクバーの設定」というポップアップメニューしか開かないのが結構めんどいというのがあったりします。

まぁどうでもいいんですけど

ついでに開いたタスクマネージャなので様子を見てみると、どうもCPU負荷が高い状態のままのようで…原因を少し調べてみることに。

詳細タブで表示されるプロセスはシステムアイドルプロセスのCPUが60%とかなのにもかかわらず、パフォーマンスタブではほぼほぼいっぱいの使用率。意味が解らないので再起動してみたり、不要そうなアプリを終了させてみたがあまり変わらず。

最初のページのプロセスタブを見ると、そこには使用率100%という表示。しかし、詳細タブの方では依然としてシステムアイドルプロセスが60%とか。意味わからんw

とりあえず見た感じ、プロセスタブの表示とパフォーマンスタブのCPU使用率はほぼ一致。パフォーマンスタブで表示されるグラフを見ていると、カーネル時間の比率が多い感じ。パフォーマンスタブのCPU使用率が100%の状態でもUIのレスポンスは悪くなっていない。経験上この状態になるとマウスの反応などはおかしくなる。しかもBluetoothマウスなのでその影響は結構大きくなる傾向が強いはずだが、問題なし。

と、一つの結論。もしかしてパフォーマンスのグラフは何と読んだらいいのかわからないけど、Windowsモダン系のサブシステムをベースとしていて、実際のシステム全体の表示じゃなくなっている。詳細タブの表示は従来のまま。

そんな感じがしてます。注視したのはCPUだけなのでその他のリソースがどうなっているかは不明。

2022年9月25日日曜日

Windows11にアップグレード2台目

Windows11への更新が有償化するかもみたいなブログ記事が目に止まり始め、重い腰を上げて、先々週ぐらいにメインで使ってるネットブックを更新。正直なところいまだにWindows10ですらWindowsUpdateで不安定になる事があるのに明らかに不安定そうなWindows11にするとかアホかと思います。しかも目玉機能のAndroidアプリの起動は未だにできないわけで。
で、アップデートするとUIで当然不満があるわけですよ。
まず、Window系のアニメーションが結構うざい。スタートメニューがデフォルトで中央配置(左寄せにすることは可能になっていた)なのですが、おかげでアプリを起動するたびにズリズリ動くので切り替えるのも正直やりずらいし、見た目のウザさもハンパない。
たとえタッチパネルだったとしても切替時にズリズリ動くのは結構ストレスになりそう。
これでも使うまではスタートメニューが中央配置でもあんま問題ないんじゃと思っていたのですが、実際に触ってみるとありえないぐらい使いづらかった。
ある程度触っているとまだアニメーションがうざく感じたので、アニメーションをカットさせるとかなり快適に。ウィンドウの最大化とウィンドウ化ぐらいしか使ってないんですが、それでもなんかウザい感じがこの上なく…よくよく比較はしていませんが、アニメーションの時間がWindows10より伸びている感じがします。
全体的にアニメーションがうざく感じるので、コンボボックスなどのアニメーションやヒントなどのフェードアウトもカット。
ヒント表示のフェードアウトは見た目はいいんですけど、結構使えないと感じてるのは私だけかな?
コンボボックスのアニメーション効果は確実に操作が遅くなるので百害あって一利なしってやつです。リストボックスはごくごく稀にリスト項目の高さが高くなっていて表示される高さが1.5行ぐらいしかないときに操作が楽になることはありますが…そもそもそんなUIにするなって話です。
ここまで設定するのは随分久々なきがします。

で、ちょっとしたときに拡大鏡を使ってみると…スタートメニューがスタートバー?の後ろに隠れるようになって、Firefoxがスタートバーを隠すようになる始末。
百歩譲ってアプリのウィンドウの最大化が崩れるのは仕方がないにしても、スタートメニューや、タスクトレイのポップアップメニューなども崩れるのはアカンでしょ。レポートしたけども、多分見てないんだろうな。

それ以外の部分は、まぁなんだろう、それなり?
未だにモダンタイプ(死語)の設定画面には統一できていなく、当然のように旧コントロールパネルのプロパティ設定ダイアログを表示させて逃げてるところが気になるし、思ったとおりに検索で引っかからないしでやっぱ使えんという感じが強い。このへんは多言語対応の弊害なのかもしれないが、日本語でWindowsの設定は微妙。

と、そんな感じで使っていましたが、週末にはブログ記事で     Windows 11への無償アップデートが「2022年10月5日以降は有償化される可能性がある」   
なんて物を見つけ、ホントかウソかはわからんが、使ってるPCはアップデートしておいたほうが安心かもという気になってしまった。

なってしまったので、寝る前に更新したものの、なんかCPUの使用率が上がってたり、WindowsUpdateでエクスプローラーのリスト項目の行間が伸びてたり(オプションで変更できるのをまだ覚えていたので被害は数秒だったが)放置しててスリープに入るタイミングが早くなってたり…てか、CPU負荷が結構かかっててスリープするようになったのか?という驚きが…

メインで使ってるデスクトップはWindows11にはできない物もあったりしますが、HDDを先月買ったSSDに置き換えたら随分まともに動くようになったのでまだまだ現役続行…

ほらな…やっぱ愚痴だらけの記事になったよw

2022年8月18日木曜日

moto e32s スクリーンショットのジェスチャ機能が少し怪しい

先日moto e32sのタッチスクリーンがちょっと独特だったといった内容を書いたのですが、その際にスクリーンキャプチャを行ったとき、録画した時にスクリーンキャプチャアプリで触れている場所が正しく表示されていたので少し確認してみました。

手前味噌なアプリは、アプリレベルで実際にタッチ情報がどのように受け取られるのか?という疑問を解消するのが目的のアプリです。作成当時はKitKatとかそのへんなので、現状ではAndroidのバージョンがかなり上がってタッチ情報の扱いが拡張されているかも?という疑念はあるものの、e32sで考えられそうなのは3本指タッチによるスクリーンショットのジェスチャハンドリングかな?と。

そんなわけで、早速オフにして確認したところ…その通りだったようです。

タッチの筆圧はおそらく固定だし、2点を超えるポイントは固定で0.001になっている感じで、この辺の仕様は理解しがたいです。

ただ手前味噌なアプリの疑念はあるので、少し最新のドキュメントを確認しなければ…

 

 

ドキュメントを確認したところ、

https://developer.android.com/training/gestures/multi?hl=ja

幅広いプラットフォームに最適なサポートを提供するために、MotionEventCompat を使用する必要があります。MotionEventCompat は MotionEvent クラスの代替ではありません。むしろ、そのイベントに関連付けられた目的のアクションを受け取るために、MotionEvent オブジェクトを渡す静的ユーティリティ メソッドを提供します。

と言う注釈があり、MotionEventCompatクラスを使用することが推奨されていました。しかし、実際にソースでMotionEventCompat.getActionMasked(event);と記述してみると、現状(33?)ではすでにgetActionMaskedは非推奨となっていてgetActionを使えということになっていました。リンクはMotionEvent.getActionになっていたので、MotionEventCompatクラス自体は非推奨ではないものの、他にも非推奨となっているメソッドが多数ありました。MotionEventCompatクラスは無くなるんじゃないかな?この辺のいきさつはわかりませんが。

と言うことで、結果的に現状の実装では問題ないんじゃないかと。

やれそうなことは、最新のSDKでリビルドするぐらいかな?

2022年8月13日土曜日

moto e32s

メインで使っていたTCL 10 Proの液晶を割ってしまいました…orz

原因は落下で、ベッドの上から落としてしまったのですが、落とした先がとても悪かったのです。不運にもサイドテーブルの角パイプの角に落下しました。

落下直後は少しのヒビだったのですが、時間が経つにつれ徐々に広がっている様子。

ディスプレイ交換の部品は1万5000円程度で調達できそうなのですが、2週間程度かかるということなので、2日ぐらい悩んだ末にギリギリ使えそうな安いスマホを購入することに。

それが今日届いたので、さっそく開封して使い始めてみました。

結論を言ってしまえば、入手価格でTCL10Proのコスパが良すぎて比較にならなかった。

開封して一番の驚きは、USBケーブルもなければ、イヤホンもなく、そして充電器もなかったということ。この辺は割り切ってしまえば影響は少ないので、その辺が無くなって低下が下がるのならそういう方向の方がいいとは思う。

今回重視したのは、GPSの性能とカメラ性能。それとついでにAndroid12の実機が欲しいかなぁと。正直触ってみないとこの辺はわからないので毎回運任せなわけですが。メモリはあればあるだけいいですが、ゲームメインではないので3G以上あれば十分な気はしますが、4Gは欲しい気がする。ストレージは128Gでしたが、ほとんど使っていなかったので、64Gもあれば、十分な気がする。それよりはSDカードスロットがSIMなどと兼用になっていないほうが嬉しいかな。

そして候補に挙がったのは格安スマホの有名どころのBlackViewとmotoシリーズ。TCLの後継機なら多少高くてもと思っていましたが、10Proの廉価版とかそんな感じで候補にあがらず。結果的に電波帯がBlackViewだとau向けになっているようで地下鉄で使えないのは不便なのでmotoに軍配が上がりました。そこからそれなりにスペック上でe32sでと。ディスプレイに関してはdpiが低い方が処理が軽いかな?とかそんな感じ。スマホでステレオスピーカーである必要性はないかなと。まぁステレオの方が嬉しいけど。で、それよりはイヤホンジャックの方があってほしいかなと。ただ、USB-Cからイヤホンジャックを出せるっぽいので無いときはそれなりに対応できるかな?

で、実際に電源を入れてアップデートして使えるようにするまでまつこと数時間。システムアップデートがWindowsUpdateなみにやたらと時間がかかりました。

端末コピーは使わない人なので、 起動後、Playストアでアプリのアップデートと、適当なアプリをインストール。

若干画面のもたつきに違和感が…まぁ方や定価5万でかたや2万。値段的にそんなもんか。

グラフィックスが崩れて遊べなくなったゲームを試したものの、やはりこれでもダメでした。

グーグルマップを起動してGPS性能を…motoお前もか…なんかコンパスの精度:低のままなんですが。これなら〇mazonでレビューを書いたら消された〇ukitelのあいつと変わらんじゃないか…

e32sのスペックを再確認すると、GPSはそろってそうだけどよく見ると磁気コンパスがなかった。まぁ、今回は一個買うほど気合は無いので…てか、予備機扱いのあいつでよかったんじゃね?とか気づいた…

そしてカメラ性能。

主に利用していた解像度は3472x4640なのでその辺の解像度で撮影できれば無問題。それよりは暗い場所でもライト無しで撮影できる程度の感度があればよかったのだが…

結果は…解像度は3456x4608で処理速度もそんなに違和感なく撮影できる感じ。暗所は…正直全くダメダメでしたw

ナイトモードもあったのですが、TCL10Proとは遠く及ばず。ライトは必須。夜景に関しては光源があれば何とかと言った感じで、肉眼で視認できる範囲よりかなり狭い範囲しか映らずブラックアウトしています。しかも、ナイトなんとかというモードにすると解像度が8M固定となっていて、このへんはカメラアプリの処理速度というか仕様となっている模様。

感触としては予備機のあいつよりはまぁましかな?

インカメラは顔認識の感度に影響するので若干気になっていましたが、感触としてはTCL10Proのインカメラとほぼ同等な感じです。

ちなみに、TCL10Proはアウトカメラの性能が良すぎてインカメラの性能がひどかった感じですが、e32sはインカメラの性能がスゲーとか感じました。実際に試しに撮影してみると、インカメラはどちらもほぼ変わらず。ディスプレイなどの光源があればそれなりに写るので画面が明るければ暗所でも顔認識は反応してくれそうです。(と言うわけで、それだけアウトカメラはTCL10Proと比べてしまうと比較にならないぐらい性能が良くないです。)

保存のオプションもなく、圧縮もかなりかかった感じでしか保存できないようです。

比較対象として予備機のあいつ(〇ukitelのC19Pro)より良いような気がするが…このへんも同時に撮影して比較してみるのもいいのかも?

まぁなんだ…正直なところ予備機のあいつ(〇ukitelのC19Pro)を触ってみた後と同様にガッカリ感が半端ないです。

 

最後にタッチパネルの性能を見てみたところ、面白いことが判明しました。

タッチ感度は固定でした。マルチタッチ的には10ポイントは判断するようですが、それぞれの追従は2ポイント以上では行われないという結果に。

逆に、2ポイントまでなら問題なく思った通りの反応をしてくれますが、それ以上ではデバイス的に追従は行われませんでした。

時期が悪いとは思っていましたが、メインとして使うにはグーグルマップで方角が表示されないっていうのがやはり一番厳しいかなぁ。

後からスマホを見直すと、一時期g31を在庫処分してた雰囲気があったものの、g31のほうが使い勝手上ないんじゃね?的な感じも。

 

番外として、motoのサウンドのセンスが無さすぎな気がします。カメラアプリもやたらうるさいし、結構きついかなぁ。

おススメポイントは少ないですけど、格安スマホの中でも中間ぐらいの価格設定ながら、4Gまでの電波帯なら問題なく多分全てのキャリアで使えるというぐらいしか無いかもしれないw

使用感の番外としては発熱はそれなりにある感じ。少し触ってただけでケースの外が暖かい感じになりました。それだけ熱効率が高いのかもしれないが、この夏使ってフリーズしないことを祈るばかり。

2022年8月6日土曜日

廃線

ものすごく理解しがたいと考えていることがある。

相当前から団塊の世代が抜けた後の社会構造への対応について、日本社会は何も手を打ってなかったという結果について。

公共事業の民営化を行って、結局責任を民間に擦り付けて美味しい汁は自分たちで分配。なんの努力もなく民間となった企業は基本的に現状維持に徹しそれ以上の改革は行わない。

鉄道に関してようやく身近な危機として騒ぎ始めているが、何もしなければ赤字路線は廃線しかなくなる。根本的に何もしてこなかった各鉄道会社は当然廃線の方向で話を進めるしかない。本当にそうだろうか?

一時期、自動運転化の話がもてはやされていたが、結局うやむやのうちに頓挫してしまった。

どうすればよかったのか?結果論となるが、自動運行システムを構築する手法として、廃線化される予定の路線を実証実験に使用することで整備や運行が最低でも数年は行えるだろう。急を要するのであれば、分社化された各鉄道会社で独立させた開発を平衡させれば一つが頓挫しても代替手段が残される。延命された廃線に関しては時間をかけてその後どのように運営するのか方向を模索することもできる。

そのころからゆっくりやったとしても、実証実験まで20年もあればお釣りがくるだろう。

鉄道に関しては国鉄が民営化される前から確実視されていたし、だれもがわかっていたこと。

ゼロから路線を引くのとすでにあるものの維持を行うのとどちらが社会負担が少ないかは明白。そうでないなら管理・維持で利権で固められておかしくなっているだけ。 

結局、だれの指示もなければ良くても現状維持。普通に考えて劣化することしかない。合理化もされない。そういう結果が今の日本。


電車の話ついでとななるが、どっかの鉄道会社は運行ダイヤの見直しを行ってから、やたらと駅での待ち時間が増えた。急行などの停車駅を減らした列車を運行しても到着時間は始発駅から終着駅まで、せいぜい10~15分程度しか変わらない。無理に速度を上げて騒音・振動公害をまき散らすぐらいなら各駅停車を運行しても大した差はないはず。クソダイヤを計画するぐらいならもっとまともなダイヤにしてもらいたいものだ。

2022年7月15日金曜日

シリアル

自宅にいるときの朝食はシリアルを食べてたりしますが、そのシリアルで悲劇的なことが…

最寄りのスーパーで買えていたシリアルがとうとうトップバリュー製品に入れ替わってしまった模様。

主観ですが、シリアルの代表としてはシスコーンでおなじみの日清シスコだと思います。昔はそれ以外に選択肢がなかったというのもありますが、その後数社がシリアルに参入したと記憶しています。

現在どうなっているのか分かりませんが、日清シスコがPBブランドの製品も作っていて、セブンイレブンのシリアルも日清シスコだったと思います。最近は最寄りのスーパーで買えるお手頃価格の「おいしいコーンフレーク」をよく買っていました。セブンイレブンとこの「おいしいコーンフレーク」の違いはパッケージにジップが付いているとか、材料の比率が違っていたり、フレーク自体が若干違う気がしたりするのですが、正直なところあまり差異はないと記憶しています。

トップバリュー製品は「まいばすけっと」でよく並んでいますが、その時にトップバリューのシリアルを食べたのが最初でした。トップバリュー製品は結構頻繁に製造方法や原材料が変わってたり、遺伝子組み換えの穀物が早々に採用されてたりとある意味パイオニアだとは思いますが、原産国の表記が無かったり選択肢があるのなら手を出したくないブランドの一つだったりします。

愚痴は置いておいて…w

で、最初のうちはあまり気にならなかったのですが、去年まぁいっかとトップバリューのシリアルを買って食べたのですが、かなり違和感があり、それ以来避けていたのですが…どうしましょうかねぇw

現時点の選択肢として残されているのは

  • トップバリューのシリアルで我慢する。
  • けっこう欠品状態になるが、セブンイレブンで購入する。
  • いっそのことシリアルはやめる。

まぁこれのどれかと言うことでしょうか。淡い期待として最寄りのスーパーに日清シスコのシリアルが戻ることを期待します。

Windows10: WindowsUpdateしたあと、プログラムの起動に時間がかかる様に

昨日かかったWindowsUpdateの再起動後から、エクスプローラからファイルをダブルクリックしてプログラムの起動されるまで時間がかかるようになった。
タスクマネージャで確認しても特に負荷はかかっていなく、再起動してもいつも開いて表示されるまでのタイミングが確実に遅くなってしまった。
もう一つ、再起動時に気になったが、ログオン画面が表示されるまでのタイミングも遅くなった。
プログラムの起動のプロセスで何らかの処理が増えている感じがする。

2022年7月11日月曜日

Windows10: 設定/システム/タブレット/タブレットの追加設定を変更する

昨日から使いづらかったタブレットモードの設定ですが、設定項目が追加されたことが原因のようで…

以前にも同様の状態でしたが、しばらくするとアップデートで元に戻ったので単なるバグだと思っていましたが、設定で元に戻せました。

ただ、パッと見たときにこの設定が通常のデスクトップに影響を受けているのはわかったのですが、少ししてから再度見てようやく理解できました。

「タブレットモードを使用していないとき」

と、記述されていてデスクトップに影響があるとか直感的に理解できる人がいるのだろうか?w


結局これらのスイッチをOFFにすることで元に戻すことができました。

もうちょっと翻訳するときに何とかならなかったのか?

Windows10: Windows updateでまたデスクトップがタブレットモードの属性に汚染されている…

昨日WindowsUpdateを行ったら、画面に違和感を覚えた。

なんか前もこんなことになったなぁ…あ、これタブレットモードの設定が混じってる…

またか…クソアップデート流しやがって

2022年6月29日水曜日

はっきりと映り込んでて気になってましたが…

深夜に撮影されていて何かと思っていたのですが、どうやらただの火球の様です。

とすると、2日前のアレも火球なのかな?
 

2022年6月27日月曜日

またなんか映り込んでました

やっぱりこれも衛星なのかな?

 直前に動体検知で撮影された映像には流星っぽい映像も残っていました。

夜間は1秒間の露出を行って撮影しているので肉眼だと確認できないほどの流れ方かもしれません。季節的には流星群の季節でもないのに、前後のフレームにも流れていないものの発光体がありました。https://youtu.be/x5dDO_GmkUk

2022年6月8日水曜日

windows11へのアップグレードの準備ができました

 えっと…なんかwindows11にアップグレードできませんって言われていたPCにwindows11へのアップデートの準備ができましたとか表示されるんですが…

正直今更だったりします。

メインで使用しているPCは「準備ができました」とか表示されて更新ボタン押したんだけど、その後全然アップグレードされないし、ほかのPCはそれぞれの使用用途が止まってほしくないのでアップグレードする気はいまのところなかったりする。

で、当初アップグレードするための条件がTPM2.0とかだけだったので、ギリギリ手持ちのハードはアップグレードできるかな?と踏んでたのだが、CPU縛りも発生してもうwindows11はいいかな?とか。ゲームもハードウェアを購入するまで気合い入れてやることもなくなった現在、windowsである必要性はほとんどなくなってきているし。

時間ができたら更新するけど、PC止めてアップデートするほど暇はない。

それよりもwindows10で気づけばバックグラウンドで処理が動き続けて困ってるんだがw

2022年6月5日日曜日

gcc: インライン展開の効果

発端はやはりmotion。

ループ中の関数呼び出しを行った後のif文分岐で処理をキャンセルしている形が目についたので、これってかなり不利だよなぁとか引っかかってたので処理のオーバーヘッドがどの程度影響するのか確認してみました。

最初はソースを書き換えることを考えたのですが、この辺はコンパイラがどのような実行コードのするのか決めることができます。c言語でもinlineという指定があるのである程度指示することができます。ある程度と言う意味は、現状のc/c++コンパイラはinline修飾子をヒントとして用いているのでinline修飾子だけでは確定させることができません。

前置きはこのぐらいで、本題へ。

用意したのは単純なループと関数定義

#include <stdio.h>
#include <time.h>

int proc1(int i){
        i++;
        return(i);
}

inline static int iproc1(int i){
        i++;
        return(i);
}

int main(int argc, char *argv[]) {
        int i, w;
        long t0, t1, t2;
        double s;

        t0=clock();

        w=1;
        for(i=0; i<100; i++){
                w=proc1(w);
        }
        t1=clock();

        w=1;
        for(i=0; i<100; i++){
                w=iproc1(w);
        }
        t2=clock();

        s=(double)(t1 - t0) / CLOCKS_PER_SEC;
        printf("%f sec\n", s);

        s=(double)(t2 - t1) / CLOCKS_PER_SEC;
        printf("%f sec\n", s);

        return 0;
}

インターバルの時間計測の比較で実行してみてみると…

pi@rasp2b:~/ctest $ gcc inlinetest.c -o inlinetest
pi@rasp2b:~/ctest $ ls -l
合計 12
-rwxr-xr-x 1 pi pi 8152  6月  4 14:47 inlinetest
-rw-r--r-- 1 pi pi  485  6月  4 14:47 inlinetest.c
pi@rasp2b:~/ctest $ ./inlinetest
0.000023 sec
0.000013 sec

確かに早い結果は得られたが、この桁ではクロック変動や誤差の範囲w

ループ回数をもう少し増やしてみましょう。ゼロを4つ増やして…

pi@rasp2b:~/ctest $ gcc inlinetest.c -o inlinetest
pi@rasp2b:~/ctest $ ls -l
合計 12
-rwxr-xr-x 1 pi pi 8152  6月  4 14:56 inlinetest
-rw-r--r-- 1 pi pi  493  6月  4 14:56 inlinetest.c
pi@rasp2b:~/ctest $ ./inlinetest
0.050699 sec
0.051429 sec
pi@rasp2b:~/ctest $ ./inlinetest
0.044166 sec
0.042028 sec
pi@rasp2b:~/ctest $ ./inlinetest
0.048412 sec
0.044907 sec

最初に遅くなっているときはクロッキング時のオーバーヘッドがこれだけかかっているという結果でしょう。raspberry pi 2辺りの動作クロックのオーバーヘッドが結構大きいのですが、それだけで結果がひっくり返りました。

現実問題として、秒単位の処理で高速化のためにインライン展開を利用するのは効果は非常に薄いです。関数の引数の数で差はでるとしても、100万回の呼び出しでも4ms程度の差しかでない。

結局、サンプルコードも書いてみたものの、効果がほとんどないという結果は喜ぶべきか悔しがるべきか、悩みます。

ことの発端は、ボトルネックとなっている撮影開始時の処理で、処理が1s以上程度処理落ちしている様で、それを何とかしたいと思ったから。

現状ではminimum_motion_framesとpre_captureの値で内部バッファが確保され、動作検知をした時点でバッファの画像をエンコードを行い、処理が終わるまでほかの処理が行われません。(実装を変えれば…)

しかしそのバッファを0になるように設定してもどうしても1秒程度のラグが発生してしまっているために何とかならないかと。一番マズそうなのは、pipeでffmpegエンコードしている部分だとは思いますが…

extpipeさせている理由は単純で記録される動画のファイルサイズを小さくしたいというだけなのですが、現状だとtmpf上に一回保存した後、soundと結合させたりしていることを考えると、動画も再エンコードさせてもいいのかもしれないが、無駄にデジタル劣化させるのもなぁと言ったところ。

 

 

2022年6月2日木曜日

motion: タイムラプス撮影させているカメラで雷が撮影されてた(*´▽`*)

食後にごろごろ音がしていたのでもしかしてと思ってみてみると、いいのが撮れてました。

解像度を上げているため、CPU負荷の低減と、撮影カメラの発熱を抑えるためにfpsを2にしているので動作検知動画でも数フレームしか記録されずにそのうちの1フレームに稲光が!w音も録音していたのですが、雨音しか録音されていなかった。

そんな努力?の結果が、

雲の中を水平に突き進む光をとらえていました。

タイムラプスの方にも記録されているといいのだけれど…あっちは15秒間隔の映像なので運が良ければ…

motionplusだと…

ここ1か月ほどpullリクエストもなく平和そうだったmotion-project。

ふと見てみると、motionplusなるものが…あーそういうことだったのか…とちょっと納得。

ここ一か月ほど結構どっぷりとmotionのソースを見て、うまく動作してない部分や気になる部分に手を入れ様子を見ていましたが、別プロジェクトが立ち上がってしまったのならそちらに流れる必要がありそう。

積年の間どうにかしたいと思っていた部分は現状の実装では何ともなりそうもなく、根本的な部分をテコ入れするしかないかなと言う結論に至ったのが数日前。

ただ、それ以外の部分も少しpullリクエストして反映してほしい部分もあるようなないような。

特にマイクロスイッチの実装がよくわからない動作をしていてうまく機能していないので、ライトスイッチとは別になってほしいという気持ちが強い。ライトスイッチ自体は結構それなりに動作するし、誤作動も発生することはないはず。

なので未実装部分の余計な追加コードなどは削除したうえで早急にpullリクエストしておいた方がいいのかもと焦ってたり。

motionplusでは4.2.2をベースにc++へコンバートされていて、その時にコンバートでうまくいかない部分や無駄に拡張されてしまった部分を捨て去った上で、新たにサウンドの追加などを行っているようだ。

少しだけメインループの実装を確認したいと思っているが、当面の目標は早急に手持ちの修正の終息させねばw

人工衛星だとは思うけど…

https://stdkmd.net/sgt/

結局何見てもそれらしい軌道の衛星がわからない。

平面の世界地図で見ると「みちびき」かもと思いつつも、高度が高すぎる。

3D表示が可能な画面に切り替えてその他の衛星も表示させると今回は「STARLINK-1563」が一番ありえそうなのかな?と。ただし高度は、539.08km 

今回に限れば太陽光の反射が強いはずなので人口衛星だとは思うのですが。

2022年5月31日火曜日

最近気になっていることと言えば…

タイムラプス映像に結構頻繁に映り込んでいる火の玉っぽい何か。

いかんせんただのドットしかなく、ヒントは少ないのでパッと思い浮かぶのは流れ星とか衛星とか?

夜間に星空が撮影できれば最高なのですが、そこまで感度は良くないので、映り込むのは特定の明るく輝く星か、太陽系の惑星程度だと思います。

衛星だったとして大型かもしくは大きくて低軌道であれば映るかもなぁとは思います。

いままで、飛行機、流れ星はある程度検索したりリアルタイム情報をみてみたりと、調べてみましたが、該当しそうなものはありませんでした。

昨日は衛星という切り口で調べてみましたが、正直調べきれませんでした。ただ昨日は低軌道でも高度が3000km以上だということで雲のはるか上空なので雲の下に見えるはずがないという結論で終わっていたのですが、今調べてみると低軌道衛星で500kmぐらいで飛んでいるものがあるという検索結果にw

wiki(https://ja.wikipedia.org/wiki/%E4%BD%8E%E8%BB%8C%E9%81%93)を見てみると

地球低軌道では、日本の宇宙航空研究開発機構(JAXA)の超低高度衛星技術試験機「つばめ」が2019年、高度167.4 kmで軌道を7日間保持して、地球観測衛星の最も低い軌道高度としてギネス世界記録に認定された。

とのこと。ちなみに雲は高層でも地表から10km程度しかないので、結果として衛星軌道よりはるか下となります。

なので、雲の下に見えるということは…衛星でもないということなのか?

やっぱり結論は出ないかぁ…

motion: いつの間にビルトインの動画出力と外部パイプ出力が同時に行われるようになったのだろう?

色々とソースを見ていて気付いた点があります。

基本動作としてmotionは、カメラで撮影した映像内の動体検知を行って記録すること。

ここから派生して記録する形式として、静止画と動画の大きく分けて2つがあり、動画は実際の映像と、動体検知を行っている処理の映像という2つの映像が存在します。

また実際の映像は、ビルトインのエンコーダで処理することもできるし、pipeを使って外部処理でエンコードすることもできます。

この機能は当初から存在してはいましたが、処理速度やビルド環境、実行環境に大きく左右される機能なのですが、体験記憶としては静止画と動画の同時出力はできていた記憶はあるのですが、実際の映像と検知処理の映像はどちらかしか出力できなかったと記憶していました。

現在のソースを見ていると実際の映像と検知処理の映像の同時出力を行うように作られており、さらにextpipe(外部パイプ)出力も同時に行う形になっていました。自分の中ではビルトインか外部パイプどちらかしか出力されないと思い込んでいて、外部パイプ出力の処理が予想以上に重たく感じられていたのです。なので微調整を行う過程で結局最後はビルトインエンコーダを使用する形で落ち着いていました。

motionの出力
┣静止画(全て/特定のフレーム)
┗動画
┣ビルトインエンコーダの出力 実際の映像
┣外部パイプへの出力 実際の映像
┗ビルトインエンコーダの出力 動作検知処理の映像

これらが同時に出力可能と言うことに今更気づいたのかよwとかいうレベルですが、ビルトインエンコーダと外部パイプ出力が同時に行われるという仕様をまったく想定していなかったので今まで理解できなかった不可解な現象がようやく理解できました。

不可解な現象を列記すると、

・ごくまれに出力された動画ファイルが壊れていることがあった。

・ビルトインの出力と外部パイプの出力で動体検知の癖が変わる。

・出力された動画をffmpegで処理すると、エンコーダを通していないのにファイルサイズが変わった。

・外部パイプを使用しているときにイベントスクリプト内(on_movie_end)で処理するときにまだ動画ファイルがクローズされていない。

・スクリプトの引数で%fを使用するときにファイルの拡張子がある場合とない場合があった。

などなど…まだあると思いますがこの辺が結構不可解だったポイントです。

仕様として、動体検知映像はファイルの末尾に"m"を強制的につけられるのですが、ビルトインエンコーダのファイル名と、外部パイプのファイル名は拡張子があるかないかの差しかありませんでした。(今まで、とりあえず外部スクリプトで拡張子がない場合は処理を行わないようにしていました。)

で、問題的な動作として、ビルトインエンコーダの出力と外部パイプの出力が同じファイル名になっていて、処理はビルトインエンコーダの出力→外部パイプの出力という順番で処理されるので、結果的にどうなるのかと言えば…

ビルトインエンコーダの出力が行われ、直後に外部パイプの出力が行われることにより上書きされてゆく結果に。

Windowsでそれなりの実装を行っていれば、おそらく外部パイプのファイル出力エラーとなるはずなのですが、Linux(Raspberry pi)では平気で処理が通ってしまい、ファイルサイズはどちらか大きいサイズ。出力内容は書き込みバッファサイズに依存してどうなることやらといった感じでしょうか。(ファイルの排他制御はファイルシステムに依存しているはずなので、ファイルシステムを変えると動作が変わるかも?)

大抵の場合、ビルトインエンコーダの出力は大きく、固定ビットレートなので外部パイプ出力を上書きしてしまうようなことがなかったために、動画が見れていた感じです。ファイルとしては映像の後に無駄なパディングが書き込まれている状態になったために、ffmpegで処理を行うと、その無駄なパディングが排除され、ファイルサイズが小さくなった、と。

なんか今まで不可解だった不安定な動作が一気にすっきりしました。

動体検知の癖の差はエンコード処理が単純に多くなるのでレスポンス低下による影響だと考えられます。

なぜこの辺のソースを追っかけたかと言えば、想定している機能とちょっとソースを見た感じ実装がずれていたので足りない部分を追加しようとしていたのですが、よくよく見てみると想定している仕様が違うということに気づきました…。

git上のソースを3.10ぐらいまでは遡れるのですが、そのくらいからは同時出力できる感じがしました。なので、おそらく当初からそういう仕様だったのかもw

Windows: SDカードが何度かエラーになった

遡ることGW少し前から。(このアーティクルを書き始めたのは 2022/05/23 18:15)

SDカード上でテキストファイルを編集して使っていたのですが、どうも調子が悪い。
突然の書き込みエラーで始まり、SDカードへのアクセスが不安定に。

経験上SDカードへのアクセスエラーが始まってからアクセス不能になるまで残された時間はほとんどない。慌てて必要そうなファイルのバックアップ。

エラー発生時に編集中だったファイルは更新状態がわからないことになってしまいましたが、スキャンディスクを行うと使えるようになったので、様子を見ながら使っていると、また同様の現象が。2,3度繰り返し同じ状況になったので、外付けのカードリーダー経由で使用してみたところ問題なさそうなので、GW中はそれで使っていました。しばらくするとWindowsUpdateが、何回かかっていたので恐る恐る本体のSDカードスロットに戻しましたが問題は出なくなりました。

特に更新内容は確認していないのですが、問題はおそらく4月のWindowsUpdateが絡んでる感じがします。

2022年5月29日日曜日

今日は3つ流れた…

時間帯や流れる方向が違いますが、今日は火の玉が3つ流れてました…。

 




さすがに3つとなるとかなり気になります。

動画のコメントにも書きましたが、飛行機かもとちょっと調べてみました。結果から言えば、見えてたとしても逆方向とか両方向に流れてないといけない感じに。そもそも撮影方向で飛行機を確認したことはないので。

流れたのは、画面上部左から右へ。時間は動画の時間で3:04ぐらいから9秒程度の間。撮影時間では23:01:00ぐらいから23:25:00ぐらいにかけて。

飛行機の航路を見てみましたが

https://www.flightradar24.com/2022-05-28/14:01/12x/35.88,139.37/9

飛行機は無さそうでした。撮影場所は春日部から南西の方角。


 

ちなみに昨日の該当する時間の航路も見てみましたがそちらも何も飛んでなさそうでした。

2022年5月28日土曜日

火の玉?雷が光ってたのでコマ送りで見ていたら…

夜に雷が光ってたので、稲妻でも映り込んでないかな?とコマ送りで見てたのですが、



上中央から左下の方に流れる火の玉のようなものが…

落雷による火花かとおもったんですが、15秒間隔の撮影なので5枚に渡って映り込んでいるので流れている時間は最低でも1分15秒と、リアルタイムで見ていたら結構ゆっくりだと思います。時間は20:07:15。

Youtube クリップ 火の玉?

2022年5月19日木曜日

ffmpeg: h264_qsv hvec_qsv

raspberry pi 上でh265のハードウェアエンコードができないならWindowsで試してみるかと、試してみました。

ffmpegをダウンロードして様子を見てみると、intel系のチップで使えるハードウェアコーディックがありました。

quickなんちゃらと呼ばれているコーデックですが、ちゃんとエンコードもできそうなので早速エンコードしてみました。どうせならとソースはタイムラプスのmpgファイル…画像のソースは65%ぐらいなのでざらついていてノイジーな圧縮に不向きな状態だと思います。

試しの試でlibx265でエンコードしてみたところ、安価なネットブックなのでパワー不足なのは確かなのですが、1280x960で出だしから0.2倍速とか10FPS程度。
h265は設定にもよると思うのですが、後になるほどエンコード速度が落ちてゆくので、結構時間かかりそうなので[ctrl]+[c]を2回押して止めましたw

youtubeのアップロードでHDRにならなさそうなので動画のクリッピングをして720pでエンコードしてみようと思い、指定の仕方を調べていざスタート。(今だと720pは低画質に分類される気がしますが、まぁ2Kや4Kなんて環境はそろえる予定もないので…)

hevc_qsvで、エンコード速度は2.2ぐらいで始まって最終的に1.6~1.8倍(46FPS)程度でh264_qsvでは7~8倍で始まって、最終的に5.0倍(151FPS)程度でした。 

ただ、qsvは設定がハマってくれないのか、実際に出来上がったものを見たかぎりhevc_qsvのハードウェアエンコーダはあまり圧縮はできていないようで、h264_qsvとの差はあまりないような印象を受けました。(効果のあるオプションは -b:v -minrate -maxrate ぐらいしか見つけられませんでした。)libx265で驚くべきファイルサイズになったので感動したのですが、hevc_qsvは実装こそしてあるものの中身はh264なのでは?と疑いたくなるレベル。

hevcとh264のqsvはかなり似ていて、平均ビットレートの効果が強く、常に平均ビットレートに合わせる感じでした。変換中のビットレート表示を見る限りminrateとmaxrateはあまり効果がないようでした。出来上がったファイルサイズは、maxrateを上げた方が若干小さかったりとよくわからない結果も。


2022年5月17日火曜日

raspberry pi: ffmpeg ハードウェアエンコーダ(omx/v4l2m2m)かソフトウェアエンコーダ(libx264/libx265)か?

motionからの派生でffmpegも少しづつ触り始めて入るのですが、いかんせんよくわからないことだらけ。

知ってる知識は音や映像はかならずコーデックと呼ばれるデータ圧縮/伸張機能があって、処理としては、エンコード、デコードという手順を行うコーデックの事をエンコーダ、デコーダと呼ばれている。基本的にはコーデックは圧縮伸張機能を有しているが、実際には片側だけのものもある。この辺はオープンソースとか特許とか、いろいろしがらみがあるっぽい感じ。

まぁこのぐらいの薄っぺらな知識ぐらいしかない。

とは言え、実際に色々と扱ってはいるので、その範囲内なら癖はわかる。が、最近?かな?のh264とかh265の実情はあまりよくわからないまま、ちょっと触った感じだと、h265のエンコードって少し頑張ればリアルタイムでも使えるかも?と勘違いするぐらいしかmotionで使てみたぐらいです。

h264はDVDとかで見られる感じの基本的な感じ方はjpegっぽい感じが強い印象。データ量が足りなくなると途端ににじみやブロックノイズが激しくなる。

h265はごく短時間(数秒から数十秒)の動画の場合でもそれなりに圧縮率が高いのですが、動画時間が長くなればなるほど前処理に時間がかかり書き込み始めるまで時間がかかるように。さらに、ソフトウェアだと書き出しもかなり遅いです。試しにタイムラプスの雲動画の半分ぐらいの長さの物(1半分ぐらい?)をraspberry pi 3bでlibx265を使ってmpgから変換してみましたが、 1時間半ほどかかったうえ、後から温度グラフ見たこともない温度になってました…ファンついてるヒートシンクだけど、回してないのでw


ただ、圧縮がかなり効いていてmpgの単体のソースが107MBぐらいのものが5.6MBぐらいに…パラメータは-q 20ぐらいであとはそのまま。まぁ白いモヤモヤがモヤモヤしてるだけの動画で時間軸で圧縮が行われるとかなり圧縮できそうではありますが。ちなみにh264_v4l2m2mやh264_omxで圧縮すると、何をやっても固定ビットレートになってしまうようで参考になりませんが、libx264で同様のパラメータで出来上がったものは70MB程度と、なりました。圧縮時間はソフトウェアなので、1280x960のサイズの動画で10分程度かかってる感じでした。(グラフを見ると13時に大きな山がありますがこれがlibx265で処理している山で、70度まで上がってスロットリングが発生している気がします。その手前の山はlibx264で処理した状態だと思います。)

raspberry piの処理速度を考えると、motionで扱う場合、画像サイズは640x480程度で限界を超えていてフレームレートを落とす必要があったりします。ただ監視用途ではそこまでFPSが必要と言うわけではないので、あとは用途によってバランスを考える感じでしょうか。

4bではメモリーも増えて処理速度も上がってはいるのですが、その分排熱もかなり高く、単独で放置するのはちょっと気が引ける感じです。室内温度が上がる部屋だとちょっと危ない感じにはなりますが、その点3bplusぐらいまでならなんとか大丈夫かな?

で、結局こんなことを何でやったのかと言うと、raspberry piのハードウェアエンコーダでもうすこし綺麗でファイルサイズも小さくならないかな?と期待してみたのですが、先にも書きましたが、どうもハードウェアエンコードは固定ビットレートしか対応していないようで、どうも期待通りにパラメータが機能してくれませんでした。色々と見ると -passで2パスにするという手が使えるらしいのですが、手持ちの環境ではエラーではじかれてしまいました。

監視用に使っているのは640x480なのでもしかしたらh265でも行けそうな気はする。しかし、タイムラプスのファイルサイズを小さくするためにボード温度が危険域に入ってしまうのはとても危険と判断。昨日今日はたまたま涼しい感じになっているからこれで済んでいるが…

ちなみに、raspberry pi でh265のハードウェアエンコードは実装されていないようです。デコードはできそうな気がする。

youtubeにアップすると漏れなくブロックノイズが激しい…アップ前にもうちょっと何かしてあげないとだめなのかな?

2022年5月13日金曜日

motion: microlightswitch?

どこに需要があるかわからないmotionネタです…w

昨日から気になっていたほとんどまともに機能しないと思われるlightswitch関連。結論から言えば、処理速度があればあまり問題にならないのかもと思える結果となりました。

ここ数日の主なテスト環境はraspberry pi 3b plusで外部パイプを使ってffmpegでv4l2m2mのハードウェアコーデックを利用して動画を作成していました。

少なくても、この状態ではlightswitch関連の機能はほぼ絶望的な状態です。設定にもよりますが、ログを見てもmicrolightswitch!というログしか出てこなく、そのタイミングもかなり気まぐれな感じです。

そんな状況の中、githubでフォークさせてソースを直に変更してみました。(多分使い方が違うw)

気になるポイントとかも試しに書き換えたりデバッグ用のメッセージを入れたりと。

まずは設定項目を増やして、ついでに値の整合性を入力時に行えるように実装し直したりと少しづつ書き換えていると、ふと一つの疑問が。

「いつから機能しなくなったのだろう?」

と。しかし、私が知らなかっただけで、lightswitchの実装は結構古いらしく、ソースのヒストリーを見る限りこの辺りを変更した感じは無さそうでした。ソースの形式を大きく変えたのが4.3からの様でしたが、見ることのできる一番古い3.2でもlightswitch関連の実装がされているのを確認しました。

それだけ古くて誰も手を入れていないということは、全く使われていないか、設定によって動作が変わる?

と、ふと、一番特殊と思われる外部パイプの使用をやめてビルトインに任せてみました。

するとあら不思議。それなりに機能しているようなしてないような?そんな感じw(あんまり変わってない?w)

一番気に入らない点はlightswitch関連の機能を有効にすると録画される動画が不安定になることでした。が、ビルトインを使えばそんなことはなく、それなりに録画されました。

ってことは今度は外部パイプ周りを確認しなきゃかな?

ログを見る限りmicrolightswitchは普通に機能していない感じは強いかなぁ。

2022年5月11日水曜日

ffmpegの出力中にファイルを移動させると…

多分ファイルシステムが強固なwindowsなら、ファイル移動が失敗するのでしょうけど、linuxは簡単に移動できてしまう気がするのですが?

Windowsでも処理の実装方法によっては常にopenとcloseを繰り返している場合は処理中でも他からファイルを消したりすることはできるので、何とも言い難い部分だったり、そもそもそんな事するなと言うのが当たり前だったり。

まぁでもmotionだと内部からイベントの各タイミングで丁寧にフォークしてシェルコマンドが呼び出されてたりするので、かなり運用任せでいろいろできてしまうので表題のような処理になってしまいましたw

結論から言えば、運が良ければ動画ファイルとしては何とか通用するものとなりますが、ファイルフォーマット形式でいえば確実に破損状態となり、再生することもできなくなります。

motionで、ビルトインコーデックであれば外部イベント処理が呼び出される前に処理が完了している感じだったのですが、外部パイプでエンコーダ実行されている場合、エンコーダ自体もフォークされているっぽいので処理が終わってないことも。

試しに使ったlibx265とかだと、処理が重いためか確実に処理途中となってエラー処理になってしまっていました。ハードウェアが利用できると処理が軽くなるために今までは気になったことはないのですが、先ほど書いた記事にある通り、minimum_motion_framesを20とか頭の悪い設定していると、エンコード処理が間に合わずエラー処理へ。

で、そこからはエラー処理の話になるのですが、後からチェックできるようにエラーファイルはゴミも含めてフォルダに退避させているのですが…まだ出力中のファイルを移動することになって結局動画が死んでしまうというジレンマに。

そして結局取るべき措置としては、エンコードしている場合は処理を待ちましょうということ。

linuxではよくある話らしく、psとgrepを使ってプロセスを監視するのが当たり前の様で。

で、実装して処理を待つようにしました。ビルトインの場合はチェックができない…なのでまぁ外部パイプでエンコードしている場合のみですが回避できるように。

しかし、最初はそんなに大したことにはならないはずだったのに、結構色々詰め込んでしまった気がする。

motion: 引き続きlightswitchネタ


色々と調整しているとボケてしまっていたようで、lightswitchを有効にすると反応が鈍くなると感じたのminimum_motion_frames20になっていたのが原因かも。環境としては10FPSなので時間にして2秒間動かないと検知されない状態。そりゃ鈍いw

早速これを2フレームとかにすると反応は良くなりました。

いつ変えたのか正直記憶に無いわけでログを見直す気もないのでさっさと先に進むことに。

再度lightswitchを有効にして…様子を見ることに。

部屋を暗くしてライトをつけてもちゃんと防御してくれてるっぽい。ログにも
[1:ml1:D] [NTC] [ALL] [ 5月 11 20:22:14] mlp_actions: イベント11の終了
[1:ml1:D] [INF] [ALL] [ 5月 11 20:27:58] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [NTC] [ALL] [ 5月 11 20:40:53] motion_detected: モーションが検出されました. - イベント12を開始中

となっているのですが、ちょっと違和感…ログレベルを下げたのでdebugログが出てないかもしれないのでソースを確認しましたが…

MOTION_LOG(INF, TYPE_ALL, NO_ERRNO, _("Lightswitch detected"));

と言うのが先に来なきゃいけないような?INFレベルだし多分処理が通過すればログに残るよね?

なんで

MOTION_LOG(INF, TYPE_ALL, NO_ERRNO, _("micro-lightswitch!"));

が先に出てしまってるのだろう?

ま、様子を見つつも…もっと強烈なのが来ました。

[1:ml1:D] [NTC] [ALL] [ 5月 11 21:46:06] motion_detected: モーションが検出されました. - イベント15を開始中
[1:ml1:D] [INF] [EVT] [ 5月 11 21:46:06] event_ffmpeg_newfile: ソースFPS 6
[1:ml1:D] [INF] [ENC] [ 5月 11 21:46:06] ffmpeg_set_quality: libx264 コーデック vbr/crf /ビットレート: 30
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:46:06] event_newfile: 動画ファイルを出力中です: /home/motion/tmp/OrbitAF_2/20220511214605D-15.mp4
[1:ml1:D] [INF] [ENC] [ 5月 11 21:46:06] ffmpeg_set_quality: libx264 コーデック vbr/crf /ビットレート: 30
[1:ml1:D] [INF] [EVT] [ 5月 11 21:46:06] event_create_extpipe: ソースFPS 6
[1:ml1:D] [NTC] [ALL] [ 5月 11 21:46:06] mycreate_path: ディレクトリ /home/motion/tmp/OrbitAF_2を作成しています
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:46:06] event_create_extpipe: パイプ: ffmpeg -y -f rawvideo -pix_fmt yuv420p -video_size 640x480 -framerate 6 -i pipe:0 -vcodec h264_v4l2m2m -b:v 4000k -f mp4 /home/motion/tmp/OrbitAF_2/20220511214605D-15.mp4
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:46:06] event_create_extpipe: cnt-> moviefps:6
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:46:06] event_newfile: 動画ファイルを出力中です: /home/motion/tmp/OrbitAF_2/20220511214605D-15
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:08] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:12] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:14] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:16] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:23] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:25] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:27] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:29] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:32] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:37] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:39] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:40] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:41] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:43] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:52] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:55] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:47:09] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:47:11] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:47:12] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:47:20] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:47:22] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:47:46] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:48:19] event_newfile: 画像ファイルを出力中です: /home/motion/tmp/OrbitAF_2/20220511214725D-15-01.jpg
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:48:19] event_extpipe_end: クローズ中: extpipeファイルの説明 12、エラー状態 0
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:48:19] event_extpipe_end: pcloseリターン値: -1
[1:ml1:D] [NTC] [ALL] [ 5月 11 21:48:19] mlp_actions: イベント15の終了


撮影された動画を見ると映像が出てこないw

ほかのも見てみると動画出力中にこの「マイクロライトスイッチ!」のログが混じっている場合はなんか動画が乱れて終わっていました。

なんだかコードの前後でthreshold_tuneとかnoise_tuneとか私は使ってないけど有望そうなパラメータも死んでそう…ま、置いといてw

やっぱりこの辺おかしくなってる感じですねぇ。


あとlightswtich関連の実装部分でやたらと範囲チェックして補正欠けてたりするんですが、ハッキング対策を考えるとありっちゃありだと思うんですが、理想論としてはやはり設定値を読み込んだり、外部から設定されるタイミングで範囲チェックして、補正するなら強制的に補正して取り込んで、処理中に設定値の範囲チェックなんてやってる場合じゃないと思うんですが。デバッグしてると疑心暗鬼になって不安に駆られて入れたくなるのは理解できるのですが。

ffmpeg : -c:v copy で 小さくなる?

motionで外部パイプの外出しffmpegで動画を作成させるのは色々と無駄な感じがするものの、motionのビルドや実行環境の整合性などを考えると安定感はあるのかなとちょいちょい使ってみてはいるのですが、ffmpegの癖なのかドライバの癖なのか意外と一筋縄ではいかなかったり。

そんな右往左往しているときに少しづつ調整しても圧縮されすぎて出来上がった動画がブロックノイズと言うよりもモザイク状態になってしまい仕方なしに固定ビットレートで結構大きめに指定することでようやくまともな動画に。

動作を見ていると出来上がったmp4ファイルは2M程度の大きさだったはずが、音声とマージして出来上がったのが800kとかやたらと小さくなっている現象を目の当たりにしました。

早速VLCのメディア情報の統計を見比べてみるとビットレート自体は変わってない感じただ、ブロック数とフレーム数の数が一致していなかった。ただ音声を結合させているのでこの辺の数字は何ともな感じ。なので、処理途中のファイルを抜き出して同様の処理を通してみることに。

pi@rasp3bprs:~ $ ffmpeg -i /home/motion/tmp/OrbitAF_2/20220511102817D-03.mp4 -c:v copy ./out.mp4

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x1b3ecd0] st: 0 edit list: 1 Missing key frame while searching for timestamp: 0
[h264 @ 0x1b40120] no frame!
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/motion/tmp/OrbitAF_2/20220511102817D-03.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.45.100
  Duration: 00:00:32.40, start: 0.000000, bitrate: 633 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x480, 165 kb/s, 5.03 fps, 5 tbr, 10240 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
Output #0, mp4, to './out.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.45.100
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x480, q=2-31, 165 kb/s, 5.03 fps, 5 tbr, 10240 tbn, 10240 tbc (default)
    Metadata:
      handler_name    : VideoHandler
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
frame=  162 fps=0.0 q=-1.0 Lsize=     657kB time=00:00:32.20 bitrate= 167.2kbits/s speed=3.52e+03x
video:656kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.218411%


もとのファイル

2,565,577 バイト
325ブロック
463フレーム

出来上がったファイル

673,137 バイト
325ブロック
463フレーム

ブロック数とフレーム数は一致。ただ、出来上がったファイルサイズはかなり違う。

32秒の動画で、motionから作成しているときのffmpegのパラメータは-b:v 1000kとしている。
bpsなので1秒当たりのビット数。細かい数字は置いておいて(差が2割ぐらい出そうですが)、ざっくりした数字は 8で割った数が1秒間のバイト数 125k程度と言うことかな?

それの32倍 4000kバイト…なんか出来上がったファイルも想定より全然小さいのだが…。

fpsと総フレーム数が合ってなさそうなのでmotionのログを見てみると、

[1:ml1:D] [NTC] [ALL] [ 5月 11 10:28:21] motion_detected: モーションが検出されました. - イベント3を開始中
[1:ml1:D] [INF] [EVT] [ 5月 11 10:28:21] event_ffmpeg_newfile: ソースFPS 5
[1:ml1:D] [NTC] [ENC] [ 5月 11 10:28:21] ffmpeg_set_codec: fpsが低いため, 5フレームを10フレームコンテナに変換しています
[1:ml1:D] [INF] [ENC] [ 5月 11 10:28:21] ffmpeg_set_quality: libx264 コーデック vbr/crf /ビットレート: 30
[1:ml1:D] [NTC] [EVT] [ 5月 11 10:28:21] event_newfile: 動画ファイルを出力中です: /home/motion/tmp/OrbitAF_2/20220511102817D-03.mp4

コンテナ的には10フレームにしているように見えるが、libx264とか出てる時点で動作検知動画の方を指しているような気もしないでもなく。

フレーム数から考えても実際の動画の記録時間と一致しない。

思考停止…

動画の中身を見てみると、表示されている時間は 10:28:17で始まって10:29:00で終わっている。なので、時間軸は43秒ほど。よくよく見ていると間に何度か飛んでいる状態になっているので、再生時間と一致はしてないけど、処理としては全てのフレームは出力している形になっているのかな?なんか考えるだけおかしくなりそうな動画。

そもそもraspberry piで動いているmotionは無理してる感が強いので気にしてはいなかったのですが、なかなか難儀な現状なのだと実感。

まぁこの辺のことは一旦保留。

現状、omxとかv4l2m2mとかのハードウェアでエンコードしようとするとどうも思い通りにならず、予想よりはるかに劣化した動画になっているのが大問題。

パイプで外部プログラムでエンコードするとビルトインのエンコードと違って遅延もそれなりに発生しているのでイベント処理で結構面倒なことになってたり。

エンコードで固定ビットレートを理論値よりかなり大きくしないと思った通りの動画にならず、その上出来上がった動画をcopyしているだけのはずが、ファイルサイズが小さくなるという。

ま、あれか?ファイルサイズが小さくなるというのは単純に処理上領域確保してデータを書き込んで、閉じて、追記でまたファイルを開いて領域を確保してデータを書き込んで…を繰り返した結果、余計なパディングが発生しているってことでいいのかな? -c:v copyの場合はそのパディングが無くなっただけなのかな?

バイナリチェックしないと何とも言えんな…

なんかあまりバイナリ比較がまともに行えなかったものの、テキストとして強制的に比較した結果、所々の違いはあったものの、元のファイルは末尾にゴミが付いていただけの様子。

予想ではフレームとフレームやブロックとブロックの間にパディングされているものだと思ったのだが。

motion: lightswitch

イベント周りの実装がかなり気になってきたので、少しソースを眺めていました。

気になっていたのは、動作検知して、検知状態に移ってから、解除されるまでの流れがきれいに出来上がっていて、その流れをうまくコントロールできるかどうか知りたかったからなのですが…。そもそもイベントループ中の無駄なループを排除したいという思惑はGW前からあったのですが、どのくらい処理が無駄になっているのかを比較したかったのですが、休み中は全く別の事で手一杯にw

その中で気になる逃げの実装になっている一つがlightswitch関連の設定値。

イベント関連の実装の手直しが結構最近行われていてこのような実装になっているのだと思います。現状では画像の差異の量を、lightswitchの条件下で強制的に0にしているのですが、このようなことを行うと後々痛い目を見そうな感じ。

実際にこの設定を使うと、結構色々なところで誤検知されているのを回避できるので便利そうなのですが、現状だと動作検知がかなり鈍くなっている気がします。

ついでに、昔は起動時や再起動時は普通に開始できたのですが、lightswitchの設定が無効の状態だと必ず最初に動作検知状態に突入し、処理が行われてしまいます。

停止と開始を切り分けず、再始動させれば発生しない感じではあるのですが、設定値をガンガンいじっている現状ではこの動作もかなり目につきます。

なので、この辺ちょっとテコ入れしたいかな…


あと、気づいてなかっただけかもしれませんが、昔は動作検知の出力と実際のカメラ画像はどちらかしか出力できなかったと思うのですが、現状では同時に出力させることができるというとても便利な機能に仕上がってたりして、検知反応を簡単に見れるようになっているのでそっちもテコ入れしたかったりw

まぁでもそこまで触れるかなぁ…

ffmpegのパラメータ周りも、codecの指定もできるようになっていて便利そうだったりするのですが、イマイチうまくいかなかったり、motionプロセス保護のためにblacklistまで用意して、特定のcodecのガードをかけていたり。ガードはすぐ外せるようになってるのですが、ガードがかかってないcodecを指定すると出力がまともにできなかったりするのでそっちも気になります。

2022年5月9日月曜日

C270 白飛びはもしかして…

C270は2つあって、どちらが古いのか若干怪しいのですが、新しいとしてもアマゾンの履歴を見る限り2016/3/28となっているので6年以上前の物となります。

なので暗い夜空の中に見える白い点はカメラセンサの不良か劣化だと思っていたのですが、もしかすると単に動作通知ランプの映り込みかも。

今までここまで暗い中でガラス越しに撮影した経験がないためはっきりとは分からないのですが…

時間ができたら撮影を一旦止めて通知ランプを確認したほうがいいのかもしれません。あと埃もw



2022年5月7日土曜日

C505

アマゾンでWebCamを見ているとC310nなるものを発見。したのは3日ほど前w

勢いでカートに入れたものの、どうせ買うならもう少しいいものが欲しいかもと1日悩んで結局購入したのはC505でした。

用途的に解像度は必要がなく、そこそこ撮影の設定ができればと最近のモデルが欲しいかなと。nシリーズとしてC270nもあり、最初はどちらがいいか悩みつつ。

後から気づいたのが、C270nとC310nの機能的な違いとしては画角が5度ほど違っているようでした。手持ちのC270を購入した時は画角なんて気にもしなかったのですが、用途的には広角の方がよいのですが。

C270から比べれば上位機種っぽいC505ですが、実際にどのくらい違うのか手元に届くまで期待と不安が募ります。

手元に届き早速開封して接続してみました。そしてv4l2-ctl -L で設定パラメータを見てみると…

                     brightness 0x00980900 (int)    : min=0 max=255 step=1 default=128 value=128
                       contrast 0x00980901 (int)    : min=0 max=255 step=1 default=32 value=32
                     saturation 0x00980902 (int)    : min=0 max=255 step=1 default=32 value=32
 white_balance_temperature_auto 0x0098090c (bool)   : default=1 value=1
                           gain 0x00980913 (int)    : min=0 max=255 step=1 default=64 value=131
           power_line_frequency 0x00980918 (menu)   : min=0 max=2 default=2 value=2
                                0: Disabled
                                1: 50 Hz
                                2: 60 Hz
      white_balance_temperature 0x0098091a (int)    : min=0 max=10000 step=10 default=4000 value=7530 flags=inactive
                      sharpness 0x0098091b (int)    : min=0 max=255 step=1 default=24 value=24
         backlight_compensation 0x0098091c (int)    : min=0 max=1 step=1 default=0 value=0
                  exposure_auto 0x009a0901 (menu)   : min=0 max=3 default=3 value=3
                                1: Manual Mode
                                3: Aperture Priority Mode
              exposure_absolute 0x009a0902 (int)    : min=1 max=10000 step=1 default=166 value=665 flags=inactive
         exposure_auto_priority 0x009a0903 (bool)   : default=0 value=1

あんまりC270と変わりませんでしたw

外も少し暗くなってきたので、実際にどのぐらい撮影できるのか確認してみることに。

部屋の中で撮影してみると、全体的に鮮明で反応速度もいい感じ。照明を落としてみるとディスプレイの明かりだけで特に何もしなくてもそれなりに撮影できました。

ただ、ここで気になるところが。動作状態ランプが結構眩しい。

さらに暗いシーンだと、画像のランプ側にその光が干渉している感じ。C505の本体はC270の作りとほとんど変わりがなく、正面のカバーを外すとネジ3本でケースを開けることができました。LEDを物理的に外してもいいのですが、とりあえず光を拡散させるための半透明のプラスチック部分をアルミホイルで覆ってテープで固定してみました。変な接触が怖いので絶縁のためにただのテープでくるんでみました。元に戻して様子を見てみると外に漏れている光はほとんどないのですが、画像の干渉はあまり変化がありません。もしやと思い、レンズ部分を指で覆ってみると…

どうも内部でレンズユニット部分にLEDの光が干渉してしまっているようです。

仕方がないので、梱包に使われていた紙テープが厚そうだったので粘着剤が剥離している部分を使って仕切りを作ってみました。これでなんとか干渉がほとんどなくなったような感じに。

窓から外を撮影してみると、それなり。しかし、暗いベランダのある窓の下に置いて見上げる形で撮影してみたのですが、夜空は撮影できそうになかった。まぁ仕方ないかwパラメータを操作して雲が撮影できる感じにして少し放置してみました。motionの設定をしつつ、様子を見ていたのですが、少し経つとなぜか画像が真っ黒に。この状態になってからパラメータを操作してほとんど効果がなく仕方がないのでとりあえず初期値に戻してから設定し直してみると、何となく撮影できそうだったので放置しているとまたまた真っ黒に。

意味が解らないので、とりあえずタイムラプスを撮影しているC270の窓に置いて撮影してみることに。ここで色々と設定を変えてパラメータの様子を見てみると、どうもexposure_absoluteの値がC270より反応が強い感じ。しかも、マニュアルモードになっているはずなのに、設定後にさらに補正されて数秒で画像の明るさが変動しました。操作していると真っ暗になってしまう原因の一つにexposure_absoluteの値を限界値に設定するとしばらくしてから真っ暗になってしまうようなので値を6000程度にすると真っ暗になりませんでした。

強制的な自動補正がどの程度効いているのか夜間の空を撮影しながら放置して朝見てみると画面は真っ白。さすがにそこまでは強制補正は行われないようです。

C505の販売日は2020/11/19とのこと。定価は¥3,300。今回購入した金額は¥2,500程度。この値段でこれだけ映れば悪くはないんじゃないかな。ただ、現状のままだと、暗い部屋での撮影は内部のLED干渉があるので、この点はコストカットで干渉部分の保護パーツが外されたのか、LEDの輝度が上がったための干渉なのかわかりませんが何とかしてほしいところ。人によってはクレーム出そうですが、ググってみましたがその手の話題今のところ痕跡は見つかりませんでした。

C270をv4l2-ctlでパラメータを操作していて

発売開始時期は知らないが、10以上前なのは確実だと思う。ちょっと調べてみるか…

同じ名前で何度かリニューアルされている感じがするが、最近ではC270nとなってほかのモデルも~nとなってリニューアルされている。C310もC310nとなっていた。

C270はhttp://www.macotakara.jp/blog/accessories/entry-9235.htmlを見ると、2010/08/27となっていた。初代はもっと古かった気もするが、このぐらいなのかもしれない。アマゾンで見ると発売日が2010/8/20となっていたがC310も同じ日付になっていたので、正しい日付はおそらく27日。アマゾンの情報を信頼するなら、定価はC270は¥4,980、C310は¥5,800の模様。記憶ではC270の実売価格は¥3,200~¥1,350ぐらいだったと思う。リニューアルは実売価格に対する販売価格調整だと思う。

夜空を直接撮影していて気付いたパラメータ設定に癖があったのでメモ書き。

明るい場所の撮影は自動調整でほぼ問題なくそれなりに撮影できる。反応速度も実用範囲内だと思う。

pi@rasp3b:~ $ v4l2-ctl -d /dev/video1 -L
                     brightness 0x00980900 (int)    : min=0 max=255 step=1 default=128 value=128
                       contrast 0x00980901 (int)    : min=0 max=255 step=1 default=32 value=32
                     saturation 0x00980902 (int)    : min=0 max=255 step=1 default=32 value=32
 white_balance_temperature_auto 0x0098090c (bool)   : default=1 value=1
                           gain 0x00980913 (int)    : min=0 max=255 step=1 default=64 value=192
           power_line_frequency 0x00980918 (menu)   : min=0 max=2 default=2 value=0
                                0: Disabled
                                1: 50 Hz
                                2: 60 Hz
      white_balance_temperature 0x0098091a (int)    : min=0 max=10000 step=10 default=4000 value=6760 flags=inactive
                      sharpness 0x0098091b (int)    : min=0 max=255 step=1 default=24 value=24
         backlight_compensation 0x0098091c (int)    : min=0 max=1 step=1 default=0 value=0
                  exposure_auto 0x009a0901 (menu)   : min=0 max=3 default=3 value=3
                                1: Manual Mode
                                3: Aperture Priority Mode
              exposure_absolute 0x009a0902 (int)    : min=1 max=10000 step=1 default=166 value=5 flags=inactive
         exposure_auto_priority 0x009a0903 (bool)   : default=0 value=1

これは屋内撮影を想定した使用を想定しているため、暗い場所での撮影は自動ではうまく撮影できない。限界まで感度を得ようとすると露光とゲインを上げて撮影する。そのために

v4l2-ctl -c gain=255,exposure_auto=1,exposure_absolute=10000

というように1回実行し、-Lでパラメータを確認するとちゃんとパラメータが反映されているように見えるのだが、実際の得られる画像がまだ暗い。もう一度実行すると、明るくなる。どうも設定値と実際にデバイスが動作している値とズレがある。C270のファームウェアのバグか、ハード的なバグか、v4l2-ctl側のバグかは不明。だが、どうもおかしい。

一気に設定しているので順番を入れ替えてみるが、変化なし。2回設定を実行する必要がある。

設定値を一つ一つバラバラに実行してみると、状況が若干変わる。

gainを設定して、exposure_autoを設定して、exposure_absoluteを設定しても一気に設定した状態と変わらないが、さらにgainを設定すると、画像が明るくなった。

次に順序を変えてみる。

exposure_auto=3ではexposure_absoluteをセットしても無視されるので最初にexposure_auto=1を実行するのは必須。そのあとexposure_absoluteをセットする。その後gainを上げると…あら不思議、ちゃんと動いた。

結論として、マニュアルでexposure_absoluteをセットすると、C270内部のgainが強制的に書き換えらえれいるように見える。よって、exposure_absoluteを設定した後はgainを設定する必要がある。

余談として、逆にexposure_autoをマニュアル(1)から自動(3)にして結果としてexposure_absoluteが変化してもgainは変化していないように見えた。

2022年5月6日金曜日

raspberry pi 4b: w1_master_driver w1_bus_master1: Family 0 for 00.400000000000.46 is not registered.

GW最初に寝かせていたraspberry piをmotionだけ一時的に使いたかったので電源を入れてみたところ、SDカードが不調になったので別のSDカードにインストールして動かしていたのですが、syslogを今まで見かけたことのないエラーが繰り返し表示されていた。

そのログは起動時は問題ないが、起動後にエラーが繰り返している様子。

May  4 13:30:34 rasp4b4g kernel: [    7.687656] w1_master_driver w1_bus_master1: w1_search: max_slave_count 64 reached, will continue next search.

May  4 13:40:25 rasp4b4g kernel: [   58.337671] w1_master_driver w1_bus_master1: Attaching one wire slave 00.800000000000 crc 8c
May  4 13:40:25 rasp4b4g kernel: [   58.346399] w1_master_driver w1_bus_master1: Family 0 for 00.800000000000.8c is not registered.
May  4 13:41:28 rasp4b4g kernel: [  121.919916] w1_master_driver w1_bus_master1: Attaching one wire slave 00.400000000000 crc 46
May  4 13:41:28 rasp4b4g kernel: [  121.928212] w1_master_driver w1_bus_master1: Family 0 for 00.400000000000.46 is not registered.
May  4 13:42:19 rasp4b4g kernel: [  172.702498] w1_master_driver w1_bus_master1: Attaching one wire slave 00.c00000000000 crc ca
May  4 13:42:19 rasp4b4g kernel: [  172.710612] w1_master_driver w1_bus_master1: Family 0 for 00.c00000000000.ca is not registered.
May  4 13:43:35 rasp4b4g kernel: [  249.143787] w1_master_driver w1_bus_master1: Attaching one wire slave 00.200000000000 crc 23
May  4 13:43:35 rasp4b4g kernel: [  249.149572] w1_master_driver w1_bus_master1: Family 0 for 00.200000000000.23 is not registered.
May  4 13:40:25 rasp4b4g kernel: [   58.337671] w1_master_driver w1_bus_master1: Attaching one wire slave 00.800000000000 crc 8c
May  4 13:40:25 rasp4b4g kernel: [   58.346399] w1_master_driver w1_bus_master1: Family 0 for 00.800000000000.8c is not registered.
May  4 13:41:28 rasp4b4g kernel: [  121.919916] w1_master_driver w1_bus_master1: Attaching one wire slave 00.400000000000 crc 46
May  4 13:41:28 rasp4b4g kernel: [  121.928212] w1_master_driver w1_bus_master1: Family 0 for 00.400000000000.46 is not registered.
May  4 13:42:19 rasp4b4g kernel: [  172.702498] w1_master_driver w1_bus_master1: Attaching one wire slave 00.c00000000000 crc ca
May  4 13:42:19 rasp4b4g kernel: [  172.710612] w1_master_driver w1_bus_master1: Family 0 for 00.c00000000000.ca is not registered.
May  4 13:43:35 rasp4b4g kernel: [  249.143787] w1_master_driver w1_bus_master1: Attaching one wire slave 00.200000000000 crc 23
May  4 13:43:35 rasp4b4g kernel: [  249.149572] w1_master_driver w1_bus_master1: Family 0 for 00.200000000000.23 is not registered.
May  4 13:44:39 rasp4b4g kernel: [  312.726603] w1_master_driver w1_bus_master1: Attaching one wire slave 00.a00000000000 crc af
May  4 13:44:39 rasp4b4g kernel: [  312.736281] w1_master_driver w1_bus_master1: Family 0 for 00.a00000000000.af is not registered.
May  4 13:45:17 rasp4b4g kernel: [  350.645643] w1_master_driver w1_bus_master1: Attaching one wire slave 00.600000000000 crc 65
May  4 13:45:17 rasp4b4g kernel: [  350.656778] w1_master_driver w1_bus_master1: Family 0 for 00.600000000000.65 is not registered.
May  4 13:45:57 rasp4b4g kernel: [  391.145835] w1_master_driver w1_bus_master1: Attaching one wire slave 00.e00000000000 crc e9
May  4 13:45:57 rasp4b4g kernel: [  391.154513] w1_master_driver w1_bus_master1: Family 0 for 00.e00000000000.e9 is not registered.
May  4 13:47:00 rasp4b4g kernel: [  454.127072] w1_master_driver w1_bus_master1: Attaching one wire slave 00.100000000000 crc 9d
May  4 13:47:00 rasp4b4g kernel: [  454.135840] w1_master_driver w1_bus_master1: Family 0 for 00.100000000000.9d is not registered.
May  4 13:47:40 rasp4b4g kernel: [  493.277022] w1_master_driver w1_bus_master1: Attaching one wire slave 00.900000000000 crc 11
May  4 13:47:40 rasp4b4g kernel: [  493.284808] w1_master_driver w1_bus_master1: Family 0 for 00.900000000000.11 is not registered.
May  4 13:48:55 rasp4b4g kernel: [  568.486570] w1_master_driver w1_bus_master1: Attaching one wire slave 00.500000000000 crc db
May  4 13:48:55 rasp4b4g kernel: [  568.494303] w1_master_driver w1_bus_master1: Family 0 for 00.500000000000.db is not registered.
May  4 13:49:47 rasp4b4g kernel: [  620.475808] w1_master_driver w1_bus_master1: Attaching one wire slave 00.d00000000000 crc 57
May  4 13:49:47 rasp4b4g kernel: [  620.484518] w1_master_driver w1_bus_master1: Family 0 for 00.d00000000000.57 is not registered.
May  4 13:50:13 rasp4b4g kernel: [  646.925677] w1_master_driver w1_bus_master1: Attaching one wire slave 00.300000000000 crc be
May  4 13:50:13 rasp4b4g kernel: [  646.933426] w1_master_driver w1_bus_master1: Family 0 for 00.300000000000.be is not registered.
May  4 13:51:03 rasp4b4g kernel: [  696.325929] w1_master_driver w1_bus_master1: Attaching one wire slave 00.b00000000000 crc 32
May  4 13:51:03 rasp4b4g kernel: [  696.335037] w1_master_driver w1_bus_master1: Family 0 for 00.b00000000000.32 is not registered.
May  4 13:51:42 rasp4b4g kernel: [  735.565958] w1_master_driver w1_bus_master1: Attaching one wire slave 00.700000000000 crc f8
May  4 13:51:42 rasp4b4g kernel: [  735.574970] w1_master_driver w1_bus_master1: Family 0 for 00.700000000000.f8 is not registered.
May  4 13:52:34 rasp4b4g kernel: [  787.545977] w1_master_driver w1_bus_master1: Attaching one wire slave 00.f00000000000 crc 74
May  4 13:52:34 rasp4b4g kernel: [  787.553953] w1_master_driver w1_bus_master1: Family 0 for 00.f00000000000.74 is not registered.
May  4 13:53:36 rasp4b4g kernel: [  850.006573] w1_master_driver w1_bus_master1: Attaching one wire slave 00.080000000000 crc c2
May  4 13:53:36 rasp4b4g kernel: [  850.014503] w1_master_driver w1_bus_master1: Family 0 for 00.080000000000.c2 is not registered.
May  4 13:54:30 rasp4b4g kernel: [  903.266685] w1_master_driver w1_bus_master1: Attaching one wire slave 00.880000000000 crc 4e
May  4 13:54:30 rasp4b4g kernel: [  903.274555] w1_master_driver w1_bus_master1: Family 0 for 00.880000000000.4e is not registered.
May  4 13:55:07 rasp4b4g kernel: [  941.107598] w1_master_driver w1_bus_master1: Attaching one wire slave 00.480000000000 crc 84
May  4 13:55:07 rasp4b4g kernel: [  941.116282] w1_master_driver w1_bus_master1: Family 0 for 00.480000000000.84 is not registered.
May  4 13:55:58 rasp4b4g kernel: [  991.797850] w1_master_driver w1_bus_master1: Attaching one wire slave 00.c80000000000 crc 08
May  4 13:55:58 rasp4b4g kernel: [  991.805829] w1_master_driver w1_bus_master1: Family 0 for 00.c80000000000.08 is not registered.
May  4 13:57:15 rasp4b4g kernel: [ 1068.479304] w1_master_driver w1_bus_master1: Attaching one wire slave 00.280000000000 crc e1
May  4 13:57:15 rasp4b4g kernel: [ 1068.488104] w1_master_driver w1_bus_master1: Family 0 for 00.280000000000.e1 is not registered.
May  4 13:58:18 rasp4b4g kernel: [ 1131.990488] w1_master_driver w1_bus_master1: Attaching one wire slave 00.a80000000000 crc 6d
May  4 13:58:18 rasp4b4g kernel: [ 1131.999217] w1_master_driver w1_bus_master1: Family 0 for 00.a80000000000.6d is not registered.
May  4 13:59:22 rasp4b4g kernel: [ 1195.491899] w1_master_driver w1_bus_master1: Attaching one wire slave 00.680000000000 crc a7
May  4 13:59:22 rasp4b4g kernel: [ 1195.500845] w1_master_driver w1_bus_master1: Family 0 for 00.680000000000.a7 is not registered.
May  4 14:00:02 rasp4b4g kernel: [ 1235.942504] w1_master_driver w1_bus_master1: Attaching one wire slave 00.e80000000000 crc 2b
May  4 14:00:02 rasp4b4g kernel: [ 1235.951466] w1_master_driver w1_bus_master1: Family 0 for 00.e80000000000.2b is not registered.
May  4 14:01:05 rasp4b4g kernel: [ 1299.103551] w1_master_driver w1_bus_master1: Attaching one wire slave 00.180000000000 crc 5f
May  4 14:01:05 rasp4b4g kernel: [ 1299.112035] w1_master_driver w1_bus_master1: Family 0 for 00.180000000000.5f is not registered.
May  4 14:01:45 rasp4b4g kernel: [ 1338.304235] w1_master_driver w1_bus_master1: Attaching one wire slave 00.980000000000 crc d3
May  4 14:01:45 rasp4b4g kernel: [ 1338.312876] w1_master_driver w1_bus_master1: Family 0 for 00.980000000000.d3 is not registered.
May  4 14:02:34 rasp4b4g kernel: [ 1387.584971] w1_master_driver w1_bus_master1: Attaching one wire slave 00.580000000000 crc 19
May  4 14:02:34 rasp4b4g kernel: [ 1387.594343] w1_master_driver w1_bus_master1: Family 0 for 00.580000000000.19 is not registered.

ある程度抜き出してみたが、w1と言われて心当たりがありそうなのはone wire絡みなのか?と言うところ。初期設定でインタフェースは有効にした記憶があるが、まだプログラムは動かしていない。物理的につながっているのはI2Cと、ただのIOポートにぶら下がっている温度計だけのはず。なんにしても今までこんなエラーの記憶は全くない。なので検索してみるとraspberry pi 公式のアーティクルがヒットした。

w1_master_driver w1_bus_master1: Family 0 for 00.200000000000.23 is not registered. - Raspberry Pi Forums

細かいt頃が全く分からないものの、、最終的にはraspi-configで1wireインターフェースをオフにするということ。フォーラム内ではなぜか直接/boot/configを修正する感じになっていた。

インタフェースをオフにしてデバイスが使えなくても今は問題がないので、早速インタフェースをオフに。そして再起動。

ログを見る限りエラーは出なくなった。4bだとone wireが使えないのか接続すればエラーが無くなるのかはよくわからない、

2022年5月3日火曜日

PHPから読み込むiniファイルでハマる

色々とテコ入れしているので影響範囲が大きかったりします。

各環境で仕様で吸収できない部分を仕方なしにiniファイルを使って設定しています。

できる限り最小限にすべく、一つのiniにしています。

iniにしている理由はPHPでiniファイルがそのまま扱えたというのが経緯だったりするのですが、PHP7.0以降なんか条件が無駄に厳しくなっていって変な方向に行っているので捨ててもいいのかも。

ローカル仕様なら仕様を単純にすることができるので、外的仕様による余計な時間を取られなくなるので。そもそもiniファイルにそんな難しい仕様を盛り込むべきじゃない。

と、今回ハマったのは、テコ入れしてていつの間にか温度ログを表示しているグラフがモノクロ表示になってしまったことが始まりでした。

最初はLinuxバージョンを上げた影響か、メモリ不足が原因かと思ってたのですが、どうも原因がはっきりせず、もしくはaptでインストールされているパッケージ特有のバグかとも思ったのですが、よくわからず。パッケージもインストールされているし、不足してそうなライブラリもなかった。そもそも作業前はちゃんとカラーになってたし。

気を取り直してapatchのログを見てみると、errorログ内に大量にphpのエラー表示が。

エラーは特定の一つの行でPHP Notice:  Undefined indexというメッセージ。

ソースを見てもエラーとなりそうじゃないので、早速デバッグ用にスクリプトを入れてターミナルから直接実行してみると、該当の配列が見事に空っぽ。へ?w

何度か実行し一番最初に見かけないエラーがあるのに気づきました。

PHP Warning:  syntax error, unexpected '=' in /etc/xxxxxxx.ini on line 41
 in /home/htdocs/graph_temperature.php on line 117 

iniファイルに無効な=が…ってありますよ。確かに。文法的にはエラーだろうけど、iniファイル的にはオッケーなんじゃないかな…普通…

仕方がないので、ダブルコーテーションで括ってやり過ごしましたが、実際使う側でも不要な処理が増えてしまいました。

無事グラフも元通りに。つ、つかれた…。