変奏現実

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

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

パソコン

[javascript]createElementとかaddEventListenerはダルい

createElementはダルい。

そもそも、innerHTMLを使えば済む。

createElementはタグ名が付いてるダケの空っぽなHTMLエレメントを作るだけなので

var button = createElement('button');
button.className = 'fileButton fileDrag';
button.id = 'fileButton' + buttonId;
button.type = 'button';
button.innerHTML = caption;
parentObj.appendChild(button);

と・・・ダラダラと書かないといけないから

      var fileButton  = createElement('button', {
        className:  ['fileButton','fileDrag'],
        id:         'fileButton' + buttonId,
        type:       'button',
        innerHTML:  caption,
        parent:     parentObj
      });

の様に連想配列でエレメントの属性を一式で指定できればいいのに・・・

と思ったので書いてみた。

    //  HTMLエレメントを作成します
    const createElement = (tagName, options) => {
      var eventList = ['ended'];
      var elm  = document.createElement(tagName);
      Object.keys(options).forEach( (key) => {
        // eventの場合
        if( eventList.includes(key) ) {
          elm.addEventListener(key,options[key]);
        } else {
          // event以外の場合
          switch(key) {
            case 'className': // プロパティはclassNameですが、タグの属性はclassなので別途に処理します。
              if(Array.isArray(options[key])) {
                elm.classList.add(...options[key]); // 配列を展開しパラメータとして引き渡す
              } else {
                elm.classList.add(options[key]);
              }
              break;
            case 'innerHTML': // setAttributeではタグ内にinnerhtml="***"と属性を生成するので別途に処理します。
              elm.innerHTML = options[key];
              break;
            case 'parent':    // setAttributeではタグ内にparent="***"と属性を生成する様で、画面に生成したエレメントを割り付けないので別途に処理します。
              options[key].appendChild(elm);
              break;
            default:
              elm.setAttribute(key, options[key]);
              break;
          }
        }
      });
      return elm;
    };

イベントに対応するeventListの中身が少ないのは、creapteElementの後で毎回addEventListenerするのも面倒なので、スクリプトの最初でクラス指定でイベント登録を済ませたかったから・・・

とは云え、クラス数×イベント数がいっぱいあったら、その分のdocument.addEventListenerは呼び出したくないので、

    const onLoadWindow = () => {
      //  コントロールのイベント処理を登録します
      const classEvents = [
        /* onload */
        { className:  'fileButton',         events:   { 'click':  onClickFileButton}},
      ...
      ];
      registEventListener(classEvents);
    };
    //  documenイベント処理
    var documentEvents = {};
    const documentEventListener = (event) => {
      // 処理
      var target = event.target || event.srcElement;
      Array.from(target.classList).map((className) => documentEvents[event.type][className])
        .filter((func) => func !== undefined)
        .forEach((func) => func(event));
    };
    //  指定クラスを持つHTMLエレメントにイベントを登録します
    const registEventListener = (classEvents) => {
      // classEvents配列数分ループ
      classEvents.forEach((classEvent) => {
        // イベント数分ループ
        Object.keys(classEvent.events).forEach((eventName) => {
          // クラスのイベントごとの処理
          if( documentEvents[eventName] === undefined ) {
            // documentEvents[eventName][classEvent.className]に代入できるように初期化
            documentEvents[eventName] = {};
            document.addEventListener(eventName, documentEventListener);
          }
          // ※同じクラス・同じイベントに対応する処理は1つだけ
          documentEvents[eventName][classEvent.className] = classEvent.events[eventName];
        });
      });
    };
    //  画面初期表示時の処理
    window.onload = onLoadWindow;

イベントごとに1回document.addEventListenerを呼び出し、イベント発生時に呼出された時にイベントターゲットのクラス名からイベントで処理したい関数をリストアップして呼び出す様にしてみた。

const classEvents =[
  {
    className:  'fileButton',
    events:   {
      'click':  onClickFileButton}
    },
  },
  ...
]

この書き方は思いついたイベントを書き殴るには都合がいいけど、documentEventsでは扱いにくいので

var documentEvents = [
  {
    'click': [
      {
        'fileButton': onClickFileButton,
        ...
      }
    ],
  ...
  }
]

に置き換え、documentEvents[‘click’][‘fileButton’]からonClickFileButtonが容易に取得できるようにしている。

で・・・全部済ませたかったが、

videoタグのendedイベントはdocument.addEventListenerで拾えなかったので

自作のcreateElementで作成したHTMLエレメントにaddEventListenerでendedイベントを登録できるようにした。(ワケ

気分的には楽になるけど、

なぜかソースは長くなる。(大笑い



[javascript]matchとか

HTMLで同じようなタグが多いとのidに1とか2とか数値を付けるけど、

この数値の部分だけ欲しい時がある。

parseInt(id.match(/\d+$/))

とするとidの末尾の方の数字を数値で得られる。

matchは配列を返すので [0] を付けてparseIntに渡した方がいいけど、parseIntは引数を文字列に変換する際に配列なら先頭のみを対象とするみたいでこのままでも支障は無い。

ファイルの拡張子ダケ欲しい時

fileName.match(/([.])(.*$)/)[2]

[1]の様に思えるけど

matchはキャプチャグループを使うと

[0]:全体

[1]:1つ目のキャプチャグループ

[2]:2つ目のキャプチャグループ

の様に返すので ピリオドの後の拡張子部分ダケ欲しい場合は[2]になる。



「Windows10]KB5034441が0x80070643エラー

詳しいことは詳しい記事にお任せして、

見よう見まねでコマンドラインから回復パーティションを拡張しようとしたが

やはり失敗。(予定通り

原因は回復パーティションを拡張するにはディスクに未割当な部分(つまり隙間)が必要だが、Windowsのインストール時にディスクに隙間無く領域を割り当てるから隙間が全くないせいだ。

(と思う。

とは云うものの、DiskPartコマンドでディスクのパーティションを無駄なく割り当てるのはとても難しい。(と思える。

と云う訳で、AOMEIさんのPartiton Assitant Standard(機能制限のある体験版)のお手軽なUIで解決。

(1)Cドライブと回復パーティションを画面右のリサイズ機能でそれぞれ容量を調整する。

今回の手元のPCでは、Cドライブ、回復パーティションの順にならんでいたので、

  • Cドライブのパーティションをリサイズで縮小して未割当な領域(隙間)を作る。
  • 回復パーティションをリサイズで1.5GB程度に拡張する。

な感じで調整。

逆順だったら移動すればいいのかな?

(2)画面左上の『適用』ボタンを押す。

(3)ポップアップしたダイアログで『続行』ボタンを押すと

※操作時の画像を取り忘れた!画像はイメージです。

自動的に再起動しPartiton Assitant がディスクのパーティション調整を終わるまでじっくり待つ。

※240GBのSSDでも最初のボリュームチェックが結構長く数秒で1%進むペースだが、調整自体は数分だった。

再起動後にPartiton Assitant で調整結果を確認。

WindowsUpdateも確認すると

エラーは出なく無くなったので無事終了したようだ。

しかし、ツールを使ってディスクをイジるのはリスクがあるので、Windows10 – 22H2 のインストールUSBディスクを作ってクリーンインストールした方が安心!

ps.

このPCはCPUが古いから11にアップデートできないので、どうせならWindows11をクリーンインストールでディスクのボリュームも割り当てしなおした方が良かったのかな?



[三国英雄の夜明け]10倍

ゲームの近況。

襄陽戦に勝利したから年度報酬もいつもより多めに9倍を目指しましょう!

とゲームのチャットに出ていたのでやってみた。

9倍になったので報酬が配布される午後11時まで暫くYoutobeを見て時間を潰す。

さて、

午後11時になったのでログインして年度報酬を貰らおうとしたら・・・

ん?10倍報酬になっていた。

適当に英雄を配置してからYoutobe見てたので

撃破数や損失数が少し増えたかな?

でも、中身はショボかった。

年度報酬は人数割りなので、

サーバー統合の度に減額されるのは知ってたけどね。

偶然10倍になるのは良いけど、10倍を目指すのは辞めといた方がいい。

ps.2024/1/13

と云ったのにもう一度10倍にならないか試してみたケド。

9倍止まり、損失数が400万に届かなかったせいかな?

損失増やすには食料がいっぱい必要で襄陽戦に負け他勢力からの報酬が無いから黄金探索の七星灯で米を大量にGETできないと無理かな。

なので報酬はいつもの通り。

ps.2024/1/14

日付変わってから確認すると10倍に変わってた。報酬貰うの早すぎたのか!

前の10倍だったスクリーンショットの時刻が、23:37。

昨日の9倍のスクリーンショットの時刻が、23:28。

今日の10倍のスクリーンショットの時刻が、0:43。

このゲームで23時になっても年度報酬は貰えず、再ログインが必要。

だから数回再ログインすると10倍になるかもしれない。

時刻かもしれないけど、9倍だったら10倍になるまでちょっと待つのはありかもしれない。

いや!もしかしたら・・・・

いっぱい建設したのに9倍は可哀そう・・・

もう報酬は貰ったよね!

表示だけ10倍にしてあげよう!

かもしれない。

ps.2024/1/15

21:07:37 獣霊の品質選択の画面のレイアウトが変わってた。午前中は只のチェックボックスだったのに?

と云うか、このゲームのサーバは負荷が重いっぽいので、

実はコレが正解で、今までは画像データが読み込めず、「とりあえず判るレイアウト」になったままだったのかもしれない?



「古いPC」ついにPC起動せず

Windows10の22H2のアップデートの後くらいから調子が悪かったPC。

電源を入れるとたまにBIOS画面まで進むが暫くすると電源が落ちた。

このPC、電池切れで電源が入らなかった過去があるので

ボタン電池(CR2302)を交換してみたがダメ。

電源コンセントを逆差し(極性を変える)もダメ。

とりあえず思いつく事はやってもダメだったので、

電源を切ったまま放置したままだったPC。

ついに電源スイッチを押すと、すぐに電源が落ちる事態に・・・

余ってた電源ユニットに差し替えて見てもダメ。

とりあえず、全部パーツを外して順に繋いでみると・・・

あら不思議、ちゃんと起動するようになりました。

外した時にホコリを拭いたのが良かったのかな?

もしかするとボタン電池を交換した際に電池ホルダーが固く

しっかりホールドできていない様な気がして入れなおしたのが良かったのかな?

ps.2023/12/13

結局、電源ケーブルを抜いて暫くすると電源入らず。

静電気のせいな気がするけど、トリアエズ・・・マザボ交換。

MSIのPH61A-P35があったので差替えた。

外したASUSのP8H77-V LEは春になったら冬眠から寝覚めるだろう。



[ミニPC]beelink eq12 n100

beelink eq12 n100はトリプルディスプレイで、HDMIx2の他にType-C(DisplayPort Alt Mode対応) があり、usb Type-Cなモバイルディスプレイがケーブル一本で使えそう。

但し、モバイルモニターをUSB-C接続したら途中でフリーズしたり再起動するらしい。

そんなType-C(DisplayPort Alt Mode対応)なら不要なら、

Beelink Mini S12 Pro 16GB DDR4 SSD 第12世代プロセッサ N100 4C 4Tの方が安いけど、

やはり困った時だけモニターを繋ぐ場合はモバイルディスプレイがケーブル一本で使える方が楽。

また、静粛性を重視しすぎたのか?

BIOSのデフォのファン設定ではベンチを回すと途中でフリーズらしい。

負荷が重い使い方をするならファン設定は調整が必要そう。

なお、Windowsが付属してるのかは不明。



[Windows]MSからのメール受信の登録・解除

MSからのお知らせメールの受信設定は、このリンクから登録・解除が可能。

Start サマリーは、このリンクから登録が可能。

解除は、上の画像下部のプロモーション コミュニケーション マネージャーのリンクから

メアドを入力するとURLが入ったメール(なぜか迷惑メールに分類された)が送られるので、

リンクをクリックできない場合は、リンク上で右クリックして【リンクをコピー】し、

ブラウザにURLを貼って開く。

そこのURLの画面で登録・解除が可能。

暫くすると構成が変わるんだろうなぁ。



[Win11]Windows Subystem for Linux

Microsoft StoreからWindows Subystem for Linuxをインスト。

インスト後の【開く】ボタンを押すと

Linux 用 Windows サブシステムにディストリビューションがインストールされていません。

'wsl.exe --list --online' を使用して利用可能なディストリビューション
を一覧表示し、'wsl.exe --install <Distro>' を使用してインストールします。

また、Microsoft Store にアクセスしてディストリビューションをインストールすることもできます:
https://aka.ms/wslstore
Error code: Wsl/Service/CreateInstance/GetDefaultDistro/WSL_E_DEFAULT_DISTRO_NOT_FOUND
続行するには何かキーを押してください...

wslだけでは何もできないので、何かLinuxをインストしないといけないらしい。現状を確認してみる。

Microsoft Windows [Version 10.0.22621.2283]
(c) Microsoft Corporation. All rights reserved.

C:\Users\[ユーザ名]>wsl --list --verbose
Linux 用 Windows サブシステムにディストリビューションがインストールされていません。

'wsl.exe --list --online' を使用して利用可能なディストリビューション
を一覧表示し、'wsl.exe --install <Distro>' を使用してインストールします。

また、Microsoft Store にアクセスしてディストリビューションをインストールすることもできます:
https://aka.ms/wslstore
Error code: Wsl/WSL_E_DEFAULT_DISTRO_NOT_FOUND

やはり何も入っていない。

このwslのバージョンを確認してみると

C:\Users\[ユーザ名]>wsl.exe --version
WSL バージョン: 1.2.5.0
カーネル バージョン: 5.15.90.1
WSLg バージョン: 1.0.51
MSRDC バージョン: 1.2.3770
Direct3D バージョン: 1.608.2-61064218
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.22621.2283

WSLのバージョンは古いままらしい。

wslのver2の入手方法は不明。

とりあえず何がインストできるんだろう?

Microsoft Windows [Version 10.0.22621.2283]
(c) Microsoft Corporation. All rights reserved.

C:\Users\[ユーザ名]>wsl.exe --list --online
インストールできる有効なディストリビューションの一覧を次に示します。
'wsl.exe --install <Distro>' を使用してインストールします。

NAME                                   FRIENDLY NAME
Ubuntu                                 Ubuntu
Debian                                 Debian GNU/Linux
kali-linux                             Kali Linux Rolling
Ubuntu-18.04                           Ubuntu 18.04 LTS
Ubuntu-20.04                           Ubuntu 20.04 LTS
Ubuntu-22.04                           Ubuntu 22.04 LTS
OracleLinux_7_9                        Oracle Linux 7.9
OracleLinux_8_7                        Oracle Linux 8.7
OracleLinux_9_1                        Oracle Linux 9.1
openSUSE-Leap-15.5                     openSUSE Leap 15.5
SUSE-Linux-Enterprise-Server-15-SP4    SUSE Linux Enterprise Server 15 SP4
SUSE-Linux-Enterprise-15-SP5           SUSE Linux Enterprise 15 SP5
openSUSE-Tumbleweed                    openSUSE Tumbleweed

C:\Users\[ユーザ名]>wsl.exe --install Ubuntu-22.04
インストール中: Ubuntu 22.04 LTS
Ubuntu 22.04 LTS がインストールされました。
Ubuntu 22.04 LTS を起動しています...
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: admin ※試しに既存のユーザ名を入力してみると・・・
adduser: The group `admin' already exists. ※ちゃんと弾かれた
Enter new UNIX username: [Linux用のユーザ名]
New password:
Retype new password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.90.1-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage


This message is shown once a day. To disable it please create the
/home/[Linux用のユーザ名]/.hushlogin file.
[Linux用のユーザ名]@[PC名]:~$

無難なUbuntu-22.04をインストしてみた。

これで使えるらしい。

一応、Windowsで再ログインするとエクスプローラからUbubtuのリンクが貼られているのでファイル操作は可能。

また、windowsのコマンドラインからwslを実行すると、

Microsoft Windows [Version 10.0.22621.2283]
(c) Microsoft Corporation. All rights reserved.

C:\Users\slani>wsl
root@[PC名]:/mnt/c/Users/[ユーザ名]# pwd
/mnt/c/Users/[ユーザ名]
root@[PC名]:/mnt/c/Users/[ユーザ名]#

と出るので、/mnt/[windowsのドライブ名]/・・・な感じでwindowsのファイルへもアクセスできそう。

ただ、ネットワークをいじるのはマズイらしいから、外部からの参照は不可っぽい。

複数のディストリビューションも併用できるっぽいのでOracleLinux_9_1もインストしてみた。

C:\Users\[ユーザ名]>wsl --list --verbose
  NAME               STATE           VERSION
* Ubuntu-22.04       Stopped         2
  OracleLinux_9_1    Stopped         2

ちなみにエクスプローラのリンクもOS毎に分かれていたので安心。

コマントラインでwslを起動すると、*の付いたUbuntu-22.04が実行される。

C:\Users\[ユーザ名]>wsl
root@[PC名]:/mnt/c/Users/[ユーザ名]#
C:\Users\[ユーザ名]>wsl --list --verbose
  NAME               STATE           VERSION
* Ubuntu-22.04       Running         2
  OracleLinux_9_1    Stopped         2

ディストリビューションを指定すればドレでも起動もできる。

C:\Users\[ユーザ名]>wsl -d OracleLinux_9_1
[root@[PC名] [ユーザ名]]#
C:\Users\[ユーザ名]>wsl --list --verbose
  NAME               STATE           VERSION
* Ubuntu-22.04       Stopped         2
  OracleLinux_9_1    Running         2

試しにプレリリースをインストしてみると

C:\Users\[ユーザ名]>wsl --update --pre-release
更新プログラムを確認しています。
Linux 用 Windows サブシステムをバージョンに更新しています: 2.0.0。
^C
C:\Users\[ユーザ名]>wsl --version
WSL バージョン: 1.2.5.0
カーネル バージョン: 5.15.90.1
WSLg バージョン: 1.0.51
MSRDC バージョン: 1.2.3770
Direct3D バージョン: 1.608.2-61064218
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.22621.2283

変わらない。(謎

一旦、コマンドプロンプトを閉じて、開き直なおして再確認。

Microsoft Windows [Version 10.0.22621.2283]
(c) Microsoft Corporation. All rights reserved.

C:\Users\[ユーザ名]>wsl --version
WSL バージョン: 2.0.0.0
カーネル バージョン: 5.15.123.1-1
WSLg バージョン: 1.0.57
MSRDC バージョン: 1.2.4485
Direct3D バージョン: 1.608.2-61064218
DXCore バージョン: 10.0.25880.1000-230602-1350.main
Windows バージョン: 10.0.22621.2283

無事にver2になってた。

後、wslで起動した場合、コマンドプロンプトを閉じても終了しないので、ちゃんとshutdownしないといけないらしい。

Microsoft Windows [Version 10.0.22621.2283]
(c) Microsoft Corporation. All rights reserved.

C:\Users\[ユーザ名]>wsl --shutdown



[Win11]ストレージのクリーンアップ

Windows10ではディスクのプロパティのツールから一時ファイル等を「クリーンアップ」する事ができたが、今のWindows11の同じ画面には「クリーンアップ」ボタンは無い。

「設定」から「ストレージ」画面に「クリーンアップ対象候補」と云うのがあるが、大抵はずーっと処理中のままだ。

なので「ストレージセンサー」画面に進み、【今すぐストレージセンサーを実行する】ボタンを押すしかない様だ。

尚、実行する前に画面のチェックボックスの選択状態をよく確認してから実行しないと、「アプリファイル」が消えたり「ダウンロードフォルダ」が空っぽになって困るかもしれない。

処理が終わると「クリーンアップ対象候補」で一時ファイル等が選択できるようになる。

ここまでの操作で、「設定」から「システム」⇒「ストレージ」⇒「一時ファイル」の画面がWindows10の「クリーンアップ」と同じような画面になるので、要らないモノを選択して「クリーンアップ」できるようになる。

Androidのgoogleもそうだけど、OSの製作者はストレージを汚箱にしたい様だ。

もしくは、掃除はロボットの仕事と思っているのだろう。



[三国英雄の夜明け]累積勲功

面倒くさいけど領地の各設備のレベルアップしたら官邸レベルを36から39に上げられた様な気がしてますが、3か月過ぎても36のままの方もいます。

爵位条件の「領地の官邸がLv36に達成」や「県公を達成し、累積で700万戦功獲得」は毎度の事ですが、今回は久々に「累積勲功獲得」が入ってます。しかも6千万!※はい。たった今0を数えました。

履歴から最低でも累積2千万勲功はあるはずですが、

久々に復活して条件を確認してみたら

4千万足りないよ!

となったら、ちょっと絶望してしまうレベルかもしれません。

もっともレベル36でも、ボクより戦力は遥かに上の方もチラホラ見かけますけどね。

ps.2023/07/26

勲功を増やす方法

毎日の政務で増やすのが基本。

要らないアイテムがあれば以下の手段も使える。

  • 無駄に資源(木とか鉄が)が何億もあるなら、コツコツとムダな建設に励む
    • 建設する度に勲功が増える
    • うまくいけば10倍の年度報酬も夢じゃない
    • 黄金を使用して「直ちに完了」すれば早い
      • 注意:早い早いと調子に乗ると後悔しそう
  • 勲功を消費する獣霊の生門と死門のレベルアップと分解を繰り返す
    • 分解した時に勲功が増える
    • 獣霊の生門と死門がいっぱいあればサクサク進める
    • 注意:要らない獣霊の生門と死門ダケにしましょう
  • 生産(村)で報酬の選択肢がある時にデフォルトではないボタンの方も選んでみる
    • 勲功が貰えるときもある




top