python 事始め (2)

ちょっと時間かかりましたが,3日目にして,昔作ったのの同じようなものができました。ただ,今回短時間
でできたのは,画像があったのと,マスクの画像があったからです。マスクの画像も,何のソフト使って作っ
たのかも忘れています。多分海賊版アド〇の画像ソフトだったかなと思います。
このソフトを動かすのに,64のマスク画像を使ってます。プログラムでやってるのは,元画像にマスクの画
像を重ねているだけです。

python の openCV のプログラムで,このマスクと,元画像を重ね合わせています。

次が動かしたプログラムです。たった,これだけです。

import os
import cv2


# ファイル名を配列に格納
file_names = ['00.jpg', '01.jpg', '02.jpg','03.jpg','04.jpg','05.jpg','06.jpg','07.jpg','08.jpg','09.jpg','10.jpg',\
		'11.jpg','12.jpg','13.jpg','14.jpg','15.jpg','16.jpg','17.jpg','18.jpg','19.jpg','20.jpg','21.jpg',\
		'22.jpg','23.jpg','24.jpg','25.jpg','26.jpg','27.jpg','28.jpg','29.jpg','30.jpg','31.jpg','32.jpg',\
		'33.jpg','34.jpg','35.jpg','36.jpg','37.jpg','38.jpg','39.jpg','40.jpg','41.jpg','42.jpg','43.jpg',\
		'44.jpg','45.jpg','46.jpg','47.jpg','48.jpg','49.jpg','50.jpg','51.jpg','52.jpg','53.jpg','54.jpg',\
		'55.jpg','56.jpg','57.jpg','58.jpg','59.jpg','60.jpg','61.jpg','62.jpg','63.jpg','64.jpg']

# ベースパスを設定
base_path = 'E:/python-kaihatu/nanikana/mask-jp'

#背景画像を読み込み
ima1 = cv2.imread('E:/python-kaihatu/nanikana/gazou/buta1.jpg')

# 配列から画像ファイルを開いて表示
for file_name in file_names:
    # フルパスを作成
	full_path = os.path.join(base_path, file_name)
    
    # マスクファイルを開く
	mask = cv2.imread(full_path)
    
	if mask is not None:
		#画像の合成
		result = cv2.bitwise_and(mask,ima1)

		# 画像を表示
		cv2.imshow('Image', result)

		#キー入力待ち
		cv2.waitKey(0)  # キー入力待ち
		#cv2.destroyAllWindows()
	else:
		print(f'Failed to load {full_path}')

python 事始め

サーバーの保存してある,古いファイルを整理していたら,昔,現役時代に作成したプログラムの片割れの,
データー(画像)がでてきました。当時,何冊もグラフィックの書籍を読みあさり,結構な期間をかけて,
VB(ビジアルベーシック)を使って,苦労して作ったものです。動かす,実行ファイルもあったのですが,
ウイルスに犯され,あえなく,削除しました。
この昔作ったプログラムを再現したくなりました。幸い,python というフリーのプログラムを使うと,画像
処理が簡単にできそうでしたので,早速始めてみました。
python は,簡単にインストールできましたが,openCV という,画像を操作するソフトのインストールに
手間どりました。多分,これは, python のバージョンが新しくて, openCV が対応してないのか,と
想像して一端,全削除して,インストールし直しました。最初インストールしたのは,3.13.2 ですが,イン
ストールし直したのは,3.12.9 です。思った通り,バージョンを落としたことで,openCV 問題なくイン
ストールできまた。

インストールの確認用にあった,プログラムを改編して,動かしました。

import cv2
import numpy as np
img = cv2.imread('E:/python-kaihatu/nanikana/gazou/test.jpg')
cv2.imshow('Image Test', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

結果,下記のような画像が,あっけなく表示できました。


この画像を使ってたのは,何年前でしょうかね。もう,20年以上前ですね。さらに,最終目的である,画像
の重ね合わせも何とかできました。

この画像を表示するのに,現役の時に,どれだけ時間をかけたか,ちょっと,ばからしくなりました。python
を使ったら何と二日で完成です。ただ,最終形にはまだ,時間かかりそうですが・・・・・。

import cv2
import numpy as np

ima1 = cv2.imread('E:/python-kaihatu/nanikana/gazou/test.jpg')
mask = cv2.imread('E:/python-kaihatu/nanikana/bmp/15.jpg')

result = cv2.bitwise_and(mask,ima1)

cv2.imshow('Image Test', result)

cv2.waitKey(0)
cv2.destroyAllWindows()

Microsoft Defender オフラインスキャンができない

今使っているノートPCのMicrosoft Defender オフラインスキャンができない状況がしばらく続いていまし
た。初めて分かったとき諸兄のHPをたよりに復旧しようとおもいましたが,初期化云々という言葉をあって,
簡単な操作では,復旧できませんでした。そこで,このところお世話になっているcopilotとチャットをして
みました。以下,チャットのやりとりです。

=あなたの発言(私)=

Microsoft Defender オフラインスキャンができない。

=Copilot の発言=

icrosoft Defenderのオフラインスキャンができないのは困りますね。いくつかの対処法がありますので、
試してみてください。
PowerShellを管理者権限で実行して、以下のコマンドを入力してみてください:
Start-MpWDOScan
Windows RE(回復環境)が有効になっているか確認します。コマンドプロンプト
を管理者権限で開き、以下のコマンドを入力してください:
reagentc /info
回復環境が無効になっている場合は、以下のコマンドで有効化します:
reagentc /enable
システムの修復を試みます。コマンドプロンプトを管理者権限で開き、以下のコ
マンドを入力してください:
DISM.exe /Online /Cleanup-image /Restorehealth
その後、以下のコマンドを入力してください:

指示従って入力したが,途中経過を次のように聞く
=あなたの発言(私)=

Windows RE イメージは見つかりませんでした。 とでます

=Copilot の発言=

Windows RE イメージが見つからないというエラーは、Windows 回復環境 (WinRE) を有効にしようとした際
によく見られる問題です。以下の手順で解決できることがあります:
Windows ISO ファイルをダウンロード:Windows の公式サイトから ISO ファイルをダウンロードします。

7-Zip をインストール:7-Zip は無料のアーカイブツールで、ISO ファイルを開くために必要です1。

Winre.wimファイルを抽出:ISO ファイルを開き、「sources」フォルダーから「install.esd」ファイルを開き、
必要なフォルダー(例:Windows 10 Home なら「1」フォルダー)を探して「Winre.wim」ファイルを抽出します1。

Winre.wimファイルをコピー:抽出した「Winre.wim」ファイルを C:\Windows\System32\Recovery フォルダーに
コピーします1
WinRE を有効にする:次のコマンドを入力して Enter を押します2
reagentc /setreimage /path C:\Windows\System32\Recovery
reagentc /enable
```[_{{{CITATION{{{_2{Win10 解決!「REAGENTC.EXE: Windows RE イメージは ...]
(https://windows-waza.com/win10-solved-reagentc-exe-windows-re-image-not-found/)

これで WinRE が有効になるはずです2
。もし問題が解決しない場合は、再度お試しください。

ここまでのやりとりで,
「次のコマンドを入力して Enter を押します2」
のような小さい数字の所に参考のリンクがはってありますので,そこも参考にしながら,やってみました。
けっか見事にオフラインスキャンできるようになりました。チャットでは,下記が参考のリンク先でした。
Win10 解決!「REAGENTC.EXE: Windows RE イメージは見つかりませんでした。」

やっと復活

原因はわかりませんが,3日ほど寝込んでしまいました。
最初の夜は,布団に入った物の,足が冷たくてどうしようもなくて,仕方なくこたつをつけて,一晩こたつ
ですごしました。しかし,足があたたまってくると,体が熱くなり,でたくなるのです。きっと,体温の調
整ができなくなっていたのでしょうね。夜が明けてから,かなり着込んで,布団にはりしました。パジャマ
の上に下は,オーバーズボン2着,上はは,パジャマの上に,フリース,ジャージ,厚手の外套?を着こん
での格好です。それでも,汗一つかけませんでした。このままでは,と思い,家内のなおまないでいた,カ
ロナールをもらって,6時間おきにのみながら,一日中ねていました。3日目になり,やっと,体温の調整
ができるようになったのか,少し暖かさを感じるようになりました。
咳のでないし,喉もいたくないし,少し風邪声になったくらいでしたが,回復するのに,4日ぐらいかかり
ました。今年は,こんな状態なったのは,2度目で,何とも,さい先の悪い,蛇年になりました。

OUTLOOKをエクセルVBAから最小化して開く

エクセルVBAから,outlookを操作して,メールを送るプロシャージャを作成してました。あれこれ
改良をしていますが,いろいろ試しても最小化してひらくことはできませんでした,まずやったのは,下記の
ように,最小化を指定してシェルから開く方法です。

Shell "outlook.exe", vbMinimizedNoFocus

これは,だめでした。outlook.exe をフルパスに変えたり,vbMinimizedNoFocus を数値に変えたりしま
したが,だめでした。
次にやったのは,開いた,outlook をアクティブにして,最小化のショートカットを,sendkey で送ること
です。copilot は,

Shell ""C:¥Program Files (x86)¥Microsoft Office¥root¥Office16¥OUTLOOK.EXE"OUTLOOK.EXE", vbNormalFocus
AppActivate "Outlook"
SendKeys "% n", True

私の環境とは,outlook までのパスが違っていたので,私の環境に書き換えましたが,だめでした。

最小化するショートカットは,{WINDOESKEY}+{↓}なので,SendKeys がだめなのかと思い,

Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Const KEYEVENTF_KEYUP = &H2
Private Const VK_LWIN = &H5B

Public Sub window_saisyouka()
  keybd_event VK_LWIN, 0, 0, 0
  keybd_event vbKeyDown, 0, 0, 0
  keybd_event VK_LWIN, 0, KEYEVENTF_KEYUP, 0
  keybd_event vbKeyDown, 0, KEYEVENTF_KEYUP, 0
End Sub

のように,keybd_event のサブを作って,{WINDOESKEY}+{↓} をやってもだめでした。ま
るまる二日ほどあれこれやりましたが,やっと今日,できました。
ここのHPが参考になりました。
次のような手順です。
 1 メニューの「OUTLOOK」を右クリック
 2 その他→ファイルの場所を開く をクリック
 3 ファイルの保存場所に行って,outlook.exe を右クリックして,ショートカットを作成
 4 できたショートカットをデスクトップに移動
 5 デスクトップに移動したショートカットのプロパティーを開く
 6 次写真のように,起動時の状態を変更

VBAのシェルの部分をショートカットを実行するように変更。

 CreateObject("WScript.Shell").Run "C:\Users\mabo-2021\Desktop\Outlook"

長い道のりでした。これで,VBAのマクロを開くときに,あらかじめOUTLOOKを最小で開いておける
ので,後の処理がスムーズに行きます。

OUTLOOKのイベントをエクセルVBAのトリガーにする。

OUTLOOK研修所から以前に問い合わせについての解答をいただきましたが,私の環境で,なかなか実現でき
ませんでした。実現できなかった原因は,そもそも,設定仕方等が,全く違っていたのです。それに,肝
心のこと忘れていました。イベントを受け取るにには,プロシージャが終了していては,いけないのです。
肝心要のこのことも抜けていました。それで,copilotにしつこく聞いたり,google先生をたよったりして,
本日やっと実現できました。

まず,OUTLOOKのイベントをつかむには,

Public WithEvents mySentItems As Outlook.Items

を書く必要がありますが,このコードは,クラスモジュールに書かなければいけにようです。同時に,
OUTLOOK研究所でおしえてもらった,サブルーチン等も,クラスモジュールに置く必要があるようで,標
準モジュール等に置くと,エラーになります。また,クラスモジュールにおいたサブルーチンを呼ぶには
手続きがいるようで,これも抜けていたようです。下記がClassモジュールにおいたものの全文です。

Option Explicit

Public myOutlookApp As Outlook.Application
Public mySentFolder As Outlook.Folder
Public WithEvents mySentItems As Outlook.Items

Private Sub Class_Initialize()
    Set myOutlookApp = Nothing    'objoutlookの初期値これがないとGetObjectに失敗するとobjoutlookはemptyのまま
    
    On Error Resume Next
        Set myOutlookApp = GetObject(, "Outlook.Application")     '起動済みのOutlookをクラス名を指定して取得
    On Error GoTo 0

    If myOutlookApp Is Nothing Then                               'objoutlookがNothingなら
        Set myOutlookApp = CreateObject("Outlook.Application")    'Outlookを起動
    End If

    Dim oNS As Namespace
    Set oNS = myOutlookApp.GetNamespace("MAPI")
    Set mySentFolder = oNS.GetDefaultFolder(olFolderSentMail)
    Set mySentItems = mySentFolder.Items

End Sub
Public Sub AddTrackInfo(ByVal objMail As MailItem, iRow As Integer, iCol As Integer)
     Dim olkApp As Outlook.Application
     Dim fldSentMail As Folder
     Dim strTrackInfo As String
     Dim propTrack As UserProperty

     ' 送信済みアイテム フォルダーを取得
     Set fldSentMail = objMail.Application.Session.GetDefaultFolder(olFolderSentMail)

     ' mySentItems が設定されていなければ送信済みアイテム フォルダーの Items を設定
     If mySentItems Is Nothing Then
         Set mySentItems = fldSentMail.Items
     End If


     ' メールに送信後の保存先フォルダーを設定

     Set objMail.SaveSentMessageFolder = fldSentMail


     ' 送信状況を追跡するためのプロパティを設定
     Set propTrack = objMail.UserProperties.Add("TrackInfo", olText, True)

     ' 送信日時を保存するセルの行番号と列番号を設定
     propTrack.Value = iRow & "," & iCol
     
End Sub


' 送信済みアイテム フォルダーにアイテムが追加されたときに実行されるイベント
Public Sub mySentItems_ItemAdd(ByVal Item As Object)
     Dim objMail As MailItem
     Dim propTrack As UserProperty
     Set objMail = Item
     ' 送信状況を追跡するプロパティの確認
     Set propTrack = objMail.UserProperties.Find("TrackInfo")

     ' プロパティが存在したら
     If Not propTrack Is Nothing Then
         Dim arrRC As Variant
         ' 送信日時を保存するセルの行番号と列番号を取得
         arrRC = Split(propTrack.Value, ",")
         ' 取得した行、列のセルに送信日時を保存
         Sheet1.Cells(CInt(arrRC(0)), CInt(arrRC(1))).Value = objMail.SentOn
     End If
End Sub

これを実行するには,標準モジュール等から,このクラスモジュールのサブルーチンを下記のようにして
呼び出します。VBAを終了しないよううに,最後にユーザーフォームを表示してます。

Public Function Mail_Sousin()
        ▼
		詳細設定略
        ▲ 
           
                Dim clsSample1 As Class1 'Class1型のオブジェクト変数を宣言 「Class1」はクラスモジュール名
                Set clsSample1 = New Class1
    
                Call clsSample1.AddTrackInfo(objItem, 4, 9) 'objItemは,送信するメール本体4,9はRange(4,9)で
                               送信日時を記録すすセル
                           
                If jidou_sousin_flag = False Then
                    objItem.Display  '送信画面を表示
                End If
                If jidou_sousin_flag = True Then
                    objItem.Send    '自動で送信
                End If

              UserForm1.Show

               Set olkApp = Nothing
               Set objItem = Nothing
               Set acctToSend = Nothing

End Function
クラスモジュールのサブルーチンを呼ぶには,インスタンス?を下記のように作成しないとだめみたいでした。

                Dim clsSample1 As Class1 'Class1型のオブジェクト変数を宣言 「Class1」はクラスモジュール名
                Set clsSample1 = New Class1
    
                Call clsSample1.AddTrackInfo(objItem, 4, 9)

なお,一番参考になったのは,外国の掲示板でした。

ブラウン シェーバー 350CC 電池交換 際ぞりの外し方  分解注意

電池交換は無事完了しましたが,どうやら,分解の過程で,際ぞりの部分を外すときに,際ぞりの部品を破損
してしまったようです。部品交換するべく,ヤフオクで,中古品を購入しましたが,これも,破損させてしま
いました。何回も組み立て分解を繰り返しやっとその仕組みがわかりました。頭悪いですね。
際ぞりの部品は,写真,赤→と黄色矢印が合わさる位置でないと外れないようになってます。それを邪魔して
いるのが,緑丸の突起です。この突起が緑四角の中を移動ししますが,突起が,外れる位置まで,移動するの
を邪魔しています。

ですから,外すには,


最上部まで,スライドさせ,


突起の部分に,突起を持ち上げるものを差し込んで,さらに,上にスライドさせます。



赤→の穴が見える位置が,外せる場所です。通常は,爪のため,この位置まで,ずれません。このようにする
と,破損させることなくはずせます。高い,勉強代になりました。また,安い物がでていたら,購入
して直そうを思います。

これからは,google先生 よりも AI か

今日初めて,マイクロソフトのPC付属の cipilot に質問してみました。
質問は,

VBAエクセルで,アクティブセルの背景の色を変えるコードは。条件付き書式では」

で,下記のような解答でした。

 Private Sub ApplyConditionalFormatting()
     Dim ws As Worksheet
     Dim rng As Range
     
     ' シートと範囲を設定
     Set ws = ThisWorkbook.Sheets("Sheet1") ' シート名を適切に変更してください
     Set rng = ws.Range("A1:A100") ' 範囲を適切に変更してください
     
     ' 既存の条件付き書式をクリア
     rng.FormatConditions.Delete
     
     ' 新しい条件付き書式を追加
     With rng.FormatConditions.Add(Type:=xlExpression, Formula1:="=ROW()=CELL(""row"")")
         .Interior.Color = RGB(255, 255, 0) ' 背景色を黄色に設定
     End With
 End Sub

google先生よりも,具体的で,この解答,ほぼあってます。

ブラウン シェーバー 350CC 電池交換

アリエクから,電池がとどいたので,シェーバーをくみたてました。
電池を入れたところで,充電して,モーターが動くことを確認しました。
際ぞりの部分を外すとき,一部分,破損させてしまったようで,ちょっとがたがたしてます。
これで,また,しばらくつかえます。