指定したディレクトリ内にあるexcelファイルに特定の文字列を含むセルがあるかを検索するPowershellスクリプト

たくさんあるexcelファイルのどれに必要な情報が含まれているのかわからないときに、WindowsのPowerShellとExcelアプリを連携させて各セルの中身を検索するスクリプトを作成した。

単純な処理にした場合、excelが保護されている(パスワードあり)ものがあると、スクリプト上でそのexcelファイルを開こうとしたところで、パスワード入力が出てそこで止まってしまう。

そのため、保護されているexcelファイルを効率よく除外する手法はないものか、というのを探したのだが、どうやらPowerShell/Excel連携の機能には、該当するファイルに保護がかかっているかどうかを判定する機能はない模様。

stackoverflowの「Powershell Test for Excel Password Protection」にて解決方法を発見

保護されているexcelファイルというのは、暗号化されたzipファイルで、ヘッダが特定文字列で始まるので、その文字列があれば暗号化されている、と判断して処理を飛ばす、ということが書かれていた。

$sig = [Byte[]] (0x50,0x4b,0x03,0x04)
$bytes = get-content $_.fullname -encoding byte -total 4
if (@(compare-object $sig $bytes -sync 0).length -eq 0) {
  # process unencrypted file
}

これを搭載することで、パスワード入力要求を飛ばすことができた。

で、検索した結果をCSVファイルに保存する処理を付けたものがこちら

CSV出力周りの処理がめんどくさくなってるの「PowerShellで巨大なファイルをGet-Contentし、Export-Csvするのを省メモリで行う」によるもの。これをやらないと速度がだいぶ変わるはず

$excel= New-Object -ComObject Excel.Application
$excel.visible= $false

# 検索対象ディレクトリ
$directory="C:\Users\osakanataro\Documents"

# 検索結果のcsv保存先
$outputfile="c:\tmp\output-tmp.csv"

# 検索キーワード
$keywords="ワード1","ワード2","ワード3"


# CSV出力向けの処理
$results=@()
$linecount=0
#


Get-ChildItem -Recurse $directory -Include *.xlsx,*.xls | ForEach-Object {
    $filename=$_.FullName
    Write-Host "file:", $filename

    # 暗号化チェック簡易版用
    $sig=[Byte[]] (0x50,0x4b,0x03,0x04)
    $bytes= Get-Content -Path $filename -Encoding Byte -TotalCount 4
    if( @(Compare-Object $sig $bytes -Sync 0).Length -eq 0){
        # 暗号化されていないファイルの処理 start
        $workbook=$excel.workbooks.open($filename)
        #Write-Host "ファイル:",$workbook.Name

        $workbook.Sheets|ForEach-Object {
            $worksheet = $_
            #write-host "タブ:", $worksheet.name

            $keywords | ForEach-Object {
                $keyword=$_
                $result1=$worksheet.Cells.Find($keyword)
                while($result1 -ne $null){
                    Write-Host "タブ:",$worksheet.Name," 単語:",$keyword," 場所:",$result1.Column, $result1.row, $result1.text
                    # CSV向け処理 start
                    $output = New-Object -TypeName PSObject
                    $output | Add-Member -MemberType NoteProperty -Name "ファイル名" -Value $filename
                    $output | Add-Member -MemberType NoteProperty -Name "タブ" -Value $worksheet.Name
                    $output | Add-Member -MemberType NoteProperty -Name "単語" -Value $keyword
                    $output | Add-Member -MemberType NoteProperty -Name "Column" -Value $result1.Column
                    $output | Add-Member -MemberType NoteProperty -Name "Row" -Value $result1.row
                    $output | Add-Member -MemberType NoteProperty -Name "文面" -Value $result1.text
                    $results+=$output
                    $linecount++
                    # CSV向け処理 end
                    $result2=$result1
                    $result1=$worksheet.Cells.FindNext($result2)
                    if( $result1.row -le $result2.row ) { $result1=$null }
                }
            }
        }
        # 暗号化されていないファイルの処理 end
    }else{
        # 暗号化されているファイルの処理 start
        Write-Host "   暗号化されている"
        $output = New-Object -TypeName PSObject
        $output | Add-Member -MemberType NoteProperty -Name "ファイル名" -Value $filename
        $output | Add-Member -MemberType NoteProperty -Name "タブ" -Value "パスワード保護につき確認できず"
        $output | Add-Member -MemberType NoteProperty -Name "単語" -Value ""
        $output | Add-Member -MemberType NoteProperty -Name "Column" -Value ""
        $output | Add-Member -MemberType NoteProperty -Name "Row" -Value ""
        $output | Add-Member -MemberType NoteProperty -Name "文面" -Value ""
        $results+=$output
        $linecount++

        # 暗号化されているファイルの処理 end
    }
    if(($linecount % 1000) -eq 0 ){
        $results | Export-Csv $outputfile -Encoding UTF8 -NoTypeInformation -Append -NoClobber
        $results = @()
    }

}

$results | Export-Csv $outputfile -Encoding UTF8 -NoTypeInformation -Append -NoClobber

Lifebook U9310X/D FMVU29021に Windows 11 24H2をインストールした

富士通Lifebook U9310X/D FMVU29021 のタッチペン対応モデル(ペンなし)が14000円だったので入手してみた。

とりあえずWindows 11 24H2で再インストールしてみたところ、結構なデバイスが未認識

認識していないものをリストアップ

PCIシリアルポート
PCI\VEN_8086&DEV_02E3&SUBSYS_003F1E26&REV_00\3&11583659&0&B3

PCIシリアルポート
PCI\VEN_8086&DEV_02FC&SUBSYS_003F1E26&REV_00\3&11583659&0&98

PCIシンプル通信コントローラー
PCI\VEN_8086&DEV_02E0&SUBSYS_003F1E26&REV_00\3&11583659&0&B0

PCIシンプル通信コントローラー
PCI\VEN_8086&DEV_02A9&SUBSYS_003F1E26&REV_00\3&11583659&0&F1

PCIシンプル通信コントローラー
PCI\VEN_8086&DEV_02A8&SUBSYS_003F1E26&REV_00\3&11583659&0&F0

PCIデータ取得およびシグナル処理コントローラー
PCI\VEN_8086&DEV_1903&SUBSYS_003F1E26&REV_0C\3&11583659&0&20

PCIデータ取得およびシグナル処理コントローラー
PCI\VEN_8086&DEV_02F9&SUBSYS_003F1E26&REV_00\3&11583659&0&90

PCIデバイス
PCI\VEN_8086&DEV_02A4&SUBSYS_003F1E26&REV_00\3&11583659&0&FD

SMバスコントローラー
PCI\VEN_8086&DEV_02A3&SUBSYS_003F1E26&REV_00\3&11583659&0&FC

マルチメディアオーディオコントローラ
PCI\VEN_8086&DEV_02C8&SUBSYS_00401E26&REV_00\3&11583659&0&FB

不明なデバイス
ACPI\INT3400\2&DABA3FF&0

不明なデバイス
ACPI\INT3403\SEN1

不明なデバイス
ACPI\INT33D5\2&DABA3FF&0

まずWindows Updateを終わらせて、オプションの更新プログラム を確認するといろいろある

全部を選択してインストール

再起動

Windows Updateをもう1度更新すると、さらにドライバが表示されるので全部を選択してインストール

再起動

Windows Updateをもう1度更新すると、さらにドライバが表示されるので全部を選択してインストール

再起動

Windows Updateをもう1度更新すると、さらにドライバが表示されるので全部を選択してインストール

再起動

Windows Updateをもう1度更新すると、さらにドライバが表示されるので全部を選択してインストール

これで全部認識された。

ペン操作については、WACOM AESペンで動作することを確認

ペンの細かい設定とWACOM系タブレット操作をできるように「Wacom Components Driver」をインストールすると筆圧設定なども行えるようになる。


以下は古い記述

このうち、まずは「FUJITSU Client Computing Limited」のやつを確認

FUJITSU CLIENT COMPUTING LIMITED – Firmware – 4.5.35.0
uefi\res_{5934ca0b-355c-4f53-a283-52eab7def1df}

Fujitsu Client Computing Limited – Firmware – 67.2046.0.0
uefi\res_{690b373c-5100-409b-823e-c8fd31ba0419}

Fujitsu Client Computing Limited – Firmware – 2.26.0.0
uefi\res_{eac4e93d-8568-4594-8cd1-90cc5b67e76f}

直接は関係なさそう

まずはSMバスコントローラについて検索 してみると、「INTEL – System – 10.1.27.xx」といったものが表示された

このため、Windows Updateで出てきたなかから上側の「INTEL – System – 10.1.27.3」をインストールしてみたが状況変わらず

続いて下側の「INTEL – System – 10.1.27.3」をインストールしてみると、認識した

続いてシリアルポート VEN_8086&DEV_02E3 について検索

WIndows Updateにいた「Intel – Ports – 1946.14.0.1380」をインストールしたところ

続いてVEN_8086&DEV_02FC を検索

出てくるのは「Intel – Systm 3.1.0.x」というやつなので、Windows Updateの中から「Intel – Systm 3.1.0.4140」

で・・・しばらーく待つとちゃんと認識された

PCIシンプル通信コントローラー VEN_8086&DEV_02E0 について検索

Intel – System – 2xxx.x.x.x と二千番台のものが出てきたので「Intel – System – 2031.15.0.1743」をインストールして認識

PCIデータ取得およびシグナル処理コントローラー VEN_8086&DEV_1903 を検索

「Intel – System – 8.7.1xxxx.x」がたくさんあるのでWindows Updateの「Intel – System – 8.7.10200.12510」の上側をインストール

不明なデバイスが消えたけど、PCIデータ取得およびシグナル処理コントローラー PCI\VEN_8086&DEV_1903&SUBSYS_003F1E26&REV_0C\3&11583659&0&20 は残っている。

先にマルチメディアオーディオコントローラー VEN_8086&DEV_02C8 を検索

「Intel(R) Corporation – System – 10.25.0.xxxx」となっているのでWindows Updateから「Intel(R) Corporation – System – 10.25.0.3633」をインストール

認識が変更されて Intel High Definition DSP INTELAUDIO\DSP_CTLR_DEV_02C8&VEN_8086&DEV_0222&SUBSYS_00401E26&REV_0000\4&BEE1754&0&0800 になった。

今度は VEN_8086&DEV_0222 で検索

「Intel(R) Corporation – System – 10.29.0.xxxxxx」なんだけど、Winows Updateにそれっぽいのがいない

このオーディオデバイスについては、Windows Update経由だとうまくいかないことが多いので、改めて富士通のダウンロード検索(LIFEBOOK)で検索

Realtek High Definition Audio アップデートパック (FMV-NPR46A/NPR50A/NPR44B/NPR48A/FMV-NPR49対応) からE1032544.exe をダウンロードしてインストールしたが認識は変わらなかった

SSDファームウェアアップデートツール を使ってみたところ、ssd firmwareがアップデートされた

ただ、いろいろインストールしてみたけど、ドライバ警告が消えない

Windows 10 22H2インストール編

1回やり直すついでにWindows 10 22H2でインストールしなおしてみた

認識してないデバイス数が多い

まずはWindows Updateしてみると、以下の認識に変わった

Windows11の時と同じドライバをインストールしてみたが、変わらなかった

もしかして、と、FMV Lifebook AH49/H3 に使った Realtek High Definition Audio オーディオドライバー (プレインストール版) をインストールしてみたがやっぱりだめだった

めんどくさくなってWindows Updateに表示されたドライバ群を全部インストールして再起動したらIntel High Definition DSP (INTELAUDIO\DSP_CTLR_DEV_02C8&VEN_8086&DEV_0222&SUBSYS_00401E26&REV_0000\4&BEE1754&0&0800) だけが残った

「インテル(R) スマート・サウンド・テクノロジー ドライバー」(64ビット)の修正項目とインストール方法について(2022年10月・11月発表モデル : LIFEBOOK WU2/G ほか)インテル(R) スマート・サウンド・テクノロジー ドライバー V 10.29.0.6590

Secure Boot無効でWindows 10 22H2を再インストール

最初の認識してないデバイスがちょっと違う

さっきはなかった以下

NB-2033-U
USB\VID_298D&PID_2033\203E36685852

これは[指紋センサードライバー] NEXT Biometrics 指紋センサーの模様

これに全部チェック入れてインストールしたところ下記になった

ここで再度Windows Updateすると以下が出る

再起動すると下記の認識

Windows Updateを実行すると自動的にドライバが適用されて

さらにWindows Updateを再実行して、ドライバー更新プログラムの以下を適用

ようやく全デバイス認識した

Oracle Cloudのオブジェクトストレージにcyberduckで接続する

Oracle Cloud(OCI)のオブジェクトストレージに cyberduck を使って接続する際、なんかうまくいかなかったのでメモ書き

us-phoenix-1にあるので、OCI Object Storage (us-phoenix-1).cyberduckprofile を選択したのだが選択しても表示されるサーバ名は「s3.amazonaws.com」となっている。

cyberduckprofileの内容を確認すると下記なので、本来サーバに表示されるべきなのは「<namespace>.compat.objectstorage.us-phoenix-1.oraclecloud.com」なんじゃないのか?という疑問点が・・・

	&lt;key>Protocol&lt;/key>
	&lt;string>s3&lt;/string>
	&lt;key>Vendor&lt;/key>
	&lt;string>oracle-us-phoenix-1&lt;/string>
	&lt;key>Description&lt;/key>
	&lt;string>OCI Object Storage (us-phoenix-1)&lt;/string>
	&lt;key>Hostname Placeholder&lt;/key>
	&lt;string>&amp;lt;namespace&amp;gt;.compat.objectstorage.us-phoenix-1.oraclecloud.com&lt;/string>
	&lt;key>Hostname Configurable&lt;/key>
	&lt;true/>

なお、cyberduckのバージョンは 9.1.2 (42722) でした。

じゃあ、OCIにつなぐときはどう接続すればいいのか?

とりあえず、プロファイルはOCI Object Storageを選択する

サーバ名は「<namespace>.compat.objectstorage.us-phoenix-1.oraclecloud.com」

ここでいう<namespace>は、Oracle Cloudコンソールで[ストレージ]-[オブジェクトストレージ]-[バケット(bucket)]で表示される「ネームスペース」のこととなる。

cyberduckに入力すると以下のような感じになる。

続いてAccess KeyとSecret KeyをOracle Cloudコンソールで作成する。

[アイデンティティとセキュリティ]-[ドメイン]でドメイン「Default」を選択

[アイデンティティ・ドメイン]-[ユーザー]にて、API操作用のユーザを作成

作成後、該当ユーザを選択し、[リソース]-[顧客秘密キー]を開く

「秘密キーの生成」をクリック

ここで表示される「生成されたキー」が Secret Keyとなる。

書いてある通りに再表示できないので、間違えずに保存すること。

画面を閉じて一覧に戻ると、Access Keyが確認できる。

これで、Access KeyとSecret Keyが入手できたので、Cyberduck設定画面に入力する

これで接続をすると以下のようにOracle Cloud上のオブジェクトストレージのbucket内容が表示されるのを確認できた。

Aliepressで売ってるlogiの偽マウスを買ってみた

aliexpressを見てたら、妙に安いlogi M185マウスが売っていた

amazonでは1235円なので、まああからさまに怪しい

続けて関連プロダクトを見ていくと、logi M750やM650なども出てきた

不当に安いM650/750はどちらも、(logicoolの)オリジナルドライバじゃ使えません。Logitechのソフトウェアと接続できず、ボタン割り当てもできません、と明記されている。

じゃあ、こいつらはなんなのか?と買ってみた

うちにあるlogicoolマウスと並べてみた

ぱっと見の外観はほぼ同じ

うちにあるM235とM750はマウス側面のゴム?シリコン?部分が使いこみですり減っているが、偽M185と偽M650はプラスチック成形となっている。

直接比較できるのは兄弟モデルの本物のM750と、偽物のM650となる。

ちょっと使ってみての異なる点

・側面が偽物はプラスチック成形
・ホイールを回した時のクリック感が、偽物の方が小さい
・偽M650はlogibolt非対応
・偽M650はbluetooth対応をうたってたけど認識しない。専用USBドングルにのみ接続可能 何回か試してみたら接続ボタンを長押ししたあと20秒ぐらい放置しているとbluetoothデバイスとして認識された。
・側面のボタンクリックが偽物はちょっと堅い

あと、偽M185を触った時の違和感は、角張ってる、というのもありました。

で、マウスがどう認識されるのかをLinuxにつなげてlsusbで確認してみると・・・

本物のlogi M750マウスをlogibolt接続した場合、「メーカ:Logitech, Inc. Logi Bolt Receiver」で認識し、下にデバイスが3種類認識
偽M185マウスを接続した場合、「メーカ:SHARKOON Technologies GmbH [Mediatrack Edge Mini Keyboard]」で、下にデバイスが2種類認識
偽M650マウスを接続した場合、「メーカ:YICHIP Wireless Device」で、下にデバイスが2種類認識

という結果になった。

偽M185の「SHARKOON」はマウスやキーボードを含めたPCパーツ類を作ってるメーカを名乗っているので、そこが出している基盤を流用しているっぽい。

それに対して偽M650の「YICHIP」はマウスを構成するチップメーカ名なのでメーカの出してるfirmwareをそのまま使っているのかもしれない。

実際、偽M185マウスと偽M650マウスを使い比べてみると、偽M185マウスのほうが動作が良い・・・

偽M650マウスはしばらく使わないと省電力モードに入るのだが、スリープからの復帰がボタンを押すこと、で、マウスを動かしただけでは解除されないのがちょっと使いにくい。

そんなわけなので、偽M185の方が使いやすいなぁ、という感じですね。

USB接続時の認識状況

Ubuntu 24.04 LTS環境にて各マウスのUSBドングルを接続し、OS上で認識された様子をlsusbコマンドにて確認したもの

偽M185マウスの認識状況

$ sudo lsusb
<略>
Bus 002 Device 003: ID 1ea7:0066 SHARKOON Technologies GmbH [Mediatrack Edge Mini Keyboard]
<略>
$ sudo lsusb --tree
<略>
/:  Bus 002.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/11p, 480M
    |__ Port 004: Dev 003, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 004: Dev 003, If 1, Class=Human Interface Device, Driver=usbhid, 12M
<略>
$

偽M650マウスの認識状況

$ sudo lsusb
<略>
Bus 002 Device 004: ID 3151:2020 YICHIP Wireless Device
<略>
$ sudo lsusb --tree
<略>
/:  Bus 002.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/11p, 480M
    |__ Port 004: Dev 004, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 004: Dev 004, If 1, Class=Human Interface Device, Driver=usbhid, 12M
<略>
$

本物のlogi M750マウスの認識状況

なお、本物のlogi M750マウスをlogiboltで接続した場合のUSB認識状況は下記。

$ sudo lsusb
<略>
Bus 002 Device 005: ID 046d:c548 Logitech, Inc. Logi Bolt Receiver
<略>
$ sudo lsusb --tree
<略>
/:  Bus 002.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/11p, 480M
    |__ Port 004: Dev 005, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 004: Dev 005, If 1, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 004: Dev 005, If 2, Class=Human Interface Device, Driver=usbhid, 12M
<略>
$

偽logiマウスと違って、デバイスサブクラスが3つ認識されている。

Bluetooth接続時の認識状況

“M650 Mouse”が偽M650、”Logi M750″が本物のM750マウス

M750は電池残量表示があるが、偽M650には残量表示がない

内部写真

偽M650マウスの内部写真

基板上に「M75-M65-B」とあるので、偽M750を買っても同じ動作をしてそうな気配が・・・

偽M185マウスの内部写真

偽M185の基板には「HTX-185-8650-VER1.0」とあるようにみえる

本物のlogi M750マウスの内部写真

偽M650の内部を見ると結構細かく作られてるように見える・・・

もしかして、M750の筐体が壊れた時に偽M650が流用できないかな?と思って、本物のlogi M750も開けてみた(なお本物はねじがトルクス)

下側の構造は似ているものの、上側の構造がだいぶ違っているので、流用はちょっと難しそうです。本物のM650だと同じだったりするのかん?

というか、メイン基板の部品搭載量が違いすぎるw

スペアディスクを分散する技術についてのメモ

RAIDで組んだ領域が2PBになると再構築に時間がかかりすぎるので、旧来の専用スペアディスクを用意するという仕組みをとらず、各物理ディスク内にスペア領域を用意し、全体にスペアを分散する、という技術を採用している。

ただ、これについて、RAIDの定義と違って一般的な用語がないため、各社の用語をチェックした

「Dynamic Drive Pool」が比較的共通で使われているような印象があるが、DDPという単語を使っていても実装について詳細をみると、各社差があるようにみえる。

NetApp SANtricity : Dynamic Drive Pool (DDP)
 OEM: 富士通 ETNERNUS ABシリーズ
 What Are Dynamic Disk Pools?

DELL Unity: Dynamic Pool (RAID5,RAID6,RAID1/0相当)
 Dell Unity:動的プールについて(マップされたRAID)(Dellによる修正可能)

DELL PowerVault: ADAPT (2本障害まで対応。12~128本構成)
 Dell PowerVault ME5シリーズ 管理者ガイド RAIDレベル

HPE MSA Gen6: MSA-DP+
 HPE MSA Gen6 Storage システム構成図
 ネットワールド HPE MSA Gen6

PureStorage: RAID-3D (2本障害まで対応)
 レポート ESG Lab Validation Pure Storage FlashArray-