xlrd.biffh.XLRDError: Excel xlsx file; not supported エラー対策

VS code上でPandasを使ってエクセルファイルを読み込む際
xlrd.biffh.XLRDError: Excel xlsx file; not supported
と言うエラーに出会いましたので覚書として解決方法を残します。

原因

xlrd(エクセルファイルの読み込みライブラリ)からxlsxファイルの読み込み機能が外されています。
xlsファイルは読み込めます。

解決策

  1. ファイルの拡張子を.xlsに変更する
  2. xlrdのバージョンを戻す
  3. 一時的にopenpyxlを利用する

今回は解決策3をご紹介します。
まずopenpyxlのインストールを

pip install openpyxl

次にプログラムコードの修正
オプションにopenpyxlを明示する。

kokyaku_data = pd.read_excel('C:/Users/*****/Desktop/sample_100knocks/サンプルコード_20201021/2章/kokyaku_daicho.xlsx',engine='openpyxl')

以上でエクセルファイルを読み込めるようになる。

Pandas 100本ノックの覚書

最近Pandas 100本ノックを始めたので、覚書として色々と書き残したいと思います。
実行環境はGoogle Colabです。

ノック2 データを結合(ユニオン)してみよう 縦方向結合編

  • transaction_1
  • transaction_2
transaction_1 = pd.read_csv('/content/transaction_1.csv')
transaction_2 = pd.read_csv('/content/transaction_2.csv')

読み出したファイルをpd.concatで結合してみる。
オプションのignore_index=Tureでインデックス番号の降り直しをしている。

transaction = pd.concat([transaction_1,transaction_2], ignore_index=True)

結合後確認
len関数で各ファイル数の行数を確認する。
transaction_1が5000行、transaction_2が1786行、transactionは1,2を結合したので6786(5000+1786)となっています。

print(len(transaction_1))
print(len(transaction_2))
print(len(transaction))
5000
1786
6786

ノック3 データを結合(ジョイン)してみよう 横方向結合編

ジョインする場合、しっかりと主軸になるデータを考えつつ、どの列をキーにジョインするかを考えていきます。
ここでは、transaction_detail1の方が詳細な情報が含まれているため主軸データとします。
そしてジョインするキーはtransaction内の次のカラムとします。

  • transaction_id
  • payment_date
  • customer_id
join_data = pd.merge(transaction_detail1, transaction[["transaction_id","payment_date","customer_id"]],on="transaction_id",how="left")

結果は次のとおりです。

   detail_id transaction_id item_id  quantity         payment_date customer_id
0          0    T0000000113    S005         1  2019-02-01 01:36:57    PL563502
1          1    T0000000114    S001         1  2019-02-01 01:37:23    HD678019
2          2    T0000000115    S003         1  2019-02-01 02:34:19    HD298120
3          3    T0000000116    S005         1  2019-02-01 02:47:23    IK452215
4          4    T0000000117    S002         2  2019-02-01 04:33:46    PL542865

ノック5 必要なデータを作ろう 編

ここでは売り上げの列[price]を作るために、quantity(量)とitem_priceの掛け算で計算します。

join_data["price"] = join_data["quantity"] * join_data["item_price"]

実行結果
右端に[price]カラムが追加され、掛け算した結果が追加されています。

   detail_id transaction_id item_id  quantity         payment_date customer_id customer_name    registration_date customer_name_kana                        email gender  age       birth pref item_name  item_price   price
0          0    T0000000113    S005         1  2019-02-01 01:36:57    PL563502         井本 芳正  2019-01-07 14:34:35           いもと よしまさ  imoto_yoshimasa@example.com      M   30   1989/7/15  熊本県      PC-E      210000  210000
1          1    T0000000114    S001         1  2019-02-01 01:37:23    HD678019         三船 六郎  2019-01-27 18:00:11           みふね ろくろう   mifune_rokurou@example.com      M   73  1945/11/29  京都府      PC-A       50000   50000
2          2    T0000000115    S003         1  2019-02-01 02:34:19    HD298120         山根 小雁  2019-01-11 08:16:02            やまね こがん     yamane_kogan@example.com      M   42   1977/5/17  茨城県      PC-C      120000  120000
3          3    T0000000116    S005         1  2019-02-01 02:47:23    IK452215         池田 菜摘  2019-01-10 05:07:38            いけだ なつみ    ikeda_natsumi@example.com      F   47   1972/3/17  兵庫県      PC-E      210000  210000
4          4    T0000000117    S002         2  2019-02-01 04:33:46    PL542865         栗田 憲一  2019-01-25 06:46:05           くりた けんいち   kurita_kenichi@example.com      M   74  1944/12/17  長崎県      PC-B       85000  170000

ノック8 object型をdatetime型に変換する 編

join_data.dtypesを実行するとpayment_dateの型がobjectです。
これをdatetime型に変換してみます。

detail_id              int64
transaction_id        object
item_id               object
quantity               int64
payment_date          object
customer_id           object
customer_name         object
registration_date     object
customer_name_kana    object
email                 object
gender                object
age                    int64
birth                 object
pref                  object
item_name             object
item_price             int64
price                  int64
dtype: object

1行目ではpd.to_datetimeを利用しdatetime型へ変換します。
2行目で新しくpayment_monthを用意し、そこに年月のみを入れ込む

join_data["payment_date"] = pd.to_datetime(join_data["payment_date"])
join_data["payment_month"] = join_data["payment_date"].dt.strftime("%Y%m")

実行結果
最終行の実行結果はjoin_data["payment_date"].dtypesの結果である。

         payment_date payment_month
0 2019-02-01 01:36:57        201902
1 2019-02-01 01:37:23        201902
2 2019-02-01 02:34:19        201902
3 2019-02-01 02:47:23        201902
4 2019-02-01 04:33:46        201902
datetime64[ns]

~続く~ 2021年3月26日追記

OCI Windows Serverのパスワード忘れた場合の対処方法

たまにあると思うんですよ。パスワード忘れちゃうこと。
今回はそんな場合でもopcユーザのパスワードを変更する方法をご紹介します。
※ただしこの方法は独自の手法です。OCIの公式が発表している手法とは異なる可能性があります。
 その点のみご承知おきください。

手順

  1. 対象Winsods Serverにてコンソール接続を作成
  2. 対象サーバにコンソール接続を行う
  3. 対象サーバの再起動後にセーフモードで起動する
  4. セーフモードでコマンドプロンプトを起動しopcユーザのパスワードを再設定

対象Winsods Serverにてコンソール接続を作成

手順は割愛

対象サーバにコンソール接続を行う

手順は割愛

対象サーバの再起動後にセーフモードで起動する

①まずはコンソール接続を行う

いつも通りの再起動を行う。
f:id:kyamisama:20210222114829j:plain

②再起動中F8を連打します。

すると下記画面が表示されます。なので「Safe Mode with Command Prompt」を選択しエンターを実行。
f:id:kyamisama:20210222115030j:plain

③ログイン画面上にAdministratorが出現する

注意)初めてセーフモードで起動するとAdministratorのパスワードを設定するようになっています。
下記画面は既にAdministratorのパスワードを設定しているためパスワードの設定を求められません。
f:id:kyamisama:20210222115337j:plain

コマンドプロンプトからopcのパスワードを再設定

手順③でAdministratorでログインするとコマンドプロンプトが表示されます。
ここで下記コマンドを実行しopcのパスワードを再設定しまs。

net user opc {password}

f:id:kyamisama:20210222115734j:plain

その後インスタンスの再起動を行います。
起動後再設定したパスワードでログインできることを確認します。

以上でopcユーザのパスワード再設定となります。

OCI REST APIでVCNをサクッと作ってみたよ。

ラククラウドのリソース作成はいくつか方法があり今回はREST APIを使った方法のご紹介です。

OCI-CURLの準備

OCI-CURLの環境が無い方はこちらの記事を参考に準備してください。

その他の準備

REST API実行先のエンドポイントの確認

エンドポイントの確認は下記に記載あります。
docs.oracle.com
今回は東京リージョンなので「iaas.ap-tokyo-1.oraclecloud.com」
※[https://]は不要です。

VCN作成時に必要なパラメータの確認

docs.oracle.com
POSTする時は「POST /20160918/vcns」が必要であることを確認

body文の用意

REST APIでPOSTメソッドを実行する際body文が必要です。
今回は下記のbody文でVCNを作成します。

[root@localhost ~]# cat request.json
{
  "cidrBlock":"10.10.0.0/16",
  "compartmentId":"*******************************************",
  "displayName":"TEST-VCN"
}
[root@localhost ~]#

コマンドの実行

下記のとおり実行し、実行結果内にエラーが無ければ作成OKです。

[root@localhost ~]# oci-curl iaas.ap-tokyo-1.oraclecloud.com POST ./request.json "/20160918/vcns"
{
  "cidrBlock" : "10.10.0.0/16",
  "cidrBlocks" : [ "10.10.0.0/16" ],
  "compartmentId" : "ocid1.compartment.oc1..aaaaaa*******************************************",
  "defaultDhcpOptionsId" : "ocid1.dhcpoptions.oc1.ap-tokyo-1.aaaaa*******************************************",
  "defaultRouteTableId" : "ocid1.routetable.oc1.ap-tokyo-1.aaaaaa*******************************************",
  "defaultSecurityListId" : "ocid1.securitylist.oc1.ap-tokyo-1.aaaaaa*******************************************",
  "definedTags" : {
    "Oracle-Tags" : {
      "CreatedBy" : "oracleidentitycloudservice/****@******.jp",
      "CreatedOn" : "2021-02-02T01:26:17.036Z"
    }
  },
  "displayName" : "TEST-VCN",
  "freeformTags" : { },
  "id" : "ocid1.vcn.oc1.ap-tokyo-1.amaa*******************************************",
  "lifecycleState" : "AVAILABLE",
  "timeCreated" : "2021-02-02T01:26:17.041Z"

【脱オレオレ証明】Lest's EncryptでSSL証明書を取得してみた

オレオレ証明書のWebサイトにアクセスするたびに危険のあるWebサイト警告画面がうるさいのでLest's Encryptの証明書でその警告からおさらばしたいと思います。

参考にさせていただいた記事です。ありがとうございます。
qiita.com

証明書作成環境

- CentOS7.8

パッケージのインストール

# yum install certbot -y

証明書発行コマンドの実行

ドメイン名、Eメールは適当な文言にしています。適宜変更し実行してください。
実行コマンド:certbot certonly --manual --domain hogehoge.com --email hogehoge@example.jp --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns

# certbot certonly --manual --domain hogehoge.com --email hogehoge@example.jp --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns
email hogehoge@example.jp --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns
Use of --manual-public-ip-logging-ok is deprecated.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Requesting a certificate for hogehoge.com
Performing the following challenges:
dns-01 challenge for hogehoge.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.hogehoge.com with the following value:

8kRbsero3l3o38B_PT864ZwNUEcXCm2x0gOy5tFpYVQ

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

実行コマンドを打鍵すると「Before continuing, verify the record is deployed.」で一旦止まります。
この状態で何もキーを実行しないでください。
その間に「hogehoge.com」の「TXT」レコードに「8kRbsero3l3o38B_PT864ZwNUEcXCm2x0gOy5tFpYVQ」を設定する。
f:id:kyamisama:20210201110033j:plain

「TXT」レコードの反映が完了したら止まっていた「Before continuing, verify the record is deployed.」からエンターを実行する。
「TXT」レコード反映は下記コマンドで確認する。

$ dig -t txt _acme-challenge.hogehoge.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.3 <<>> -t txt _acme-challenge.hogehoge.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60439
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1372
;; QUESTION SECTION:
;_acme-challenge.hogehoge.com. IN TXT

;; ANSWER SECTION:
_acme-challenge.hogehoge.com. 30 IN TXT "NPRp4OkoUrFVQHLKO6WP8EFvF**************"

;; Query time: 219 msec
;; SERVER: 169.***.***.***#53(169.***.***.***)
;; WHEN: Fri Feb 05 11:08:12 JST 2021
;; MSG SIZE  rcvd: 122
# certbot certonly --manual --domain hogehoge.com --email hogehoge@example.jp --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns
email hogehoge@example.jp --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns
Use of --manual-public-ip-logging-ok is deprecated.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Requesting a certificate for hogehoge.com
Performing the following challenges:
dns-01 challenge for hogehoge.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.hogehoge.com with the following value:

8kRbsero3l3o38B_PT864ZwNUEcXCm2x0gOy5tFpYVQ

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ★先ほどの続きでここでエンター実行
Press Enter to Continue
Waiting for verification...
Cleaning up challenges
Use of --manual-public-ip-logging-ok is deprecated.

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/hogehoge.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/hogehoge.com/privkey.pem
   Your certificate will expire on 2021-05-01. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

[root@localhost ~]#

取得した証明書を確認してみる

全部で5つのファイルが作成されているはずです。
これで証明書作成は完了です。

# ls /etc/letsencrypt/live/hogehoge.com/
README  cert.pem  chain.pem  fullchain.pem  privkey.pem
#

おまけ

WindowsIISようにPFX形式の証明書を作成します。

# openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out auth.pfx
Enter Export Password:
Verifying - Enter Export Password:
#

tcpdumpで出力したファイルをWiresharkで見る方法

はい、これだけ。

tcpdump -i ens33 port 465 -s 0 -w /tmp/tcpdump_20210108.out

あとはローカルPCに「tcpdump_20210108.out」ファイルをコピーしてWiresharkで開けましょう。

WP mail SMTPエラー「Peer certificate CN=`*.****.jp' did not match expected」

ワードプレスプラグインで「WP mail SMTP」ってあると思います。
このプラグインからメールを送信する際の下記エラーに遭遇したので回避策を紹介したいと思います。
「Peer certificate CN=`*.****.jp' did not match expected」
今回も参考にさせて頂いた記事に感謝を述べたいと思います。
ありがとうございます。
qiita.com

原因

暗号化されたすべてのクライアントストリームで、ピア検証がデフォルトで有効になりました。 デフォルトでは、OpenSSL のデフォルト CA > バンドルを使ってピア証明書を検証します。 たいていの場合は、正しい SSL 証明書を持つサーバーと通信するならこれを変更する必要> はありません。 OpenSSL が、よく知られた CA バンドルを使うように設定されているからです。

解決策

SSL証明書を用意するか、functions.phpプログラムの修正を行うかです。
今回はfunctions.phpの修正で対応いたします。
下記コードをそのままfunctions.phpの最下部に張り付けてください。

function my_wp_mail_smtp_custom_options ( $phpmailer ) {
    if ( isset( $phpmailer->SMTPAuth ) ) {
        if ( $phpmailer->SMTPAuth == true ) {
            $phpmailer->SMTPOptions = array('ssl' =>
array(
 'verify_peer' => false,
 'verify_peer_name' => false,
 'allow_self_signed' => true));
        }
    }
    return $phpmailer;
}
add_filter("wp_mail_smtp_custom_options", "my_wp_mail_smtp_custom_options");

その後、Apacheのリスタートを実行。

systemctl restart httpd

上手く送信できていれば下記のように表示されます。
f:id:kyamisama:20210108184548j:plain