CanvasAPIがさっぱり頭に入らずMDNのコードをコピペして実行してるだけな状況。
これを使ってセルの中を描くのがまだイメージできない。
この画面は、簡易表示です
CanvasAPIがさっぱり頭に入らずMDNのコードをコピペして実行してるだけな状況。
これを使ってセルの中を描くのがまだイメージできない。
何か?
押してみると・・・
設定に移動してみる
オンにしてみよう
どうやら互換性のないドライバがマズイらしい。
互換性のないドライバーを確認するとLogcoolの名前が多いので、LogcoolのG HUBをインストしてみるもダメ!ドライバーの名前が被る始末、症状は悪化してしまった。検索するとDriverStoreにもコピーを作っている。アンスコしてもDriverStoreフォルダに残ったまま。
このDriverStoreフォルダはエクスプローラからの削除はうまくいかないので、よく判らないけどDriverStoreの邪魔なドライバーを削除するツール(DriverStoreExplorer.v0.11.92)を使い、非互換ドライバーをC:\Windows\System32\DriverStore\FileRepositoryから強制削除も使用して一掃した。
C:¥Windows¥System32¥driversフォルダにある非互換ファイルは1つづつDEL。
やっと【再スキャン】の出番だ。
これでメモリ整合性がONになるのかな?
無事、メモリ整合性はONにできた様だ。
24H2インスト直後はここでTPM2.0が無いせいと表示されていたと思うが今はキニシナイらしい。
しかし、インテルのオンボのグラフィックス・ドライバーやドライバー&サポート・アシスタントが使えなくなっていた。
暫定的にこうなってる様な気もするし、いづれにTPM 2.0モジュールが無いと本当にダメな気がしてきた。
i7-3770Tの今のマザボをCPU-Zで見るとMSIのPH61A-P35 (B3)で、オンラインでマニュアルを見るとTPMモジュールのコネクタがOptionalで付いている。実物にもそれらしいコネクタが付いていたのでAmazonで注文してみた。(500円くらい。国際郵便で一週間程度)
これが届けば、一安心?一波乱?
PC(G4560)で、非互換ドライバー発見
でメモリ整合性ONにできた。
INTEL(i7-3770T)のオンチップ・グラフィックスが停止。
調べてみると、第3世代のグラフィックスドライバーは開発終了で、第7世代以降しかドライバは更新されていなかった。どうやらメモリ整合性ONにするにはWindows11対応してるグラフィックスカードが必要な様だ。またドライブを無効化してもWindows起動時に「このドライバは読み込めません」えらーが出るので、BIOSから「PEG」の設定で「IGPU Multi-Monitor」を無効化し「IGD」を併用しない様にした。
これで安定するかな。SATAドライバが2つ?不明なデバイスもあるのが謎なので無効化。Ivy Bridgeは厳しい様だ。
G4560のオンボード・グラフィックスは無事。Kaby Lake(第7世代)だからセーフ?
G3900はSkylake(第6世代)だからダメかも。
不明なデバイスはサポートされなくなったIntel Smart ConnectionとのことなのでBIOSで【DISABLED】
標準SATA AHCIコントローラーの⚠️は、BIOS でSATAのモードが【AHCI】だったので【IDE】に変更したら消えたけど、デバイスマネージャの表記がSATAからIDEに変わってしまった。
SSDもIDEだったかな?
TPM2モジュールが届いたけど、20PINだった。14PINタイプを買うもASUS用で、MSIとPINアサインが全然違っていたのでキャンセル依頼を出して、MSI用を買い足す。キャンセルできなかったら古いMBの保守に取っておくか。
ピン数 | 種類 | 価格 | 送料 | 状態 |
---|---|---|---|---|
20 | unknown | 510 | – | 配達(10/17) |
キャンセル | ||||
14 | msi | 1733 | 700 | 配達(10/25) BIOS未対応? |
ps.2024/10/25
予定より速くTPMモジュールが到着。試してみるとモジュールのREDが点灯するがWindowsはドライバーが読み込まれず無反応。BIOSを見るがTPMモジュールの項目が無い。
ここでBIOSをdefaultにしてみたらハマった。
起動してリセットの繰り返しになる。TPMモジュールやグラボやストレージを外しボタン電池を取り換えても無駄。
オングラボは無反応なのでグラボを戻してCMOSリセット直後はブート時にF1:SETUP、F2:CONNTINEのメニューが出るがBIOSは表示せず、リセットの繰り返し。またUSBキーボードが反応しない(NumLock等も全くLEDが付かない)のでPS2キーボード(起動時にLED点灯)でなんとかF1かF2が押せるだけ。
TPMモジュールに怪しいコードでも入っていたか?
BIOSのdefaultが化けていたか?
もうCPUかマザボが虫の息一歩だったダケ?
少なくともUSBのPS2エミュが不可になってる。
時間がかかり過ぎ、電源のメニューに「休止」が無いので、「スリープ」が「スリープ」アンド「休止」動作になり、復帰後も暫く無反応な状態になる場合がある。※NVME M.2 SSDを使ってるのに。
この「スリープ」の「休止」処理を止めるには電源ボタンのメニューに「休止」を出すことで・・・
「スリープ」が「スリープ」のみの動作になる。(らしい
操作1:
①ウィンドウズバーの検索に「電源」と入れて「電源プランの編集」を選択。
②「電源ボタンの動作を選択する」を選択。※電源ボタンのメニューを編集したいから
③「現在利用可能ではない設定を変更する」を選択。※メニューに出ない項目を出したいから
④「休止状態」にチェックを入れ「変更の保存」ボタンを押す。
これで電源ボタンのメニューに無事「休止」が表示される。
管理者権限のコマンドラインでハイバネーション(ストレージにPCの状態を保存する機能)をOFFし、
powercfg.exe /hibernate off
休止不可にしてスリープを速くすることもできるっぽい。
というか、手持ちのSSDが実質0.8GBytes/sec程度でメモリ32GBytesも積んでるから30秒以上はかかりそうな休止よりシャットダウンの方が速そうなんでハイバネーションOFF済みだったのに。
自前コードなので、関数やクラスをネームスペースにバラ巻いていた。
ただ、このままでは、再利用する度に、困りそうなので、カスタムタグのソースのクラスなどをMYAPPに纏めてみた。
まず、ネームスペースをまとめる関数を追加。※ネットで見つけたコードを少し改良したもの
/**
* MYAPP グローバルオブジェクトのアプリ名
*/
const MYAPP = {}; // 初期設定
/**
* 指定ネームスペースを作成する
* @param {string} pNameSpace 作成するネームスペース・パス
* @param {undefined | JSON} pJson 追記する内容 undefined または JSON
* @param {boolean} pFreeze 変更不可指定
*/
MYAPP.namespace = (pNameSpace, pJson = undefined, pFreeze = false) => {
/**
* 再帰的にオブジェクトを凍結する
* @param {object} obj 凍結するオブジェクト
*/
const freezeR = (obj) => {
if (typeof obj === 'object') {
// オブジェクトの配下を再帰的に凍結
for (const key of Object.keys(obj)) {
freezeR(obj[key]);
}
// オブジェクト自体を凍結
Object.freeze(obj);
}
};
// ネームスペースのテキストを .で区切った配列を作成する。※先頭がMYAPPなら削除する
const aNameSpace = pNameSpace.split('.').filter((element, index) => index !== 0 || element !== 'MYAPP');
// 現在のパスをMYAPPへ移動する
let curPath = MYAPP;
// パス最後の要素の有無で処理が分岐する為、配列から最後の要素を分離する。※constでもpopはオブジェクトを差替(代入)えないのでOK(らしい
const lastElement = aNameSpace.pop();
// 配列の順にネームスペースの有無をチェックする
for (const part of aNameSpace) {
// パスが存在しなければ作成し、パス位置を現在位置へ移動する
curPath = curPath[part] = curPath[part] ?? {};
}
// パス最後の要素が未設定なら空リストを代入
if (curPath[lastElement]) {
// pJsonをマージする
Object.assign(curPath[lastElement], pJson ?? {});
} else {
// pJsonに差替える
curPath[lastElement] = pJson ?? {};
}
// 編集不可指定ありの場合
if (pFreeze) {
// 作成したネームスペースを再帰的に凍結します
if (!pJson) {
freezeR(curPath[lastElement]);
} else {
// JSON配下のオブジェクトを再帰的に凍結します
for (const key of Object.keys(pJson)) {
freezeR(curPath[lastElement][key]);
}
}
}
};
aNameSpaceからそのままfor (const part of aNameSpace)を回すと、curPathが最後まで移動し、pJsonをネームスペースに追加しようとすると、
curPath = pJson ?? {} ; // MYAPPの方は書き換わらない
となってしまい、MYAPPの方は書き換わらないので、最終の一歩手前でcurPathを止めて、
curPath[lastElement] = pJson ?? {}; // curPath[lastElement]はMYAPPの一部なのでOK
としたかったので、aNameSpaceから最後の要素を切り取った。
また、Object.assignの第一パラメータの中身がundefinedの場合は、エラってしまうので、
try {
let obj = undefined;
Object.assign(obj, pJson ?? {});
} catch(ex) {
debug.print('Fail. '+ex);
}
⇒ Fail. Uncaught TypeError TypeError: Cannot convert undefined or null to object
undefined判定で空リストに変えてマージ。
if (!curPath[lastElement]) {
curPath[lastElement] = {}; // 空リストにする
}
Object.assign(curPath[lastElement], pJson ?? {}); // マージする
さすがに
Object.assign(curPath[lastElement]??{}, pJson); // マージする
は無理。
また、参照先が同じJSONにある場合は未確定な状態になりやすいので、MYAPP.namespaceの呼び出しを参照元と参照先で分けるのも面倒なので、第一パラメータで非参照先のネームパスを作成した方が楽。
これで完了と思ったら( ^ω^)・・・
MYAPP.namespace('aaa.bbb.ccc',
(p1, p2, p3) => {
...
}
);
aaa.bbb.ccc(1,2,3);
Uncaught TypeError TypeError: aaa.bbb.ccc is not a function
Object.assignは関数をプロパティっぽく書き込み、参照時に未定義な関数のエラーになるので、
// パス最後の要素が未設定なら空リストを代入
if (curPath[lastElement]) {
// pJsonをマージする
Object.assign(curPath[lastElement], pJson ?? {});
} else {
// pJsonに差替える
curPath[lastElement] = pJson ?? {};
}
で落ち着いた。
※まずpJsonがJSONかどうか判定した後の処理にした方が意図が読み取りやすいけど、深く意味を読み取ると無駄だと判るコードになる。
元ネタでは、
/**
* スプレッドシートクラス
* @class MYAPP.spreadSheet.SpreadSheetCustomElement
*/
MYAPP.namespace('spreadSheet.SpreadSheetCustomElement'),
MYAPP.spreadSheet.SpreadSheetCustomElement = class extends HTMLElement {
...
};
と、ネームスペースを作成し、作成したネームスペースにクラス等を設定する感じになっていた。
これを実際に動かしてみると、クラスの#変数がエラるw(パラメータがクラス宣言部なせいだろう)し、ネームスペースの文字も2度書いてるw(被ってるのは嫌い)なので、ネームスペースはファイルのパスまでとし、クラス名等はJSON形式でキー指定した方に変更して、クラスの定義は、こんな感じになった。
/**
* スプレッドシートクラス
* @class MYAPP.spreadSheet.SpreadSheetCustomElement
*/
MYAPP.namespace('spreadSheet', {
'SpreadSheetCustomElement': class extends HTMLElement {
...
}
});
ゴチャ付いてないから見やすくなった。(と思う
クラスを使用する場合はグローバルにクラスを宣言してないので、フルパス名で指定する。
_spreadSheet._command = new MYAPP.spreadSheet.SpreadSheetCommand(this);
関数も同様で、無名関数「function(…) { } 」でもいい。
MYAPP.namespace('lib', {
'createHtmlElement': (elementName, options) => {
...
},
});
使う時はフルパス名で指定する。
_layout.divTableN = MYAPP.lib.createHtmlElement('div', ... );
オブジェクトのプロパティはObject.freeze(object)で変更不可にできる。
メソッド名 | プロパティの追加 | プロパティの削除 | プロパティの値の変更 |
---|---|---|---|
Object.preventExtensions() | ✕ | 〇 | 〇 |
Object.seal() | ✕ | ✕ | 〇 |
Object.freeze() | ✕ | ✕ | ✕ |
Object.freeze(object)以外は値の変更ができるので今回は対象外。
MYAPP.namespace('lib', {
'char': {
BR:'<br/>',
CR: '\n',
TAB: '\t',
},
},true); // 変更不可を指示
関数やクラスの外では意図的にstrictモードにしないとエラー(TypeError)が起きない。
ちなみに
"use strict"; // strictモード全開!
// const 変数
MYAPP.namespace('lib', {
'char': {
BR: '<br/>',
CR: '\n',
TAB: '\t',
},
}, true);
MYAPP.lib.char.BR = 'aaaaa'; ☚ここでType Error
Uncaught TypeError TypeError: Cannot assign to read only property 'BR' of object '#<Object>'
デバッグして止めて、スクリプト・スコープの内容を見ると、修正が漏れ過ぎ( ´∀` )
やっとのことでMYAPPにまとまった。
ネームスペースはすっきりした。
しかし、こんなコードを見た試しが無い。(大笑
パス名が付くのでコードが長くなる上、VSCodeの自動でコメントを生成するプラグインが怪しい動きをする可能性があるが、このクラス、変数はどこ?と探すのは楽かもしれない。
アップロード処理でvalueの無いセルデータでエラっていたので修正
早々に24H2へアップグレードしPC(i9-9900)を再起動すると
PC(i7-3770T)のマザボをASUSからMSIのものに交換した際にアンスコしたAI Suite3の残骸が残っていたらしい。
AsIO.sysで検索してみると、
の3か所にいっぱい残骸が残っていることが判ったので
で再起動したらエラーは出なくなった。
他のPC(G4560)ではIntelのiqvw64e.sysがエラってた。
こっちはファイルを掴んでいるのがいるらしく上手く消せない。
Intel印のアプリを全て設定のアプリからアンスコしても消えない。
恐る恐る最後に残ったIntelのLANドライバーも設定のアプリからアンスコ。
それでもエラーは消えない。
IntelのホームページからWindows11用のLANドライバーのEXEをダウンロードしインスト。
やっと消えた。
安全の為に、同ホームページからインテル® ドライバー & サポート・アシスタントを入れなおし。
なぜか、2コア2スレッドのG3900だけはそんなエラーを吐かなかった。
Hyper-Threadingが絡んでいるのかな?
ヤレヤレと思ったのもつかの間、
24H2にアップグレードした全てのPCでWindowsUpdateが失敗。
0x800f0825。ヽ( ´ー)ノ フッ
メッセージ | 説明 | 軽減策 |
---|---|---|
CBS_E_CANNOT_UNINSTALL。パッケージをアンインストールできません。 | 通常、このエラーは、コンポーネントが部分的にインストールされている状態のときに発生するコンポーネント ストアの破損が原因です。 | コマンドを使用してコンポーネント ストアを Dism RestoreHealth 修復するか、部分的にインストールされたコンポーネントのペイロードを使用して手動で修復します。 管理者特権のコマンド プロンプトから、次のコマンドを実行します。Dism.exe /Online /Cleanup-Image /Restorehealth Sfc.exe /Scannow デバイスを再起動します。 |
つまり、アップデートモジュールが勝手に24H2アップグレードからの回復機能をOFFしようとしたけど、システムから怒られた訳か。
> DISM /Online /Get-OSUninstallWindow
展開イメージのサービスと管理ツール
バージョン: 10.0.26100.1150
イメージのバージョン: 10.0.26100.1742
Uninstall Window : 10
操作は正常に完了しました。
期限が10日すぎるまで様子見モード。
60日まで伸ばしておくか。
> DISM /Online /Set-OSUninstallWindow /Value:60
お急ぎの方は、コンポーネント ストアを修復するか
> Dism.exe /Online /Cleanup-Image /Restorehealth
> Sfc.exe /Scannow
がっつりと修復をさせる
> Dism RestoreHealth
と良いかもしれない。
回復する気が無いことに気が付いたのでいつものおまじないをする。※上記と同じ。
> DISM /Online /Cleanup-image /Restorehealth ' 展開イメージのサービスと管理ツール
展開イメージのサービスと管理ツール
バージョン: 10.0.26100.1150
イメージのバージョン: 10.0.26100.1742
[==========================100.0%==========================] 復元操作は正常に完 了しました。
操作は正常に完了しました。
> sfc /scannow
システム スキャンを開始しています。これにはしばらく時間がかかります。
システム スキャンの検証フェーズを開始しています。
検証 100% が完了しました。
Windows リソース保護により、破損したファイルが見つかりましたが、それらは正常に修復されました。
オンライン修復の場合、詳細は次の場所にある CBS ログ ファイルに含まれています
windir\ Logs\CBS\CBS.log (たとえば C:\Windows\Logs\CBS\CBS.log)。オフライン修復 の場合、
詳細は /OFFLOGFILE フラグによって指定したログ ファイルに含まれています。
C:\Windows\Logs\CBS\CBS.logをRepairで探したけど、怪しいのは
CSI 00000245 [SR] Repair complete
DEPLOY [Pnp] Corrupt file: C:\WINDOWS\System32\drivers\bthmodem.sys
DEPLOY [Pnp] Repaired file: C:\WINDOWS\System32\drivers\bthmodem.sys
ぐらい。
KB5043178をリトライしてみると、エラーは出ないが無限ループっぽい感じがしたけど、再起動が要求来た。
DISM /Online /Get-OSUninstallWindowの回答は60のまま。復元の【戻す】ボタンもまだ使えるかもしれない。
WindowsUpdateで問題を解決するの【今すぐ再インストール】ボタンで
コンポーネント ストアを修復する様だ。
これからはこの【今すぐ再インストール】ボタンでWindowsUpdateの0x800f0825エラーを修復するのが簡単そうだと思って、PC(G4560)で試したが効果無く、おまじないもしたが失敗。
※G3900,G4560のupdateの0x800f0825エラーは2024/10/9のupdateで解消。
G3900はWin10より起動が速くマウス操作の反応も良くなった気がする。※色々設定が初期化されてるせいかも?
PCの中のNASは開けるが
しかし、「ネットワーク」のアイコン
を開き、
NASのアイコンをクリックすると
よくあるパターンは
方法1:Windows11のPCからNASにアクセスできない場合の対処方法
では、「Windowsの機能の有効化または無効化」で、
でSMB1.0クライアントを有効にしてNASにつなぐ方法が紹介されているが、
今はNAS側でSMB3暗号化が[Enabled]になっているので繋がらない。
方法2:ネットワークパスが見つかりません(エラーコード:0x80070035)の対処法 – Windows10
というのを見つけ、対処3: ゲストログオンを有効にする を試してみる。
グループポリシーエディタ(gpedit.msc)で
やっとNASのアイコンを開けるようになった。
勿論、NASのアカウント設定は消えていたようで、ユーザ名とパスワードを再度入力して開けた。
・・・
「PCの中のNAS」は誰でも見れるパブリックなフォルダなので、セキュリティ的には何もしていない。
「ネットワークの中のNAS」はSMBで特定のアカウントのみに制限しているが、これがWin11だとセキュリティ的中途半端で嫌いらしい。
・・・
とりあえず、トラブルはこれでクリアできたかな?
ん?再起動するとNASのアカウントを忘れてる?
自動で更新されてないっぽい。Windowsアルアルで、パスワードを更新しても自動保存されない件。
資格情報マネージャーでパスワードを再設定。
これで終わったかな・・・( ^ω^)・・・
ps.2024/10/5
という記事を見たけど、実感は無い。巨大なISOファイル(今回のは5.35GBぐらい)をPCのSSDにバックアップする場合は速いだろうけど、NASにバックアップする場合にはLANが1Gbps(≒GBit/sec)なら100MBytes/secあたりが最速なんで、頻繁にPCの中で巨大な作業ファイルをコピる人以外は体感する画面は少なさそう。
ps.2024/10/8
トラブルが多すぎて配布を中止してるそうです。再開時期は未定。カーソルが消えたり、NASの接続方法等が初期設定に戻されたりと、仕方が無いかな。
ps.2024/10/10
いっぱい残ってるWindowsUpdateの一時ファイルのクリーンアップを実行しても、途中で引っかかってしてい進まない。試しにChromeを閉じると、一気に進み完了。
しかし、8.63GBも残ってるので繰り返してみるが減らない。
諦めて、以前のWindowsのインストールの一時ファイルを削除をしてみるも、こっちもさっぱり進まない。
タスクマネージャでイーサネットの負荷が不可解だったのでグラフの表示をイーサネットに切り替えたら、即終了。
いかにも、「バレたか!」っぽい動き
どうやら、一時ファイルの削除処理はただ黙って待ってても、うまくいかないっぽい。
ps.2024/10/11
例の一時ファイルWindowsUpdateのクリーンアップ(8.43GB)はクリーンアップ対象候補から外れてるので放置でいいかも。それよりWindows10互換指定とか全く使ってないアプリを消した方が良いかも。
ps.2024/10/12
DeskCleanコマンドで一時ファイルが消えるかな?Windowsバーの検索に「DeskClean」と入力して
結果は、減らなかった。
ps.2024/10/13
sfc /scannow で必ずエラーが出るらしい。
2024-10-13 01:54:36, Info CSI 00000149 [SR] Verifying 100 components
2024-10-13 01:54:36, Info CSI 0000014a [SR] Beginning Verify and Repair transaction
2024-10-13 01:54:36, Info CSI 0000014b [SR] Repairing file \??\C:\WINDOWS\SystemApps\Shared\WebView2SDK\\Microsoft.Web.WebView2.Core.dll from store
2024-10-13 01:54:36, Info CSI 0000014c [SR] Repairing file \??\C:\WINDOWS\SystemApps\Microsoft.WindowsAppRuntime.CBS_8wekyb3d8bbwe\\Microsoft.Web.WebView2.Core.dll from store
2024-10-13 01:54:36, Info CSI 0000014d [SR] Repairing file \??\C:\WINDOWS\SystemApps\MicrosoftWindows.Client.CBS_cw5n1h2txyewy\\Microsoft.Web.WebView2.Core.dll from store
2024-10-13 01:54:36, Info CSI 0000014e [SR] Repairing file \??\C:\WINDOWS\SystemApps\Microsoft.Windows.SecureAssessmentBrowser_cw5n1h2txyewy\\Microsoft.Web.WebView2.Core.dll from store
2024-10-13 01:54:36, Info CSI 0000014f [SR] Repairing file \??\C:\WINDOWS\SystemApps\Microsoft.Windows.OOBENetworkCaptivePortal_cw5n1h2txyewy\\Microsoft.Web.WebView2.Core.dll from store
2024-10-13 01:54:36, Info CSI 00000150 [SR] Repairing file \??\C:\WINDOWS\ImmersiveControlPanel\\Microsoft.Web.WebView2.Core.dll from store
2024-10-13 01:54:36, Info CSI 00000151 [SR] Repairing file \??\C:\WINDOWS\SystemApps\ShellExperienceHost_cw5n1h2txyewy\\Microsoft.Web.WebView2.Core.dll from store
2024-10-13 01:54:36, Info CSI 00000152 [SR] Repairing file \??\C:\WINDOWS\SystemApps\Shared\WebView2SDK\\Microsoft.Web.WebView2.Core.winmd from store
2024-10-13 01:54:36, Info CSI 00000153 [SR] Repairing file \??\C:\WINDOWS\SystemApps\Microsoft.WindowsAppRuntime.CBS_8wekyb3d8bbwe\\Microsoft.Web.WebView2.Core.winmd from store
2024-10-13 01:54:36, Info CSI 00000154 [SR] Repairing file \??\C:\WINDOWS\SystemApps\MicrosoftWindows.Client.CBS_cw5n1h2txyewy\\Microsoft.Web.WebView2.Core.winmd from store
2024-10-13 01:54:36, Info CSI 00000155 [SR] Repairing file \??\C:\WINDOWS\SystemApps\Microsoft.Windows.SecureAssessmentBrowser_cw5n1h2txyewy\\Microsoft.Web.WebView2.Core.winmd from store
2024-10-13 01:54:36, Info CSI 00000156 [SR] Repairing file \??\C:\WINDOWS\SystemApps\Microsoft.Windows.OOBENetworkCaptivePortal_cw5n1h2txyewy\\Microsoft.Web.WebView2.Core.winmd from store
2024-10-13 01:54:36, Info CSI 00000157 [SR] Repairing file \??\C:\WINDOWS\SystemApps\ShellExperienceHost_cw5n1h2txyewy\\Microsoft.Web.WebView2.Core.winmd from store
2024-10-13 01:54:36, Info CSI 00000158 [SR] Verify complete
二度目も修復しましたと表示する。減ってるけど・・・
2024-10-13 02:03:34, Info CSI 00000234 [SR] Verify complete
2024-10-13 02:03:34, Info CSI 00000235 [SR] Repairing 1 components
2024-10-13 02:03:34, Info CSI 00000236 [SR] Beginning Verify and Repair transaction
2024-10-13 02:03:34, Info CSI 00000237 Hashes for file member [l:31]'Microsoft.Web.WebView2.Core.dll' do not match.
Expected: {l:32 ml:33 b:a46788e94463899b6799304178a634643b20949cc7d378938db8abce8f69d17e}.
Actual: {l:32 b:50a5c14fd4da7116a2072d12cb94c258354d0237979d5d5afa979be740d118f5}.
2024-10-13 02:03:34, Info CSI 00000238 [SR] Repairing file \??\C:\WINDOWS\SystemApps\Microsoft.WindowsAppRuntime.CBS_8wekyb3d8bbwe\\Microsoft.Web.WebView2.Core.dll from store
2024-10-13 02:03:34, Info CSI 00000239 Hashes for file member [l:33]'Microsoft.Web.WebView2.Core.winmd' do not match.
Expected: {l:32 ml:33 b:84c0515b0adf5f0078b2ce28d84912ebc071737c2150d781a2d15a7464390e92}.
Actual: {l:32 b:0491fcbadc7e2e7320f741a9a562612305e515930811f176eab1b00ae5eb9d91}.
2024-10-13 02:03:34, Info CSI 0000023a [SR] Repairing file \??\C:\WINDOWS\SystemApps\Microsoft.WindowsAppRuntime.CBS_8wekyb3d8bbwe\\Microsoft.Web.WebView2.Core.winmd from store
2024-10-13 02:03:34, Info CSI 0000023b CSIPERF - FilePI Queue 132ms
2024-10-13 02:03:34, Info CSI 0000023c [SR] Repair complete
3度目も修復しましたと表示する。戻ってる?
2024-10-13 02:10:27, Info CSI 0000023d [SR] Verify complete
2024-10-13 02:10:27, Info CSI 0000023e [SR] Repairing 1 components
2024-10-13 02:10:27, Info CSI 0000023f [SR] Beginning Verify and Repair transaction
2024-10-13 02:10:27, Info CSI 00000240 [SR] Repairing file \??\C:\WINDOWS\SystemApps\Shared\WebView2SDK\\Microsoft.Web.WebView2.Core.dll from store
2024-10-13 02:10:27, Info CSI 00000241 [SR] Repairing file \??\C:\WINDOWS\SystemApps\Microsoft.WindowsAppRuntime.CBS_8wekyb3d8bbwe\\Microsoft.Web.WebView2.Core.dll from store
2024-10-13 02:10:27, Info CSI 00000242 [SR] Repairing file \??\C:\WINDOWS\SystemApps\MicrosoftWindows.Client.CBS_cw5n1h2txyewy\\Microsoft.Web.WebView2.Core.dll from store
2024-10-13 02:10:27, Info CSI 00000243 [SR] Repairing file \??\C:\WINDOWS\SystemApps\Microsoft.Windows.SecureAssessmentBrowser_cw5n1h2txyewy\\Microsoft.Web.WebView2.Core.dll from store
2024-10-13 02:10:27, Info CSI 00000244 [SR] Repairing file \??\C:\WINDOWS\SystemApps\Microsoft.Windows.OOBENetworkCaptivePortal_cw5n1h2txyewy\\Microsoft.Web.WebView2.Core.dll from store
2024-10-13 02:10:27, Info CSI 00000245 [SR] Repairing file \??\C:\WINDOWS\ImmersiveControlPanel\\Microsoft.Web.WebView2.Core.dll from store
2024-10-13 02:10:27, Info CSI 00000246 [SR] Repairing file \??\C:\WINDOWS\SystemApps\ShellExperienceHost_cw5n1h2txyewy\\Microsoft.Web.WebView2.Core.dll from store
2024-10-13 02:10:27, Info CSI 00000247 [SR] Repairing file \??\C:\WINDOWS\SystemApps\Shared\WebView2SDK\\Microsoft.Web.WebView2.Core.winmd from store
2024-10-13 02:10:27, Info CSI 00000248 [SR] Repairing file \??\C:\WINDOWS\SystemApps\Microsoft.WindowsAppRuntime.CBS_8wekyb3d8bbwe\\Microsoft.Web.WebView2.Core.winmd from store
2024-10-13 02:10:27, Info CSI 00000249 [SR] Repairing file \??\C:\WINDOWS\SystemApps\MicrosoftWindows.Client.CBS_cw5n1h2txyewy\\Microsoft.Web.WebView2.Core.winmd from store
2024-10-13 02:10:27, Info CSI 0000024a [SR] Repairing file \??\C:\WINDOWS\SystemApps\Microsoft.Windows.SecureAssessmentBrowser_cw5n1h2txyewy\\Microsoft.Web.WebView2.Core.winmd from store
2024-10-13 02:10:27, Info CSI 0000024b [SR] Repairing file \??\C:\WINDOWS\SystemApps\Microsoft.Windows.OOBENetworkCaptivePortal_cw5n1h2txyewy\\Microsoft.Web.WebView2.Core.winmd from store
2024-10-13 02:10:27, Info CSI 0000024c [SR] Repairing file \??\C:\WINDOWS\SystemApps\ShellExperienceHost_cw5n1h2txyewy\\Microsoft.Web.WebView2.Core.winmd from store
2024-10-13 02:10:27, Info CSI 0000024d [SR] Repair complete
繰り返しても終わらなさそう。
そのうち修正されるそうです。
昨日からインターネットが不通気味。
Chromeを開くと
とブログに追記しようとしたら
などと表示された後に
が表示されることがある。
Microsoft Windows [Version 10.0.26100.2033]
(c) Microsoft Corporation. All rights reserved.
C:\Windows\System32> IPCONFIG /FLUSHDNS
Windows IP 構成
DNS リゾルバー キャッシュは正常にフラッシュされました。
C:\Windows\System32> NBTSTAT -R
NBT リモート キャッシュ ネーム テーブルを正常に削除し、事前に読み込みました 。
C:\Windows\System32> NETSH INT IP RESET
コンパートメントの転送 のリセットに成功しました。
コンパートメント のリセットに成功しました。
制御プロトコル のリセットに成功しました。
エコー シーケンス要求 のリセットに成功しました。
グローバル のリセットに成功しました。
インターフェイス のリセットに成功しました。
エニーキャスト アドレス のリセットに成功しました。
マルチキャスト アドレス のリセットに成功しました。
ユニキャスト アドレス のリセットに成功しました。
近隣 のリセットに成功しました。
パス のリセットに成功しました。
可能性 のリセットに成功しました。
プレフィックス ポリシー のリセットに成功しました。
プロキシの近隣 のリセットに成功しました。
ルート のリセットに成功しました。
サイト プレフィックス のリセットに成功しました。
サブインターフェイス のリセットに成功しました。
スリープ解除のパターン のリセットに成功しました。
近隣の解決 のリセットに成功しました。
のリセットに成功しました。
...
のリセットに成功しました。
のリセットに失敗しました。
アクセスが拒否されました。
のリセットに成功しました。
...
のリセットに成功しました。
コンピューターを再起動してこの操作を完了してください。
C:\Windows\System32> NETSH WINSOCK RESET
Winsock カタログをリセットしました。
リセットを完了するためにコンピューターを再起動する必要があります。
この記事をプレビューすると50%くらいの確率でエラるか砂時計が回りっぱなし。【保存】ボタンもあやしい。
ps.2024/10/28
通信エラーはかなり緩和された。Windows Updateのクリーンアップできない件は9.6GBから大きく減量された。
長らく放置していたセル幅高編集機能をspreadSheet5として実装した。
spreadSheet4はさっぱり進んでいないマクロ機能の実装用に残した。
操作方法:セルの境界線上にマウスポインタを乗せるとカーソルがリサイズっぽく変わりドラッグするとドットラインも表示するので好みの位置でリリースし確定する。
データ保持:セル幅やセル高を変えるとindex.html内のspread-sheetタグのdatabasename属性で指定したデータベースのcellテーブルに列ヘッダー(r0cNNN)または行ヘッダー(rNNNc0)のセルに変更内容(style:{width:’NNNpx’あるいはheight:’NNNpx’})が保持される。
確認方法:変更内容はCtrl+Sでデータをダウンロードすることを確認でき、更に変更を加えspreadSheet上にドロップすることで結果を確認できる。
永続性:再表示(F5)時も変更内容を参照し画面に反映される。
TODO1:セルのHTMLエレメントを作成する部分が初期のセル幅やセル高を前提に作ってるので、セルを初期より狭くするとセルがうまく表示されない。カーソルキーでセル移動すると補正されるケースがある。実装を見直し中。
TODO2:セル内テキストがセル幅を越える場合は…付きの表示になるが、セル高を複数行分まで広げてもセル内テキストは改行しない。canvas.measureTextを使って適切な行数を計測できそうだけど、複数行表示で自動的に省略文字(…)を書きたい場合に困り、思案中。
TODO3:初期のセル幅やセル高に戻すUIは無いので下限値が16pxになっているが、r0c{セル位置}、r{行位置}c0のデータを削除することで初期に戻すことは可能だから、コンテキストメニュー実装時に考慮。
TODO4:セル境界線上でダブルクリックすると、良い感じのセル幅に変更するUIも実装したいが、まずタグにテキストを埋め込んで実測すると遅いのは明白で、canvasで描画して調べるしかなさそうだ。
const context = document.getElementById("canvas").getContext("2d");
/* 以下必要な分繰り返す*/
context.font = "48px serif"; /* な感じでセルのテキスト属性を指定 */
const text = '適当なテキスト'; /* な感じでセルのテキストを指定 */
const textMetrics = context.measureText(text);
let width = textMetrics.width;
let height = textMetrics.height;
これを画面で見える範囲で繰り返すなら処理時間も短かくて済そう。
しかし、測定値を保持するとページスクロールとダブルクリックを最終セルまで繰り返さないとドコかで不都合な場合もありそうなので、’best-value’:「適切な測定値」とかで保持するといいかな?とか思案中。
TODO5:ドラッグ中の値を表示してない。
TODO6:ドットラインの初期位置が現在のセル幅の位置ではなくカーソルの位置になっている。FIX9/30
予想通り色々と問題が発覚しすぎ。ここまで尾を引くなら、セル描画はcanvasに任せた方が良いかも。HitTestの実装もセル単位で判れば良いし。
ps.2024/9/30 ラバーバンドの位置を調整。横スクロールのY軸調整がうまくいかないので外す。セルサイズの小数部を切り捨て(52.3px⇒52px)。画面構成の計算は単位がpxのみ対処。他単位を指定した場合は×。コードを見返してみると長いし複雑、もっと手短にしたい。
ps.2024/10/8
アップロード処理でvalueの無いセルデータでエラっていたので修正
再宣言の差異は
再宣言可なvarと再宣言不可のlet。
どっちがいいのか微妙だけど、外部変数の宣言の場合には・・・
概ね宣言が被る方が困るので、letにしておこう。
尚、スコープの差異は
ブロックスコープなletの方が関数スコープのvarより使いやすい。
結論、varは要らない。
const createHtmlElement = (elementName, options) => {
・・・
・・・
const rc = Object.keys(options).map(
(key) => (chkOriginal(key) || chkStyle(key) || chkEvent(key) || setAttribute(key)));
);
}
と書くと、呼び出された各処理で
function chkOriginal(key) {
const value = options[key];
...
}
function chkStyle(key) {
const value = options[key];
...
}
function chkEvent(key) {
const value = options[key];
...
}
function setAttribute(key) {
const value = options[key];
...
}
と書いてたけど・・・
const createHtmlElement = (elementName, options) => {
・・・
const chkOriginal = (key,value) => {
...
}
const chkStyle = (key,value) => {
...
}
const chkEvent = (key,value) => {
...
}
const setAttribute = (key,value) => {
...
}
・・・
const rc = Object.keys(options).map(
const value = options[key];
(key) => (chkOriginal(key,value) || chkStyle(key,value) || chkEvent(key,value) || setAttribute(key,value)));
);
}
としてみた。自分で書いたコードから、ローカル関数で元関数のパラメータを見ても特に支障は無いけど、functionを使わない書き方で統一できた。
MDNを見ると、mapでも第2パラメータ(thisArgs)が使えるみたいなので、
const rc = Object.keys(options).map(function (key) {
const value = this[key];
return chkOriginal(key, value) || chkStyle(key, value) || chkEvent(key, value) || setAttribute(key, value);
}, options);
としてみた。
本来はコールバックに特定のオブジェクトをthisとして引き渡したい場合に使うものだし、コールバックの中でoptionsを書きたくないと意地を張ったものの、optionsを2回書いてしまう事に変わりは無いので、無駄なthisArgsの使い方になってしまった。外部の変数を見てる怪しい部分も修正したら結果がコレ。
/**
* HTMLエレメントを作成する
* @param {string} elementName エレメント名
* @param {{attributeName:,... eventName:,...}}} options 設定内容
* @returns {HTMLElement} 作成したHTMLElement
*/
const createHtmlElement = (elementName, options) => {
const fileName = 'js/lib/createHtmlElement.js';
const funcName = 'createHtmlElement'; //debugLog(`${fileName}:${funcName}(elementName: ${elementName}, options)`);
/**
* 独自の処理が必要な場合
* @param {} param 属性
* @returns {boolean} 結果
*/
const chkOriginal = (param) => {
let rc = false;
try {
switch (param.name) {
case 'className': // classNameはメソッドで、\x20で文字列を区切って複数の属性を指定できる
case 'classList': // classListはメソッド
let v = param.value;
if (!Array.isArray(v)) { v = v.split('\x20'); }
param.element.classList.add(...v); // 配列を展開してクラスリストに追加する
rc = true;
break;
case 'innerHTML': // innerHTMLはメソッド扱い ※未使用
param.element.innerHTML = param.value;
rc = true;
break;
case 'innerText': // innerTextはメソッド扱い
param.element.innerText = param.value;
rc = true;
break;
case 'parent': // parentはメソッド
param.value.appendChild(param.element);
rc = true;
break;
case 'appendChild': // appendChildはメソッド ※未使用
param.element.appendChild(param.value);
rc = true;
break;
case 'insertBefore': // insertBeforeはメソッド ※スクロール処理で座標の小さい方向へセルを作る際に使用
param.value.parentNode.insertBefore(param.element, param.value);
rc = true;
break;
} // end of switch
} catch (ex) {
debugLog(`${funcName}(elementName: ${elementName}) '${param.name}'属性の固有処理に失敗 '${ex}'`);
rc = false;
}
return rc;
};
/**
* スタイル属性の場合
* @param {} param 属性
* @returns {boolean} 結果
*/
const chkStyle = (param) => {
let rc;
try {
// style-xxxxのキーの場合
let styleChk = param.name.match(/^style_(.*)/);
if (styleChk) {
let styleName = styleChk[1];
switch (styleName) {
case 'width':
param.element.style.width = param.value;
break;
case 'height':
param.element.style.height = param.value;
break;
default:
styleChk = null;
break;
} // end of switch
}
rc = styleChk !== null;
} catch (ex) {
debugLog(`${funcName}(elementName: ${elementName}) '${param.name}'スタイル属性に${param.value}を設定失敗 '${ex}'`);
rc = false;
}
return rc;
}
/**
* eventの場合
* @param {} param 属性
* @returns {boolean} 結果
*/
const chkEvent = (param) => {
let rc;
try {
const eventList = ['ended']; // イベントリスト
rc = eventList.includes(param.name); // イベントリストに含まれているかどうか
if (rc) { // イベントリスナを登録する
param.element.addEventListener(param.name, param.value);
}
} catch (ex) {
debugLog(`${funcName}(elementName: ${elementName}) '${param.name}'イベントリスナの登録に失敗 '${ex}'`);
rc = false;
}
return rc;
}
/**
* HTMLエレメントに属性を追加する
* @param {} param 属性
* @returns {boolean} 結果
*/
const setAttribute = (param) => {
try {
param.element.setAttribute(param.name, param.value);
return true;
} catch (ex) {
debugLog(`${funcName}(elementName: ${elementName}) '${param.name}'属性に${param.value}を設定失敗 '${ex}'`);
return false;
}
}
let elm = document.createElement(elementName);
// optionsの設定名を取得しぶん回す!
const rc = Object.keys(options).map(function (key) {
const value = this[key];
const param = { 'name': key, 'value': value, 'element': elm };
return chkOriginal(param) || chkStyle(param) || chkEvent(param) || setAttribute(param);
}, options)
.filter(v => !v); // trueならば削除する
if (0 < rc.length) {
debugLog(`${funcName}(elementName: ${elementName}) 未処理属性数:${rc.length}件`);
}
return elm;
}
数か月経つと
※未使用
と書かないと、「どこかで使っている(気がする」し、
※スクロール処理で座標の小さい方向へセルを作る際に使用
とか書いておかないと、「要らない(気がする」する、
なぜか、逆バイアスがかかってしまうのは・・・謎。
あ、使い方も忘れた。
こんな感じだった。
let a = createHtmlElement('a', {
href: url,
download: fileName,
text: "re-download",
});
色々設定したいHTMLエレメントを作る時に
const div = createElement('div');
shadow.addChiled(div);
div.className = 'scroll';
div.id = `div${sn}`;
div.style.height = _spreadSheet.width;
div.style.width = _spreadSheet.height;
div.tabIndex = `${sn}`;
を1行で書ける。更にそんなモノがいっぱいある場合には、
// シャドールートを作成
_layout.shadowRoot = (!_layout.shadowRoot) ? _spreadSheet.customElement.attachShadow({ mode: "open" }) : _layout.shadowRoot;
const shadow = _layout.shadowRoot;
// 既存のHTMLElementを削除
Array.from(_layout.shadowRoot.children).forEach((ch) => ch.remove());
// スタイルシート部
const style = _layout.createStyle(sn, _spreadSheet.rows, _spreadSheet.cols, true, true);
shadow.appendChild(style);
// スプレッドシート部
_layout.divTableN = createHtmlElement('div', { parent: shadow, className: 'scroll', id: `div${sn}`, style_height: _spreadSheet.width, style_width: _spreadSheet.height, tabIndex: `${sn}`, });
_layout.tableN = await _layout.createTableElement(_layout.divTableN, 'spread-sheet', `table${sn}`);
_layout.divScrollX = createHtmlElement('div', { parent: _layout.divTableN, className: 'scroll-x', id: `divScrollX${sn}`, style_height: '17px', style_width: _spreadSheet.height, tabIndex: `${sn}`, });
_layout.divScrollY = createHtmlElement('div', { parent: _layout.divTableN, className: 'scroll-y', id: `divScrollY${sn}`, style_height: _spreadSheet.width, style_width: '17px', tabIndex: `${sn}`, });
と書け、すっきりする。
もっとも、インターネットの記事でそんなケースはまず有り得ないし、必要に応じてcreateHtmlElementの機能を増設していかないと「すっきり」しないので、仕事で作るソースにも使ったことはないね。
最初はcreateDivElementとかcreateAElementとかタグ毎に作っていたけど多すぎるので、createTableElementを除いて一本化した。
createTableElementみたいに複雑で同期を取る必要もあるモノは別物にするしかないが、コード全般の流れを単純化するとスッキリした。勿論、createTableElementの中のアチコチでcreateHtmlElementを呼び出している。
今見ると、イベント登録まで入れたのはやり過ぎ感があるなぁ。
Ctrl+Sでデータのダウンロードするとエラっていたので、修正。
メニューの「ファイル」で
「プロファイルを含む新しいウインドウ」⇒「新しいプロファイル…」を選択すると、
「新しいプロファイル」のウインドウが出るので
「v」⇒「テンプレートから」で、言語が色々選べる。
何に使うのかと云えば、チームでアプリを開発する際に、「プロファイルのインポート」で、同じプロファイルを使う様にすると開発環境(スニペや拡張機能のインストとか)を揃える手間が減るかもしれない。
でも、使い道がよく判りません。
画面左下の「設定(歯車)」の内容も随分増えてる。
訳が判らない。