2023年7月 この範囲を時系列順で読む この範囲をファイルに出力する
まだまだ途中ではあるものの使えるっちゃ使える LTC_Player で本業の音源チェックをしています。
思いっきり自画自賛ですが、コレ、便利です。
作った本人だからってのが81%くらいありそうですけど、こうやって実務で使うと完成イメージが具体的になります。
今は設定変更のロックを機能別にしていますが、Play_Mode という括りで良さそうです。本番モード、リハモード、机上作業モード、プレイリスト編集モードって感じです。各種設定のロックの組み合わせがモードの違いとなりますが、機能単位でロックを掛けられるようにしていますので変更するのは簡単です。
私のプログラムの書き方を整理しますと「状態を把握」「処理の振り分け」「パラメータとフラグの設定」「パラメータとフラグを見て最終処理」ってのを1フェーズ単位にして管理しています。バグが多く発生する書き方は処理を振り分ける際に一部の最終処理までしてしまう書き方だったので、幾重にも重なったふるいにかけて粉を落とすイメージでフラグを立て、最後に落ちて来たフラグを見て最終処理をするのです。その都度結果を求めると整合性を取るのが大変になり、それこぞバグの原因になるのでした・・・私の場合ですけどね。完全独学ですから王道の書き方なんて知りませんが、一本筋の処理フェーズしかないPICのアセンブラで染みついた構築の仕方です。ガチガチで汎用性が狭い感じがしますが、発展させると疑似的なマルチスレッドも構成出来ます。PICではタイマー1個でポーリングによる複数の時間分岐を得る書き方をレギュラー化していますが、これって精度は低いけどRTOSっぽくね?とか思いながら使っています。タイムスレッドと勝手に呼称している書式ですが、余程のレスポンスを求めないなら割込みを使わずタイムスレッドとモジュールの割込みフラグによるポーリング処理で複数の処理をPICの中で実現出来ています。特別なレスポンスを求める要素にだけ割込みを使い、高級言語で言うところの sleep を絶対に使わない方針です。
ソフトウェアは時間の管理が一番大事だと思う今日この頃。適切に時間が管理されていればインプットもアプトプットも整合性を持って管理出来ます。
#Python #PIC
思いっきり自画自賛ですが、コレ、便利です。
作った本人だからってのが81%くらいありそうですけど、こうやって実務で使うと完成イメージが具体的になります。
今は設定変更のロックを機能別にしていますが、Play_Mode という括りで良さそうです。本番モード、リハモード、机上作業モード、プレイリスト編集モードって感じです。各種設定のロックの組み合わせがモードの違いとなりますが、機能単位でロックを掛けられるようにしていますので変更するのは簡単です。
私のプログラムの書き方を整理しますと「状態を把握」「処理の振り分け」「パラメータとフラグの設定」「パラメータとフラグを見て最終処理」ってのを1フェーズ単位にして管理しています。バグが多く発生する書き方は処理を振り分ける際に一部の最終処理までしてしまう書き方だったので、幾重にも重なったふるいにかけて粉を落とすイメージでフラグを立て、最後に落ちて来たフラグを見て最終処理をするのです。その都度結果を求めると整合性を取るのが大変になり、それこぞバグの原因になるのでした・・・私の場合ですけどね。完全独学ですから王道の書き方なんて知りませんが、一本筋の処理フェーズしかないPICのアセンブラで染みついた構築の仕方です。ガチガチで汎用性が狭い感じがしますが、発展させると疑似的なマルチスレッドも構成出来ます。PICではタイマー1個でポーリングによる複数の時間分岐を得る書き方をレギュラー化していますが、これって精度は低いけどRTOSっぽくね?とか思いながら使っています。タイムスレッドと勝手に呼称している書式ですが、余程のレスポンスを求めないなら割込みを使わずタイムスレッドとモジュールの割込みフラグによるポーリング処理で複数の処理をPICの中で実現出来ています。特別なレスポンスを求める要素にだけ割込みを使い、高級言語で言うところの sleep を絶対に使わない方針です。
ソフトウェアは時間の管理が一番大事だと思う今日この頃。適切に時間が管理されていればインプットもアプトプットも整合性を持って管理出来ます。
#Python #PIC
Table のカラム幅の自動調整で少し悩む。
初期サイズからウィンドウ枠をドラックするサイズ変更を1回でもやれば問題ないのですが、初期サイズからいきなり最大化(フルスクリーン)するとカラム幅が期待値にならない。一見良いのですが全体的に平均的な幅になろうとします。
ウィンドウサイズが初期値以下になると初期値に戻る機能を付けていたので、サイズ変更後にこの機能が1回余計に発動する騙しを入れたところ解決。上記のウィンドウ枠をドラックしてサイズ変更することが自動的に起こる様にしたワケ。ウィンドウサイズを変更をした後の画面復帰が少し遅くなりますが、頻繁に行われる操作ではないのでいいかなと。フラグを使えば起動後一回だけの動作に出来るので書き換えてみます。
PySimpleGUI はこういった騙しみないなのを入れないと期待値を得られないことがあるようです。
あと、列ごとに左寄せ、センタリング、右寄せの指定が出来ないのがシックリこない。
調べたところ次のバージョンのPySimpleGUIでは対応するとのこと。GitHubにあるバージョンを手動インストールすれば今でも出来るらしいですが、pipで入手するにはもう少し待たなければならないようです。
フォントの指定も列ごとに出来るといいのですけどね。
#Python
初期サイズからウィンドウ枠をドラックするサイズ変更を1回でもやれば問題ないのですが、初期サイズからいきなり最大化(フルスクリーン)するとカラム幅が期待値にならない。一見良いのですが全体的に平均的な幅になろうとします。
ウィンドウサイズが初期値以下になると初期値に戻る機能を付けていたので、サイズ変更後にこの機能が1回余計に発動する騙しを入れたところ解決。上記のウィンドウ枠をドラックしてサイズ変更することが自動的に起こる様にしたワケ。ウィンドウサイズを変更をした後の画面復帰が少し遅くなりますが、頻繁に行われる操作ではないのでいいかなと。フラグを使えば起動後一回だけの動作に出来るので書き換えてみます。
PySimpleGUI はこういった騙しみないなのを入れないと期待値を得られないことがあるようです。
あと、列ごとに左寄せ、センタリング、右寄せの指定が出来ないのがシックリこない。
調べたところ次のバージョンのPySimpleGUIでは対応するとのこと。GitHubにあるバージョンを手動インストールすれば今でも出来るらしいですが、pipで入手するにはもう少し待たなければならないようです。
フォントの指定も列ごとに出来るといいのですけどね。
#Python
PySimpleGUI にてウィンドウのサイズを取得出来ました。
これは基本情報です。
課題は Windows サイズに合わせて Table のカラム幅を自動調整する方法です。
純正のドキュメントには解決策が無くネットをしばらく徘徊。
結論から言うと解決したのですが、Tkinter のパラメータを PySimpleGUI から直接操作すると思われるコマンドでカラム幅を直接指定しました。
Tkinter を知らないので全く理解出来ていませんが、先達の例文にあった定型文を試したところビンゴでした。
細かい調整は沢山ありますが、根本的なところは解決したので一安心です。
#Python
これは基本情報です。
課題は Windows サイズに合わせて Table のカラム幅を自動調整する方法です。
純正のドキュメントには解決策が無くネットをしばらく徘徊。
結論から言うと解決したのですが、Tkinter のパラメータを PySimpleGUI から直接操作すると思われるコマンドでカラム幅を直接指定しました。
Tkinter を知らないので全く理解出来ていませんが、先達の例文にあった定型文を試したところビンゴでした。
細かい調整は沢山ありますが、根本的なところは解決したので一安心です。
#Python
本業が詰まってしまい工作が進みません。
困ったような仕方ないような。
さて、合間に調べモノと妄想はしています。
課題は PysimpleGUI のウィンドウのサイズを変更しても画面レイアウトを成立させるにはどうするかです。
まずは基本情報の位置とサイズの取得です。
位置(左上の角)は sg.window.current_location() を用います。Tupleで(width, height)を取得出来ます。
ウィンドウサイズを取得するには sg.window.size を用います。Tupleで(width, height)を取得出来ます。ちなみに size の後にカッコは入れません。
ウェジットのサイズも同様の方法で取得出来ます。
ただ、PysimpleGUIはウェジットのサイズ指定が文字数/行数単位とピクセル単位が混在していますので、取得したサイズ情報からウェジットのサイズ指定をどのようにするか熟慮しないといけません。
#Python
困ったような仕方ないような。
さて、合間に調べモノと妄想はしています。
課題は PysimpleGUI のウィンドウのサイズを変更しても画面レイアウトを成立させるにはどうするかです。
まずは基本情報の位置とサイズの取得です。
位置(左上の角)は sg.window.current_location() を用います。Tupleで(width, height)を取得出来ます。
ウィンドウサイズを取得するには sg.window.size を用います。Tupleで(width, height)を取得出来ます。ちなみに size の後にカッコは入れません。
ウェジットのサイズも同様の方法で取得出来ます。
ただ、PysimpleGUIはウェジットのサイズ指定が文字数/行数単位とピクセル単位が混在していますので、取得したサイズ情報からウェジットのサイズ指定をどのようにするか熟慮しないといけません。
#Python
Python をスレッドに分ける基準についてオレメモです。
待ち時間が発生する処理単位をスレッドとして独立化することが基本的な考え方でしょう。デバイスの応答待ちや重い処理の終了待ちがある場合です。この間に何もしなくていいならスレッド化をする必要はありませんが、大概は待ち時間に他の処理を平行して行うことになるからです。
この様な想定がされる場合は最初からマルチスレッドで書き始めるのが良さそうです。主処理を親スレッドとしてサブルーチン的な子スレッドを定義する手もありますが、親スレッドはスレッド間通信の管理と子スレッドの起動・終了だけを扱うようにするとわかりやすいような気がします。
スレッド間通信の手段はデータ量や求める速度によりますが Queue を使うのが良さそうです。Tuple で包めばどんな型でもやりとり出来ますし、FIFO スタックなのでスレッド間のタイミング管理が楽です。
こういった検討する場合、一つのプロセスで処理しきれるかも同時に検討します。OS次第ではありますが、一つのプロセスは一つのCPUスレッドで処理されるのが普通ですから、処理が重い場合はプロセスを分けてCPUスレッドを分散させた方がいいこともあります。ただし、プロセスを分けると子プロセスを起動するのに時間がかかり、プロセス間通信も手続きが煩雑ですので、ハードウェアの能力を余すところなく使えそうなマルチプロセスが必ずしも最良の選択とは言えません。
#Python
待ち時間が発生する処理単位をスレッドとして独立化することが基本的な考え方でしょう。デバイスの応答待ちや重い処理の終了待ちがある場合です。この間に何もしなくていいならスレッド化をする必要はありませんが、大概は待ち時間に他の処理を平行して行うことになるからです。
この様な想定がされる場合は最初からマルチスレッドで書き始めるのが良さそうです。主処理を親スレッドとしてサブルーチン的な子スレッドを定義する手もありますが、親スレッドはスレッド間通信の管理と子スレッドの起動・終了だけを扱うようにするとわかりやすいような気がします。
スレッド間通信の手段はデータ量や求める速度によりますが Queue を使うのが良さそうです。Tuple で包めばどんな型でもやりとり出来ますし、FIFO スタックなのでスレッド間のタイミング管理が楽です。
こういった検討する場合、一つのプロセスで処理しきれるかも同時に検討します。OS次第ではありますが、一つのプロセスは一つのCPUスレッドで処理されるのが普通ですから、処理が重い場合はプロセスを分けてCPUスレッドを分散させた方がいいこともあります。ただし、プロセスを分けると子プロセスを起動するのに時間がかかり、プロセス間通信も手続きが煩雑ですので、ハードウェアの能力を余すところなく使えそうなマルチプロセスが必ずしも最良の選択とは言えません。
#Python
コロナも明けた感じで繁忙期に入っています。開発・製作をする時間が取りにくくなってきました。
LTC Player は早く欲しい気持ちはあるものの、近日中に使いたい案件があるワケではありません。1年くらいかけてノンビリ作るつもりです。
先日も書きましたが、Python らしい様式で書き直そうと思います。マルチスレッドの基本構造を最初から組み入れ、平文ではなく構造化・ライブラリ化(ヘッダーファイル化)を進め、可能な部分は出来るだけクラス化するのです。
PysimpleGUIも読みやすく手直しがしやすい書き方を検討したいですね。ウェジット一つにも設定項目が多いのでちょっとしたウィンドウ作るだけで膨大なコマンド数になりますが、これを出来るだけ簡素に書きたいのです。他人に読んでもらう気はありませんが、2年後の自分が理解できるようには書きたいかなと。PysimpleGUIは他の製作でも使いたいので、習作というか自分なりのひな形作りも兼ねるつもりです。
複数のファイルを使って構造的に書いていきますので VSCode を使った方が楽です。RaspberryPi の開発では便利に使っていますが、目的・用途に合わせたセッティングの仕方をオレマニュアルにまとめる必要があります。VSCode は素直で使いやすいエディタだと思うのですが、やれることが多すぎるので最初の段取りをキチンと踏まないと後で困るからです。
ファイル1枚の短いモノなら秀丸エディタでチョイチョイ書いた方が手っ取り早いのですけど、LTC PLayer はそういう規模ではなくなっています。
#Python
LTC Player は早く欲しい気持ちはあるものの、近日中に使いたい案件があるワケではありません。1年くらいかけてノンビリ作るつもりです。
先日も書きましたが、Python らしい様式で書き直そうと思います。マルチスレッドの基本構造を最初から組み入れ、平文ではなく構造化・ライブラリ化(ヘッダーファイル化)を進め、可能な部分は出来るだけクラス化するのです。
PysimpleGUIも読みやすく手直しがしやすい書き方を検討したいですね。ウェジット一つにも設定項目が多いのでちょっとしたウィンドウ作るだけで膨大なコマンド数になりますが、これを出来るだけ簡素に書きたいのです。他人に読んでもらう気はありませんが、2年後の自分が理解できるようには書きたいかなと。PysimpleGUIは他の製作でも使いたいので、習作というか自分なりのひな形作りも兼ねるつもりです。
複数のファイルを使って構造的に書いていきますので VSCode を使った方が楽です。RaspberryPi の開発では便利に使っていますが、目的・用途に合わせたセッティングの仕方をオレマニュアルにまとめる必要があります。VSCode は素直で使いやすいエディタだと思うのですが、やれることが多すぎるので最初の段取りをキチンと踏まないと後で困るからです。
ファイル1枚の短いモノなら秀丸エディタでチョイチョイ書いた方が手っ取り早いのですけど、LTC PLayer はそういう規模ではなくなっています。
#Python
弊社の音響担当に意見を聞きました。使ってもらうために彼らの慣れに合わせたいと思っているので、私の感覚だけで作りたくないのです。
こちらのイメージも具体的になってきたのでナルホドねぇ~が連発でしたが、そんな話の中で驚いたのはいわゆる叩きに使えるアプリが少ないという事実。
世の中には音楽再生アプリが数多ありますので私が作ったアプリを使ってくれるだろうかと思っていましたが、音響さんにとって便利な機能を積極的に取り込めば割り込む余地はありそうです。
大半の音楽再生アプリはあくまで音楽を聴くことを目的にしているためか操作に対するレスポンスが悪くキッカケ合わせに使うのは難しいのだそうです。私が音源再生のライブラリとして使っているVLCライブラリはレスポンスが良いので不思議です。
マルチスレッド化を考えていますが、その前にソースコードの整理が必要っぽいです。
フラグを用いた逐次処理をベタベタの平文で書いていますが、2000行に届こうともなるとインデックスが使えない平文ではエディタを上下スクロールするだけでも面倒ですし、今後の加筆、修正を考えるとこのままではいけないような気がします。
特に PysimpleGUI の設定が大量なので、せめてこの辺りをC言語で言うところのヘッダーファイル化したいものです。定数や関数をオレ様ライブラリ化するのですが、これが正しい書き方なのでしょう。
ここまでを試作とし、Python として美しい書式で新たに書いた方がいいのかな?
#Python
こちらのイメージも具体的になってきたのでナルホドねぇ~が連発でしたが、そんな話の中で驚いたのはいわゆる叩きに使えるアプリが少ないという事実。
世の中には音楽再生アプリが数多ありますので私が作ったアプリを使ってくれるだろうかと思っていましたが、音響さんにとって便利な機能を積極的に取り込めば割り込む余地はありそうです。
大半の音楽再生アプリはあくまで音楽を聴くことを目的にしているためか操作に対するレスポンスが悪くキッカケ合わせに使うのは難しいのだそうです。私が音源再生のライブラリとして使っているVLCライブラリはレスポンスが良いので不思議です。
マルチスレッド化を考えていますが、その前にソースコードの整理が必要っぽいです。
フラグを用いた逐次処理をベタベタの平文で書いていますが、2000行に届こうともなるとインデックスが使えない平文ではエディタを上下スクロールするだけでも面倒ですし、今後の加筆、修正を考えるとこのままではいけないような気がします。
特に PysimpleGUI の設定が大量なので、せめてこの辺りをC言語で言うところのヘッダーファイル化したいものです。定数や関数をオレ様ライブラリ化するのですが、これが正しい書き方なのでしょう。
ここまでを試作とし、Python として美しい書式で新たに書いた方がいいのかな?
#Python
Pythonでマルチスレッドをする方法を改めて調べていました。
以前は threading を使いましたが、concurrent.futures が便利っぽい。普通の関数を使うのと大差ない手間で使えます。
しかもマルチスレッドだけでなくマルチプロセスも扱えます。マルチプロセスでも fork して管理する作業が無く、マルチスレッドとほぼ同じ書き方で使えるので、どちらかで書いておけば後から変更するのも簡単。
マルチスレッドとマルチプロセスの違いは先達の書き込みが沢山があるので割愛しますが、今回の用途ではマルチスレッドが良さそうです。処理の総量はシングルプロセスでも十分に間に合っているのですが、ウィンドウマネージャーの待ちとシリアル通信の待ちがかみ合わないことへの措置なので軽快なマルチスレッドなワケです。
#Python
以前は threading を使いましたが、concurrent.futures が便利っぽい。普通の関数を使うのと大差ない手間で使えます。
しかもマルチスレッドだけでなくマルチプロセスも扱えます。マルチプロセスでも fork して管理する作業が無く、マルチスレッドとほぼ同じ書き方で使えるので、どちらかで書いておけば後から変更するのも簡単。
マルチスレッドとマルチプロセスの違いは先達の書き込みが沢山があるので割愛しますが、今回の用途ではマルチスレッドが良さそうです。処理の総量はシングルプロセスでも十分に間に合っているのですが、ウィンドウマネージャーの待ちとシリアル通信の待ちがかみ合わないことへの措置なので軽快なマルチスレッドなワケです。
#Python
EVがエコである条件は、環境負荷が少ないエネルギー源で電力を起こし消費量も少ないことです。製造においても運用においてもです。
ところが現実は違うようです。電力の大半を火力発電で賄い、運用エネルギーの消費量も少ないとは言えず、製造ではガソリン車よりも多くのエネルギーを必要とするそうな。
ぶっちゃけ、目の前で排ガスを出さないだけでエコとは呼べないのが今のEVです。給電インフラの不足や電池の原料採掘と廃棄のことまで言い出したらキリがありません。
まぁ、目の前で排ガスを出さないのはアリっちゃありっちゃありなんですけど。
そんなこんなの裏で人造石油が注目されています。藻に下水を喰わせて搾り取ったり、炭酸水に原油(種油)を混ぜて培養するなど様々な方法が考案されていますが、人造石油のいいところは大気中の二酸化炭素が原料の一部になること、燃やしても有害物質の発生がとても少ないことなどです。特に硫黄の含有量がほぼゼロなので硫黄酸化物(SOx)の排出が理屈ではゼロです。しかもとても安価に作れるそうな。これは凄いことです。
欠点があるとするなら主要特許を持っているのが日本だということです。
日本車潰し(正確には日本のエンジンメーカー潰し)のためのEV化なのに、このままではEVはダメでやっぱり内燃機関でしょとなり燃料まで日本が強くなって本末転倒です。
次世代燃料、高性能電池、レアメタルレス高性能モーターなどの主要特許を日本がほぼ独占しているのは皮肉でしかありません。
他者の足を引っ張ることで一番になろうとしても頂点には立てないという道徳の授業かな?
#雑談
ところが現実は違うようです。電力の大半を火力発電で賄い、運用エネルギーの消費量も少ないとは言えず、製造ではガソリン車よりも多くのエネルギーを必要とするそうな。
ぶっちゃけ、目の前で排ガスを出さないだけでエコとは呼べないのが今のEVです。給電インフラの不足や電池の原料採掘と廃棄のことまで言い出したらキリがありません。
まぁ、目の前で排ガスを出さないのはアリっちゃありっちゃありなんですけど。
そんなこんなの裏で人造石油が注目されています。藻に下水を喰わせて搾り取ったり、炭酸水に原油(種油)を混ぜて培養するなど様々な方法が考案されていますが、人造石油のいいところは大気中の二酸化炭素が原料の一部になること、燃やしても有害物質の発生がとても少ないことなどです。特に硫黄の含有量がほぼゼロなので硫黄酸化物(SOx)の排出が理屈ではゼロです。しかもとても安価に作れるそうな。これは凄いことです。
欠点があるとするなら主要特許を持っているのが日本だということです。
日本車潰し(正確には日本のエンジンメーカー潰し)のためのEV化なのに、このままではEVはダメでやっぱり内燃機関でしょとなり燃料まで日本が強くなって本末転倒です。
次世代燃料、高性能電池、レアメタルレス高性能モーターなどの主要特許を日本がほぼ独占しているのは皮肉でしかありません。
他者の足を引っ張ることで一番になろうとしても頂点には立てないという道徳の授業かな?
#雑談
LTC Player は音源プレーヤー部がほぼ終わり。今後は LTC Generator の制御を組み込んでいきます。
LTC Generator の制御部はマルチスレッドを使って音楽プレーヤーと分ける必要があると思われます。LTC Generator との通信は最短で33msec(1/30秒)毎に行われますが、PysimpleGUI の sg.window.read() のタイムアウトを25msecにしているためにタイミングが間に合わない可能性があるからです。タイムアウトをもっと早くすれば良さそうなものですが、これ以上早くすると PysimpleGUI にとってよろしくないのです。あちらを立てればこちらが立たず状態ですが、トータルの処理量には無理は無く、あくまでタイミングの問題ですから、マルチスレッドにすればストレス無く動くと思います。
スレッド間通信には Queue を使えばいいでしょう。共有メモリや Pipe より通信は遅いのですが、List だろうが Tuple だろうがPythonで扱う変数をそのまま扱えるので便利です。通信するデータ量も僅かですから速度が気になることもないでしょう。ちなみに、Queue を送った後にほんの僅かな sleep() を入れると受け側のスレッドが動くまでの時間を短く出来る様です。
#Python
LTC Generator の制御部はマルチスレッドを使って音楽プレーヤーと分ける必要があると思われます。LTC Generator との通信は最短で33msec(1/30秒)毎に行われますが、PysimpleGUI の sg.window.read() のタイムアウトを25msecにしているためにタイミングが間に合わない可能性があるからです。タイムアウトをもっと早くすれば良さそうなものですが、これ以上早くすると PysimpleGUI にとってよろしくないのです。あちらを立てればこちらが立たず状態ですが、トータルの処理量には無理は無く、あくまでタイミングの問題ですから、マルチスレッドにすればストレス無く動くと思います。
スレッド間通信には Queue を使えばいいでしょう。共有メモリや Pipe より通信は遅いのですが、List だろうが Tuple だろうがPythonで扱う変数をそのまま扱えるので便利です。通信するデータ量も僅かですから速度が気になることもないでしょう。ちなみに、Queue を送った後にほんの僅かな sleep() を入れると受け側のスレッドが動くまでの時間を短く出来る様です。
#Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105