変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

パソコン

[Windows11]コア分離・メモリ整合性OFF?

何か?

押してみると・・・

設定に移動してみる

オンにしてみよう

どうやら互換性のないドライバがマズイらしい。

互換性のないドライバーを確認すると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円くらい。国際郵便で一週間程度)

これが届けば、一安心?一波乱?

ps.2024/10/14

PC(G4560)で、非互換ドライバー発見

  • WinDVD 10 の PxHlpa64.sys
    • C:\Windows\System32\Drivers\PxHlpa64.sys を削除
      • それでも普通にWinDVD起動するし動画再生もする
      • BDドライブにメディアを入れた時に起動する設定がレジトリィあるそうな
        • \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e965-e325-11ce-bfc1-08002be10318}のLowerFilters のデータに、PxHlpa64.sys とあるのを削除しておく方が良いらしい。
  • USB TVチューナー(PIXELA製PIX-DT295)の pxmb86m0x_usb.sys

でメモリ整合性ONにできた。

ps.2024/10/14

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世代)だからダメかも。

ps.2024/10/17

不明なデバイスはサポートされなくなったIntel Smart ConnectionとのことなのでBIOSで【DISABLED】

標準SATA AHCIコントローラーの⚠️は、BIOS でSATAのモードが【AHCI】だったので【IDE】に変更したら消えたけど、デバイスマネージャの表記がSATAからIDEに変わってしまった。

SSDもIDEだったかな?

ps.2024/10/17

TPM2モジュールが届いたけど、20PINだった。14PINタイプを買うもASUS用で、MSIとPINアサインが全然違っていたのでキャンセル依頼を出して、MSI用を買い足す。キャンセルできなかったら古いMBの保守に取っておくか。

ps.2024/10/18

ピン数種類価格送料状態
20unknown510配達完了
14asus1043699キャンセル
14msi1733700発送済み
TMP2.0モジュール



[windows11]スリープからの復帰の呪い

時間がかかり過ぎ、電源のメニューに「休止」が無いので、「スリープ」が「スリープ」アンド「休止」動作になり、復帰後も暫く無反応な状態になる場合がある。※NVME M.2 SSDを使ってるのに。

この「スリープ」の「休止」処理を止めるには電源ボタンのメニューに「休止」を出すことで・・・

「スリープ」が「スリープ」のみの動作になる。(らしい

操作1:

①ウィンドウズバーの検索に「電源」と入れて「電源プランの編集」を選択。

②「電源ボタンの動作を選択する」を選択。※電源ボタンのメニューを編集したいから

③「現在利用可能ではない設定を変更する」を選択。※メニューに出ない項目を出したいから

④「休止状態」にチェックを入れ「変更の保存」ボタンを押す。

これで電源ボタンのメニューに無事「休止」が表示される。

管理者権限のコマンドラインでハイバネーション(ストレージにPCの状態を保存する機能)をOFFし、

powercfg.exe /hibernate off

休止不可にしてスリープを速くすることもできるっぽい。

というか、ハイバネーションOFF済みだったのに。



[javascript]spreadSheet5 ネームスペース

自前コードなので、関数やクラスをネームスペースにバラ巻いていた。

ただ、このままでは、再利用する度に、困りそうなので、カスタムタグのソースのクラスなどを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の自動でコメントを生成するプラグインが怪しい動きをする可能性があるが、このクラス、変数はどこ?と探すのは楽かもしれない。

ps.2024/10/8

アップロード処理でvalueの無いセルデータでエラっていたので修正



[Windows11]早々の24H2といつものお約束

早々の24H2のインスト

早々に24H2へアップグレードしPC(i9-9900)を再起動すると

いつものお約束

トラブル①動かない「ASUS社製(らしい)」AsIO.sys

PC(i7-3770T)のマザボをASUSからMSIのものに交換した際にアンスコしたAI Suite3の残骸が残っていたらしい。

AsIO.sysで検索してみると、

  • C:\ProgramData\Asusフォルダ
    • AI Suite3プロダクト一式が隠れていた。設定のアプリの【変更】ボタン用だろう。
  • C:\Windows\System32\drivers\フォルダ
    • AsIO.sysがあった
  • C:\Windows\SysWOW64\Drivers\フォルダ
    • AsIO.sysがあった

の3か所にいっぱい残骸が残っていることが判ったので

  • C:\ProgramData\Asusをフォルダごと削除
  • C:\Windows\System32\drivers\AsIO.sysファイルを削除
  • :\Windows\SysWOW64\Drivers\AsIO.sysファイルを削除

で再起動したらエラーは出なくなった。

トラブル②動かない「INTEL社製」iqw64e.sys

他のPC(G4560)ではIntelのiqvw64e.sysがエラってた。

こっちはファイルを掴んでいるのがいるらしく上手く消せない。

Intel印のアプリを全て設定のアプリからアンスコしても消えない。

恐る恐る最後に残ったIntelのLANドライバーも設定のアプリからアンスコ。

それでもエラーは消えない。

IntelのホームページからWindows11用のLANドライバーのEXEをダウンロードしインスト。

やっと消えた。

安全の為に、同ホームページからインテル® ドライバー & サポート・アシスタントを入れなおし。

なぜか、2コア2スレッドのG3900だけはそんなエラーを吐かなかった。

 Hyper-Threadingが絡んでいるのかな?

ヤレヤレと思ったのもつかの間、

トラブル③Windows11のオンラインアップデートがへたる。

24H2にアップグレードした全てのPCでWindowsUpdateが失敗。

0x800f0825。ヽ( ´ー)ノ フッ

メッセージ説明軽減策
CBS_E_CANNOT_UNINSTALL。パッケージをアンインストールできません。通常、このエラーは、コンポーネントが部分的にインストールされている状態のときに発生するコンポーネント ストアの破損が原因です。コマンドを使用してコンポーネント ストアを Dism RestoreHealth 修復するか、部分的にインストールされたコンポーネントのペイロードを使用して手動で修復します。 管理者特権のコマンド プロンプトから、次のコマンドを実行します。
Dism.exe /Online /Cleanup-Image /Restorehealth
Sfc.exe /Scannow
デバイスを再起動します。
0x800f0825の意味

つまり、アップデートモジュールが勝手に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より起動が速くマウス操作の反応も良くなった気がする。※色々設定が初期化されてるせいかも?

トラブル④Windows11の「ネットワーク」の中のNASのアイコンを開けない。

PCの中のNASは開けるが

「PC」の中身、NASを開くと
ちゃんと見える。

しかし、「ネットワーク」のアイコン

を開き、

「ネットワーク」の中身

NASのアイコンをクリックすると

【0x80070035 ネットワークパスが見つかりません。】と、そっけない返事。

よくあるパターンは

  • ファイル共有が外れている可能性?
    • 有効になっていた
  • (怪しさMAXな)Peerプロトコルが無効の可能性?
    • サービスの一覧にPeer xxxxxなサービス名がそもそも無かった

方法1:Windows11のPCからNASにアクセスできない場合の対処方法

では、「Windowsの機能の有効化または無効化」で、

でSMB1.0クライアントを有効にしてNASにつなぐ方法が紹介されているが、

今はNAS側でSMB3暗号化が[Enabled]になっているので繋がらない。

方法2:ネットワークパスが見つかりません(エラーコード:0x80070035)の対処法 – Windows10

というのを見つけ、対処3: ゲストログオンを有効にする を試してみる。

グループポリシーエディタ(gpedit.msc)で

  • 左ペインのローカルコンピュータポリシー
    • コンピュータの構成
      • 管理用テンプレート
        • ネットワーク
          • Lanman ワークステーション
            • 右ペインの「安全でないゲストログオンを有効にする」を開く
              • 「未構成」⇒「有効」に変更
      • Windowsの設定
        • セキュリティの設定
          • ローカルポリシー
            • セキュリティオプション
              • 右ペインの「Microsoftネットワーククライアント: 常に通信にデジタル署名を行う」を開く
                • 「無効」になっていたのでそのまま閉じる
「安全ではないゲストログオンを有効にする」を探してる
「未構成」から「有効」に切り替えて【OK】ボタン
「常に通信にデジタル署名を行う」は無効だったのでパス

やっとNASのアイコンを開けるようになった。

トラブル⑤NASのパスワードを変えたら資格情報が自動更新してくれない

勿論、NASのアカウント設定は消えていたようで、ユーザ名とパスワードを再度入力して開けた。

・・・

「PCの中のNAS」は誰でも見れるパブリックなフォルダなので、セキュリティ的には何もしていない。

「ネットワークの中のNAS」はSMBで特定のアカウントのみに制限しているが、これがWin11だとセキュリティ的中途半端で嫌いらしい。

・・・

とりあえず、トラブルはこれでクリアできたかな?

ん?再起動するとNASのアカウントを忘れてる?

自動で更新されてないっぽい。Windowsアルアルで、パスワードを更新しても自動保存されない件。

資格情報マネージャーでパスワードを再設定。

これで終わったかな・・・( ^ω^)・・・

ps.2024/10/5

Windows 11 24H2で巨大ファイルのコピー速度が最大94%改善へ

という記事を見たけど、実感は無い。巨大な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

繰り返しても終わらなさそう。

そのうち修正されるそうです。



[javascript]spreadSheet5

長らく放置していたセル幅高編集機能を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の無いセルデータでエラっていたので修正



[javascript]varとlet

再宣言の差異は

再宣言可なvarと再宣言不可のlet。

どっちがいいのか微妙だけど、外部変数の宣言の場合には・・・

概ね宣言が被る方が困るので、letにしておこう。

尚、スコープの差異は

ブロックスコープなletの方が関数スコープのvarより使いやすい。

結論、varは要らない。



[JavaScript]配列のkeyとvalueの両方を使う

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を呼び出している。

今見ると、イベント登録まで入れたのはやり過ぎ感があるなぁ。



[VScode1.93]プロファイルエディタ

メニューの「ファイル」で

「プロファイルを含む新しいウインドウ」⇒「新しいプロファイル…」を選択すると、

「新しいプロファイル」のウインドウが出るので

「v」⇒「テンプレートから」で、言語が色々選べる。

何に使うのかと云えば、チームでアプリを開発する際に、「プロファイルのインポート」で、同じプロファイルを使う様にすると開発環境(スニペや拡張機能のインストとか)を揃える手間が減るかもしれない。

でも、使い道がよく判りません。

画面左下の「設定(歯車)」の内容も随分増えてる。

訳が判らない。



[windows11]emscriptenのインスト

WebAssemblyを使いたくてemscriptenをインスト。

まずはcドライブのルートで「ターミナルを開く」。※最新PowerShellに連動済み

PowerShell 7.4.5
PS C:\> git clone https://github.com/emscripten-core/emsdk
Cloning into 'emsdk'...
remote: Enumerating objects: 4162, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (76/76), done.
remote: Total 4162 (delta 47), reused 54 (delta 19), pack-reused 4065 (from 1)
Receiving objects: 100% (4162/4162), 2.38 MiB | 1.65 MiB/s, done.
Resolving deltas: 100% (2722/2722), done.
PS C:\> cd emsdk
PS C:\emsdk> ./emsdk.bat install latest
Resolving SDK alias 'latest' to '3.1.65'
Resolving SDK version '3.1.65' to 'sdk-releases-fdcf56c75a1d27fdff6525a7e03423595485ca19-64bit'
Installing SDK 'sdk-releases-fdcf56c75a1d27fdff6525a7e03423595485ca19-64bit'..
Installing tool 'node-18.20.3-64bit'..
Downloading: C:/emsdk/downloads/node-v18.20.3-win-x64.zip from https://storage.googleapis.com/webassembly/emscripten-releases-builds/deps/node-v18.20.3-win-x64.zip, 30476796 Bytes
Unpacking 'C:/emsdk/downloads/node-v18.20.3-win-x64.zip' to 'C:/emsdk/node/18.20.3_64bit'
Done installing tool 'node-18.20.3-64bit'.
Installing tool 'python-3.9.2-nuget-64bit'..
Downloading: C:/emsdk/downloads/python-3.9.2-4-amd64+pywin32.zip from https://storage.googleapis.com/webassembly/emscripten-releases-builds/deps/python-3.9.2-4-amd64+pywin32.zip, 14413267 Bytes
Unpacking 'C:/emsdk/downloads/python-3.9.2-4-amd64+pywin32.zip' to 'C:/emsdk/python/3.9.2-nuget_64bit'
Done installing tool 'python-3.9.2-nuget-64bit'.
Installing tool 'java-8.152-64bit'..
Downloading: C:/emsdk/downloads/portable_jre_8_update_152_64bit.zip from https://storage.googleapis.com/webassembly/emscripten-releases-builds/deps/portable_jre_8_update_152_64bit.zip, 69241499 Bytes
Unpacking 'C:/emsdk/downloads/portable_jre_8_update_152_64bit.zip' to 'C:/emsdk/java/8.152_64bit'
Done installing tool 'java-8.152-64bit'.
Installing tool 'releases-fdcf56c75a1d27fdff6525a7e03423595485ca19-64bit'..
Downloading: C:/emsdk/downloads/fdcf56c75a1d27fdff6525a7e03423595485ca19-wasm-binaries.zip from https://storage.googleapis.com/webassembly/emscripten-releases-builds/win/fdcf56c75a1d27fdff6525a7e03423595485ca19/wasm-binaries.zip, 523605271 Bytes
Unpacking 'C:/emsdk/downloads/fdcf56c75a1d27fdff6525a7e03423595485ca19-wasm-binaries.zip' to 'C:/emsdk/upstream'
Done installing tool 'releases-fdcf56c75a1d27fdff6525a7e03423595485ca19-64bit'.
Done installing SDK 'sdk-releases-fdcf56c75a1d27fdff6525a7e03423595485ca19-64bit'.
PS C:\emsdk> ./emsdk.bat activate latest
Resolving SDK alias 'latest' to '3.1.65'
Resolving SDK version '3.1.65' to 'sdk-releases-fdcf56c75a1d27fdff6525a7e03423595485ca19-64bit'
Setting the following tools as active:
   node-18.20.3-64bit
   python-3.9.2-nuget-64bit
   java-8.152-64bit
   releases-fdcf56c75a1d27fdff6525a7e03423595485ca19-64bit

Next steps:
- Consider running `emsdk activate` with --permanent or --system
  to have emsdk settings available on startup.
Adding directories to PATH:
PATH += C:\emsdk
PATH += C:\emsdk\node\18.20.3_64bit\bin
PATH += C:\emsdk\upstream\emscripten

Setting environment variables:
PATH = C:\emsdk;C:\emsdk\node\18.20.3_64bit\bin;C:\emsdk\upstream\emscripten;C:\Program Files\WindowsApps\Microsoft.PowerShell_7.4.5.0_x64__8wekyb3d8bbwe;C:\app\[ユーザ名]\product\19.0.0\client_1;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\PROGRA~1\JPKI;C:\Program Files\Git\cmd;C:\Users\[ユーザ名]\AppData\Local\Microsoft\WindowsApps;C:\Users\[ユーザ名]\AppData\Local\Programs\Microsoft VS Code\bin
EMSDK = C:/emsdk
EMSDK_NODE = C:\emsdk\node\18.20.3_64bit\bin\node.exe
EMSDK_PYTHON = C:\emsdk\python\3.9.2-nuget_64bit\python.exe
JAVA_HOME = C:\emsdk\java\8.152_64bit
Clearing existing environment variable: EMSDK_PY
The changes made to environment variables only apply to the currently running shell instance. Use the 'emsdk_env.bat' to re-enter this environment later, or if you'd like to register this environment permanently, rerun this command with the option --permanent.

インストしたが、

PowerShell 7.4.5
PS C:\emsdk> emmake
emmake: The term 'emmake' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

環境変数を追加しないといけないらしい。

悩んだ末emcmdprompt.batの存在に気が付いた。

PowerShellじゃないけどね(笑

やっとコマンドが使えるようになったのでインスト完了。

どこのフォルダでも使える様にするには

emsdk activate --permanent or --system

で環境変数を直接書き換えてしまった方がいいだろう。(※未確認

さて、インストしたらどれくらいのサイズを使ったのかな?

なんてこったい!1.63GBもある!

node.jsとpythonとJavaも入っている様だから仕方が無いかな?




top