宿泊施設向けスマートロック自動設定ツール(完全無料)

スマートロックのSwitchBotロックを使って、宿泊者用の暗証番号の自動設定&メール文章作成できるツールをリリースしました。(完全無料!)
※特に民泊(Airbnb Vrbo adodaなど)の鍵の受け渡しに最適です!

使い方は非常にシンプルで、SwitchBotロックアプリから取得できるトークンとクライアントシークレットを入力すると、登録済みのロック一覧が出てくるので、設定したいデバイスを選択して、宿泊する日時などを選ぶと自動的にメールの文章とかも作成してくれます!

スマートロックと自動連携されているので、アプリを開いて設定などの手間がなくなります

We have released a tool that allows you to automatically set PIN numbers and create emails for guests using the SwitchBotLock. (Completely free!)

・スイッチボットロック 予約自動設定ツール(SwitchBotLock Access Code Creation & Email)

https://medicalfields.jp/switchbot/

※ホテル・旅館・民泊・病院などにもオススメ!

ぜひご利用ください!

Amazonのリンク

SwitchBot スマートロック プロ 指紋認証パッド

・SwitchBot スマートロック プロ 指紋認証パッド 暗証番号 – スイッチボット 鍵 スマートキー オートロック ドアロック 玄関 スマートホーム Alexa Google Home Siriに対応 遠隔対応 工事不要 取付カンタン 防犯対策 後付け

SwitchBot スマートロック 指紋認証パッド

・SwitchBot スマートロック 認証パッド セット Alexa スマートホーム スイッチボット オートロック 暗証番号 玄関 Google Home Siri LINE Clovaに対応 遠隔対応 工事不要 取付カンタン 防犯対策

VMware の 新規インストール時にerror 2755 で失敗する時の解決方法

Vmware playerの新規インストールで謎のエラーが出て失敗した。

「指定されたデバイスまたはファイルを開けません」

そのあとに
エラーコード:2755
「The installer has encountere an unexpected error installing this package. This may indicate a problem with this package. The error code is 2755.」
と出る

再起動しても、C++再配布パッケージをアンインストールしても、何をしても解決できなかった。

これ、調べると、どうもTempファイルのインストーラーのパーミッションがおかしくて、VMwarePlayer.msiにアクセスできなくて、インストールに失敗してるぽい。
なので、

Vmwareのインストーラーを起動して途中の段階([WMware Wrokstation 17 Playerセットアップウィザードへようこそ]の画面)で

Win + Rの「ファイル名を指定して実行」で

%temp%

から

{99A6B581-0FA3-4E1B-BD84-E796FE26E41D}~setup
の中にある
VMwarePlayer.msi

のファイルを見つけ出して、違う場所に移動。

そのあとに、VMwarePlayer.msiを直接実行させると無事にインストールできました。

めちゃくちゃ悩んだので一度試してください。

Failed to download metadata for repo ‘mariadb-maxscale’がでて、yum updateができないとき

yum updateをしたときに

Errors during downloading metadata for repository ‘mariadb-maxscale’:
– Status code: 404 for

Error: Failed to download metadata for repo ‘mariadb-maxscale’: Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried

が出た

どうもrepositoryがなんかおかしそう

だから

/etc/yum.repos.d/mariadb.repo

baseurl = https://dlm.mariadb.com/repo/maxscale/latest/yum/rhel/8/x86_64

から

baseurl = https://downloads.mariadb.com/MaxScale/2.4/centos/$releasever/$basearch

に変更したら解決しました!

CentOS8のupgradeでCurl error (37)が出る場合の対処

CentOS8 Stream の dnf upgradeで

Curl error (37): Couldn’t read a file:// file for file:///etc/pki/rpm-gpg/MariaDB-Server-GPG-KEY [Couldn’t open file /etc/pki/rpm-gpg/MariaDB-Server-GPG-KEY]
The downloaded packages were saved in cache until the next successful transaction.
You can remove cached packages by executing ‘yum clean packages’.

がでた

RPM KEYをインポートしたら治ります!

rpmkeys --import https://downloads.mariadb.com/MariaDB/RPM-GPG-KEY-MariaDB

NginxのSSLでブラウザでは問題ないのにPythonのrequestsでSSLErrorが出た

弊社のソフトウェアはpythonのrequestsでSSL通信を行っているが、今回証明書を更新するタイミングでssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failedが出て焦った。

これ原因は中間証明書にあります!

例えばアルファSSLだとG2の有効期限は2024-02-20で、G4は2027-10-12までで、私は2027年までのG4の証明書だけをPEMにして入れたらいいと思ってました。

これ違います!

実は中間証明書は階層構造になっていて、G2の証明書とG4の証明書の両方が必要になります!

https://info-globalsign.com/news/20221108

なので

NG:

—–BEGIN CERTIFICATE—–
Your CRT
—–END CERTIFICATE—–
—–BEGIN CERTIFICATE—–
MIIEijCCA3KgAwIBAgIQfU1CqStDHX5kU+fBmo1YdzANBgkqhkiG9w0BAQsFADBX
MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UE
CxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIyMTAx
MjAzNDk0M1oXDTI3MTAxMjAwMDAwMFowTDELMAkGA1UEBhMCQkUxGTAXBgNVBAoT
EEdsb2JhbFNpZ24gbnYtc2ExIjAgBgNVBAMTGUFscGhhU1NMIENBIC0gU0hBMjU2
IC0gRzQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtJCmVZhWIPzOH
A3jP1QwkuDFT8/+DImyZlSt85UpZwq7G0Sqd+n8gLlHIZypQkad5VkT7OLU+MI78
lC7LVwxpU19ExlaWL67ANyWG8XHx3AJFQoZhuDbvUeNzRQyQs6XS5wN6uDlF0Bf1
AtCUQWrGGLGYwyC1xTrzgrFKpESsIXMqklUGTsh8i7DKZhRUVfgrPLJUkbbLUrLY
42+KRCiwfSvBloC5PgDYnj3oMZ1aTe3Wfk3l1I4D3RKaJ4PU1qHXhHJOge2bjGIG
l6MsaBN+BB2sr6EnxX0xnMIbew2oIfOFoLqs47vh/GH4JN0qql2WBHfDPVDm3b+G
QxY6N/LXAgMBAAGjggFbMIIBVzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYI
KwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYE
FE/LrKjC76vdg29rv86YPVxYJXYVMB8GA1UdIwQYMBaAFGB7ZhpFDZfKiVAvfQTN
NKj//P1LMHoGCCsGAQUFBwEBBG4wbDAtBggrBgEFBQcwAYYhaHR0cDovL29jc3Au
Z2xvYmFsc2lnbi5jb20vcm9vdHIxMDsGCCsGAQUFBzAChi9odHRwOi8vc2VjdXJl
Lmdsb2JhbHNpZ24uY29tL2NhY2VydC9yb290LXIxLmNydDAzBgNVHR8ELDAqMCig
JqAkhiJodHRwOi8vY3JsLmdsb2JhbHNpZ24uY29tL3Jvb3QuY3JsMCEGA1UdIAQa
MBgwCAYGZ4EMAQIBMAwGCisGAQQBoDIKAQMwDQYJKoZIhvcNAQELBQADggEBABol
9nNkiECpWQenQ7oVP1FhvRX/LWTdzXpdMmp/SELnEJhoOe+366E0dt8tWGg+ezAc
DPeGYPmp83nAVLeDpji7Nqu8ldB8+G/B6U9GB8i2DDIAqSsFEvcMbWb5gZ2/DmRN
cifGi9FKAuFu2wyft4s4DHwzL2CJ2zjMlUOM3RaE1cxuOs+Om6MCD9G7vnkAtSiC
/OOfHO902f4yI2a48K+gKaAf3lISFXjd32pwQ21LpM3ueIGydaJ+1/z8nv+C7SUT
5bHoz7cYU27LUvh1n2WSNnC6/QwFSoP6gNKa4POO/oO13xjhrLRHJ/04cKMbRALt
JWQkPacJ8SJVhB2R7BI=
—–END CERTIFICATE—–

OK:

—–BEGIN CERTIFICATE—–
Your CRT
—–END CERTIFICATE—–
—–BEGIN CERTIFICATE—–
MIIGVDCCBTygAwIBAgIMCJEO0BA+aoDxjYPKMA0GCSqGSIb3DQEBCwUAMEwxCzAJ
BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMSIwIAYDVQQDExlB
bHBoYVNTTCBDQSAtIFNIQTI1NiAtIEc0MB4XDTIzMDIxMjEyNTAxN1oXDTI0MDMx
NTEyNTAxNlowHTEbMBkGA1UEAwwSKi5tZWRpY2FsZmllbGRzLmpwMIIBIjANBgkq
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm48J3rSAZWccx0w+43wR6LaAG6CiECmf
fGBlqNbzojoDlNM+aEIiNvYKspkxQhu1C+pZJ1wfHHqR7Zir+km7I9e+tXuP8pGA
T7gkxFGgPCB3xEQZ51kp105idV7mVdIwS7FGgHeetboCZDty+KqXc3SzUCdXKAyO
YCQQN9i0UI6PZ2zvBm5QMWDTzFQyYPld04ACABPEH7k6uK5arXkt7rZKOjHhDc8Q
bhf6XkGwX5qdG8Db9/MkqsgZ1PdkvOKkFR1vv/5QOslMGopatq1E15hqCGfB+541
Cgcua6oG/AdL9nMPTXkw0+cNKewYKXSATr5E21+ZaIFDpAJpSAecSwIDAQABo4ID
YzCCA18wDgYDVR0PAQH/BAQDAgWgMIGTBggrBgEFBQcBAQSBhjCBgzBGBggrBgEF
BQcwAoY6aHR0cDovL3NlY3VyZS5nbG9iYWxzaWduLmNvbS9jYWNlcnQvYWxwaGFz
c2xjYXNoYTI1Nmc0LmNydDA5BggrBgEFBQcwAYYtaHR0cDovL29jc3AuZ2xvYmFs
c2lnbi5jb20vYWxwaGFzc2xjYXNoYTI1Nmc0MFcGA1UdIARQME4wCAYGZ4EMAQIB
MEIGCisGAQQBoDIKAQMwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFs
c2lnbi5jb20vcmVwb3NpdG9yeS8wCQYDVR0TBAIwADBBBgNVHR8EOjA4MDagNKAy
hjBodHRwOi8vY3JsLmdsb2JhbHNpZ24uY29tL2FscGhhc3NsY2FzaGEyNTZnNC5j
cmwwLwYDVR0RBCgwJoISKi5tZWRpY2FsZmllbGRzLmpwghBtZWRpY2FsZmllbGRz
LmpwMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAfBgNVHSMEGDAWgBRP
y6yowu+r3YNva7/OmD1cWCV2FTAdBgNVHQ4EFgQUAXsU+ABU/dt1i/xKq0JNwrQs
ghswggF+BgorBgEEAdZ5AgQCBIIBbgSCAWoBaAB2AEiw42vapkc0D+VqAvqdMOsc
UgHLVt0sgdm7v6s52IRzAAABhkWtNUQAAAQDAEcwRQIhAPgamklBv6V/FsBj0x3J
JwP88Kg/d+grzVMlEIgs+o7TAiA+PoRMp+m6L9lWicyBtHHgcUn8mvKcrxVRJF4f
rJt6jwB1AO7N0GTV2xrOxVy3nbTNE6Iyh0Z8vOzew1FIWUZxH7WbAAABhkWtNhsA
AAQDAEYwRAIgbk9SKl405qzjKBxrojOfA5BaaiQTUDMGAXnM5wqAzYcCIBciIXnd
GfCET5allakjTSz8RSdFjQI0W7+/1iRk5LLvAHcA2ra/az+1tiKfm8K7XGvocJFx
bLtRhIU0vaQ9MEjX+6sAAAGGRa0zmAAABAMASDBGAiEA4ekNPp+uSlKHIYxs2XR/
w09GCv04P55jRHQQSORpps4CIQC7qG0qhsPhnLK+t6hJEvXZi7AJ2NYPxtc5nGWZ
JOBKWTANBgkqhkiG9w0BAQsFAAOCAQEAMzxtntb/K0oJWUf6j0NsIMK6oIIKsUou
HRTesA0jjFYGWDAXXom6pNBkQK5I/EkU/TNdhvLRSwJD4u1BAuqpp/p2uvQQdzOI
Cvf1sA9yNRomHvay0hkLw3XU6Va4mPHWfvKkFXtrl+0I1MDZBBYbYD03IpBV8XrY
2YiSOMIbKZXLIZUHz0Pt7jitj4nvrO0ijWogoU1aHjEK0qWKlFgg73nZtB0gTOQk
JyLYlJe+xswXl1LJaPXKH29yo2DaUI1BA7zVD0Hxw8vzer7siImWQ3FgVE5yrYRp
+fN5yMgOAPYqXWvcS6ndLGe9kaGSpLpfo6sNlAnR786ZV84/tAQCeQ==
—–END CERTIFICATE—–
—–BEGIN CERTIFICATE—–
MIIEijCCA3KgAwIBAgIQfU1CqStDHX5kU+fBmo1YdzANBgkqhkiG9w0BAQsFADBX
MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UE
CxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIyMTAx
MjAzNDk0M1oXDTI3MTAxMjAwMDAwMFowTDELMAkGA1UEBhMCQkUxGTAXBgNVBAoT
EEdsb2JhbFNpZ24gbnYtc2ExIjAgBgNVBAMTGUFscGhhU1NMIENBIC0gU0hBMjU2
IC0gRzQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtJCmVZhWIPzOH
A3jP1QwkuDFT8/+DImyZlSt85UpZwq7G0Sqd+n8gLlHIZypQkad5VkT7OLU+MI78
lC7LVwxpU19ExlaWL67ANyWG8XHx3AJFQoZhuDbvUeNzRQyQs6XS5wN6uDlF0Bf1
AtCUQWrGGLGYwyC1xTrzgrFKpESsIXMqklUGTsh8i7DKZhRUVfgrPLJUkbbLUrLY
42+KRCiwfSvBloC5PgDYnj3oMZ1aTe3Wfk3l1I4D3RKaJ4PU1qHXhHJOge2bjGIG
l6MsaBN+BB2sr6EnxX0xnMIbew2oIfOFoLqs47vh/GH4JN0qql2WBHfDPVDm3b+G
QxY6N/LXAgMBAAGjggFbMIIBVzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYI
KwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYE
FE/LrKjC76vdg29rv86YPVxYJXYVMB8GA1UdIwQYMBaAFGB7ZhpFDZfKiVAvfQTN
NKj//P1LMHoGCCsGAQUFBwEBBG4wbDAtBggrBgEFBQcwAYYhaHR0cDovL29jc3Au
Z2xvYmFsc2lnbi5jb20vcm9vdHIxMDsGCCsGAQUFBzAChi9odHRwOi8vc2VjdXJl
Lmdsb2JhbHNpZ24uY29tL2NhY2VydC9yb290LXIxLmNydDAzBgNVHR8ELDAqMCig
JqAkhiJodHRwOi8vY3JsLmdsb2JhbHNpZ24uY29tL3Jvb3QuY3JsMCEGA1UdIAQa
MBgwCAYGZ4EMAQIBMAwGCisGAQQBoDIKAQMwDQYJKoZIhvcNAQELBQADggEBABol
9nNkiECpWQenQ7oVP1FhvRX/LWTdzXpdMmp/SELnEJhoOe+366E0dt8tWGg+ezAc
DPeGYPmp83nAVLeDpji7Nqu8ldB8+G/B6U9GB8i2DDIAqSsFEvcMbWb5gZ2/DmRN
cifGi9FKAuFu2wyft4s4DHwzL2CJ2zjMlUOM3RaE1cxuOs+Om6MCD9G7vnkAtSiC
/OOfHO902f4yI2a48K+gKaAf3lISFXjd32pwQ21LpM3ueIGydaJ+1/z8nv+C7SUT
5bHoz7cYU27LUvh1n2WSNnC6/QwFSoP6gNKa4POO/oO13xjhrLRHJ/04cKMbRALt
JWQkPacJ8SJVhB2R7BI=
—–END CERTIFICATE—–

としましょう

Material ColorのIllustratorのSwatchesのダウンロード

マテリアルデザインのカラーのスウォッチがGoogle公式サイトからダウンロードできなくなっています。

公式サイト→https://material.io/design/resources/color-palettes.html

こちらからダウンロードできます。

ダウンロード

【 https://medicalfields.jp/uploads/color-swatches.zip 】

どうぞ使ってください。

CentOS Stream 8にアップグレードしたらnginxのstatusがactive(running)なのに何も表示されない

タイトルそのままです。

めちゃんこ悩んだ

なんと、アップデートしたら勝手にNginxの設定ファイルがリネームされてた。

自分のケースでは

/etc/nginx/conf.d/default.conf

/etc/nginx/conf.d/default.conf.rpmsave

にリネームされてた。

設定ファイルがないなら動かないよね。

あと、Nginxのtmpフォルダ(fastcgi)の位置が変わってた

古いのは

/var/cache/nginx

新しいのは

/var/lib/nginx/tmp

なので

/var/lib/nginx/ にパーミッション許可を与えましょう

そうしないと

open() “/var/lib/nginx/tmp/fastcgi/x/xx/0000000007” failed (13: Permission denied) while reading upstream, client: xxx.xxx.xxx.xxx, server: _, request: “POST /xxx.php HTTP/1.1”, upstream: “fastcgi://unix:/var/run/php-fpm/php-fpm.sock:”, host:xxx

と出て、メモリに入り切らない処理が出たときにTMPに書き込みできずエラーになります。

さらに、index.htmlが上書きされてました。

修正しましょう。

 

For English User.

After upgrading to CentOS Stream 8, the status of nginx is active(running), but nothing is displayed.

Solution!

After updating, the Nginx configuration file was renamed.

In my case

Original

/etc/nginx/conf.d/default.conf

Renamed

/etc/nginx/conf.d/default.conf.rpmsave

Just Rename to original Filename….

 

Android Q (API:29)以上でgetExternalStorageDirectoryに保存ができない

Googleさんのポリシーの変更によりファイルの書き込みや読み込みの権限が厳しくなった

一応暫定処理でAndroidManifest.xmlに

android:requestLegacyExternalStorage="true"

を追加することで使うことはできたのだが、とうとうAndroid API 30以上では完全に書き込みが出来なくなってしまった。

もしAndroid API 30以上で今までのコードのままで使う場合はAndroidManifest.xmlに

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

を追加し、全てのファイルのアクセス権限をもらえば、getExternalStorageDirectoryに書き込める。でもこれだとGoogle Playにアップロードする場合MANAGE_EXTERNAL_STORAGEの権限は基本的にもらえないのでAPKの更新が出来なくってしまう(申請したが弾かれた)

非常に困った。

とりあえず今のところ、MediaStore経由で保存するしかなさそう

ということでJavaコードで対応させてみた

@RequiresApi(Build.VERSION_CODES.Q)
private String saveFileUsingMediaStore(Context context , String url , String fileName, String mimeType) {
    //https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
    ContentValues contentValues = new ContentValues();
    contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName);
    contentValues.put(MediaStore.MediaColumns.MIME_TYPE, mimeType);
    contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS);

    ContentResolver resolver = context.getContentResolver();
    Uri uri = resolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues);
    if (uri != null) {
        InputStream is = null;
        OutputStream os = null;
        try {
            is = new FileInputStream(url);
            os = resolver.openOutputStream(uri);
            inputCopy(is, os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    // ignore
                }
            }
            if(os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    // ignore
                }
            }
            new File(url).delete();//delete original file
        }
        return getPathURI(context,uri);
    }
    return null;
}
public static String getPathURI(Context context, Uri uri) {
    ContentResolver contentResolver = context.getContentResolver();
    String[] columns = { MediaStore.Downloads.DATA };
    Cursor cursor = contentResolver.query(uri, columns, null, null, null);
    cursor.moveToFirst();
    String path = cursor.getString(0);
    cursor.close();
    return path;
}
void inputCopy(InputStream source, OutputStream target) throws IOException {
    byte[] buf = new byte[8192];
    int length;
    while ((length = source.read(buf)) > 0) {
        target.write(buf, 0, length);
    }
}

WindowsHello対応の指紋認証付きキーボードの購入

ノートパソコンでの指紋認証が早く、便利すぎてデスクトップでも導入しようとした。
(Windows Helloの指紋認証は使い勝手がとても良い)

一番いいと思ったのが今使っているノートパソコンと同じ、キーボードと一体型で指紋認証センサーが搭載されていてるものだ。

※イメージ

ただ、調べてみたら驚くほどラインナップが少なくとても高価だった。(英字配列を含めても数えるほど)

※プリファード・プロとかは日本語JIS配列かつ指紋認証センサーがついてはいるが、生産中止で、古いスライド式の為認識も良くないと思われるからやめた

※Microsoft Modern Keyboard (指紋認証センサー付き)はUS配列だからやめた
(むかしUS配列を使ったことがあるが、JIS配列に慣れすぎて、非常に使い辛かった)

 

そこで快適さ、価格、デザインを考え編み出した解決案がこちら

 

これすごく良い!

Amazonのリンク

USBポート搭載キーボード

・エレコム キーボード 有線 プレミアムメンブレン フルキーボード 1000万回高耐久 メカニカルライク USB2ポート付 ブラック TK-FCM094HBK

指紋認証

・アルカナイト(ARCANITE) USB指紋認証リーダー Windows Hello機能対応 0.05秒 指紋認証でセキュリティ対策 1年保証 AKFSD-07 

認識も抜群でしかももう1ポートUSBも使えちゃう!しかもお値段も安い!

なのでぜひオススメのやり方です。