変奏現実

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

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

インターネット

[Wnidows]PowerShell

色々できる(ハズ

EXEからアイコンを取り出す方法をさがしていたら、PowerShellでもできるらしい。

※Ver6からはSystem.Drawing.Iconが無い様だ。Windows10はVer5だから動くけど。

しかし、文法が ソースっぽさとコマンドラインが混ざってる(メンドクサイ

例えば、PowerShellの窓を開き

元ネタ:https://suzuzusu.hatenablog.com/entry/2016/10/14/043726
###########################################################
# アイコンを抽出して保存
###########################################################
function ExtractionIcon( 
            $Path,      # 抽出する .exe のフルパス
            $OutFile    # 出力する .ico のフルパス
        ){

    # アセンブリロード
    Add-Type -AssemblyName System.Drawing
    Add-Type -AssemblyName System.IO

    $str1 = "ExtractionIcon :Path=`"$Path`", :OutFile=`"$OutFile`""
    $str1
    # アイコンデータ抽出
    $IconData = [System.Drawing.Icon]::ExtractAssociatedIcon( $Path )

    # 出力用ファイルストリーム
    $FS = New-Object System.IO.FileStream( $OutFile, [System.IO.FileMode]::Create )

    # 保存
    $IconData.Save( $fs )
    $fs.Close()

    # オブジェクトの始末
    $fs.Dispose()
    $IconData.Dispose()
}

と貼り付けると、

窓が開いている間だけ使える。(便利

しかし、この関数を呼び出す時はコマンドプロンプトっぽく

> ExtractionIcon "C:\Program Files (x86)\Sarad\DiCE\dice.exe" "a:\aaa\aaa.ico"

と打つ。

関数の中では、関数っぽく呼び出すのだから・・・

コマンドプロンプトから1コマンドづつ打って動作を確かめた後、

関数化する際には

「コマンドっぽい記述は関数っぽく書き直さないといけない。」

のが面倒だな。

後、Windowsでパパっと使う都合上、デスクトップに貼る場合、

Join-Path $env:UserProfile\Desktop "sample.ico"

で済ましたいがOneDriveをインストしてしまうと、アンスコしてもパスが変わってしまうから

Join-Path [System.Environment]::GetFolderPath("Desktop") "sample.ico"

と書かないと動かないPCも出てくる。

更に、コマンドラインのパラメータの区切りは空白文字なのは常識なので

コマンドのパラメータにコマンドを使うと、 どっちのパラメータなのか判らなくなる。

〇 コマンド  (コマンド パラメータ1 パラメータ2)  パラメータ3

× コマンド  コマンド パラメータ1 パラメータ2  パラメータ3

だから、パラメータにコマンドの戻り値を使うなら、PowerShellでは()で括る仕様になっている。

先のEXEからアイコンを取り出すコマンドをコマンドラインから呼び出すには

ExtractionIcon "C:\Program.....\xxx.exe" (Join-Path [System.Environment]::GetFolderPath("Desktop") "sample.ico")

となってしまう。

最後に、今のPowerShellはRestrictedで、スクリプトファイルは実行不可で、

一時的に許可するなら

> pwsh.exe -ExecutionPolicy RemoteSigned xxxx.ps1 

ps1のショートカットの場合も

powershell -ExecutionPolicy RemoteSigned -File ${元の内容}

となる。

ま、当然何でもできるから危なっかしい。

いくらPS1を実行不可にしても気の利いたショートカットを作られたら・・・

結局、MSが作ると、

大抵は使い物にならない

しかし、使い物になる様にバージョンアップすると

危なっかしい。

これは定説だな。



[git]コマンド

多分、こんな感じかな

  1. 参照系
    1. git clone ${リポジトリィ}
      • カレント・ディレクトリィにドコかのリポジトリィをコピる。
    1. git pull
      • リモートリポジトリの最新状態に更新
  2. 更新系
    1. とりあえずクローンする
    2. git checkout ${ブランチ}
      • 新たなブランチで履歴を作る時は、-b ${新しいブランチ} を使う
      • 既存のブランチでも、初回は git fetch ${ブランチ} で情報の取得が必要
    3. git add ${ファイル名}
      • コミット対象ファイルに追加
    4. git rm ${ファイル名}
      • コミット対象ファイルから削除
    5. git mv ${ファイル名}
      • コミット対象ファイル名の変更
    6. git commit -m ${メッセージ}
    7. git push origin ${ブランチ}
  3. 管理
    1. git init
      • カレント・ディレクトリィにリポジトリィを作る。
    2. git branch ${ブランチ}
      • ブランチを作る
      • ブランチを削除する時は -d ${ブランチ}

な感じで使えばいいかな



[Excel]Alt+F11の競合

ExcelでVBAエディタは ALT + F11 で開いていたが、

暫く振りに使ったら無反応だった。

仕様が変わったのかな?思ったら

NVIDEA GeForce Expressの中で「 ALT + F11 」をフックしていたせいだった。

普通は自分の画面上でしか 自分の ショートカットは有効にならないが

ゲームの画面をキャプチャ等をするには、

デスクトップ内で 自分の ショートカット を有効にする方法(ジャーナルだったかん?)を使うしかない。

このため「ゲーム内のオーバーレイ」で登録してある「ショートカット」は全てのアプリの 「ショートカット」 より優先されるのだ。

対処法で一番確実なのは

NVIDEA GeForce Expressで 「ゲーム内のオーバーレイ」 を無効化

もし、Excelの操作をキャプチャで使ってるなら、

  1. 隠れているインジーケータから
  2. NVIDEAを右クリックして
  3. GeForce Expressをクリック
  4. 画面右上の方の歯車のアイコンをクリック
  5. 左側の全般をクリック
  6. 画面中央の「ゲーム内のオーバーレイ」の「設定」ボタンを押下
  7. 「キーボード ショートカットリスト」を下スクロールし
  8. 「ブロードキャストライブ」のとこの「 ALT + F11 」 を探し出し、
  9. クリックしてスペースバーを押して「None」表示に切り替える。
  10. 「戻る」ボタン押下「完了」ボタン押下
  11. 「ゲーム内のオーバーレイ」状態に変わり、ちょっと何をすればいいか困る状態に陥る(かもしれないけど
  12. デスクトップの右上の「X」ボタン押下と、「ゲーム内のオーバーレイ」が解除される。

かな。



[JavaScript]dropイベント

MDNにフォルダをドロップして中身をリストアップするサンプルを見つけた。

FireFoxではうまく動くが、ChromeやEdgeでは・・・・・・・・・

code: 0
message: "A URI supplied to the API was malformed, or the resulting Data URL has exceeded the URL length limitations for Data URLs."
name: "EncodingError"

が出てしまう。

「APIに提供されたURIの形式が正しくないか、結果のデータURLがデータURLのURL長の制限を超えています。」

ってファイル名のせい?

しかし、C:¥aaaでも同じ結果だった。

原因は判らないけど、コードをアップしてみると・・・何故かうまくいく(アップ先)。

どうやら、httpなURLなパスにあるHTMLファイルをブラウザで開いている場合はOKらしい。

微妙だ。どっちかと云えば、

PCにコピったHTMLファイルでウマくいく方が安心なのに

得体のしれないのURLの画面のページに自分のPCのフォルダをドラッグするのは・・・

素で怖いw

と思う。

後、先の参考URLの注釈通りにreadEntries は、100個までしか読んでくれない。

forEachはPromiseを返さないので、非同期処理を抱えてる部分を含めて、

ローカル関数に書き換えたが forEachの最終ループで再起すると

どう見ても無限ループにしか見えない

ここは、forEachをmapにして暗黙の同期化を発動する。

ついでにmapの戻り値から readEntries が空っぽを渡たさなかった場合のみ再起するようにした。

readEntries  も非同期っぽいから、ローカル関数のままか。

フォルダに203個ファイルがあっても全部書き出してくれたから、

多分大丈夫。

メデタシ、メデタシ。(かな?

あ、HTMLのINPUTタグでwebkitdirectory を指定すると

フォルダも選択できるらしい。

こっちの方が良さそう。

でも、非標準らしい。



[ELECOM]TK-FBM112BK

なぜかスマホ・スタンドが付いてくる。キーボード裏側に単3電池1個を入れる。傍にUSBドングルを格納する様な窪みがあるが本機はBluetoothで3台切り替えられるキーボードだから、共用の裏蓋なんだろう。他社の3台切り替えキーボードも物色していたので、これもUSBドングルついてると思い込んでいた。

当然だけど、

UEFIではOSが動いていないのでBluetoothのキーボードやマウスは使えません。

TPM非搭載のPCでWindows BitLockerを使ってボリュームを暗号化し、ロックの解除にPINを使っている場合にOSが立ち上がっていないので、Bluetoothのキーボードやマウスは使えない (らしい、未確認

そんな訳でこれからのマザボには

UEFIにBluetoothのペアリング機能

が欲しいね。

※何年も使ってると有線マウスとか捨ててしまった。

オンラインマニュアルを探してみると箱の中に印刷してあるものと全く同じだった。

キーボード全体の強度が弱目で強く押すとたわむのでキータッチが少しネバい感じ。

かるくキーを押すのがいい。

気持ちTK-FDM063の方がガッシリして打ちやすい。

最初は「Fn」を押しながら「Tab」を押してBluetoothのペアリングをすれば普通に使える。

但し接続先をコロコロ切り替えて使う場合は

右上の「B1」「 B2 」「 B3」のどれかを押すと接続先が変わる仕組みなので、

※「B1」のBのBluetoothマークの意味。フォントが無かった。

「B1」「 B2 」「 B3」 を一度も押していなければ

最初の1台目は「B1」になる。

2台目を繋ぐときは先に 「 B2 」を押してからペアリング動作を行う。

※「B2」を押さずに ペアリング すると、先に「B1」として登録した接続先の設定が上書きしまう。

※最初は取説を読まずに3台ペアリングするれば順に「B1」「B2」「B3」に自動的に振り分けられると思った。

これで、 「B1」「 B2 」 を押す度に接続先を変えられる。

3台目を繋ぐときは先に 「 B3 」を押してからペアリング動作を行う。

そのうち、気持ちが変わって「 B1」「 B2 」「 B3」 の接続先を変えたい場合、例えば、「B1」でペアリングしたけど「B3」で接続する様にしたい場合は、一旦「B1」の接続先からペアリングを削除した後に、「 B3」を押し、再ペアリングすることになる。

勿論、 「 B1」「 B2 」「 B3」 のどれも同じ接続先にしてもいいハズだけど、意味は無い。

しかし、 「 B1」「 B2 」「 B3」 で接続先を切り替えると云うことは、

切替元からはもう接続中ではなく「以前ペアリングしたキーボード」的な状態になり、

切替先の方も「以前ペアリングしたキーボードの電源がいきなりONになった!」的な感じなのでアタフタしかねない。

ちゃんとキーボード入力を受け付けるまでちょっと時間がかかる機器もあるだろうから、

急がずに右上のLEDが消えるまで待った方がいい様な気がする。

あとスマホなどその辺にポィっと置きっぱなしで画面を見ていない機器に接続しっぱなしにしておくと

うっかり接続先がスマホになってて「スタート」キーを押してもPCは無反応!

どうなんてるの状態の裏で、

スマホのGoogleアシスタントとの話がどんどん進んで妙なことになっている可能性が高い。(大笑

最後に、「Fn」キーを押しながら「PrinScreen」「ScrollLock」「Pause/Break」キーを押す必要があるので、これらを多用する人(プログラムのマニュアル作成、EXCEL、VisualBasic等)向けではない。

ボクはドレもあてはまるので、★3つかな。

というのも、多くのBluetoothキーボードはキートップが薄っぺらで格安ノートPCみたいなものが多いから、他よりはだいぶマシなんだよね。



[JavaScript clipboard]表の行の背景色を

表をTABLEタグ風のテキストをEXCELに貼ると、それっぽい表になる。

でも安易に

TD付の行リスト.push("<td>" + data1 + "</td><td>" + ... + "</td");
・・・
TD付の行リスト.push("<td>" + data1 + "</td><td>" + ... + "</td");
var str="<table><tr>" +TD付の行リスト.join("</tr><tr>") + "</tr></table>");
window.clipboardData.setData("Text" , str);

な感じで作ってしまったら、行の背景色を交互に変えるのがめんどくさくなってしまった。

TD付の行リスト.push("<td>" + data1 + "</td><td>" + ... + "</td");
・・・
TD付の行リスト.push("<td>" + data1 + "</td><td>" + ... + "</td");
var p = "<table><tr ${bgColorRow}>" +TD付の行リスト.join("</tr><tr>") + "</tr></table>";

// 行の背景色(${bgColorRow})を交互に変える
var i=0;
var str= p.replaceAll(/\$\{bgColorRow\}/g, function(pat){
   i++;
   return  (i%2)? '': 'bgcolor="lightgrey"';
}));
window.clipboardData.setData("Text" , str);

でもいいけど、10,000行をJoinした後にReplaceAllは重すぎる様な気がした。



[Windows 10]21H1にアップグレード

暫く電源を入れていなかった6台のPCはいつまで経っても21H1へのアップデートに失敗し続けたので、

電源を入れていない間にWindowsUpdateの累積アップデート(LCU)の管理が変わりエラる問題を解決するハズのスタック更新パッケージ(SSU)のインストールにも失敗する(賞味期限が切れた?)現象が改善できない状況でした。

以下のWindows 10 のダウンロードのページの

https://www.microsoft.com/ja-jp/software-download/windows10

【ツールを今すぐダウンロード】のMediaCreationTool21H1.exeを使用した。

本来はWindows10をインストールするツールで既にインストール済みのPCでも使用可能だ。

注意点

  • インストールする前にマウスやモニターを接続した方が安心。
    • リモートデスクトップ越しにアップグレードしているとリモートデスクトップがOFFに切替ることがある。
      • この場合はモニターを繋いでも何も映らないことが多い。
        • フリダシに戻る。
  • WindowsUpdateを停止させておくこと。
    • 非力なPCの場合、同時進行は無理だから
  • USBメモリにインストール用メディアを作成する方法を選択する。
    • 20GB以上のUSBメモリが必要。※USB3なら直良し。
    • 直でアップグレードしても、Cドライブに空き容量がギリギリ8GBだと更に空き容量が10GB以上のUSBメモリを要求してくるので、さっさと諦めて回り道した方が手間がかからない。
  • アップグレード中に「更新プログラムをダウンロードするか?」と聞かれたら、WindowsUpdateは停止中なので「No」を選択。
  • 何度か再起動しログインできたらWindowsUpdateを必ず戻すこと。

これで古いCore2DuOやメモリ2GBのスティックPCでも21H1にアップグレードできました。



[VB.net] for eachにindexが欲しい

大方の場合

For Each item in collection
  debug.print(item .xxx)
Next

で済むけど、何番目なのか知りたい時があるが、

Dim index As Integer=0
For Each item in collection
  debug.print($"{index}:{item .xxx}")   ' あ、indexを+1しないといけない
  index += 1  ’改造中に消えたり、ココを通らなくなるとメンドィ
Next

パッと見、ゴチャったコードになってしまう。

Enumerable.Select メソッドでcollectiomの各要素をindex付のテンポラリィなクラスに差替えられるので、
for each の in で使ってみると・・・

For Each entry In collection.Select(Function(item, index) New With {item, index})
    Debug.Print($"{entry.index}:{entry.item.xxx}")
Next

entryは collectionの要素であるitemとindexのプロパティを持ち、entry.indexには、0から始まる整数が、entry.itemにはcollectionの各要素が入る。

また、EnumerableにはSelectのほかにもDistinct、Where、OrderByやUnionまであるから、SQL風に書こうとすればできないこともないかもしれない。



【Excel】秒分グラフ

単位を分と秒にするとまともなグラフを作れないのはエクセルの仕様ですか?
ブチギレそうです。

~とあるTwitter から~

そうなのかな?と思ってやってみたら、見事にハマった。

失敗したグラフ

単に棒グラフを作成すると、このデータの場合は自動的に横軸の目盛りが「43秒」毎に配置されてしまう。原因は単位が60進数を考慮してない設計のせいで、適当スギる値になっているせいだ。

適当スギる単位

単位の主はセルに「0:1:0」と入力して書式を「数値」にすると、「0.0006944444」になるが、
長いので「0.000695」が良いだろう。補助線も「0.00139」ぐらいが良いだろう。※適当だけど!

では変更を加えよう!

その「1分26秒」辺りを右クリックし【軸の書式設定】を選択し、右のプロパティっぽい画面の「単位」の「主(J)」を「0.000695」に「補助(I)」を「0.000139」にする。

一通りの操作はこんな感じ。

これで、いい感じになるっぽい。

ま、適当にやっつけたダケなので、本当は「ちゃんとした簡単な方法」があるんだろうなぁ~(棒読み

※ 実は最初のグラフが余りにも醜いので、最初から書式(mm”分”ss”秒”)に変えてある。初期書式は(hh”時”mm”分”ss”秒”)だ。




top