せっかなくので、やってみた。

日々のあんなこと、こんなこと、せっかくなのでやってみた

X68000実機でキーボードのCAPSとCTRLを入れ替えたい

ましろん氏が制作されている「X68000用 USBキーボード変換機」を使い始めました。

www.beep-shop.com

純正のcomactキーボードも使用しているのですが、好みのキーボードでX68を使えるのはいいですね。
今後の事を考えるとこの変換器のお世話になる機会も増えそうです。

ただ、使用するキーボードはWindows用になるので、当たり前の様に[A]の隣には[CAPS]キーが配置されています。 Windowsならツールやレジストリで簡単に[CAPS]と[CTRL]の入れ替えができるのですが、X68ではそうもいきません。
そのまま使うと ED.X のカーソル移動や fish.x の操作をするには小指が非常に辛い事になるので、なんとかできないかなぁと思っていたいのですが、X68にも素晴らしいツールがあったのをすっかり忘れてました。
そうです、Kamada氏のKeyWitch.xです!

retropc.net

誤入力防止やASK68Kのパッチも入っているので常用しているのですが、[CAPS]と[CTRL]キーの入れ替え用に、新たに以下の様なファイルを作成しました。

% KeyWitch 環境定義ファイル
%
% ファイル名: caps2ctrl.env
%       内容: CTRL と CAPS を入れ換えます。
%   スイッチ: -x

&name 83 CAPS
&name 89 CTRL

&rule
&target CAPS     CTRL
&code   CTRL     CAPS

キーを入れ替えるには、以下の様に -x オプションを指定して環境定義ファイルを読み込みます。

> keywitch -x -e caps2ctrl.env

これで簡単に入れ替える事ができました。
私の使っているキーボードでは、[CAPS]を押すたびにCAPSのインジケータランプが反応してしまいますが、実害は無いので気にしない事にします。
元に戻すには、アーカイブに同梱されているenv/KeyWitch.envを使用して、

> keywitch -x -e KeyWitch.env

で標準の設定に戻す事ができます。 純正キーボードを使用する環境でも安心です。
このKeyWitch、ものすごく汎用性を考慮して作られているので、エミュレータや純正以外のキーボードが使用されるような時代になっても便利に使用する事ができ、大変ありがたいです!

【お知らせ】
YouTubeでもX68000に関する動画を配信しております。よろしかったらこちらもどうぞ。 www.youtube.com

puttyで踏み台サーバから別のサーバにsshしたい

puttyを使って踏み台サーバから別のサーバにsshしたい時、今まで一度踏み台サーバにログインして、そこから再度目的のサーバにsshするという操作をしていました。
複数のサーバを操作する時は、操作を間違えない様にサーバごとの設定を開いてフォントを色分けするなどしていたのですが、常用するのはさすがに辛くなってきたので、TeraTermのマクロ機能の様なものが無いか調べてみました。

ネットで検索すると、リモートサーバで実行したいコマンドを記述したファイルを作成して、puttyの-mオプションでファイルを指定してあげると良いそうです。
試しに以下の様なファイルを作成し、コマンド来からputtyを実行してみると、

> cat cmd.txt
ssh hogeuser@192.168.0.123

> puttty -load "hoge-server" -m cmd.txt

sshした端末側で以下のエラーとなってしまいました。

Pseudo-terminal will not be allocated because stdin is not a terminal.

ネットを見ると色々情報があって、踏み台からさらに先のサーバにsshする際に疑似端末(Pseudo-terminal)が割当てらないとの事だそうです。
という事でファイルの中身を

ssh -t hogeuser@192.168.0.123

として試したのですが、またもや同じエラーが出てしまいます。
めげずに再度検索したらこんな記事がありました。
snickerjp.blogspot.com

どうも強制的に疑似端末を使用するよう、-tオプションを2回記述する必要があるみたいです。
という事で、以下の記述で見事sshに成功しました!

ssh -t -t hogeuser@192.168.0.123

と、ここまではネットに情報が結構があるのですが、踏み台経由で接続するサーバ毎にわざわざsshコマンドを記述したファイルを作成しなければなりません。
puttyGUIに各サーバの設定を登録しているので、できればこちらの設定に全てまとめたいところです。
という事でputtyの設定を調べてみたところ、

PuTTY設定の接続>SSH>リモートコマンド

sshのコマンドを記述することで、コマンドラインの-mオプションと同様の事が実現できました。
f:id:moneci:20211007223858p:plain

ちなみに、こちらに記述する方法だと、-tオプションは1つで動きました。(リモートホストの環境によるのかもしれません)
これで各サーバ毎に端末のフォント色を変更した設定を作成し、一発でログインできるようになりました!

Eloqunetでなぜか Allowed memory size of XXXX bytes exhausted のエラーが出る件

PHPでEloqunetを使用してCSVファイルインポートの処理を作成したところ、数百のインポートでは成功するのに、数千件のインポートを行うと、「Allowed memory size of XXXX bytes exhausted」のエラーが発生してしまいました。
コードを見た感じでは特にメモリを食うような処理は無く、原因が分からずでした。
コードはこんな感じ。(大分端折っているのでこのままでは動きません)
本来なら大量インサートはbulkインサートを使用したいところですが、処理の都合上使用していません。

$handle = fopen($fileData['tmp_name'], 'rb');
$ret = DB::transaction(function() use ($handle) {
    $index = 0;
    $query = DB::query();
    while (($line = fgetcsv($handle)) !== false) {
        $query->insert($line);
        $index++;
    }
    return $index;
});
fclose($handle);

// 次のDB操作
HogeHoge::write();

(マークダウンのコード指定に「php」を入れているのですが、色がつかない。。。)

確かに、php.iniのmemory_limitの値は64Mと少なめに設定してるのですが、CSVを丸ごと読み込んでいるわけでもないし、こんな処理でメモリが足りなくなるのはおかしい。。。
トランザクションが怪しいかと思い、外してみたのですが動作は変わらずです。
ログを仕込んでみると、CSV取込自体は無事終了していて、次のDB操作(HogeHoge::write)のタイミングでエラーが発生している。。。
さんざん悩んだ挙句、この処理を呼び出す親クラスを見てみたら、

DB::enableQueryLog();

// サブクラスの処理呼出し

$queryLog = DB::getQueryLog();
Log::debug(var_export($queryLog, true));

なんて処理が入っているのをすっかり忘れていました。。。
クエリログが大量に保持されて、エラーが発生しているのでした。
無暗にクエリログを出すと、思わぬところで痛い目に合うというオチです。

XM6typeGで060turboの起動を試してみた

XM6typeGで060turboを使用するには実機のROMが必要になります。
typeG同梱のXM6g.txtに記載されている通り、060TurboのROMをIPLROM30S.DAT、ROM30S.DATの ファイル名で作成しておけば060Turboで起動できるらしいのですが、なぜか 私の環境では起動せず。
typeGのオプションから「システム」>「機種」で「X68030」を選択後、
X68030」>「MPU換装」で68060を選択し、「拡張ROMを有効」にして電源を入れても起動画面すら 表示されず、だんまりの状態となってしまします。

長らく放置していたのですが、最近気になって再度ネットを調べたところ、5ちゃんで有益な情報がありました。

hanabi.5ch.net [2021.9.27編集]
無断転載禁止と書いてありましたので、該当記事の引用を削除いたしました。
大変申し訳ございませんでした。 要約すると、以下2点になります。

・060対応パッチ済のdb.xを使用してROMをダンプする必要がある。
・060ではなく、030モードで起動してROMをダンプした方が良い。
(拡張メモリの設定と060turbo.sysに指定されたパラメータによっては、MMUでメモリマップが変更される場合があるとの事)

今までSHARPのC-Complier 2.1 NEW KITに付属していたdb.xでダンプしていたのですが、
060対応パッチ済のdb.xでROMをダンプするって!?
030モードで起動してROMをダンプ!?
db.xって060対応パッチあったっけ?
という事で探してみたら、ありました。

retropc.net

db.x 3.02向けの差分は060turbo の添付ディスクに収録されています。
パッチを当てるとdb060.xができるのですが、既に持ってました。

という事で、030モードで起動し、改めてdb060.xでダンプしたROMを使用したところ、 見事に動作しました!
f:id:moneci:20210921003247p:plain

KAMADA氏のXEiJから同様にROMを作成しても問題なく起動します。
が、060turboだとHuman68Kの起動がやたら遅い。
もしかして、ホストPCのスペックが足りないとか。。。

まぁ起動すれば普通に使用できるので、今後の課題でしょうか。 嬉しいことにDの食卓もtypeGの060turboで起動できるようになりました。
(まーきゅりーユニットは持っていないので、typeGの方がサウンド付きでプレイできます)
exceed.hatenablog.com

ちなみにROMが正しくないせいでtypeGが起動せず、だんまりの状態になってしまう場合は、xm6g.iniを削除して、 設定をクリアしてあげると起動する様です。
各種設定が無くなっていしまうので、ノーマルの68000で起動した時のxm6g.iniをバックアップしておいて、 いざというときこのファイルに差し替えると、復旧がやりやすいです。

【お知らせ】
YouTubeでもX68000に関する動画を配信しております。よろしかったらこちらもどうぞ。 www.youtube.com

Selenium IDEのassertで値を比較したい

Selenium IDEって便利ですよね。
私は大分昔のFirefox時代に使用していたのですが、いつかのFirefoxバージョンアップから使用できなくなってしまい、その後、後継ツールは出たものの、決定版がないまま混沌とした状態となってしまったため、ちょっと業務では使えないなという状態が続いていました。

しかし数年前から、Chrome Firefoxで公式にSelenium IDEがリリースされましたので、久々に使ってみることにしました。 www.selenium.dev

Selenium IDE(というか本家Selenium)のコマンドには、asset(veryfy)というコマンドがあり、期待した通りに画面表示されたか等々を検証することができる機能が備わっています。

以前は単純な画面遷移でしか使用していなかったのであまり活用していなかったのですが、動的なページでDBから取ってきた値が正しく表示されているかの検証となると、assert textでタグ内の文字をチェックできるのですが、指定した要素のテキストが一致しているかどうかをチェックするのみなので、値のありなしや、数値の大小を比較したい場合には少々物足りない感じでした。
(Seleniumが良くないというのではなく、そもそもそういった用途は意図していないのかもしれません。Seleniumは素晴らしいツールです!)

[2021.9.29追記]
ども本家Seleniumには assertEval(verifyEval)というコマンドがあるらしいのですが、SelenumIDE最新のv3.17.0では使用できなくなってしまっている様です。

どうにか上手い事チェックできる方法はないか試したところ、一部の機能は
assert element present と XPathの指定により、チェックできるようになりました。
例えば、assert textと同様の文字列の完全一致は以下でチェックできます。

HTML

<p id="assert-hogemga">ほげもが</p>

Selenium IDEのコマンド

Command: assert element present
Target: xpath=//p[@id='assert-hogemga' and text()='ほげもが']

containsを使用すると部分一致もできます。

Target: xpath=//p[@id='assert-hogemga' and contains(text(),'げも')]

同様に「値が100以上であること」は以下でチェックできます。
HTML

<p id="assert-number">100</p>

Selenium IDEのコマンド

Command: assert element present
Target: xpath=//p[@id='assert-number' and text()>=100]

XPathで利用可能な演算子は以下で確認できます。
www.ibm.com XPathの書き方次第で、タグの要素(value="○○"など)もチェックすることができます。

期待した場所に値が表示されているかを明示するためにidなどで場所を特定してあげる必要がありますが、XPathを活用することにより、より柔軟に値をチェックできるようになりました。

Windows10のVPN接続で、ネットワークインターフェースのメトリック値を変更できない件

またまたリモートワーク関連ネタです。
会社のネットワークなどにVPN接続して作業する場合、普通にVPN接続を作成して接続すると、 通信のデフォルトGWがVPNのインターフェースに向いてしまいます。(VPNサーバの設定にもよると思うので一概にそうとは言えないでしょうが。)

普通に使用する分には問題無いのですが、ウェブサイトのアクセスなど、一般の通信は WiFiなどのインターフェース(自宅の回線に繋がる)へ、会社のサーバなど、特定のIPへのアクセスのみVPNのインターフェスへと分岐させたい場合、 特定IPへのスタティックルートを設定してあげたうえで、さらにデフォルトの通信先がWiFiなどのインターフェースに向くように ネットワークインターフェースのメトリック値をVPNより小さい値に変更してあげる必要があります。

私の場合、VPN接続の必要のないリモートデスクトップ製品を使用している時は、会社の通信負荷を下げるため 自宅の回線経由にしたい場合があるため、上のように設定を変更しています。
ZOOMなどテレビ会議の通信で会社のネットワークに負荷をかけたくない場合にも有効かと思います。

ネットワークインターフェースのメトリック値の変更は、ネットにたくさん情報があるように、
コントロールパネル>ネットワークと共有センター>アダプター設定の変更から
変更したいアダプターを右クリックして、プロパティ>ネットワークタブ>インターネットプロトコルバージョン4>プロパティ >詳細設定
で、「自動メトリック」のチェックを外して
インターフェースメトリックの値を変更できます。(設定が深すぎてしんどい...)
必要に応じて、インターネットプロトコルバージョン6も同様に変更してあげます。

SoftEtherを使用したVPN環境ではこの設定で問題無く利用できていたのですが、Windows標準のVPNを作成して 同様に設定を変更してもメトリック値がデフォルト値(4325など)に戻ってしまいました。
設定直後は変更値が反映されているのですが、何かのタイミングで値が戻ってしまう。。。

不思議に思っていたのですが、どうもVPN接続を開始すると値が戻ってしまうようです。
PowerShellで確認するとこんな感じでした。(関係ないインターフェースは省略しています)

> netsh interface ipv4 show interface
Idx     Met         MTU          状態                 名前
---  ----------  ----------  ------------  ---------------------------
 10         100        1500  connected     Wi-Fi
  3         200        1500  disconnected  イーサネット

VPN接続を開始

> netsh interface ipv4 show interface
Idx     Met         MTU          状態                 名前
---  ----------  ----------  ------------  ---------------------------
 54         999        1400  connected     hoge-VPN
 10        4325        1500  connected     Wi-Fi
  3        4425        1500  disconnected  イーサネット

VPNを切断すると設定した値に戻るので、どうもVPN接続の設定が怪しいです。
色々試したことろ、先ほどの「自動メトリック」を設定するダイアログで、 「リモートネットワークでデフォルトゲートウェイを使う」のチェックをは外したら 設定が保存されるようになしました。
f:id:moneci:20210306120725p:plain