2024年5月3日金曜日

esp32でステッピングモーター操作 ~電源がポイント~

 まだ、カメラサーバーのほうはうまく動作してないが、ステッピングモーターの動作は、コードを多少改善(サーバからのレスポンスも処理するように)してので、だいぶ安定してきた。


※いろいろ試したが、WIFIで、ストリーミングとステッピングモータの並行操作はあまり調子がよくない。
※そこで、これまで1.2V×4本の充電池を使ってきたが、試しに5Vのモバイルバッテリーを使ってみる。少し古くなったせいか(といっても、まだ1年ぐらいだが)接触不良っぽい。接点復活剤を使ったら、回復した。
 これだと、容量が十分なようで、安定している。カメラサーバーも、途切れることは少なくなった。どうやら、不安定さに電源が関係していたようだ。モーター、カメラ、Webサーバと消費電力もけっこう大きくなっていたため、電源容量が不足していると不安定になったのだと思われる。

2024年5月2日木曜日

ESP32で、ステッピングモーターとカメラ同時使用 うまくいかない

  MLA用のリモート操作バリコンの製作をしばらくぶりに再開してみた。が、ESP32をステッピングモーター用とカメラ用と2つ同時使用を試してみたがうまくいかない。最初は、カメラが動作しているのを確認できたが、ステッピングモータを操作し始めると、カメラがフリーズしてしまう。動画の通信がいったん途切れると復活しないのはなぜか?。もう少し、調整が必要なようです。とりあえず、動作監視なしでの、バリコンだけは操作できそうですが。

手前が、ダイソーのケースにESP32とバリコンをおさめたもの。
後方のPCで、操作を試しているところ。
※ その後、javascript関連にエラーはないことが確認できたので、カメラサーバのほうの仕様?の可能性もあると思い、とりあえず、モーター操作開始と同時に、IFrameをOffにし、必要に応じて、On(画面にボタン追加)できるようにした。


2024年4月30日火曜日

Intel、第13~14世代CPUが破損・劣化する不具合

 13~14世代の不具合がニュースになっている。自分の場合は、コスパを考え、あえて最新のCPUを避けて、一昨年、第11世代にしたのだけど、何事も新製品が必ずしも確実とは言えないことはよくあることかも。製品選びも難しいものです。

2024年4月29日月曜日

動的計画法について

 アルゴリズムの定石?なのかもしれませんが、今まで知らずにいました。わかりやすい説明がありました。時間がかかる探索などに有効なようです。これを、実際の場面に適用するのは、また別の難しさがありそうですが。

https://dai1741.github.io/maximum-algo-2012/docs/dynamic-programming/

2024年4月27日土曜日

ウエブ最適化ではじめる機械学習 備忘録 P19 ベイズ更新について

p(y)=∫p(x,y) dx  加法定理         p(x|y)=p(x,y)/p(y) 乗法定理
p(x,y)=p(x|y)p(y) = p(y|x)p(x)  2つ目の=より
p(x|y)=P(y|x)p(x)/p(y)   ベイズの定理
p(Θ|D)=p(D|Θ)p(Θ)/p(D)   p(D)は定数とみなされるため(Θの影響なし)
p(Θ|D) ∝ p(D|Θ)p(Θ) :p(D)証拠(evidence) or 正規化定数(nomalizing constant) p(Θ)事前分布 p(Θ|D)事後分布
  書籍にはないが  p(D)=Σp(D|Θi)p(Θi) も頭に入れておいたほうがいいようだ。 

これ以降は、下記リンクを参照させていただいた。
 https://qiita.com/ground0state/items/210faf0e7f3b0362426b

p(Θ|D1,D2)=p(D1,D2|Θ) p(Θ) / p(D1,D2)
   =p(D1|Θ) p(D2|Θ)p(Θ)/ P(D1)P(D2)
   =( p(D2|Θ)/P(D2) )* ( P(D1|Θ) /P(D1) )* p(Θ)
   = ( p(D2|Θ)/P(D2) )* p(Θ|D1)
p(Θ|D1,D2,D3)=(p(D3|Θ)/P(D3){(p(D2|Θ)/P(D2))* p(Θ|D1)}
       =(p(D3|Θ)/P(D3)) { p(Θ|D1,D2)  }
 再帰的な構造ともいえそう。つまり
  p(Θ|D1,D2,D3...Di)=(p(Di|Θ)/P(Di)* p(Θ|D1,D2,D3...Di-1)
       事後分布=(p(Di|Θ)/P(Di)* 事前分布
 ということなんだろうと思う。
 「事後分布を次の事前分布で使って。。」 という説明があちこちで 見られますが、 最初、なかなかわからなかったけれど、たぶん、こういうことなんだろうと思う。

  p(Di|Θ)/P(Di)を かけていくのですが、上記リンクでは この部分が
   p(x|ω)=ω^x*(1-ω)^(1-x) (ベルヌーイ分布)
  で、x=0で裏なら1-ω x=1で表ならω ωはΘに該当
 
   積分して1になるように定数p(Di)を決めていくということか。

2024年4月26日金曜日

実用Git第3版 備忘録5 リモートリポジトリ

 P258 git init -b main fluff  開発(ノンベア)リポジトリの作成

            git init --bare -b main fluff-bare  ベアリポジトリの作成(権威ある参照箇所)

--bareオプションを指定してgit cloneを実行すると、ベアリポジトリが作られる

P261 リモートの作成  git remote           .git/configにリモートがある git configで操作

P263 リポジトリのブランチの分類: リモート追跡ブランチ(リモートリポジトリの追跡が目的)、ローカル追跡ブランチ(開発ブランチとリモート追跡ブランチの変更の両方を集める)、トピックブランチ(開発ブランチ)、リモートブランチ(リモートリポジトリにある)

git branch -a
 main         ローカル追跡ブランチ
 mylocal-branch    トピックランチ(開発ブランチ)
remotes/origin/main     リモート追跡ブランチ

P264  リモートは URLとrefspec(refの対応づけを示す)の2つからなる
      refspecの例: +refs/heads/*:refs/remotes/remote/*   (fetchで利用)

P274 git push origin main   

P277 git branch -a
        *main                                                      ローカル追跡ブランチ
          remotes/origin/HEAD -> orign/main  リモートがアクティブなブランチだと考えているブランチをシンボル名で示す
          remotes/origin/main         リモート追跡ブランチ

P280  git pull は、git fetchのあと、git merge(or rebase)

P284 図で見るリモートリポジトリ開発サイクル
      
   オリジナルリポジトリ    AーB ←main       
                        ↓origin/main ①              
   クローンリポジトリ        AーB ←main ③ ④         

①オリジナルリポジトリのmainブランチはクローンのorigin/mainという新しいリモート追跡ブランチに導入される
②新しいクローンレポジトリのなかで、origin/mainブランチはmain(オリジナルの?)のHEADコミットを参照するように初期化される。ここではBを参照。
③クローン内にmain(ローカル追跡ブランチ)が作られる。
④mainブランチは、オリジナルレポジトリのアクティブブランチのHEADであるorigin/HEADを参照するように初期化される。(Bを参照)
 クローン後、カレントブランチとしてmainブランチを選び、チェックアウト

クローンで、X,Yをコミットすると
   オリジナルリポジトリ       AーB ←main         
                      ↓origin/main   
   クローンリポジトリ        AーBーXーY ←main 

オリジナルで、C,Dをコミットすると
   オリジナルリポジトリ       AーBーCーD ←main         
                      ↓origin/main   
   クローンリポジトリ        AーBーXーY ←main 
 この状態を 履歴が分岐 あるいは フォーク したという

自分の履歴をプッシュしようとするとき、 rejectされる
 (git push -f で強制的に上書きもできるが)
プッシュの前に 自分のリポジトリでマージが必要
 git fetchで、オリジナルを取り込む        
                      CーD ←origin/main  
                      | 
   クローンリポジトリ        AーBーXーY ←main 
あとは mainブランチに origin/mainブランチをマージすると両者を統合できる
   git merge orign/main
コンフリクトが起きたら git reset --hard ORIG_HEADでYにもどることも可

マージ出来たら git push
                        C ー D   
                       |    |
   オリジナルリポジトリ        AーBーXーYーM ←main 

                       C ー D   
                      |    |
   クローンリポジトリ        AーBーXーYーM ←main 
                           ↑origin/main


2024年4月25日木曜日

実用Git第3版 備忘録4 コミットの書き換え 一時退避

P199 履歴の書き換えについて 注意すべきこと:共有リポジトリに組み込まれたブランチの一部を改変、改ざん、改良してはならない。

P201 A-B-C-D-E-F-G  のコミットDに問題があり、取り消したい場合
    git revert main~3
          A-B-C-D-E-F-G-D'   D'はコミットDの逆(Dの効果を打ち消すようなコミット)

P202 git commit --amend コミット後ログメッセージを修正できる。
 それ以外の活用方法として:
  例:①誤ったコミット ②ファイルを再編集して、新たにコミット もできるが、
 コミット履歴をきれいに残すため、①直接書き換え、必要に応じてファイルを追加、削除できる。②git addやgit rmでインデックスに変更を反映、③git commit --amendを実行
  ①speech.txt修正  git diffでインデックスと作業ディレクトリの差分チェック
  ②git add speech.txt   ③git commit --amend 必要ならコミットメッセージ編集
   git show-branch --more=5      git shouで確認
      A-B-C HEAD  を  A-B-C' HEAD  に変更したというイメージ

                                             ↓dev HEAD                                    ↓dev HEAD
P205 git reset           A-B-C-D                                                 A-B-C-D  
      オプションの影響       HEAD    インデックス     作業ディレクトリ
         --soft       〇
         --mixed        〇        〇
         --hard        〇        〇           〇

--softの例:①file1コミット②file2をステージング③file1のコミットとfile2のステージングした変更をひとつにまとめたい④git reset --soft HEAD^ ⑤git commit -m 'file1 And file2'
  ※インデックスには影響与えてないので、ステージングはそのまま使えて、コミットだけでいいということ。

--mixedの例:①file3とfile4作成した ②コンテンツにもとづき、コミットの順序をきめたい③ git reset HEAD^ (--mixedはディフォルトなのでオプション指定なしでもOk) ④git add file4    git commit -m 'content from file4'  ⑤git add file3    git commit -m 'content from file3'  ⑥git add file1    git commit -m 'content from file1'  などのように
 ※作業ディレクトリには影響あたえないが、ステージングはリセットされるので、再度、ステージングを順序を変えて行うことができるということ。

--hardの場合は、作業ディレクトリもインデックスも含めリセットされるので、ファイルの作り直し、ステージングのやり直しをした上で、コミットすることになる。

  

P214 git cherry-pick  指定したコミットFをカレントブランチに加える 以下の場合はF’

   A-B-C-D-E-F-G-H  dev          A-B-C-D-E-F-G-H  dev

       |                                        |

       V-W-X-Y-Z   rel_2.3             V-W-X-Y-Z-F'   rel_2.3

     git checkout rel_2.3     のあと    git cherry-pick dev~2

P217  reset,revertとcheckoutの関係

  ブランチを移るとき:git checkout またはgit switch

      git resetはブランチ切り替えはしない:ブランチ名指定するとカレントブランチをリセットしてしまう git rest --hardは既知の状態を復元することが目的

P218 他の開発者があなたの李ぴ時取りをクローンしたり、一部のコミットをフェッチしたりしているときは、リポジトリ内のコミット履歴を書き換えるようなコマンドを使うべきではない。代わりにgit revertを使う。git resetやgit commit --amendを使ってはならない。

P219 rebaseについて:書籍にはないが、簡単な例で試してみる

①topicブランチで git rebase main ②mainブランチで git merge --no-ff topic

(--no-ffはfast-forwardなしで、そのほうがあとで管理しやすいとのこと)

③git log --graph で確認できる

もし、①で競合が発生したら、②エディタで競合の原因(main_file)を編集し、競合を解決 ③git add main_file  git rebase --continue(P220)  ④mainブランチで git merge --no-ff topic

P221 rebaseを途中でやめたいとなったら git rebase --abort

P225  git rebase -i コミット  とすると、指定したコミット以降のコミットが編集可

エディタで先頭のpickをsquashにすると、直前のコミットの結合され、新しいコミットメッセージのテンプレートができる。先頭の#は無視される。


P237 git stash list 一時退避されたコンテキストの表示
   git stash -m コメント  でインデックスと作業ディレクトリの内容全体を一時退避          git stash popでもどす
git stash apply + git stash drop =git stash pop

例:  ①file1とfile2を作成、add、commit ②file1に追加文字 ③git stash -m 'Tinkerd file1'
④git commit --dry-run 仮コミットしてみると、コミットするものなしと表示、git stashでまったく、残っていない状態であることを示している? 
⑤ file3を作成 ⑥git stashしても失敗 新しい未追跡ファイルは-uが必要  ⑦ git stash -u -m 'add new untracked file3'  
# 変更を避けておく
$ git stash


利用例1: ブランチを切り替えて、他の作業をする>元の作業ブランチに戻る>スタッシュを今いるブランチに適用  git stash apply
  ブランチを切り替えるためだけに中途半端な状態をコミットしなくてよい

利用例2:コミット…と思ったらブランチ間違いに気づいた>コミットしないままブランチの切り替えに成功すれば良いが、コンフリクトする場合など切り替えられないこともある
git checkout  proper-branchでエラー>git stash> git checkout proper-branch>スタッシュを今いるブランチに適用 git stash apply

利用例3:コミットしてしまったとき>直前のコミットを取り消して、コミット前の状態に戻す。インデックスは残すので--softで  git reset --soft HEAD^ > git stash> git checkout proper-branch>スタッシュを今いるブランチに適用する git stash apply

P246 参照ログで、git reset --hardで削除してしまったものを復活
ログで見えなくても、 git reflog で表示できる。それをもとに、もどりたいところを指定して  git reset --hard HEAD@{1} > git log で確認