2019/09/06

Windows10 1903 アップデートで Cortanaが暴走でスタートから検索不能 → レジストリとファイヤウォール設定

Windows10 1903 アップデートで Cortanaが暴走+スタートメニューの検索からアプリが検索できなくなった

bingSearchを停止してると Cortanaが暴走するので、有効に戻す。さらに検索されたくなければファイヤウォールでブロックしてちょ な事が書いてあったので実行したらフツーに戻ったメモ

レジストリの変更
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Search の
BingSearchEnabled を 1 (有効)へ変更

PCを再起動するか、タスクマネージャから Cortanaを強制終了して、スタートメニューの検索から検索ができるようになる

ファイヤウォールの設定(Cortanaをブロック)
ファイヤウォールの詳細設定から、「送信の規則」にある Cortana(複数ある場合は全て) の接続をブロック


Delphi 最大化MDI子フォームを切り替えると呼び出される OnResizeイベント

Delphi の古いソースコードの修正中に気づいた(最新では変わっているかも)
MDI子フォームを最大化した状態で、子フォームを切り替えると OnResizeイベントが2回呼び出される

最大化したMDI子フォームをAからBへ切り替えると
  1. フォームAが wsMaximized から wsNormal へ切り替わり OnResizeイベント発生
  2. フォームBが wsNormal から wsMaximized へ切り替わり OnResizeイベント発生
と2回呼び出される
つまり、背後に回ったフォームは、ノーマルサイズへ戻されているという事になる

今回、背後に回ったフォームのリサイズイベントは無視したいという条件があったので
MDIに wsMaximized が存在するかをチェックして、1. のイベントをスキップさせるという方法で対応

procedure TMdiChildForm.FormResize(Sender: TObject);
var I: Integer;
    MaxFormExists: Boolean;
begin
    // MDI Form に MAXが存在するかどうかを確認
    MaxFormExists := False;
    for I := MdiMainForm.MDIChildCount - 1 downto 0 do begin
        MaxFormExists := MaxFormExists or (MdiMainForm.MDIChildren[I].WindowState = wsMaximized);
    end;

    if (not MaxFormExists) or (WindowState = wsMaximized) then begin
        // resize func;
    end;
end;
上記の場合、最大化を解除した時のリサイズイベントがアクティブな子フォーム以外発生しないので注意が必要となる(アクティブな子フォーム以外は、すでに最大化ではないため)

2019/08/27

Evernote Developer で API Key 取得時の Usernameとは

久々に API Key を取得しようとして、Evernote Username へ何を入れるか迷ったのでメモ


Evernote Username は、生成される Consumer Key となるようです

2019/08/22

Evernote OAuth の Access Token 取得で 401

Evernote の OAuth にて Access Token 取得時にコード401でハマったのでメモ
基本的に Evernote の OAuth手順 どおりの key=value をポストするが oauth_token_secret の扱いについて


1. Generate a Temporary Token のレスポンスで得られる oauth_token_secret の値を保存しておく
上記のリクエスト時は、token_secret は未定義なので oauth_signature の生成時のキーは "consumer_secret&"

3. Retrieve Access Token のリクエスト時
1で保存しておいた oauth_token_secret の値を用いて oauth_signature を生成するので、キーは、"consumer_secret&token_secret" である


つまり、アクセストークンを生成するために保存が必要なレスポンス項目は
1. Generate a Temporary Token  === oauth_token, oauth_token_secret
2. Request User Authorization === oauth_verifier
となる

2019/08/21

Visual Studio 2019 + Npgsql4.09 で配布が必要だったDLL

PostgreSQLへ接続が必要な事案があり、昔使用した Npgsql3.0x系から、現行の Npgsql4.09 へ変更したら、配布するDLLファイルの数が増えた

Npgsql4.09 の Visual Studio 2019 への追加は、こちらが参考になりました

NuGet のパッケージマネージャコンソールから、ここで記載されている Install-Package コマンドを入力
(VSアップデート後にインストールすると、エラーなくインストールできた)

んで、配布に必要だったDLLの一覧
(フツーにビルドすると実行ファイルの場所にコピーされます)

Npgsql.dll
System.Buffers.dll
System.Memory.dll
System.Numerics.Vectors.dll
System.Runtime.CompilerServices.Unsafe.dll
System.Threading.Tasks.Extensions.dll
System.ValueTuple.dll


2019/07/31

ソフトポーズ(自動ポーズ)のないガラホでソフトポーズを利用する方法

一定時間経過後にプッシュ信号を自動出力するソフトポーズ(,)
一部のガラホでは、電話帳登録時にメニューにポーズ(;)しか表示されず、登録ができない

現在のガラホの多くは、Androidなためソフトポーズ自体は標準で搭載しているらしく、リンクやQRコードから取り込んだソフトポーズは動作する機種がある - 京セラ KYF34 で確認

KYF34 後継機種の KYF37, KYF39 には電話帳登録時にメニューからソフトポーズ(自動ポーズ)を選択可能

表計算でカレンダーの開始日を取得

表計算でカレンダーの開始日を取得して、容易にカレンダーを作成

ExcelやGoogleスプレッドシートの場合 Weekday関数を利用して、第1日目の曜日を取得(日0~土6)して、差分を求めれば、カレンダー先頭の日付が確定

後は +1すれば一日加算されるのでカレンダーを埋めてやって、表示形式で日付だけを表示させる


Month関数でタイトルと同じ月かどうかを判断して、条件付き書式で背景色を変えることも可能

2019/07/30

Intel ネットワークドライバのインストールで、アップグレードをサポートしていません

オンボードもインテル製ネットワーク、PCIへ追加したネットワークカードもインテル製のマシンにて、オンボードのドライバをインストールさせて認識済み

ここで、PCIへ追加したネットワークカードのドライバをインストールしようとすると

インテル(R) ネットワーク・コネクション のInstaller 情報
インストールされているインテル(R) ネットワーク・コネクションはアップグレードをサポートしていません。このバージョンをインストールする前に、現在インストールされているバージョンをアンインストールしてください。
のメッセージが出て、インストールできない
先に入れたオンボード用のドライバを見つけて、アップグレードできないぜ、と言っているらしい

上記で OK を押して、インストールプログラムを終了させてしまうと、Tempディレクトリへ展開されたドライバが消されてしまうので、上記ウィンドウを閉じない(閉じたら、もう一度起動して)

Explorer でアドレスに %temp% と入力して、Tempディレクトリを開いて、ドライバの展開されたディレクトリを探す(今回は %temp%\1\RarSFX0\配下にあり)

デバイスマネージャーから、目的のネットワークカードのドライバ更新で、上のドライバが入ったディレクトリを指定してインストールすればよい
(インストール完了後、インテルのプログラムでOKを押せば、Temp内の一時ファイルは消されます)

2019/07/26

Delphi で String を HMAC-SHA1

Delphi で String を HMAC-SHA1 + Base64

uses へ IdCoderMIME, IdHMACSHA1 を追加して
function HMAC_SHA1_Str(S, Key: string): string;
var
    HmacSha: TIdHMACSHA1;
    Hash: TidBytes;
    Base64: TIdEncoderMIME;
begin
    HmacSha := TIdHMACSHA1.Create;
    Base64 := TIdEncoderMIME.Create;
    try
        HmacSha.Key := TIdBytes(TEncoding.UTF8.GetBytes(Key));
        Hash := HmacSha.HashValue(TIdBytes(TEncoding.UTF8.GetBytes(S)));

        Result := Base64.EncodeBytes(Hash);
    finally
        Base64.Free;
        HmacSha.Free;
    end;
end;