変奏現実

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

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

【メモ】DeskMini A300で使えそうなもの

外観をEnoughに変えてみました。
飽きたら元に戻すかもしれない。

小さいケースなので、情報をちゃんと集めないと中に入らないことがあるので、メーカのサイトや動画サイトを観ながら集めた情報をまとめてみた。

  • CPU
    • Athlon 200GE
    • Ryzen3 2200G
    • Ryzen5 2400G
  • メモリ
    • DDR4-SO-DIMM(普通のものより小さい)×2
  • ストレージ
    • 2.5インチ×2
    • M.2 マザボ表 ×1 、裏 ×1
      • SSDは NVMeタイプ 〇、SATA タイプ ×
      • 表面にM.2のWifiとSSDが一緒に載せられるっぽい
  • Wifi(オプション)
    • マザボ表面のM.2 Wifiスロット
  • 増設USB (オプション)
    • マザボ表面にUSB2コネクタ有
    • マザボをケースに収める際にケーブルが邪魔
  • 電源 コイル鳴きするものもありそう
    • ACアダプタ デカイ、ケーブルも太い
      • 入力100-200 1.8A、出力19V6.32A
  • FAN 付属のCPUファンには気になる音がするハズレもありそう
    • BIOS設定
      • FANの静穏設定が無い
      • CPU-FAN1と FAN 2の設定がアベコベになることがある
    • ちょっと変わったFANの取付け方
      • CPUにはヒートシンクのみ装着
      • ケース側に8cmFANを結束バンドで取り付け
    • ケースの穴が大き目なのが気になる
      • メッシュフィルタを切って穴に取り付ける
    • 以下は動画内で試しに取付けていたもの、各々の仕様を調べれば参考になりそう
  • グラボ
    • マザボがSTXなのでPCIeスロットが無いから、USB-Cで繋がるものなら外付けできるかも、しかしUSB-CはGen1タイプなのでどうなのかな?
  • 外付けストレージ、USB3があるので、なんとかなるだろう。

ATX電源サイズなので置き場所を選ばないから、音が気になるならWifi接続でドコかに置いておけばいいかも。



low.jsの敷居はとってもお高い

ESP32のようなチッコいモノでnode.js環境を作れるっぽい。

手元にはESP32-WRCOM-32があるので試してみた。

low.jsのインスト-ル手順

https://www.lowjs.org/examples/getting-started.html

1. Flash/install low.js on your board
Step 1.1: Install Node.JS on your PC
なぜかインストしていなかったので、node-v10.15.3-x64.msiをインストした。

Step 1.2: Install lowsync via npm on your PC
>npm install -g lowsync
でOK。

Step 1.3: Connect microcontroller to PC via USB
前回に2102のドライバをインストしたので、ただ繋ぐだけ、しかしデバイスマネージャでCOMの何番目なのか?ドライバちゃんと入ってる?ことを確認すること。今回はCOM8

Step 1.4: Flash low.js
ではlow.jsを入れますね。
>C:\Users\[USER-NAME]> lowsync flash com8 –init
Requested Python version () is not installed.

*** esptool cannot be used.
Please check if you have Python installed.
If yes, please check if you have pyserial installed (if not try ‘pip install pyserial’)

Python前提か!
python-3.7.2-amd64.exeをインスト。

>C:\Users\[USER-NAME]> lowsync flash com8 –init
しかし、何か.py で serial モジュールが見つからないと出る

しかたがないので、
> pip install esptool

>C:\Users\[USER-NAME]> lowsync flash com8 –init
*** Step 1/3: Probing ESP32 microcontroller
now checking if it is an ESP32-WROVER… (takes a while)
An error has occured: ESP32 is not an ESP32-WROVER or at least does not have required 4 MB PSRAM!
Please check: https://www.lowjs.org/supported-hardware.html

スペック要確認! https://www.lowjs.org/supported-hardware.html

なんてこったRAM:4Mだって?
スペック不足で唐突に終了。 orz
普通のESP32って530KBしかないんだけど?????
サポートリストを見ると

  • Generic ESP32-WROVER Board
  • neonious one

無茶苦茶ハイスペックじゃないかコレ??????????????
でも、 On Aliexpress you can find various boards based on the ESP32-WROVER for $10. とかサラっと宣伝入ってる中に入って商品検索すると、 US $7 ~8とお安い。

AMAZONで探してみると、チップ自体は700円ぐらいだが開発キットとなるとPrament ESP32-WROVER 4MB PSRAM TFカードWiFiモジュールブルートゥース開発ボードでも2千円以上。

敷居が高いwwww

これはSmallMemoryなLow.js待ちかな?
DDR4の値下がりが続いているから、もしかすると、メモリをケチる方法を考え付くよりも、ESP32のRAMが1GBになる方が速い様な気がする
安価なスマホでも3GBぐらい入ってるからね (大笑

そうなるとRaspberry Piと区別つかなくなるな~

ps.
ESP32に4MBのSPRAM(疑似RAM)が付いてるESP32-WROVER-B Wi-Fi + BLEモジュール自体は日本でも数百円ぐらいで、パーツ屋さんが一番安かったけど、送料+代引きが別途加算されるので AMAZONでポチりました。多分low.jsをインストールできるはずだ。でもSMTモジュール基板なのでPCからプログラムを書き込むUSBシリアル変換アダプタが付いていないから、これとモジュール基板や部品をユニバーサル基板に取り付けないといけない。
なので、組み立てても動くかどうか?自信が無い。( ´艸`

ESP32-WROVER-Bが発送された後、0.1インチピッチの変換ボード付もあったことに気が付く。とりあえず配線に失敗したら、またポチろう。

右足全体に筋肉疲労痛、 過負荷で右股関節も痛み出しているところに、ピンポンと届く。10キロΩの抵抗は古い在庫(数十年もの)があるので、コンデンサと書き込み機待ち。

現物が届いてみると、ハーフピッチは、やはり小さい。そして ハーフピッチ のピンやソケットやユニバーサル基板はとってもお高いので、2の脚を踏んでしまう。

ESP-WROBER-B
ESP-WROBER-B
表面
ESP-WROBER-B
裏面

ググってみたらaitendoに「変換基板(1.27/38P)[P-WROVER-D38]」180円 の出品があった。基板のみはココだけだった。特売品の中にブログの記事や動画ではよく見かけるけど妙にお高いSPIなLCD+microSDのシールドとeSATAリアスロット(1ポート)[BC-eSATA-1P300]もチョイス。LCDのバックライト端子(D_LED)がGND接続なのは珍しいかもしれない。絶対にVCCに接続しないでくださいという注意書きもGJ。ESP-WROVER-D38 も「 間もなく発売 」になっている。

ググってみたらaitendoに「変換基板(1.27/38P)[P-WROVER-D38]」180円 の出品があった。基板のみはココだけだった。特売品の中にブログの記事や動画ではよく見かけるけど妙にお高いSPIなLCD+microSDのシールドとeSATAリアスロット(1ポート)[BC-eSATA-1P300]もチョイス。LCDのバックライト端子(D_LED)がGND接続なのは珍しいかもしれない。絶対にVCCに接続しないでくださいという注意書きもGJ。ESP-WROVER-D38 も「 間もなく発売 」になっている。

書き込み機用のCP2102 モジュール (STC Replace FT232 Module)も到着。

あとはコンデンサと抵抗。変換基板と同着かな?

あと、筋肉疲労かと思ってたが、昨日も痛み出した。もしや動脈硬化か?血管が詰まってる?と思いビクビクしながら検査を受けるが、noPloblem。ヘルニアかな?背骨のレンドゲン検査では、一か所だけ隙間が狭い。MRIを受けても「異常なし」とか云われそう。 背骨の位置を気にしながら 猫背と反り背の間の中庸をとりつつ日常生活中。



ESP32でハマるハマるハマる

技適マーク付きのESP32が届いたので、Arduino IDEにESP32の環境をセットアップしようとしたら・・・アップアップしてしまった。

1.ESP32をUSBケーブルで繋いでもArduinoIDEから使えるCOMポートが増えない。

あ、ゴミ(不良品)でも引いたか?(アタリ???

と思ったが、ケーブルで繋いだ時の音はいつもの音。
デバイスマネージャを見ると変なマークが付いた。
どうやらドライバーが見当たらないらしい。【ドライバの更新】を押して、いつもの【ドライバの最新版を自動検索】させてみたが、見つからない。

手動で、ググってみると、チップメーカが公開しているらしい。

http://www.cqpub.co.jp/interface/contents/special/cp2102install/index.ht

ドライバをダウンロードし、先の画面で解凍したフォルダ指定でドライバ更新。
無事、ESP32を繋ぐとArduinoIDEのポートが増える様になった。

2.ArduinoIDEをESP32用に変えようとしたら・・・

Arduinoのファイル⇒環境で、
https://dl.espressif.com/dl/package_esp32_index.jso
を追加したもののボードマネージャにESP32らしきものは出てこない。

そんな場合はGitHubから一式ダウンロード!してみたが、
これがいけなかった。

RSP8266の時に作ったWifiAPのスケッチをESP32で動かそうとしたら・・・
ヘッダの名前がESP8266なので削除して全ビルドしなおし。

そして・・

ビルドオプションが変更されました。全体をリビルドしています。
exec: “C:\Users\[YOUR_USER_NAME ]\Documents\Arduino\hardware\espressif\esp32/tools/xtensa-esp32-elf/bin/xtensa-esp32-elf-g++”: file does not exist
ボードESP32 Dev Moduleに対するコンパイル時にエラーが発生しました。

とツンデレ状態。
またまたググってみると、先のget.exeがあやしいらしい。
コマンドラインから実行してみると

Microsoft Windows [Version 10.0.17763.348]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Users\[USER_NAME]>cd C:\Users\[YOUR_USER_NAME]\Documents\Arduino\hardware\espressif\esp32\tools
C:\Users\[USER_NAME]\Documents\Arduino\hardware\espressif\esp32\tools>get
System: Windows, Info: Windows-10-10.0.17763
Platform: i686-mingw32
Downloading xtensa-esp32-elf-win32-1.22.0-80-g6c4433a-5.2.0.zip
Traceback (most recent call last):
  File "get.py", line 139, in <module>
    sys_name = 'Windows'
  File "get.py", line 90, in get_tool
    sys.stdout.flush()
IOError: [Errno 13] Permission denied: u'C:\\Users\\[USER_NAME]\\Documents\\Arduino\\hardware\\espressif\\esp32\\tools/dist/xtensa-esp32-elf-win32-1.22.0-80-g6c4433a-5.2.0.zip'
Failed to execute script get

当のフォルダは誰でも読み書きできるので、何か別の理由でダメらしい。
ググってみると、同様な問題を抱えた人はいるらしい。
最後は俺っちのトコでは問題ないから、クローズしますね。
そうですね。ボクだけみたいですね。お手間をかけてすみません。
って感じで終わってた。orz
うーむ、お手軽な開発環境なダケに、中身のことは誰もしらない。
訳が解らないことはムヤムヤにするしかないんだろうね。

という訳で、 ESP32のArduinoIDEでの対応がお粗末なので、ゴミのままになると思ったが、もう一度、ググってみると正解が見つかった
つまり、先のGitHubにあった開発アセットがWindows10非対応だったのだ。
※以下、Python 3.7.2 (64bit版)インスト環境ですが、多分影響ないハズです。

ボードマネージャにESP32用の設定ファイルも読むように指示
※ここは前回と同じ

と設定してから、※ココが重要!(夢に出ます。

「ボードマネージャ」をクリックする
※前回はこの操作はやっていなかった

追加したボードマネージャのダウンロードを状況をチェック!

既にダウンロード中だったので、
そのまま暫く待つ

どうやら、設定の「追加のボードマネージャのURL」を設定したら、必ずこのボードマネージャの画面を開かないとダウンロードしないらしい。

無事、インストール完了
ボードマネージャを切り替える
やっとESP32の出番だ

で、ソースのアチコチにあったESP8266の文字を消したが、
ESP8266のNO OS SDKに載っていた
・wifi_softap_dhcps_start()
・dhcp_status wifi_softap_dhcps_status()
が見当たらない。
調べてみると、APモードにすると自動的にDHCPが機能するらしいので、両方とも削除したらOK。

ビルドすると、<WiFi.h>が複数見つかったと出ていたが、いつのまにかでなくなった。

ビルドオプションが変更されました。全体をリビルドしています。
最大1310720バイトのフラッシュメモリのうち、スケッチが742550バイト(56%)を使っています。
最大327680バイトのRAMのうち、グローバル変数が37688バイト(11%)を使っていて、ローカル変数で289992バイト使うことができます。

フラッシュメモリ:1.25MB は少し足りない気がするけど、RAM:320KBはESP8266の数倍。本当はボードのスペック表を見ながら、設定しないといけないが、最低でもこれくらいあるの様だ。

フラッシュ:4MB,空きRAM:284KB? こんな感じらしい

そして、最後の最後まで・・・orz

ブレッドボードにESP32を挿したら、5穴タイプでは、部品は挿せてもジャンパを挿す穴は基板の下。

ESP32の幅 – ESP8266の幅 = 1穴。

ESP8266 は、この1穴分の幅の狭さで、なんとかなってたのに。orz




ESP8266のキットで遊んでみた

ブレッドボードに Arduinoを 何度も抜き刺しすると壊れそう。
同様に Arduino にUSBケーブルを 何度も抜き刺しすると壊れそう。
そこで、磁石でくっつけるUSB通信ケーブルを使ってみた。

いかにも壊れそうなUSBコネクタの負担は無くなった。
しかし、ケーブルの重みで空中にホバーリング状態にしていると
衝撃でポロっと落ちてしまうので要注意。

まず、ArduinoIDEの設定をESP8566用に変更しなければいけない

詳しくはキットの説明HP参照

差異:

1.ボードマネージャでNodeMCU 0.9は不調だったので1.0を使った。

2.説明の通りにやってみたが、やはり「結構ハマった」

http://osoyoo.com/ja/2016/11/28/3596/  のサンプルの「プログラム前の準備:」と「Libraryのインストール:」を参照

サンプルに ESP8566のWifiをIOTで使う方法を見つけた。

温度センサーの測定値をシリアル通信のログ画面で見るものだが、NodeMCUのサンプルなので、当然ながら・・・ソースの最後の最後で温度を「所定のMQTTサーバにあるブローカにpublish」もしている。妙な送信はしていないハズだが、マズは自己責任を果たす姿勢をみせるためにも、ソースを熟読してからESP8566に書き込もう。

http://osoyoo.com/ja/2016/11/24/use-nodemcu-to-send-temperaturehumidity-data-to-mqtt-iot-broker/

ESP8566のWifiをSTAモードで使う方法を見つけた。

同上

ESP8566のWifiをAPモードで使う方法を見つけた。

https://iot.keicode.com/esp8266/esp8266-ap.php

ESP8566のWifiをAP+STAモードで使う方法を見つけた。

https://relativelayout.hatenablog.com/entry/2017/07/22/211649

しかし、スマホ側のWifiの詳細設定項目が面倒。
1.インターネット非接続時も有効にチェックを入れる

※MDNSを使うといいのかもしれない。

初期の接続は絶不調になるので、根気よくやり直す。

少し遊んでみた感じでは、ESP8266の少ないメモリ(1044464バイトのフラッシュメモリ、81920バイトのRAM)でも簡単なサンプルなら問題無いが、データ量が多くなると不安 。

なので、SDカードスロット付きにLCDを使おうとしたら、ArduinoのMEGA2560専用(UNOも可)のピン配置だったから、 SDカード のパーツを
ついでにESP32Sもポチった

ESP8266のWEBサーバーの応答って
server.on(“/”, 関数); のように書くから、対象ファイル分を登録するのかな?
SDカードの中身をスキャンし、登録した関数の中で、コマンドは server.method()で、URLはserver.uri() で、調べればいいけど。
登録時間とメモリをかなり食いそう。
でも、 server.on()の中身が_addRequestHandler()だったので、addHandler()で汎用のイベント用関数を作ればいいかもしれないが、RequestHandlerの仕組みが判らないのでググってみたら

//以下、&は&に読み替えてください。
class MyHandler : public RequestHandler {
   bool canHandle(HTTPMethod method, String uri) {
     return (uri != NULL) && uri.startsWith("/aaa/");
   }
   bool handle(ESP8266WebServer& server, HTTPMethod requestMethod, String requestUri) {
      /* do brighness stuff here */
      String html = HTML_HEADER "<h1>";
      html += "command=";
      html += server.method();
      html +=  ",";
      html += "url=" + server.uri();
      html += "</h1>";
      html += HTML_FOOTER;
      server.send(200, "text/html", html);
   }
} myHandler;

の様に書けば/aaa/に反応するイベントハンドラになるらしい。
試しに追加してみると
http://192.168.xxx.xxxx/aaa/bbbbcccc.img なら
command=,url=/aaa/bbbbcccc.img
と表示されるので、多分OK。

あとはDHCPさえ実装できればいいなぁ~と思ってたら、

なんと ESP8266 Non-OS SDK API Reference というのがあって、server.begin();の前に

wifi_softap_dhcps_start(); 

って1行追加するダケだった。
それでも、スマホから接続すると「インターネットに接続できません」扱いで無効状態になるので、APをクリックして 再接続を「インターネットに接続できませんが、接続を維持しますか?」の確認メッセージを出るまで繰り返し「はい」 するまではESP8266のAPに繋がらない。
このAPI類はミスってExceptionが起きると、ESP8266のモニターがリセットしてくれるが・・・、初期設定で Exceptionが起きると、 リセット ト ト ト ト ト ト ト ト となり、USBケーブルを繋ぎ直してもモニタの自動アップロードが機能しなくなり再書き込みもできなくなるので、FLASHメモリの消去ボタンが無い開発キットの場合はヤバイそう。

更にググってみると、僕的に最高なESP8266が見つかった。

カブトムシ仮想キーボード Badusb ATMEGA32U4 WIFI ESP-8266 ESP8266 ESP-12E TF マイクロ SD カード開発ボードモジュール

が国内では売っていないようだ。
さて、次はESP32Sの開発キットにmicroSDカードを繋いで・・・
あ、microSDカードに書き込むときには時計が無いと
ファイル作成日時が2000年の元日になってしまうらしい。
RTCシールドも買えばよかった。orz

あと、画像を返す場合は文字ではないので、ヘッダから

File imgFile;
WiFiServer server(80);
WiFiClient client;
・・・
void Drawjpg(String fileName){
  imgFile = SPIFFS.open(fileName, "r");
  client.write(imgFile, HTTP_DOWNLOAD_UNIT_SIZE);
  imgFile.close();
}
・・・以下ハンドラ内
if(ファイルの拡張子==画像){
  hdr = "HTTP/1.1 200 OK\r\nContent-Type: image/jpeg \r\n\r\n";
  client.print(hdr);
  Drawjpg();
  client.flush();
}

みたいなことをしないといけないらしい

動画は無理なのかな。



ESP8266ではじめるNodeMCU IoT MQTT プログラミング 学習キット 実験キット 初心者演習用電子パーツセット (NodeMCU IoT)

安かったので勢いでポチった。

実は後悔してる。

その直後に

Arduino Nodemcu ESP32 KIT、esp32 開発ボード、1.44インチTFTスクリーン、Bluetooth デュアルコア キット、インターネット開発ボード、TFカードとPCMの音楽をサポート、1Wのスピーカーが付属

を見つけてしまったからだ。

ESP8266ということは・・・
前に買ったWeMOSのD1に載っていたのと同じESP-12っぽい。

とは云うもののキットとサンプルプロジェクトの紹介ページがあるので心強い。

Arduino用の2軸カメラマウント(サーボモータ付)をキット付属のリモコンで操作できたら面白いかもしれない。そのマウントにカメラを載せて、WIFIで映像を流せたら、もっと面白いんだろうけど・・・
どうやって映像を受信すればいいのか判らん。

HTMLサービスを作って/camera.mpegをGETしてきたら・・・
ストリームの手順(知らんけど)でタレ流しすればいいのかな?
応用すると APモードで待機させて、/camera1.htmlにそれっぽい画面を作って、カメラ映像mpegとサーボモーターのボタンを配置して、スマホから繋ぐと面白いかな?

月の低解像度映像を受信して月の動きをJavaScriptでカメラを追尾させ、高解像度のWEBカメラ映像を別の /camera2.html をテレビから見るとかできるかもしれない。(WIFI2系統?

暫く月食は無いので、もしかしたら次の月食までには間に合うかもしれない。(大笑

でも、こんなのをベランダに固定してたら・・・
不審なカメラにしか見えない様な気がするなぁ・・・
てかWifiの野外利用は・・・
やっぱりボツかな。orz




【PS4】Ace Combat 7をやってみた

左脚を伸ばすとカカトの中でサクっとかズキっとか痛みが走る。しかし、不思議なことにつま先立ちすると痛くないので、その様に暫く過ごしていたが、 右脚 もあちこち痛み出し、症状が悪化の一途を辿っていくので病院にいってみると「足底腱膜炎?」という診断。

激しい運動をするとなるらしいが、運動不足で筋肉が萎縮してしまい、日常生活がボクにとっては激しい運動になっていたのかもしれない。痛み止めを飲み、カカト、脹脛、膝の3か所にシップを貼ったら楽になった。

筋肉の萎縮 でググってみると、筋肉そのものが減っていく場合と、神経の刺激が乏しくなって萎縮する場合があるらしい。 頸椎症 ならまだましもALSの症状があらわれるのは、50代から70代前半の年齢層に多いといわれ、 中でも一番多いのは65~69歳らしい。

このままアクションゲームが出来なくなりそうな気が段々してきたので、そうなる前に・・・

「VR酔いしそうで購入を先送りしていたPS4のAceCombat7」を購入した。

勿論、 2月18日までに購入するとAceCombat5がオマケに付いてくることも後押ししてくれた。

AC5は普通にできたけど、 AceCombat7ではなぜかフルスロットルしても離陸できない。どうやらR2ボタンのアナログ出力のMAXが下がっていたらしく、中途半端な出力になって離陸を開始できなかったようで、コントローラの設定で、スロットルとヨーのボタンを入れ替え、 スロットル をデジタル(ON/ OFF)にして、やっと離陸。

しかし、慣れないボタン配置で飛んでいると、うっかりヨーとスロットを間違えてしまう。そうなると、上下左右の感覚もおかしくなってしまい、メッチャクチャ。MMORPGだったら完璧な3D酔いになっていたに違いない状況でキャンペーンを444部隊まで進めたところで中断した。

アナログコントローラのレンジを調整する機能なんて無いので、専用コントローラが必須らしい。 VRの前にコントローラだね。

ま、そんな調子なのでオンラインプレイは無理。

でも、ゲーム中は脚の痛みをシカトできるし、何となく体も温まり、血行が良くなってる気がする。また痛くなったらAC7で解消できるかも(しれない



「無能な人」文喜相

一言で云えば無能な人である。

日本に来た時も交渉のネタを持っていたワケでもなく、ただ来日して話をして帰国しただけである。

昨日の天皇の謝罪要求も、チンピラの嫌がらせと同じなので、こちらとしては、変な行動はとらず、有力者の対応を粛々と眺めるに留めるのが筋である。

でも、とりあえず、謝罪要求なんてものが飛び出したのかを考えてみたが、実際問題としてどう外交という交渉をしたものか?全く何も浮かばないから、こんな変なことを言い出しているだけだと思う。

つまり、アリエナイ・シチュエーションが起これば良いな!程度の妄想で、所謂、何かのサプライズの要求(AAで見たことがあるが、2chのスレに、ゴハンマダー?チーン!と合いの手を打っている様な)程度のものであり、実際にそのようなことが起こればサプライズになるのだろうが、#例の問題に関してはどうなるかは不明瞭で、明白なことはただ一つ、当人はすぐさまお代わりを要求し自分の株を上げること。それ以外にこの人に何ができようか?

では、何を云えば最良だったのだろうか

日本なんて一言も入れずに、本国の中で収まる話をすれば良かったと思う。

ps

日本は何度も謝罪していると云う問いかけに

日本は何十度も謝罪していないという 返答 が届いたらしい。

翻訳ミスなのかもしれないが、回数の違いに問題があるとは思えない。

あっち側も適当すぎる返答なんかしてないで、「例の問題は大韓民国の国内問題である、日本は無関係」と言い切って国内でうまくやってくれ。

この項、終了。



【WindowsUpdate】想定外の問題が発生

MSのWindowsUpdateのサーバが再起動したらしく、その影響で各国の中継サーバーが不調らしい。

別にWindowsUpdateを数日遅れてインストしても支障はない。

そう思っていたら

Windows10のMicrosoft Store も不調らしい。

運悪くG5eのHomicide Square 隠された犯罪のアップデートを要求されたが、ストアから更新の反応が全く来ない。

こ・このままでは連日ログインのプレゼントが消えてしまうではないか・・・orz



【EXCEL VBA】SendKeys

{HOME}でホームキーを押せるけど

CTRL+HOMEはどうするのか?

無理なのかと思ってたら

最近のMSDNオンラインにはこっそりとこう書かれています。

Shift キーを押したまま、E キー、C キーを順に押すには、”+(EC)” と指定します。

https://msdn.microsoft.com/ja-jp/library/cc364423.asp

つまり、”+({HOME})” なのだそうです。

SendKeys “+({HOME})” と  SendKeys “^+({END})”  それに DoEvents も

付けるとワークシートの全データを範囲指定できます。

DoEventsが無いと、画面の反映を完了しないので、続きのVBAコマンドが悲しい結果を引き起こします。

また行や列などをロックしている場合、ロックしている範囲は範囲指定できませんので、結局操作マクロの記録結果をそのまま使って

Range("A1").Select
Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
With Selection.Font
    .ColorIndex = xlAutomatic
    .TintAndShade = 0
End With

で、赤字を外す方が良さそうです。

古いEXCELも同じ操作マクロを記録しますが、そのままマクロを実行すると、ColorIndexに対してxlAutomaticを代入するところで範囲外エラーになってしまいます。これは、WindowsUpdateでxlAutomaticの値が変化してしまったのでしょうね。しょうもないバグですが、直してくれる訳が無いので、自分でxlNoneに書き換えるしかありません。




【Node.js】簡易デバッグコンソール

軽い気持ちで、node.jsのreadlineを使ってstdinとstdoutを繋いでコマンドインタプリタを書いてみた。

バラックなソースはそう面倒も無くできた。

// コマンドライン CmdLine.js
module.exports = class CmdLine {
  constructor(cmds) {
    this.cmds = cmds;
    this.reader = require('readline').createInterface({
        input: process.stdin,
        output: process.stdout
    });
    //コンソールからの1行入力処理
    this.reader.on('line',(line)=>{
      var cmdLine = line.split(/,|\s/g);  // コマンドラインの入力をカンマまたは空白文字を区切り文字として処理
      this.cmdAnalize(cmdLine);
      this.prompt();
    });
    // Ctrl+Dの時の処理
    process.stdin.on('end',()=>{
      //do something
    });
    //コマンドリスト
    this.cmds = this.cmds.concat( [
      { name: "exit", help: "終了",   proc: (cmdLine)=>{
        this.log("EXIT:");
        process.exit(0);
      }},
      { name: "help", help: "ヘルプ", proc: (cmdLine)=>{
        this.log("HELP:");
        var msg = this.cmds.map((e,i,a)=>{ return "" + (i+1) + ":" + e.name + ":" + e.help; }).join('\r\n');
        this.log(msg);
      }}
    ]);
    //最初のプロンプト表示
    this.prompt();
  }
  //プロンプト※処理が終わってから出力する
  prompt(msg) {
    if( msg === undefined ) { msg = 'command:(' + this.cmds.map((e)=>{ return e.name; }).join(',') + ')';}
    process.nextTick(()=>{ console.log(msg); });
  }
  //LOG
  log(msg) {
    console.log(msg);
  }
  //コマンドラインの最初の単語をキーワードとしてコマンドリストを検索し実行する
  cmdAnalize(cmdLine) {
    if(cmdLine.length==0 || cmdLine[0] == '') { return; }
    var cmd = this.cmds.filter((e)=>{
      return e.name.substring(0,cmdLine[0].length) == cmdLine[0].toLowerCase();
    });
    switch(cmd.length) {
      // Not found.
      case 0:
        this.log('\'' + cmdLine[0] + '\' unknown command.');
        break;
      case 1:
        // Command execute
        cmd[0].proc(cmdLine);
        break;
      default:
        // Duplex pattern.
        this.log('\'' + cmd.map((e)=>{ return e.name; }).join('\' or \'') + '\' commands. retry.');
        break;
    }
  };
}
// End of CmdLine.js .

テストコードは

// テストコード test.js
const CL = require('./CmdLine.js');
var cmds = [
      { name: "list", help: "リスト", proc: (cmdLine)=>{
        cl.log("LIST:");
      }},
      { name: "last", help: "ラスト", proc: (cmdLine)=>{
        cl.log("LAST:");
      }},
];
var cl = new CL(cmds);
// End of CmdLine.js . 

ハマったのは、コンストラクタの中のコールバックで{ … } の中で、thisを使おうとしたら、thisがプロセスか何かに割り当てられ xxx not function などとエラってしまった。

{ … } を  { … } .bind(this)と書けばいいけど、 { … } の中に { … } があると、.bind(this)が必要になる。

つまり、 { … } の代わりに  { … } .bind(this) と書き続けることになるので、サクっと降参して、無名関数は止めて => 形式にして、thisの割り当てを期待するようにした。

勿論、別ファイルのtest.jsでは無効なので、thisの代わりにnewしたcl変数を指定した。

あ、自前のコマンドはnewする時に引数で渡してください。(汗

で、こんなの書いて何が嬉しいのか?と云えば

> node test.js と打てば

mailServer>node test.js
command:(list,last,exit,help)

と出るので、例えば、test.jsでSMTPとかPOP3のサービスを起動させた場合、jsソース中の変数(ファイリングしているメール・ファイルとかログとか)を自前のコマンドから色々と操作できるのです。

そういうのを作ろうとすると普段は別EXEを作ったり結構面倒なのですが、node.jsなら CmdLine.js をコピってきて、対象サービスにtest.jsなコードをくっ付ければ済むので非常にありがたいです。

後は、CmdLine.jsをもっと短く書ければいいんだけどなぁ・・・(遠い目




top