変奏現実

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

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

【javascript】indexedDB

まだ、イマイチ感がある。

注意点

1.PC上のHTMLの場合、データベースのスコープ(有効範囲)はPC単位。

つまりPC上のHTMLで共有してしまう

2.データベースをオープンしたら、必ず自分でクローズすること

クローズし忘れると、次のオープン時にロックしやすい

大抵はF5のオートコミットで済むが、ブラウザを閉じないとダメな場合もある

successイベントは1回のみなので、try catchの後のfinallyでクロースすればいい

const request = window.indexedDB.open("TestDatabase");
request.addEventListener('success', (event) => {
  const database = event.target.result;
  try {
    ・・・データ処理・・・
  } catch (ex) {
    console.log(`${ex}`);
  } finally {
    database.close();
  }
});

しかし、Promiseを使って処理の同期を取りたい場合は・・・

const promise = new Promise( (resolve, reject) => {
  const request = window.indexedDB.open("TestDatabase");
  request.addEventListener('success', (event) => {
    const database = event.target.result;
    try {
      ・・・データ処理・・・
   resolve(`xxxx(...): success`);
    } catch (ex) {
      console.log(`${ex}`);
   reject(`xxxx(...): catch(${ex})`);
    } finally {
      database.close();
    }
  });
  *** エラー処理とか ***
});
return promise;

とすると、resolveの後にfinally句のクローズ処理が通るかどうか?

あまり自信が無い。

と云うのも

function test() {
  return  true;
  alert('OK');
}

のalert(‘OK’);がいつのまにか処理されなくなってたからだ。

upgradeneeded発生時は、後にsuccessイベントが続くので、successイベントに任せればいい

errorイベントも忘れずにクローズ。

request.addEventListener('error', (event) => {
  const error = event.target.error;
  database.close();
  reject(`xxxx(...): error\n${error}`);
});

3.オブジェクトストアの生成・削除はデータベースのバージョンアップ時のみ

4.インデックスの生成・削除もデータベースのバージョンアップ時のみ

5.だが、トランザクションはデータベースのバージョンアップ時は不可

6.トランザクションも自分でcommitabortすること

commitabortを忘れるとタイムアウトするまで次の処理がロックする

const trans = database.transaction(オブジェクトストア・リスト);
try {
  const objectStore = trans.objectStore(オブジェクトストア);
  ***データ処理***
  trans.commit();
} catch (ex) {
  trans.abort();
  throw ex;
}

だからと云ってcursorのsuccessイベントは何回も降ってくることが多いので

毎回commitすると、2周目でつまずく

const trans = database.transaction(オブジェクトストア・リスト);
try {
  const objectStore = trans.objectStore(オブジェクトストア);
  const cursor objectStore.createCursor().onsuccess(event => {
    const cursor = event.target.result;
    ***データ処理***
    cursor.continue();
    trans.commit(); //毎回コミットは・・・
  });
} catch (ex) {
  trans.abort();
  throw ex;
}

7.インデックスの生成・削除できるタイミングはオブジェクトストアの生成直後だけ

const request = indeedDB.openDatabase(データベース名)
request.addEventListener(`onupgradeneed', (event) => {
  const database = event.target.result;
  const objectStore = database.createObjectStore(オブジェクトストア名);
  objectStore.createIndex(インデックス名);
  objectStore.deleteIndex(インデックス名);
});

後でインデックスを調整したい場合は、オブジェクトストアのexports機能を自作して、イジって、importsするしかない。

8.カーソルの生成はデータベースのバージョンアップ時は不可だと思う

9.カーソルのsuccessイベントはカーソルの移動回数分繰り返すので、Promise使った方が良さそう

最終のsuccessイベントは、event.target.result === undefined なので、うっかりcursor.valueすると痛い。resolveだけ処理すればいい。

const trans = database.transaction(オブジェクトストア名);
const promise = new Promise( (resolve, reject) => {
  try {
    const objectStore = trans.objectStore(オブジェクトストア名);
    const cursor = objectStore.openCursor();
    cursor.onsuccess = (event) => {
      var cursor = event.target.result;
      if (cursor) {
        console.log(`${cursor.key} is ${cursor.value}.`);
        cursor.continue();
      } else {
        console.log("end");
        resolve(true);
      }
    };
    cursor.onerror = (event) => {
      const error = event.target.error;
      reject(error);
    };
  } catch (ex) {
    reject(ex);
  }
});
return promise;

な感じだった。

データベースの構成をイジる処理をコードしてみると、

何かと面倒くさかったので、

全データベースまたはオブジェクトストア単位でのexportsimports機能を作って、

データを編集するコード(createDatabasedeleteDatabaseとか)を

使いまわしをした方が良さそう。

どうせやることは、

class IndexedDbOp {
  constractor(json) {
    this.json;
  };
  const createDatabase = (databaseName) => {
    this.json.databases[this.json.databases.length] = {'database':{
    'name': databaseName,
    'version': 1
    }}
    return this;
  }
  const deleteDatabase = (databaseName) => {
    this.json.databases = this.json.databases.filter( database => database.name !== databaseName );
    return this;
  }
  ・・・以下同文・・・
}

なのにブラウザにはindexedDBのexportsimports機能が付いていない不思議。

※上記のソースコードは雰囲気です。



【SSL】期限切れ→仕様変更→SSL✕のコンボ

また電子証明書の期限切れ

cronで自動化してあったハズなのに?

# /usr/bin/certbot renew
# systemctl restart httpd

ブログにログインすらできない。

再起動してもダメ

でもしばらく経ったらOKだった。

手動でdnf updateするとAppStreamが見えないとか言い出す

ググってみるとURLが変わったらしい

/etc/yum.repos.dをバックアップし

sed -i -e 's/mirrorlist=/#mirrorlist=/g' -e 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

※元ネタ

CentOS8 で dnf update が失敗する件

dnf updateしたら、1826個もあった。変わったのは相当前だったのかもしれない(笑

2021/11/04にcerbot-auto newしていたからその後らしいけど。

  廃止              : centos-release-8.2-2.2004.0.1.el8.x86_64        1821/1826
  廃止              : centos-repos-8.2-2.2004.0.1.el8.x86_64          1822/1826
警告: /etc/yum.repos.d/CentOS-fasttrack.repo は /etc/yum.repos.d/CentOS-fasttrack.repo.rpmsave として保存されました。
警告: /etc/yum.repos.d/CentOS-centosplus.repo は /etc/yum.repos.d/CentOS-centosplus.repo.rpmsave として保存されました。
警告: /etc/yum.repos.d/CentOS-Sources.repo は /etc/yum.repos.d/CentOS-Sources.repo.rpmsave として保存されました。
警告: /etc/yum.repos.d/CentOS-PowerTools.repo は /etc/yum.repos.d/CentOS-PowerTools.repo.rpmsave として保存されました。
警告: /etc/yum.repos.d/CentOS-HA.repo は /etc/yum.repos.d/CentOS-HA.repo.rpmsave として保存されました。
警告: /etc/yum.repos.d/CentOS-Extras.repo は /etc/yum.repos.d/CentOS-Extras.repo.rpmsave として保存されました。
警告: /etc/yum.repos.d/CentOS-Devel.repo は /etc/yum.repos.d/CentOS-Devel.repo.rpmsave として保存されました。
警告: /etc/yum.repos.d/CentOS-CR.repo は /etc/yum.repos.d/CentOS-CR.repo.rpmsave として保存されました。
警告: /etc/yum.repos.d/CentOS-Base.repo は /etc/yum.repos.d/CentOS-Base.repo.rpmsave として保存されました。
警告: /etc/yum.repos.d/CentOS-AppStream.repo は /etc/yum.repos.d/CentOS-AppStream.repo.rpmsave として保存されました

URLの変更が巻き戻されとる!

もう1回

# sed -i -e 's/mirrorlist=/#mirrorlist=/g' -e 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
# dnf update
CentOS Linux 8 - AppStream                                4.8 MB/s | 8.4 MB     00:01
CentOS Linux 8 - BaseOS                                   4.7 MB/s | 4.6 MB     00:00
CentOS Linux 8 - Extras                                   6.3 kB/s | 1.5 kB     00:00
Remi's Modular repository for Enterprise Linux 8 - x86_64 3.0 MB/s | 3.1 kB     00:00
GPG 鍵 0x5F11735A をインポート中:
 Userid     : "Remi's RPM repository <remi@remirepo.net>"
 Fingerprint: 6B38 FEA7 231F 87F5 2B9C A9D8 5550 9759 5F11 735A
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-remi.el8
これでよろしいですか? [y/N]: y
Remi's Modular repository for Enterprise Linux 8 - x86_64 153 kB/s | 973 kB     00:06
Safe Remi's RPM repository for Enterprise Linux 8 - x86_6 2.3 MB/s | 3.1 kB     00:00
GPG 鍵 0x5F11735A をインポート中:
 Userid     : "Remi's RPM repository <remi@remirepo.net>"
 Fingerprint: 6B38 FEA7 231F 87F5 2B9C A9D8 5550 9759 5F11 735A
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-remi.el8
これでよろしいですか? [y/N]: y
Safe Remi's RPM repository for Enterprise Linux 8 - x86_6 474 kB/s | 2.1 MB     00:04
依存関係が解決しました。
行うべきことはありません。
完了しました!
#

しかも1826はMAX値なのか1826番目の関連パッケージが多すぎるのか?

以後、1826/1826表示が延々続く・・・(汗

更にcronが消えていたことも判明

# /etc/rc.d/init.d/crond status
-bash: /etc/rc.d/init.d/crond: そのようなファイルやディレクトリはありません

CentOS7以降はcronからcronie-noanacronに変わったので、

CentOS7以降はcronからcronie-anacronに変わったので、

自動 ndf updateで削除されてしまったのかな?

cronie-noanacronをインストしcronie-anacronをアンスコしてみた。

# sudo dnf install cronie-noanacron
メタデータの期限切れの最終確認: 0:01:41 時間前の 2022年03月19日 22時30分50秒 に実施しまし た。
依存関係が解決しました。
==========================================================================================
 パッケージ                 アーキテクチャー バージョン            リポジトリー     サイズ
==========================================================================================
インストール:
 cronie-noanacron           x86_64           1.5.2-4.el8           baseos            19 k

トランザクションの概要
==========================================================================================
インストール  1 パッケージ

ダウンロードサイズの合計: 19 k
インストール後のサイズ: 396
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
cronie-noanacron-1.5.2-4.el8.x86_64.rpm                    20 kB/s |  19 kB     00:00
------------------------------------------------------------------------------------------
合計                                                       20 kB/s |  19 kB     00:00
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                                  1/1
  インストール中   : cronie-noanacron-1.5.2-4.el8.x86_64                              1/1
  検証             : cronie-noanacron-1.5.2-4.el8.x86_64                              1/1
インストール済みの製品が更新されています。

インストール済み:
  cronie-noanacron-1.5.2-4.el8.x86_64

完了しました!
# dnf remove cronie-anacron
依存関係が解決しました。
==========================================================================================
 パッケージ              Arch            バージョン              リポジトリー       サイズ
==========================================================================================
削除中:
 cronie-anacron          x86_64          1.5.2-4.el8             @anaconda           49 k

トランザクションの概要
==========================================================================================
削除  1 パッケージ

解放された容量: 49 k
これでよろしいですか? [y/N]: y
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                                  1/1
  削除             : cronie-anacron-1.5.2-4.el8.x86_64                                1/1
  scriptletの実行中: cronie-anacron-1.5.2-4.el8.x86_64                                1/1
  検証             : cronie-anacron-1.5.2-4.el8.x86_64                                1/1
インストール済みの製品が更新されています。

削除しました:
  cronie-anacron-1.5.2-4.el8.x86_64

完了しました!
# systemctl restart crond
# systemctl status crond
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2022-03-19 22:42:46 JST; 4s ago
 Main PID: 120900 (crond)
    Tasks: 1 (limit: 23826)
   Memory: 1.2M
   CGroup: /system.slice/crond.service
           mq120900 /usr/sbin/crond -n
(push q)

※元ネタ

【CentOS7】Cron(cronie-noanacron)をインストール

CentOS8でファイルを定期的にバックアップするcronの設定

statusこまんどがqキー押下するまで待ちになっているのも謎だけど

ここまで書いて【更新】したら

サーバがオフラインらしいよぉ?と泣き言

あ、消したssl.confが復活しとる。

パッケージのssl.confは手元のSSL化したバーチャルホスト設定ファイルとうまくかみ合わないので

# NameVirtualHost *:80

# SSL
Listen 443 https

SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout  300
SSLRandomSeed startup file:/dev/random  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin

Include vhost/*.conf

な内容のvhost.confで代用している。

Include vhost/*.conf

だけ追記してもいいけどね。

なかなか面倒だなぁ

ps.2022/06/17

再びhttps期限切れ。

クローン化したのにどうしたのかな?

# systemctl status crond
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor prese>
   Active: active (running) since Sat 2022-03-19 22:42:46 JST; 2 months 29 days>
 Main PID: 120900 (crond)
    Tasks: 1 (limit: 23826)
   Memory: 13.1M
   CGroup: /system.slice/crond.service
           mq120900 /usr/sbin/crond -n

 6月 17 17:01:01 **********.*********.***** CROND[1338801]: (root) CMD (run-par>
・・・
 6月 17 21:05:01 **********.*********.***** crond[120900]: (curl) ERROR (getpwn>
・・・
# systemctl restart crond
# systemctl status crond
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2022-06-17 21:45:51 JST; 11s ago
 Main PID: 1350619 (crond)
    Tasks: 1 (limit: 23826)
   Memory: 1.2M
   CGroup: /system.slice/crond.service
           mq1350619 /usr/sbin/crond -n

 6月 17 21:45:51 **********.*********.***** systemd[1]: Started Command Scheduler.
 6月 17 21:45:51 **********.*********.***** crond[1350619]: (CRON) STARTUP (1.5.2)
 6月 17 21:45:51 **********.*********.***** crond[1350619]: (CRON) INFO (Syslog will be used instead of sendmail.)
 6月 17 21:45:51 **********.*********.***** crond[1350619]: (CRON) INFO (RANDOM_DELAY will be scaled with factor >
 6月 17 21:45:51 **********.*********.***** crond[1350619]: (CRON) INFO (running with inotify support)
 6月 17 21:45:51 **********.*********.***** crond[1350619]: (CRON) INFO (@reboot jobs will be run at computer's s>

何やらエラってたのでリスタート。

# /usr/bin/certbot renew
# systemctl restart httpd

で修復完了。

クローンのログを見ると

Jun 12 18:05:01 *********** crond[120900]: (curl) ERROR (getpwnam() failed - user unknown)

curlってユーザが無いということらしい。

wp-cron.phpを起動するトコで使っていたので、apacheに変えてみる。

certbotはログになかった???

時間が被って変になったのかもしれない毎月1日の04:03に変えてみる。

ps.2023/3/23

# dnf update
トランザクションの概要
================================================================================
インストール      6 パッケージ
アップグレード  561 パッケージ
削除              3 パッケージ

ダウンロードサイズの合計: 1.0 G
これでよろしいですか? [y/N]: y
・・・

ps.2023/08/31

なぜか証明書が更新されなかったのでコマンドラインから更新してみた。

# /usr/bin/certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/****************.***
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Renewing an existing certificate for ssiscirine.iobb.net

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all renewals succeeded: 
  /etc/letsencrypt/********************.*** (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
※ここまでを見ると証明書の更新は成功したようだ・・・
Hook 'post-hook' reported error code 5
Hook 'post-hook' ran with error output:
 Invalid unit name "httpd
 " was escaped as "httpd\x0d" (maybe you should use systemd-escape?)
 Failed to reload httpd\x0d.service: Unit httpd\x0d.service not found.
※cronで指定したオプションがなぜか動き(ゴミファイルかな?)、しかも内容がマズかったらしい。ググってみるとapacheを起動しようとして失敗したようなので手動で再起動。
#  systemctl restart httpd

8/1のletsencryptのログを見ると

–post-hook “systemctl reload httpd”

が直後のCR(\x0d)を誤って

–post-hook “systemctl reload httpd\x0d”

に観えたらしい。

このpost-hookで失敗したので

ヤバイと思ったのか、ちゃんと更新できた証明書も巻き戻したらしい。

/etc/cron.d/letsencryptの改行をCRLFからLFに治す。

動作テストには –force-renew –dry-run オプションを付ければいいはず。



【JavaScript】正規表現の\sではまる

空白でテキストを区切る場合

text.split(” “)で十分だけど

タブや改行でも区切りたかったので

text.split(/\s/g)にすると

ECMAScript 準拠なら、\s: 空白文字 ([ \t\f\r\n\v])だからいいかな?と思った。

同様に

text.match(/:[^\+…\’\s]+/g)で、SQLのパラメータっぽい事を処理しようと

「select * from table1 where aaa =’:コード[20]’」は予定通り「:コード[20]」が取れた。

「select * from table1 where aaa =’:コード{20}’」は予定通り「:コード{20}」が取れた。

しかし、

「select * from table1 where aaa =’:コード(20)’」は予定外の「:コード」が取れた。

これでは困るので\sのかわりに\u0020を使って

text.match(/:[^\+…\’\u0020]+/g)とすると

「select * from table1 where aaa =’:コード(20)’」は予定通り「:コード(20)」が取れた。

ところが、サンプルを作ってみると異常は起きない。

特定の環境か使い方でしか起きない様だ。

そうだったら恐ろしいけど、よくよく見ればコードミスかな?



[MS-Access]ODBC接続先変更

接続先データベースのIPアドレスが変わってしまった場合、WindowsのODBCマネージャでIPアドレスを変更すると概ねOKだったが、MS-Accessで外部データベースをODBC接続でリンクした場合だけ、MS-Access内部でIPアドレスをコピっているらしく変更前のIPアドレスに繋ごうとする。

リンクテーブルマネジャを使用してもIPアドレスを書き換えれない様なので、リンクテーブルを2-3個作り直すハメになった。

しかし、VBAを使えばリンクテーブルが1000個あっても泣かずに済みそうだ。

Public Sub ODBC接続先更新(strConnect As String)
  For Each tableDef In CurrentDb.TableDefs
    If tableDef.Attributes = dbAttachedODBC Then   'リンクテーブルならば、
      tableDef.Connect = connectString       'ODBCの接続テキストを書換える
      tableDef.RefreshLink                         '書き換えた内容で動く様にする
    End If
  Next tdf
End Sub

短く読みやすい記事に載せるコードとしては最良だ。

しかし、今時のMS-Office365の中のAccess2007の中で保持しているODBC接続テキストが

ODBC;DATABASE=xxxxxx;DSN=xxxxxx;OPTION=0;PORT=xxxx;SERVER=192.168.1.xxx;CHARSET=xxxxx;

だったりするので、Connectプロパティを直に書換えるのはバージョンの依存度がかなり高そう。

※CHARSETを正しく指定しないと環境文字(㈱等)が?になったりするので地味に痛い。

実際にはこんな感じで使ってみた。

Public Sub ODBC接続先個別更新(SERVER_IP_ADR As String, UID As String,  PWD As String)
  For Each tableDef In CurrentDb.TableDefs
    If tableDef.Attributes = dbAttachedODBC Then   'リンクテーブルならば、dbAttachedODBC=536870912
        con = tbldef.Connect
        If con <> "" Then   '  一応、conが""の場合、をsplit(con,";") すると ubound() = -1になってしまうため除外する
            Dim a() As String
            a = Split(con, ";")
            Select Case a(0)
            Case "":    ' MDB
            Case "ODBC":    ' ODBC
                Dim fff As Boolean
                fff = False
                Dim b() As String
                Dim i As Integer
                Dim fUID As Boolean
                fUID = True
                Dim fPWD As Boolean
                fPWD = True
                For i = 1 To UBound(a)
                    If a(i) <> "" Then
                        b = Split(a(i), "=")
                        Select Case b(0)
                            Case "DATABASE":  '特に何もしない
                            Case "UID":
                                fUID = False
                                If b(1) <> UID Then
                                    Debug.Print "SERVER='" & b(1) & "' を 'SERVER=" & SERVER_IP_ADR & "'に更新します。"
                                    fUID = True
                                    b(1) = UID
                                    a(i) = Join(b, "=")
                                End If
                            Case "PWD":
                                fPWD = False
                                If b(1) <> PWD Then
                                    Debug.Print "SERVER='" & b(1) & "' を 'SERVER=" & SERVER_IP_ADR & "'に更新します。"
                                    fPWD = True
                                    b(1) = PWD
                                    a(i) = Join(b, "=")
                                End If
                            Case "DSN":     '特に何もしない
                            Case "OPTION":  '特に何もしない
                            Case "PORT":    '特に何もしない
                            Case "SERVER":
                                If b(1) <> SERVER_IP_ADR Then
                                    Debug.Print "SERVER='" & b(1) & "' を 'SERVER=" & SERVER_IP_ADR & "'に更新します。"
                                    fff = True
                                    b(1) = SERVER_IP_ADR
                                    a(i) = Join(b, "=")
                                End If
                            Case "CHARSET":  '特に何もしない
                            Case Else:       '特に何もしない
                        End Select
                    End If
                Next
                ' UIDが未設定の場合、追記する
                If fUID Then
                    ReDim Preserve a(UBound(a) + 1)
                    a(UBound(a)) = "UID=" & UID
                    fff = True
                End If
                ' PWDが未設定の場合、追記する
                If fPWD Then
                    ReDim Preserve a(UBound(a) + 1)
                    a(UBound(a)) = "PWD=" & PWD
                    fff = True
                End If
                ' 何か変更されていた場合は、接続テキストを再構成する
                If fff Then
                    con = Join(a, ";")
                    tbldef.Connect = con
                    tbldef.RefreshLink
                    Debug.Print "設定を更新しました。" & vbCrLf & "'" & con & "'"
                End If
            End Select
        End If
    End If
  Next tdf
End Sub

どうやらリンクテーブルには

  • TableDefAttributeEnum.dbAttachedODBC
    MS SQLServer など、ODBC を使うリンクテーブル
  • TableDefAttributeEnum.dbAttachedTable
    MS Access などの非ODBCのリンクテーブル

の2種類があるらしいけど、ググってもどんな動作環境なのかは判らなかったので、

  • Enumクラスを指定しないと遺憾な場合
  • Enumクラスがそもそも無い場合

がありそうで、この辺は実際に動かして調整するしか無さそうだ。

それとPORTなんかが違う場合もありそうだ。

※デフォは学習用、xxxxはデバッグ用、yyyyはテスト用、zzzzは実機とかね。

他のデータベースの場合は、コードページの設定やオプション等も違うだろうし、データベース・ディクショナリ名とか実行時ロール名とか独特な何かを指定しないとダメな場合もあるだろう。

そんな風にDATABASEが違うだけでテキストが全く異なる場合には最初のコードの方が良さそうだから、

MS-ACCESSのVBAのBASファイルには両方を置いておいた方が安心かな。



[Windows11]ブラックアウト

例のゲーム画面が真っ暗になる中国ブラゲーのPC版を遊んでいるうちに

ふと気が付くと、デスクトップのショートカットが全て消えていた。

観えるのは初期設定のままの壁紙だけ。

画面の下ではアプリ、通知、時計その他一切のアイコンが空っぽになったタスクバーが点滅していた。

サインアウト。

ログイン。

壁紙そして空っぽのタクスバーが点滅。

何も変化なし。

ALT+CTRL+DELキー操作でタスクモニタを起動すると

Expolore.exeが出たり消えたりしてうっとおしい。

スクロールしていくとその下に大量の通信(VHOST)の形跡が続く。

グラフに切り替え、動きを眺めると通信だけがいつまでも繰り返されている。

ログイン直後にタスクバーから通知か何かを表示するために通信している最中にExplore.exeがクラッシュ&リブートしている様な感じ。

どうやら、またログイン直後のトラブルにしハマった様だ。

シャットダウン。

ログインすると画面は隅から隅まで真っ暗になった。

使えるのはマウスとALT+CTRL+DELのキー操作だけ。

再起動前は壁紙が映っていたがVRAMに残っていた残骸だったのかもしれない。

空っぽのタスクバーすらもVRAMに残っていた残骸だったのかもしれない。

とりあえずタスクバーであるexplore.exeが何か表示しようとしたらクラッシュ。

タクスマネージャーが何も考えず消えたexplore.exeを起動しなおしている。

そういうことだ。

もう一度再起動しログインしても画面は真っ暗。

(と、ここまで書いたらWindowsUpdateが勝手に再起動した。

こうならないようになっているハズなんだが・・・

まだ不調なのかな?)

USBの回復ドライブを挿して起動するもSSDから起動してしまう。

再起動。

DELキーを押し続けUEFIに切り替える。

ブート画面からUSBメモリを指定して起動。

ログイン。

すると、普段どおりに戻った。

WindowsUpdateを行うと

  • (KB5010414)
  • (KB5010474)と.Net4.8

の更新が入った。

KB5010474は、4.8 で導入された IRawElementProviderSimple オブジェクトのリーク.NET Frameworkします。だそうだ。

注記には

NET ライブラリ– TLS 1.3 のネゴシエート時にクライアント証明書が使用されている場合に Ssl ネゴシエーションが無期限にハングする可能性がある問題に対応します。 変更の再ネゴシエーション (PostHandshakeAuthentiction) が失敗する前に、SslStream または HttpWebRequest でタイムアウトが観察されます。

と書いてあった。

まさにそんな感じになっていた。

多分、治ったんだろう。

とは云え気になるので回復ドライブを更新しようとしたら16GB以上を要求された。

(前もそうだったのかな?)

で、作成中にさっきの強制再起動。

もう一回作り直し。

16GB以上推奨だからUSB2タイプのメモリではコピー時間が長すぎる。

USB2の転送レートは480Mbpsだから、理論値でも

16[GB] * (480[Mbps]/1000[G/M]/10(bit/byte))≒333秒≒6分

ファイルがいっぱいあれば、ファイルを管理する情報の書き換えもいっぱい発生するので1時間ぐらいかかりそうだ。

本当に1時間ほどかかってしまった後・・・

8GBしか使ってないw

山ほどファイルがあったのかな?

ファイルの総数:
             226 個のファイル       7,845,198,033 バイト
             271 個のディレクトリ  25,963,888,640 バイトの空き領域

ファイル数もそんなに多くない。

USBメモリが熱ダレ(過熱防止)してたのか?

イミフに長~く待たされてる間に

F8でセーフティモードで起動する設定は無効になってた様なので有効にしておいた。

> bcdedit  /set {default} bootmenupolicy legacy

戻す時は最後のlegacyをstandardに差し替える。

例のゲームのタチの悪さが増した様な気がするなぁ。



[Windows11] ペイントの場所

WinSCPで画像をイジろうとしたらmspaint.exeが行方不明になっていた。

Windows10までは、

C:\Windows\System32\mspaint.exe

だったハズだけど、Windows11になったら、見当たらない。

以前はアイコンを右クリック&プロパティでインストール先が判ったけど、

Windows11では徹底的にその辺は隠蔽する方針らしく無理なので、コマンドラインからwhereコマンドでファイル検索してみる。

C:\>where /R C:\ mspaint.exe
C:\Users\${ユーザ名}\AppData\Local\Microsoft\WindowsApps\mspaint.exe
C:\Users\${ユーザ名}\AppData\Local\Microsoft\WindowsApps\Microsoft.Paint_*************\mspaint.exe
C:\Windows\servicing\LCU\Package_for_RollupFix~****************~*****~~*****.***.*.*\amd64_microsoft-windows-mspaint_****************_**.*.*****.**_none_****************\*\mspaint.exe

といくつか候補が出てきたけど、最初のものが短くてよさそう。他は乱数っぽい文字列が沢山付いてて流用が難しそう。

C:\Users\${ユーザ名}\AppData\Localは、SETコマンドで見つけた環境変数LOCALAPPDATAで代替すれば

%LOCALAPPDATA%\Microsoft\WindowsApps\mspaint.exe

になる。

コマンドラインからmspaint.exeダケでも実行できるから、

%LOCALAPPDATA%\Microsoft\WindowsApps

がパスに追加されてるのかな?

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:\Program Files\Git\cmd
C:\Program Files\dotnet\
C:\PROGRA~1\JPKI
C:\Program Files (x86)\dotnet\
C:\WINDOWS\system32
C:\WINDOWS
C:\WINDOWS\System32\Wbem
C:\WINDOWS\System32\WindowsPowerShell\v1.0\
C:\WINDOWS\System32\OpenSSH\
C:\Program Files\nodejs\
C:\Users\${ユーザ名}\AppData\Local\Microsoft\WindowsApps
C:\Users\${ユーザ名}\AppData\Local\Programs\Microsoft VS Code\bin
C:\Users\${ユーザ名}\AppData\Roaming\npm
C:\Users\${ユーザ名}\.dotnet\tools

色々インストしたから色々とパスに追加され過ぎな気がする。

WinSCPの環境設定のエディタに追加してあったMspaintの外部エディタの設定を

"%LOCALAPPDATA%\Microsoft\WindowsApps\mspaint.exe" !.!

に変えてみると、

また画像を直接編集できるようになった。

しかし大型アップデートが来たら、また編集できなくなるかもしれない。

あれ?WordPressで文字単位で色が変えられない!

と思ったら「A テキスト色」が「A ハイライト」に変わったダケだった。

背景色もつけられるから便利だけど、文字の下に色指定のパレットが出てくるのでパレットが切れ気味。



[三国英雄の夜明け]いまいち

12 million power

戦力は順調に増強中。

しかし周囲も順調に増強中につき、1月はずーっと勢力内29位、ワールド内85位のままピクリとも動かず。

但し、シーズンイベントの職業限定の限定挑戦の為に装備や副将を調整している時は戦力が200万くらい下がってしまうこともままある。主に文民が一強状態のせい。貂蝉を200万まで上げるのに手間取り、馬超、趙雲の強化が出遅れ、小喬、甄姫以下はほとんど放置気味だったので今になって強化中。

大した戦力でもないのに慢性的な食料不足で9英雄の同時運用は難しい。部隊数が必要な時は副将を外して兵力を減らしていかないと続かない。

今は4兵舎に兵士48万づつを待機させられるが兵士1人に付き食料8.4が必要なので、最大兵士192万を作成するには食料1,612万8千が必要で甕陽戦の後にはそれがほぼ空っぽになってしまうのが食糧難の主な原因。

空っぽの兵舎の様子

対戦時にパワーアップする幕府要員の強化はもっと遅れてて、特に逸材、弓兵が66%と低い、弓兵は70%に上げたけど、逸材はそのまま。

資材と黄金を放り込む兵舎の技術は歩兵技術だけランク80に他もボチモチ上げたい。

砂盤演技は30章の序盤で 馬超、趙雲 が戦力200万未満なせいか負け続けてて、英雄の装甲の強化が止まってる。

魂玉は全6品質、八宝獣霊は全紫色を目標に強化中だけど日々の黄金探索と朝廷の密使クエストを潰していくしかないから地味。戦力が弱いから密使で「プレイヤー部隊の撃破」が出ると影響が大きすぎ。今日も2つ目のお題が4/7と未了になりそう。

・・・

パラメータ・・・

多すぎ。

ps.2022/2/2

貿易がうまくいかず、特産品の集まりが一番悪く、

李代桃僵 あと一つ
火事場泥棒はさっぱり進まない

そんな訳で、趙雲に定計を付くのはまだまだ先。

戦力1250万

戦力増強はあまり進んでいない。

ps.2022/03/13

戦力1410万
とてもゆっくりな進捗の定計

やっていること。

  • 領地の官邸の幕府のレベル上げ(今レベル35前後、対戦時の強化率は82~86%)
    • 珍宝商店で文書を買うのがメインなので黄金の消耗が激しい
      • 採掘の黄金狙いだけでは全く足りないので、建設で賄賂ボタンを押下する様になった。
  • 幕府出陣キャラのSクラス維持
    • 基礎パラメータの補助スキルアップで評価が上がりやすいがカードは出にくい
  • 兵舎の技術ランクアップ(今ランク74~88)
    • 資源(木材、金属)の消耗より失敗時の黄金の消耗が激しい
  • ミニゲーム(竜金探索)で得る魂玉の品質アップ(今の最高品質は7)
    • 竜金探索の採掘レベルがMax40になったのでペースは一定
  • 獣霊のレベルアップ
    • LV20までは獣霊元気、それ以上は獣霊元神を消費してレベルアップ
    • アイテムは朝廷の密旨のお題次第(ランダム)
  • 基礎パラメータ(武力、知力、魅力、統率)アップ
    • 補助スキル(勇武、才学、修養、兵法)のアップ
      • 訪問や狩場を補助スキルが出るキャラ(甘寧、筍或、法正、呂蒙)に集中
        • 毎日の任務で拝帳(訪問時に消耗)や角笛(狩場で消耗)を得る
          • ランダムなのでコンスタントに得るのは難しい
  • 定計のスキルの入手と★アップ
    • 貿易でアイテム交換して入手
      • 相手が欲しがるアイテムは大抵領地外の港の名物
    • 4★までアップすると、キャラに定計スキルを付加できる
      • 4★にアップ直前になると大枚の黄金を要求されることが多い

そんな感じで毎日、黄金千枚と銀両600万を使い込んでいる。

ps.2022.4.9

戦力増強は停滞気味。

戦力1500万

引き続き「砂盤演義 第30章 檮杌と遭遇」のため、2番手3番手を優先。

ps.2022/6/19

昨日、FORTEを買ったらCAMELのクーポンが出たけど品切れだったので今日引き換えに行ってFORTEを買い忘れたスラです。

このゲーム内でもクーポンが出ます。

クーポン(タダ券)続出中

チャットの見た感じでは無料でクーポン7枚をゲットしたかの様に観えますが、

クーポンを引き当てるまで黄金500枚(5回分)を消費してるので実質59%、6割引きでした。

なので、見た目ほど美味しい訳ではありません。

今の勢力の進捗は・・・

主に、

  • 八門獣霊狙いで、密使シーズンイベント
  • 魂玉狙いで、竜金探索
  • 幕府文書狙いで、珍宝商店

がメインとなっています。

マップでの無謀な振る舞いは主に密使の悪だくみかシーズンイベントの限定挑戦のポイント稼ぎの勢。

密使とシーズンイベントの攻略は、兵士の消耗が著しく食糧難が続き黄金の備蓄も厳しいですが、戦力強化のメインなのでサボれません。年度報酬で戦力消耗も倍率に加算されるので建設も頑張り年度報酬の倍率を8~9倍にしたい。しかし、8倍で4000枚越える時もあれば9倍で3000枚を下回る時もあるのが悩ましい。

PC対戦で影響が大きい幕府レベルを上げる為に必要なアイテムはレベルに応じて増える。しかも幕府に所属する英雄の戦力もレベル成りに引き上げないと幕府の応援効果が上昇しない。その一方で英雄の戦力(スキル)レベルを上げる度に消費するカード数や銀銭も増えるから、金欠まっしぐらです。

なのに、

自戦力全体で100万UPする頃には、課金勢は単騎で100万UPしてたみたいな感じで戦力差が拡大している様にしか思えない状況w



[Win11]あいかわらず

Windows11にアップグレードしても、37Gameの「三国英雄の夜明け」をやってると、相変わらずブラウザが真っ黒になる率は高い。

そう思ってスナップショットを撮ろうと待っているとなかなか真っ黒にならない奴。

さりげなく悲しい顔

MSソリテアでもおかしくなることがあるから、やはりグラフィックドライバかあるいはコレが原因なんだろう。

グラフィックスドライバ
コレ

どんな状況なんだろう。信頼性グラフを見ると 散々な状況 であることが判る。

散々な状況

細かく見ると

igdkmd64.sys???

パケットのigdkmd64.sysはIntel Graphics Kernel Mode Driverのファイルらしい。

だが、geForece1060しか使わなかったi7-3770TのPCでも同様に真っ暗になっていたので、このドライバは多分被害者側だ。

やはり、上のコレなのか。




top