2019/11/21

Ubuntu18.04 の xRDP で接続後に Authentication is required to create a color managed device

Ubuntu18.04 デスクトップ環境(RDP接続)で接続後に

「Authentication is required to create a color managed device」

が表示される
キャンセルして先に進むことも可能だが、真面目に認証をくり返してると切断される


試してダメだった作業
  • /etc/xdg/autostart/gnome-software-service.desktop へ追記 → 変化なし
  • /etc/polkit-1/localauthority/50-local.d/allow-colord.pkla を作成 → 接続後すぐに切断される(認証を繰り返したのと同じ反応)

解決した作業
参考: https://c-nergy.be/blog/?p=12073

ファイル /etc/polkit-1/localauthority.conf.d/02-allow-colord.conf (新規作成)へ
polkit.addRule(function(action, subject) {
 if ((action.id == "org.freedesktop.color-manager.create-device" ||
 action.id == "org.freedesktop.color-manager.create-profile" ||
 action.id == "org.freedesktop.color-manager.delete-device" ||
 action.id == "org.freedesktop.color-manager.delete-profile" ||
 action.id == "org.freedesktop.color-manager.modify-device" ||
 action.id == "org.freedesktop.color-manager.modify-profile") &&
 subject.isInGroup("{users}")) {
 return polkit.Result.YES;
 }
 });
を記述(再起動など不要)

2019/11/15

Python + モデムを利用してPBXの留守番電話をオンオフ

PBXの留守電自動オンオフ設定が、あまりにしょぼいので、単独内線へつないだモデムから内線コマンドをダイヤルして、留守番電話をオンオフしてみた

PBXが弄れないとちょっとハードル高め

  • PBX側に留守番電話をオンオフするデータが入れてある
  • PBXの単独収容(一般電話機をつなぐポート)へモデムを繋げられる

Python でなければならない理由はほとんどないんだけど、cuコマンド+スクリプトでもできるかも
モデムの認識などはコチラとと同じ

下記では、内線531で留守電オン、530で留守電オフしてます
import time import serial import sys def rusuSwitch(state):     modem = serial.Serial("/dev/ttyACM0"9600timeout=3)     try:         modem.write(b'ATH1\r'# オフフック         time.sleep(1.5)         if state:             modem.write(b'ATD531\r'# 留守電ON         else:             modem.write(b'ATD530\r'# 留守電OFF         time.sleep(0.5)         modem.write(b'ATH0\r'# オンフック     finally:         modem.close() def main():     if len(sys.argv) >= 2:         rusuSwitch(sys.argv[1] == 'on')     else:         print('ON # rusuden.py on\r')         print('OFF# rusuden.py off\r') if __name__ == '__main__':     main()

2019/11/11

cloudatcost v1→v3 IPアドレス変更(Centos7)

Cloudatcost で v1 から v3 へ切り替えを行うと、データが新マシンへ転送されてIPアドレスが変更になり、SSH等が接続できなくなるので、Webコンソールからネットワークデバイスへ割り当てているIPアドレスやゲートウェイを変更しなければなりません (基本的にIPアドレスの再設定と同じです)


コンパネのWebコンソールからログイン

Centos7 の場合、下記のように nmcli コマンドを利用して変更を行う

デバイスとコネクションを確認
# nmcli d

DEVICE  TYPE      STATE      CONNECTION
ens33   ethernet  connected  System eth0
lo      loopback  unmanaged  --     

新しいIPを設定
# nmcli c modify "System eth0" ipv4.addresses xxx.xxx.xxx.xxx/24

ここで コネクション名(System eth0)へデバイス名(ens33)を指定したりすると
Error: unknown connection 'ens33'
のようなエラーとなる


新しいGWを設定
# nmcli c modify "System eth0" ipv4.gateway xxx.xxx.xxx.1

DNSを設定(必要であれば)
# nmcli c modify "System eth0" ipv4.dns 1.1.1.1

ネットワークを再起動して反映
# systemctl restart network

確認(デバイスを指定)
#nmcli d show ens33

※アプリケーションでリッスンアドレスなどへグローバルIPを設定しているところがあれば、それらも変更する

2019/11/08

VB.net の配列を宣言するときの引数は、最大添字

いまさらながら、VB.net の配列を宣言するときの引数は、最大添字
なんか違和感あるけど、昔からの仕様だからしようがない

MSの説明文からも、そうなっている

Dim Data As Byte() = New Byte(1023) {}
Data.length ' <= 1024
Data(0) ' <= min
Data(1023) ' <= max
Data(1024) ' <= error

2019/11/07

HP Pavilion 15-au100 のキーボードが盛り上がってきたので、バッテリー交換

HP Pavilion 15-au100 のキーボード(左上の方)が盛り上がってきたので、キーボードとパネルがぶっ壊れる前にバッテリー交換

交換に使用したのは下記のバッテリー
※ACで使うからバッテリー必要ない方は、外したままでも動作するかもしれません


膨らんだキーボードとパネル(写真では分かりにくい)


裏蓋の開け方はコチラを参考にドライバ(ネジ10本)とオープナーみたいなのがあれば楽です


もぅ、ムキムキのバッテリーは3箇所ネジ止め、ケーブルは上部のコネクタ一本


用意しておいたバッテリーと交換 → キーボードとパネルも元通り


2019/11/06

Evernote Sandbox は検索が動作しない

Evernote API で検索を試すため、Sandboxへ接続して NoteFilter の Words へ文字を入れてみたが、件数0で返ってくる(通常より時間がかかる)
後で確認したが、Web の Sandboxでも、検索を行うと(これも通常より時間がかかる)結果が0で返ってくる

Words へ文字列を入れずに、findNotesMetadata や findNotes を実行すると、ノートリストが返ってくる

途中のライブラリに問題があるのかと調べていたら、このフォーラム記事にたどり着く
記載通り、通常環境(Sandboxではない)で Developer Token を発行して試したところマトモに動いてしまう

フォーラムの記事からも既に3ヶ月以上経ってるし...
もぅ、やる気ないだろ Evernote

Thrift.Transport の HTTPClientImpl が見つからない

Thrift 絡みの Delphi アプリケーションで Thriftを改めてダウンロードしたら
Thrift.Transport.HTTPClientImpl(THTTPClientImpl) が見つからない

Thrift.Transport.WinHTTP.WinHTTPClientImpl(TWinHTTPClientImpl) へ変更されたらしい(Windowsの場合)

2019/11/05

PHS 終了スケジュール

PHS終了(公衆網)スケジュール

2019年07月末 公衆網 受付終了
2020年07月末 公衆網 音声サービス終了
2022年11月末 旧スプリアス規格設備(構内PHS旧設備)終了 → 新規格機器は継続利用可
2023年03月末 公衆網 テレメタリングプラン終了

構内PHS代替と問題
・SIPクライアント → バッテリーおよび省電力モードの問題
・sXGP(band39) → バンド対応端末、sim発行
・FMC → ランニングコスト、内線機能に制限

2019/10/29

82bts.com からダウンロードした zipファイルが破損している→エラー部分を取り除く


82bts.com からダウンロードした zipファイルが破損していたので、中身を覗いてみたらサイト側のエラーがファイルに入り込んでいたので削除

zipファイルをテキストエディタ(サクラエディタ)で開いて(バイナリエディタのほうがいいんだろうけど)
  1. PKより前にあるhtmlエラー部分を取り除く
  2. ファイル末尾もバイナリ部分が終わって、最初のhtmlタグ(<br />等)以降を取り除く
  3. 保存時に改行コードの混在はそのままにして保存(エディタによる)

2019/10/28

Android 7 (Nougat)以降で、RINGER_MODE_VIBRATE(マナーモード)へ切り替えようとするとクラッシュ

久々に Google Play へ登録したアプリを更新しようとしたら、targetSdkVersion は 26 以上、2019/11/1以降は 28 以上じゃないとアップできねーとか表示されて、ターゲットをあげた途端に色々動作しなくなったり強制終了するようになったのメモ

Android 7 (Nougat)以降で、RINGER_MODE_VIBRATE(マナーモード)へ切り替えようとすると値が AudioManager.RINGER_MODE_VIBRATE (値=1) の時のみエラーが発生
AudioManager AudioMan = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
AudioMan.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); // ←バイブレートはNG
//
AudioMan.setRingerMode(AudioManager.RINGER_MODE_SILENT);  // ←サイレントはOK
どうも、バイブレートへ切り替えるのに権限と確認が必要になったらしい

マニフェストへ
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
を加えて
モード変更の手前で、権限が得られていない場合に設定画面を表示させる記述を入れる
// Android7 以降 マナーモードへの権限設定(初回は設定画面が開く)
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !notificationManager.isNotificationPolicyAccessGranted()) {
    Intent setupIntent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
    startActivity(setupIntent);
}

// モード変更
AudioManager AudioMan = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
AudioMan.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);

Android 8 (Oreo) 以降で、透過Activityがクラッシュ

久々に Google Play へ登録したアプリを更新しようとしたら、targetSdkVersion は 26 以上、2019/11/1以降は 28 以上じゃないとアップできねーとか表示されて、ターゲットをあげた途端に色々動作しなくなったり強制終了するようになったのメモ

SdkVersionを上げたら、通知から読んでいた 透過Activityがクラッシュするようになった
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); // ←ここで既に落ちてる
        
}
どこから呼び出しても落ちるため、調べていたら 透過Activityで画面の向きを固定設定していると Oreoでクラッシュするという貴重な情報にたどり着く
<activity android:name=".HogeActivity"
    android:screenorientation="portrait"
    android:theme="@android:style/Theme.Translucent.NoTitleBar">
    <intent-filter>
        <action android:name="android.intent.action.MAIN">
    </action></intent-filter>
</activity>
のように
    android:screenOrientation="portrait" や
    android:screenOrientation="landscape"
と共に
    android:theme="@android:style/Theme.NoDisplay" や
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
が設定されているパターン

今回利用していた Activityは即座に終了するものだったので、回転設定を外しました

Android 8 (Oreo) 以降の通知生成

久々に Google Play へ登録したアプリを更新しようとしたら、targetSdkVersion は 26 以上、2019/11/1以降は 28 以上じゃないとアップできねーとか表示されて、ターゲットをあげた途端に色々動作しなくなったり強制終了するようになったのメモ

Oreo以降の通知登録、Notification.Builder へ setChannelId を追加と NotificationChannel の利用が必須へ

Android 8 (Oreo) 以降の通知生成
(わかりにくいので括弧で包んでます)

        // 通知をタップで起動するActivity
        Intent intent = new Intent(this, HogeActivity.class); // タップで呼ばれるActivity
        intent.putExtra("sendData", true); // Activityへ渡すデータ等(複数追加可)

        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        // 通知生成
        NotificationManager nManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        {
            Notification.Builder nbuilder = new Notification.Builder(this);
            {
                nbuilder.setPriority(Notification.PRIORITY_DEFAULT);
                nbuilder.setContentTitle("タイトル");
                nbuilder.setContentText("メッセージ");
                // nbuilder.setAutoCancel(true); // タップしたら解除
                nbuilder.setSmallIcon(R.drawable.ic_hogehoge); // アイコン
                nbuilder.setOngoing(true); // 削除不可
                nbuilder.setContentIntent(contentIntent);

                // 8(Oreo) API26 以降
                if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ) {
                    nbuilder.setChannelId("hogehoge_channgel_01");
                }
            }

            // 8(Oreo) API26 以降
            if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ) {
                NotificationChannel channel = new NotificationChannel("hogehoge_channgel_01", "hogehoge channel", NotificationManager.IMPORTANCE_HIGH); //Create Notification Channel
                channel.setDescription("Channel Description.");
                nManager.createNotificationChannel(channel);
            }

            nManager.notify(0/* 削除等に利用する番号 */, nbuilder.build()); // NotificationManagerに登録
        }

2019/10/11

Delphi の TSplitter がアレなので TSpTBXSplitter を使ってみる

Delphi の Splitterコンポーネント、サイズ変更のため使用するなら問題ないのだが、対象先がサイズ 0 になるような使い方の場合、スプリッタの移動やフォームのリサイズをきっかけに突然使用不能になったりする
適当なタイミングで、対象先とスプリッタ位置を修正したりしてみるが、対象がサイズ 0 の場合、位置関係がハッキリせず、問題が解消したりしなかったりと昔からイライラの素だったりした(現在も変わらない様子)

で、ちょうど入れていた SpTBX のスプリッタを使ってみたら、位置関係不明の状態があっさり解決
MinSizeプロパティの解釈が違うので、ソコだけ修正した

MinSize プロパティ
  • TSplitter は、この値未満になると対象のサイズが 0になる
    サイズを規制するには対象の Constraints で指定
  • TSpTBXSplitter では、この値未満にはスプリッタが移動しなくなる
    対象の Constraints 規制値が実行時に確認すると 0 にされてる
で、TSplitter の MinSize プロパティと同じ動きは
procedure TDocForm.SpTBXSplitter1Moved(Sender: TObject);
begin
    if (Panel1.Height < 30) then begin
        Panel1.Height := 0;
    end;
end;

procedure TDocForm.SpTBXSplitter1Moving(Sender: TObject; var NewSize: Integer; var Accept: Boolean);
begin
    Accept := (NewSize > 25);
end;
のように、OnMoving の Acceptに余裕をもたせて、OnMoved で閾値以下は 0 にする

2019/10/09

Delphi RTTI プロパティを再帰で取得

RTTIを用いて、プロパティの設定値をそのままファイルなどへ保存しようとしたが、項目がTFont等のクラスだったりすると中身を取得する必要があるので、再帰で取得
まぁ、できるにはできたんですが、Parent Child のような互いに参照する項目があると、循環が起きてしまうので、レベル(深さ)制限や除外リストなどが用途によって必要かもしれません
また、値がnilの項目は型を特定できないため、配下を参照できません(取得時には問題ないかも)

フォームへ Memo1(TMemo) と Button1(TButton)を貼り付けて、作成した ListProperties 関数で Button1 のプロパティを参照しています

uses へ System.Rtti を追加してください
procedure TForm1.Button1Click(Sender: TObject);
begin
    Memo1.Lines.Clear;
    ListProperties(Button1);
end;

procedure TForm1.ListProperties(Obj: TObject; Level: Integer = 0);
var
    RttiContext: TRttiContext;
    RttiType: TRttiType;
    RttiProp: TRttiProperty;
begin
    if (Obj = nil) then begin
        Exit;
    end;

    if (Level > 3) then begin
        // Exit;
    end;

    RttiContext := TRttiContext.Create;
    try
        RttiType := RttiContext.GetType(Obj.ClassInfo);
        for RttiProp in RttiType.GetProperties do begin
            Memo1.Lines.Add(StringOfChar(#9, Level) + RttiProp.Name + ': ' + RttiProp.PropertyType.ToString);

            // 除外
            if SameStr(RttiProp.PropertyType.ToString, 'TComponent') then Continue;
            if SameStr(RttiProp.PropertyType.ToString, 'TWinControl') then Continue;

            // tkClass は再帰
            if (RttiProp.PropertyType.TypeKind = tkClass) then begin
                ListProperties(RttiProp.GetValue(Obj).AsObject, Level + 1);
            end;
        end;
    finally
        RttiContext.Free;
    end;
end;

2019/10/07

Delphi の RTTI で record の情報取得(2/2)

Delphi の RTTI(Delphi 2010以降) とジェネリックスを利用して record 型の情報取得

昨日のコードは、取得するだけで書き込む事を考えてなかったので、その辺りを変更
Create時の引数からポインタを保持して、record そのものを変更しに行く
これで、record の型と値を放り込んだら、レジストリやIniFileやSQLへの書き込みや、読み込みが可能になるクラスが作れます

独自のクラスを保存したい場合、FieldType の TypeKind へ tkClass が入るので、
if (Value.AsObject is TMyClass) then のようにクラスを判定して処理したり、さらに再帰して中身を分離したりできそう

ところで、ジェネリックスで与えられた型を使って、汎用ポインタからキャストって出来ないんですかね
var D: T;
    P: ^T;
begin
    D := P^;
end;
みたいなのは OK ですが
var D: T;
    P: Pointer;
begin
    P := @D;
    D := T(P); // NG
    D := (P as T); // NG
    D := <T>(P); // NG
end;
みたいなのは、NGで一方通行なんです

昨日と似たコード(Value がプロパティに変更され、引数のカッコを変更)で、書き込みをしている
procedure TForm1.Button1Click(Sender: TObject);
var I: Integer;
    RecField: TRttiRecordField<TTestRecord>;
    TestRecord: TTestRecord;
    S, ValueStr: string;
begin
    TestRecord.Key := 'Hello';
    TestRecord.Value := 99;

    RecField := TRttiRecordField.Create(TestRecord);
    try
        for I := RecField.Count - 1 downto 0 do begin
            S := RecField.Name[I];

            case RecField.ValueType(I) of
                tkInteger:
                    ValueStr := IntToStr(RecField.Value[I].AsInteger);
                tkUString:
                    ValueStr := RecField.Value[I].AsString;
            else
                ValueStr := '[else]';
            end;

            if (S = 'Key') then begin
                RecField.Value[I] := 'Good Bye';
            end;

            Memo1.Lines.Add(S + ' = ' + ValueStr);
        end;
    finally
        RecField.Free;
    end;

    Memo1.Lines.Add(TestRecord.Key);
end;
以下 TRttiRecordField<T>
unit RttiRecordFieldUnit;

interface

uses Classes, RTTI, TypInfo;

type
    TRttiRecordField<T> = class
    private
        FRecData: T;
        PRecData: Pointer;

        FCtx: TRttiContext;
        FFields: TArray<TRttiField>;

        function GetValue(I: Integer): TValue;
        procedure SetValue(I: Integer; AValue: TValue);
        function GetName(I: Integer): string;
    public
        constructor Create(var ARecData: T);
        destructor Destroy; override;

        function Count: Integer;
        function ValueType(I: Integer): TTypeKind;
        property Name[I: Integer]: string read GetName;
        property Value[I: Integer]: TValue read GetValue write SetValue;
    end;

implementation

{ TRttiRecordField<T> }

constructor TRttiRecordField<T>.Create(var ARecData: T);
begin
    PRecData := @ARecData;
    // FRecData := ARecData;

    FCtx := TRttiContext.Create;
    FFields := FCtx.GetType(TRttiRecordField<T>).GetField('FRecData').FieldType.GetFields;
end;

destructor TRttiRecordField<T>.Destroy;
begin
    inherited;
    FCtx.Free;
end;

function TRttiRecordField<T>.Count: Integer;
begin
    Result := Length(FFields);
end;

function TRttiRecordField<T>.GetName(I: Integer): string;
begin
    Result := FFields[I].name;
end;

function TRttiRecordField<T>.ValueType(I: Integer): TTypeKind;
begin
    Result := FFields[I].FieldType.TypeKind;
end;

function TRttiRecordField<T>.GetValue(I: Integer): TValue;
begin
    Result := FFields[I].GetValue(PRecData);
end;

procedure TRttiRecordField<T>.SetValue(I: Integer; AValue: TValue);
begin
    FFields[I].SetValue(PRecData, AValue);
end;

end.

2019/10/06

Delphi の RTTI で record の情報取得(1/2)

Delphi 2010だったかで、機能追加された RTTI。 クラスなどのフィールド情報などを取得できる
( 2/2はこちら )

喜んで試してみたんだけど、class だけで record の情報は取得できない様子(できるのかもしれんが)
ただ、class メンバの record 型の情報は取れるので、ジェネリックスと絡めて record 型のメンバとデータを取得するクラスを作成してみた(後半のコード)

何がしたかったかというと、データ設定値などを record 型で作成して、レジストリやIniファイルへ保存するようなパターンで、フィールドが増えたときにいちいち保存や読込の所を修正しに行くのが面倒
TInifile を継承して、レコード型を渡すだけで、全て指定セクションに書き込んでちょ、みたいなのを最終的に利用できればよいと思う(SQLとのやりとりなんかにも)

Form1 に Button1 と Memo1 を貼って、TTestRecord のメンバと値を列挙する
(とりあえず String と Integer の例)

TRttiRecordField の Create で、型と実際の値を渡してやれば、あとはメソッドを呼び出すだけです
type
    TTestRecord = record
        Key: string;
        Value: Integer;
    end;

procedure TForm1.Button1Click(Sender: TObject);
var I: Integer;
    S: string;
    RecField: TRttiRecordField<TTestRecord>;
    TestRecord: TTestRecord;
begin
    TestRecord.Key := 'Hello';
    TestRecord.Value := 99;

    RecField := TRttiRecordField<TTestRecord>.Create(TestRecord);
    try
        for I := RecField.Count - 1 downto 0 do begin
            S := RecField.Name(I) + ' = ';

            case RecField.ValueType(I) of
                tkInteger:
                    S := S + IntToStr(RecField.Value(I).AsInteger);
                tkUString:
                    S := S + RecField.Value(I).AsString;
            end;

            Memo1.Lines.Add(S);
        end;
    finally
        RecField.Free;
    end;
end;
以下 TRttiRecordField クラス (書き込みに対応したコードは、こちら)
unit RttiRecordFieldUnit;
interface

uses Classes, RTTI, TypInfo;

type
    TRttiRecordField<T> = class
    private
        FRecordData: T;
        FCtx: TRttiContext;
        FFields: TArray<TRttiField>;
    public
        constructor Create(ARecordData: T);
        destructor Destroy; override;

        function Count: Integer;
        function ValueType(I: Integer): TTypeKind;
        function Name(I: Integer): string;
        function Value(I: Integer): TValue;
    end;

implementation

{ TRttiRecordField<T> }

constructor TRttiRecordField<T>.Create(ARecordData: T);
begin
    FRecordData := ARecordData;
    FCtx := TRttiContext.Create;
    FFields := FCtx.GetType(TRttiRecordField<T>).GetField('FRecordData').FieldType.GetFields;
end;

destructor TRttiRecordField<T>.Destroy;
begin
    inherited;
    FCtx.Free;
end;

function TRttiRecordField<T>.Count: Integer;
begin
    Result := Length(FFields);
end;

function TRttiRecordField<T>.Name(I: Integer): string;
begin
    Result := FFields[I].name;
end;

function TRttiRecordField<T>.ValueType(I: Integer): TTypeKind;
begin
    Result := FFields[I].FieldType.TypeKind;
end;

function TRttiRecordField<T>.Value(I: Integer): TValue;
begin
    Result := FFields[I].GetValue(@FRecordData);
end;

end.

2019/09/28

「日本の祝日カレンダー」てサイトの祝日がけっこう間違っている件

2020年 祝日 とかで 検索すると、上位に表示される「日本の祝日カレンダー」てサイトの祝日がけっこう間違っていたりする。
こういうサイトを上位に上げる Googleもどうかと思うよ

2019/09/28 現在の2020年祝日の間違っている箇所
まぁ、機械的にやってんだろうね

2019/09/19

確認番号や予約番号から ANA の eチケットやスキップサービスを利用

急な移動のため格安航空券を購入、メールで「確認番号」等が送られてきて、チケットは空港の自動チェックイン機で発券しろとの内容 → 事前に「eチケット」発行や会員情報に紐付けした手順

※ANA マイレージクラブのWeb会員になってることが前提です
(会員の方に頼んで eチケットを表示・印刷してもらうことは可能かも)
  1. ANA マイレージクラブへログインして、マイメニューを開く
  2. 予約確認から「予約確認・購入・変更」等を開く
  3. 「他の予約を検索する」を開く
    既に予約一覧に予約がある場合は、下の方にリンクがあります
  4. 必要項目を入力して検索すれば、予約詳細が表示される
  5. 予約詳細から「eチケット控」でQRコードの表示、「登場者情報」からマイレージ番号登録を行えば会員情報へ紐付けされてiCカードやFelica端末からのスキップサービスも利用可能となる(会員の予約一覧にも表示されるようになります)


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;

2019/07/25

Tasker 5.8 で HTTP Request の警告が通知される

Tasker 5.8 で HTTP(HTTPS) Get, Post, Head アクションを利用すると、警告の通知が表示される

HTTP Get, Post, Head アクションは、非推奨(廃止予定)になったので「HTTP Request」アクションを利用してください(HTTP Auth アクションも見てね)

との事
ひとまずは、STOP REMINDING で警告は停止でき、非推奨の HTTP(HTTPS) Get, Post, Head アクションも実行可能です

2019/07/19

phpでPEARを使わずに受信メールをデコード

php でメール内容を取得しようと思うと PEAR利用が一般的だが、ヘッダのみをフィルタにかけたり、テキストメールだけを処理したい場合の簡単デコード
  • マルチパートには対応してません
  • エンコードは、ISO-2022-JP(SJIS)とUTF-8メールのみ(必要なら追記して)
<?php

// データ取得
$data = file_get_contents('example.eml'); // ファイルから
// $data = file_get_contents("php://stdin"); // 標準入力から

// ヘッダと本文を分離(空行で)
if( ($i = strpos($data, "\n\n")) !== false ){ 
 $header = substr($data, 0, $i);
 $body = substr($data, $i + 2);
}else{
 $header = $data;
 $body = '';
}

// ヘッダデコード
if( ($headerArray = iconv_mime_decode_headers($header)) !== false ){
  print_r($headerArray);
}

// 本文デコード
if( array_key_exists('Content-Type', $headerArray) && (strpos($headerArray['Content-Type'], 'ISO-2022-JP') !== false) ){
 $body = mb_convert_encoding($body, 'SJIS', 'ISO-2022-JP');
 $body = mb_convert_encoding($body, 'UTF-8', 'SJIS');
}
print_r($body);

?>

2019/07/13

ドコモ ファミリー割引のグループ回線を確認

新規にファミ割グループを追加(子回線)した後、どこかで確認できないかと探し回ったメモ

マイドコモから

  • 主回線のマイドコモ料金確認から前月末時点での対象回線は確認可能
  • 設定後、料金確定までの対象回線は確認不可能 → 151 で確認しかなさそう

前月までの明細のお知らせ項目に記載されている

2019/07/03

PydioSync でログイン認証に失敗する

PydioSync で Authentication failed: please verify your login and password のメッセージが出てログイン認証に失敗してしまう


pydio 設置ディレクトリ(サーバ側)にある、 .htaccess を開いて
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
の行のコメントアウトを外して保存


#Following lines seem to be necessary if PHP is working
#with apache as CGI or FCGI. Just remove the #
#See http://doc.tiki.org/WebDAV#Note_about_Apache_with_PHP_as_fcgi_or_cgi
#RewriteCond %{HTTP:Authorization} ^(.*)
#RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
#Following lines may be necessary for a PHP-FPM setup
# to make sure that authorization is transmitted.
# Just remove the # at the beginning of the line
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1


上記変更でログインできるようになったものの、サーバ側の変更がローカルに反映されないんだけど...
ローカル→サーバはOK

2019/07/02

古いphpバージョンに固定した、さくらレンタルサーバへ pydio8 を php7.3 で動作させる

古いphpバージョンに固定された、さくらレンタルサーバで pydio8 をインストールして php7.3 で動作させた時のメモ

フツーにインストールするのはこちら

pydio8 をダウンロード(php7.2の修正を含む版)および設置
ここからは /home/USER/www/pydio8 をインストールディレクトリとして話を進めます

インストールディレクトリへ
session 保存ディレクトリを作成
ssh 等から $ mkdir _sessions とか

.user.ini を作成
post_max_size = 1024M
upload_max_filesize = 1024M
session.save_path="/home/USER/www/pydio8/_sessions" ←上で作成したディレクトリ

php.cgi を作成(利用したい php バージョンを指定)
#!/bin/sh
exec /usr/local/php/7.3/bin/php-cgi

.htaccess へ下記を追記
Action myphp-script /pydio8/php.cgi
AddHandler myphp-script .php .html
※ここで指定する php.cgi のパスはフルパスではなく Webで開くURLのパス部分になります

言語指定(日本語環境で利用する場合)
/home/USER/www/pydio8/conf/bootstrap_conf.php に
define("AJXP_LOCALE", "ja_JP.UTF-8");
を記述
//define("AJXP_LOCALE", ""); の下辺りへ

DBの作成
さくらのコントロールパネルから、新規作成(host, user, pass をメモっておく)

index ファイル設定変更
さくらのコントロールパネル → ファイルマネージャーから
/pydio8/ の アクセス設定で index.php を開くようにする

ここまでで下準備完了

Web から /pydio8/ へ接続して、admin ユーザーやDBを設定

完了したところで Permission エラーが出る → .htaccess が書き換えられているので
書きをもう一度行う

.htaccess へ下記を追記
Action myphp-script /pydio8/php.cgi
AddHandler myphp-script .php .html

index ファイル設定変更
さくらのコントロールパネル → ファイルマネージャーから
/pydio8/ の アクセス設定で index.php を開くようにする

2019/06/28

samba で別ユーザーのホームディレクトリへアクセス

smb で別ユーザーのホームディレクトリへアクセス

userA のホームディレクトリへ、userB や userC でも smbでアクセスする例

/etc/samba/smb.conf
[FolderName]
        path = /home/userA
        browsable = No
        read only = No
        writable = Yes
        valid users = userB, userC
        force user = userA

2019/06/18

ZTE blade e01 / freetel priori3 でシステムアップデートが暴走してデータ通信過多

ZTE blade e01 / freetel priori3 でシステムアップデートが暴走してデータ通信異常に行われているとか

ココココに対応方法が書いてあるけど、ホンマかいな、って内容

  1. 電源オフ
  2. SIMカードを抜いて、再度差し込む
  3. 電源オン
  4. 機内モードにする
  5. Wi-FiをONにする
  6. 機内モード解除

「開発者向けオプション」から「自動システムアップデート」をオフや
「アプリ」から更新プログラムを無効にする
ではダメなんだろうか

2019/06/13

RTV700 で ISDNの発信者番号を設定

ヤマハ RTV700 で ISDN の発信者番号を設定
isdn local address コマンドを使うが、この時のインターフェイス名は nt-bri1 等

isdn local address nt-bri1 03xxxxxxxx

2019/05/31

Adhell で利用可能な Knox キーが発行できなくなった

2019年4月頃から、Adhell で利用可能なキーが発行できない状態

キーがまだ有効な方は、Adhell から KLMS Agent (com.samsung.klmsagent) を無効にしておくことで、キーの有効期限が切れた後も、初期化等を行わなければ引き続き Adhell が利用可能

有効期限が切れた状態で Adhell を起動してしまうと Adhellの機能が無効となってしまいます



同様の機能がある Package Disabler Pro には一覧に上記が表示されませんので、KLMS Agent を無効化できません
adb から com.samsung.klmsagent の無効化が成功するかどうかは不明です

2019/05/22

Python の引数デフォルト値に計算式入れて失敗

引数に時間を入れなければ現在の時間、と思って下記のような関数を書いて失敗

def addFile(s, nowTime = datetime.datetime.now()):
この場合、最初の関数生成時にデフォルト値が生成されるそうで、ずっと最初に呼び出した値(時刻)が使われ続けた

None等で対応するそうです
def addFile(s, nowTime = None): if nowTime is None: nowTime = datetime.datetime.now()


samba で認証なしのディレクトリを作成

sambaで認証なしのディレクトリ作成メモ

[global]セクションで security = user となっているとユーザー認証ありき、しかし認証かけてるディレクトリはいじりたくないので、 map to guest = bad user を追加して、登録されてないユーザは guest扱いとする

今回対象の [test] セクションで guest ok = Yes として、書き込み可能等それ以外の項目を設定する(下の例では、書き込みは禁止)

/etc/samba/smb.conf
[global]
        workgroup = WORKGROUP
        netbios name = TestSrv
        server string = Samba server version %v

        security = user
        passdb backend = tdbsam

        printing = cups
        printcap name = cups
        load printers = yes
        cups options = raw

        map to guest = bad user

#       map untrusted to domain = Yes

[test]
        path = /opt/test
        browsable = Yes
        read only = Yes
        writable = No
        guest ok = Yes


2019/05/16

Visual Studio 2019 で MFC アプリをビルドで afxwin.h が見つかりません

Visual Studio 2019 で MFC アプリをビルドで afxwin.h が見つかりません

Visual Studio Installer から Visual Studio 2019 に入り、C++によるデスクトップ...
「ビルドツール用 MFCほにゃほにゃ」にチェックを入れてインストールする(+1GB程度)

2019/05/09

Reply-To ヘッダ書き換えによるメール詐欺の仕組み

Reply-To ヘッダを偽ドメインへ書き換えたメールによる詐欺の仕組み
以下の手法で、メール内容を書き換えられ請求と共に振込先が変わったということで詐欺にあったという報告
互いに相手に返信していたと思われたが、似たドメインの犯人へ返信し、犯人はそれを書き換えて相手へ送っていた
最初の偽装がメール漏れによるものか、全くの新規から始まったものかは調査中

2019/04/26

Explorer でフォルダを開いてファイルを選択(既に開かれている場合は再利用) - Delphi

Windows Explorer でフォルダを開いてファイルを選択、これは通常の explorer.exe /select, オプションで実現可能ですが、既にフォルダが開かれている場合、そっちを再利用したい

参考文献

uses 節に FileCtrl, ShlObj, ActiveX が無ければ追加
function OpenFolderAndSelectFile(FileName: string): boolean;
var
    DidInitCOM: boolean;
    IIDL: PItemIDList;
begin
    Result := False;
    DidInitCOM := False;
    try
        IIDL := ILCreateFromPath(PChar(FileName));
        if (IIDL <> nil) then
            try
                Result := (SHOpenFolderAndSelectItems(IIDL, 0, Nil, 0) = S_OK);
            finally
                ILFree(IIDL);
            end;
    finally
        if DidInitCOM then
            CoUninitialize;
    end;
end;

VoIP GW - ODトランク接続の結線とメーカー別(NEC, 日立, ナカヨ)端子名称

専用線等で使われるODトランクの結線と共にメーカー(NEC, 日立, ナカヨ)ごとに名称がバラバラなのでまとめてみた

VoIP GWへRJ45(A結線)接続した場合のPBX側端子名称
PBX側VoIP GW側
日立ナカヨNECRJ45信号NECナカヨ日立
SSBBSB1(緑白)SGGSRB
SSASSM2(緑)ESRSRA
TBSL24WS(ring)3(橙白)4WR(ring)RL2RB
RBRL24WR(ring)4(青)4WS(ring)SL2TB
RARL14WR(tip)5(青白)4WS(tip)SL1TA
TASL14WS(tip)6(橙)4WS(tip)RL1RA
SRASRE7(茶白)MSSSSA
SRBGSG8(茶色)SBBSSB
※VoIP GW 側は、日立であれば NTシリーズ, NECであれば IP-Masterシリーズ等です
※アース起動の場合、PBXによってSSB-SRB間にジャンパーが必要です


一般的にPBX側はクイックコネクタですが、両端が RJ45の場合、SS ⇔ SR, R ⇔ S の上り下りが逆になるように接続

2019/04/19

Webフォームからの spam対策 - javascript

Webフォームからの広告入力対策

その1 - URL入力禁止
<script type="text/javascript">

 function checkUrl(form){
  for(var i=0; i < form.children.length; i++){
   if( form.children[i].nodeName.toUpperCase() === 'TEXTAREA' ){
    var urlCount = (form.children[i].value.match(/http(s)?:\/\//g)||[]).length;
    if( urlCount > 0 ){
     alert("テキストエリアにURLは記載できません");
     // form.children[i].value = '';
     return false;
    }
   }
  }
  return true;
 }

</script>
スクリプトを追加して、フォームのonsubmit へ checkUrl を記載
例) <form onsubmit="return checkUrl(this);">

その2 - コピペ禁止
<script type="text/javascript">

 window.onload = function(){
  document.body.onpaste = function(){
   alert("このページはペーストが禁止されています");
   return false;
  }
 }

</script>

2019/04/18

ImportXML関数に XPath をコピペしても #N/A になる原因と対策(Google スプレッドシート)

Google スプレッドシートで他サイトの情報を取得する(スクレイピングって言うの?)のに便利な ImportXML 関数

よくある解説には、
Chrome なら 右クリック→検証
取得したいエレメントで Copy → Copy XPath で得られた値の ダブルコーテーションをシングルに置き換えて、=ImportXML(url, xpath)
とやれば、ホラ簡単!
みたいなのがあるけど、ほとんど取得できねぇ~~~~~~~  #N/A

ということで原因と対策を調べてみた
ここでは、とあるサイトの値を取得するというよくあるパターン

最初に問題となるのは、取得するサイトの文字コードが UTF-8 ではない場合
これは、相手の問題なので今回はあきらめる

次に今回の本題 XPath の値がなぜ流用できないか、というか面倒なので流用したい
XPathは、主にソース固有の場所(id等は一意なので)からの相対パスとなる

該当部分のHTMLソース

ソースを見ると
div[id='cnt01']→div[の1番目]→table[の1番目]→tr[の2番目]→td
となっている

デベロッパーツールのエレメント構成

ここで得られる XPath の情報(コーテーションは変更済み)

//*[@id='cnt01']/div[1]/table[1]/tbody/tr[2]/td

このまま ImportXML へ貼り付けても そんなんありません(#N/A)となるが
//*[@id='cnt01']/div[1]/table[1]/tbody/tr[2]/td
//*[@id='cnt01']/div[1]/table[1]/tbody/tr[2]
//*[@id='cnt01']/div[1]/table[1]/tbody
//*[@id='cnt01']/div[1]/table[1]
と上位へ変更してみると、突然表示されはじめるポイントがある
(もぅ、お気づきでしょう。というか画像に答え書いてあるけど)

デベロッパーツールで表示されるエレメントツリーは、ソースで省略されたタグを補完して正しい形にしたものです(こういうライブラリを用いて修正したりする)
したがって、上記例では tbody が補完されているため、そのまま XPath を利用しようとしても、そんなエレメントありませんとなるワケです

上記の例では tbody を取り去った下記の表記が答えとなります

//*[@id='cnt01']/div[1]/table[1]/tr[2]/td

つまり、ソースコードをベースに記述しなければならない ということです

2019/04/15

GOM Player 終了時のブラウザ広告を止める

GOM Player が終了時に既定のブラウザで広告を表示するようになった

レジストリを調べると広告を表示した時刻を Unixtime で記録して、この値が24時間以上(たぶん)古いと広告を出しているようなので、値を未来へ変更
※そのうち対策される可能性があります

レジストリの変更手順
  1. ファイル名を指定して実行(Win+R)で regedit を入力、レジストリエディタを起動
  2. \HKEY_CURRENT_USER\Software\GRETECH\GomPlayer を開く
  3. EndingBrowser の値を 10進数で 1735657200 (2025/1/1)等の未来に設定


2019/04/12

Python のキーワード引数へ変数を使う

Python のキーワード引数へ変数を使いたい
→ 辞書(dict)を利用して、連想配列のような形で渡す

def main(): option1 = 100 option2 = 200 options = {'opt1': option1, 'opt2': option1} test('Test', **options) # や test('Test', **{'opt1': option1, 'opt2': option2}) def test(s, *, opt1=1, opt2=2): print(s) print(opt1) print(opt2) print('')

Python3 シリアルポートでATコマンドを使う

centos7 上で、Python3 でシリアルポートのモデム(実際はUSBポートに接続した Omron ME5614U2)へATコマンドを実行

デバイスの確認
/dev で ls
Omron ME5614U2 をUSBポートへ差し込んだら認識してました
/dev/ttyACM0 ←これ

pyserialのインストール
# pip install pyserial
とか
# pip3 install pyserial

python3コード
import serial ser = serial.Serial('/dev/ttyACM0', baudrate=9600, timeout=3) ser.write(b"AT\r") print(modem.readline().decode(encoding='utf-8')) print(modem.readline().decode(encoding='utf-8')) ser.close()
※python3からバイト列でやり取りするようになっているので、変換が必要です

readline ではなく read を使用した場合、引数の timeout は、read() で指定するサイズ(16byte)に到達しなくても、readが発生する時間(sec)です。read に貯まっているサイズを取得する inWaiting() を監視して、都度取得することも可能です

2019/04/11

コンビニで貯められるポイントと還元率

コンビニで貯められるポイント(利用可能なポイントカード)と還元率 - 2019-04-11
楽天ポイントTポイントdポイントWAON
ポイント
WAON
POINT
Pontananaco
セブン-イレブン------1.00%
ファミリーマート0.5%0.5%0.5%----
ローソン--1.0%--1.0%-
ミニストップ---0.70%0.5%--
サークルKサンクス1.0%------
ポプラ1.0%------
スリーエイト1.0%------
色→要決済2019/11以降
※レシートポイント、クレジットカード一体型やポイントアップ制度によるポイントアップ等は反映してません

私は、ポイントが貯まったと実感するほどコンビニで買物しないのですが、いずれも切り捨てのため、0.5%は200円未満, 1.0%は100円未満では購買によるポイントがそもそも付与されなかったりします。
したがって、1%還元の店で 10万円使っても 1,000ポイント貯まる可能性は限りなく低くなります。
クレジットカード決済のポイントとあわせるとか、他で貯まったポイントを利用できるという意味ならあるかもしれませんが...