G Suite legacy後継として独自ドメイン利用でGoogle Workspace Essentials starterとcloudflare Email routingへ移行する、または有償版から無償版への復帰

対象者

このエントリー(ブログ記事)の対象者は以下のどちらかです。

  • ア. 無償版Google Workspace(=旧Google Apps =G Suite legacy。以降はGSLと記載)を利用していた。GSLが終了しても無償/無料で利用したい。
  • イ. GSLを使っていなかったが、今更だがGSLっぽいものを利用したい。

前提

前提は以下です。

  • 無償版Google Workspace(=旧Google Apps =G Suite legacy)から移行したい。
  • 独自ドメインでメールアドレスを利用している。
  • できればGoogle寄りのサービスで維持したい。
  • 無償/無料。または有償/有料でも少額で抑えたい。

利点、欠点

利点

  • 無料!
  • 独自ドメインのメールアドレスでメールを受信できる(送信相手からするとToに指定するメールアドレス。以下、Toと記載)
  • 送信元メールアドレス(以下、Fromと記載)に独自ドメインのメールアドレスを利用できる。
  • GSLで使っていたほとんどの機能&サービスが利用できる。

欠点

  • 手間がかかる。
  • gmailの代理送信機能(いにしえの「本人ではなく秘書が代理で送りました機能」)を使ってFromを変更してメールを送信します。
  • なので以下が発生します。これを問題と思うかどうかは人それぞれだと思います。私は仕事で使うものではないので問題ではないと判断しました。
    • メールのヘッダーに送信に使うgmailのメールアドレスが記載されます。これはgmail及びインターネットの仕様です。
    • 通常は見えない箇所なのでメールの送信先とのやり取りで気づかれることはないと思います。
    • このエントリー以外で、受信したメールを2回以上転送すると、Fromが独自ドメインのメールアドレスではなくgmailのメールアドレスに変更されることがあります。
    • Fromが変更されるのは自分が受信する場合だけで、自分が送信した先(To)で転送が続いてもFromが変わることは無いはずです。

行う方法(選択肢)

アのGSL利用者には以下の方法(選択肢)があります。

A. GSL延長する。

  • impressやじうまの杜で5月17日に突然発表された記事の通り、現在のプランを延長する(申請必須)。

B. GSLをやめてCを行う。

イの人にはこのエントリーのタイトル通り以下の方法があります。

C. Google Essentials starter、cloudflare Email Routing、通常gmailアカウントで送受信する。

A. GSL延長する

やじうまの杜の記事に対する はてなブックマークのコメントに延長する方法が載っていました。

無償版「G Suite」、個人・非営利目的ならば継続利用できるってよ/もう「Google Workspace」へ移行しちゃったよ! って方はサポートまで【やじうまの杜】

いけた。スティーブ氏のツイートにあるリンクからじゃないと表示されなかった。

2022/05/17 09:46
b.hatena.ne.jp

具体的には、GSL延長を発表したSteve Whitcher氏のツイートにリンクがあります。

admin.google.comで始まるURLです。

GSLに事前にログインしておいて以下のリンクを開くと、

ダイアログの下部に延長するの選択が表示されます。それをクリックして進めて行けば延長できます。 https://admin.google.com/?action_id=SE_SELF_TRANSITION

この手順は必須です。自動では延長されません。

B. GSLをやめてCを行う。

方法Cを参照してください。

C. Google Essentials starter、cloudflare Email Routing、通常gmailアカウントで送受信する。

この方法2024-01-21 19時現在、業界のDMARC推進のため送信ではdmarc=failでほぼ確実にスパム扱いされて到達されません。送信だけでなく受信の転送もメール厳しいです

複雑なので最初に箇条書します。

  1. 通常のgmailアドレスを用意する。
  2. cloudflareに追加済みのWebサイト(ドメイン)でEmail Routingを有効にしてメールアドレス(ユーザー)を追加する。
  3. Fromを独自ドメインで送信できるようにgmailの設定を行う。
  4. Google Workspace Essentials Starterのアカウントを作成する。

以下、それぞれの手順です。

1. 通常のgmailアドレスを用意する

gmailで通常通りメールを取得します。

2. cloudflareに追加済みのWebサイト(ドメイン)でEmail Routingを有効にしてメールアドレス(ユーザー)を追加する

  • cloudflareのサイトへアクセスして、Log InまたはSing Upする。
  • 右上のメニューから言語を変更できます。
    • English(US)のままがお勧めだけど、やっぱり日本人なら日本語がわかりやすいので日本語でもほぼ問題ないはずです。
    • 設定したはずが反映されなかったり、英語でしか表示されない場合もあるので日本語のままでおかしいなと思ったらEnglish(US)に切り替えるとうまくいくかも。
  • 既存のWebサイト(ドメイン)を選択、または新規で追加します。
  • 以下は、順番が前後したりどちらかを先に行わないと進めないこともあるかもしれません。
  • 追加したWebサイトの管理画面で、左メニューの「メールアドレス(ベータ版)」をクリックして進みます。
  • 「ルート」や「アドレス」、「宛先アドレス」(転送先)を追加します。
  • ドメインに対してDNSサーバーをcloudflareに切り替えます。
  • DNSが浸透して問題がなさそうなら、テスト送信として作成したメールアドレスに実際に送信してgmailに届くことを確認します。
  • テスト送信するメールアドレスは1、2で作成したメールアドレスではなく関係ないその他のメールアドレスが紛らわしくなくて良いです。

3. Fromを独自ドメインで送信できるようにgmailの設定を行う。

gmail公式に手順が記載あるのでそちらを参考にしてください。

support.google.com

設定すると、メールの作成で「差出人」に上記で設定したメールアドレスを選択できるようになります。
この際の設定は以下です。

  • SMTP サーバー: smtp.gmail.com
  • ユーザー名: 元のgmailのメールアドレス
  • パスワード: 上記のGoogleアカウントのアプリパスワード

また、アプリパスワードは以下の手順で作成できます。 https://support.google.com/accounts/answer/185833?hl=ja

gmailのメールアドレスはほぼ使わず、独自ドメインのメールアドレスを使うのがほとんどならデフォルトにしてしまうのが良いと思います。

4. Google Workspace Essentials Starterのアカウントを作成する。

以下からGoogle Workspace Essentials Starterを作成します。

workspace.google.com

アカウント名は何でも良いようですが、自分のドメイン名をそのまま使うのが紛らわしくなくて良いと思います。

これでGSLで使えていたgmail以外の殆どの機能が利用できます。

ユーザーはGSLの5人までよりも増えて25人まで作成できます。

D. もうGSLから有償版Google Workspaceへアップグレードしてしまったが戻したい

はい、悲しいですね。

先に取り組んだ人が損をして、ギリギリまで移行しない人が得をしてしまった形です。

ただ、これもimpressやじうまの杜の記事の通り、

サポートに依頼すればGSLへ戻せる可能性があります。

方法Dです。

手順は以下です。

  1. 管理画面にログインします。
  2. 右上のメニューの「?」をクリックして「ヘルプアシスタン」を開きます。
  3. 「サポートに問い合わせる」をクリックします。
  4. 文面
    • 「個人」「非営利」で利用していることを書きます。
  5. チャットボットの回答:
  6. サブスクリプションを切り替える」を選択します。
  7. チャットボットの回答:
    • サブスクリプションを切り替える前に、注意すべき重要な点がいくつかあります。
    • _ -プランを切り替えると、その変更はドメイン内のすべてのユーザーに影響します。
    • _
    • 切り替えることができるエディションは次のとおりです。
  8. 「G Suiteサブスクリプションの詳細」を選択します。
  9. チャットボットの回答:
    • 2020年10月6日に、GSuiteのブランドをGoogleWorkspaceに変更し、お客様向けにカスタマイズされた新しいサービスを開始しました。既存のGSuiteのお客様は、移行のタイムラインを通知するまで、既存の契約を継続できます。 G Suiteサブスクリプションに切り替えるオプションはこれ以上ありませんが、 ここで新しいサービスを確認してください。
  10. 「これは私の問題ではありません」を選択します。
  11. チャットボットの回答:
    • どのようにサポートに連絡しますか?
      • ・チャット 推奨
      • ・ウェブ
  12. 「チャット」を選択します。
  13. チャットボットの回答:
    • 使用する言語を選択してください:
    • 優先度:
      • P1 - 重大な影響 - サービスが利用できない
      • P2 - 大きな影響 - サービスに重大な障害がある
      • P3 - 中規模な影響 - サービスが一部機能しない
      • P4 - 小規模な影響 - サービスの仕様は可能
    • 「チャットを開始」
    • 「その他のお問い合わせ」
  14. 「日本語」、「P4」を選択して「チャットを開始」をクリックします。
  15. チャットボットから人力へ切り替わろうとする。サポートが始まった旨の英語メールが届きます。
    • 画面のメッセージは以下:
      • 「お客様は 17 番目にお待ちいただいております」 ← この数字は実際の数字に変わります。
  16. 20分ほどで人間のオペレーターに繋がっりました。
  17. オペレーターに以下を伝えます。
    • 「個人で利用」
    • 「非営利で利用」
  18. チャットが終わって15分後くらいにチャットの全内容がメールで届きました。
  19. その5分後にチャットの担当者からメールが届きました。以下、内容。
    • 担当者に引き継いだ。
    • 続きの対応をする。
    • 混雑や調査に時間がかかるかも。
  20. 翌日の正午過ぎに本当に「個人」「非営利」か確認するメールが届きました。
  21. その旨を引用&同意して返信しました。
  22. 今ここ。GSLに戻るのを待っています。

※ 5月17日の夜以降だと16の時点でGSLに戻す作業を始めるという確認が始まるようです。確認手順が減って効率化されていますね。さすGoogle!

eM ClientのログをWSL2&tailでリアルタイムに監視&出力する

eM ClientのログをWSL2&tailでリアルタイムに監視&出力する

tl;dr

  • 全部を監視&出力する
tail -n0 -f /mnt/c/Users/kappa/AppData/Roaming/eM\ Client/Logs/*.log
  • 今日だけを監視&出力する
    • でも昔作られたファイル名にも出力されるのでこれだけでは足りない。
tail -n0 -f /mnt/c/Users/${USER}/AppData/Roaming/eM\ Client/Logs/{cef.log,sqlite.log}  /mnt/c/Users/kappa/AppData/Roaming/eM\ Client/Logs/$(date '+%Y-%m-%d')*.log

phpがtidy-html5がないとエラーを出して動かない時はリンクを作る

TL;DR

同じバージョンがインストールされているならそれっぽい名前のリンクを作ればよい。

現象

phpがこんなエラーを吐いて何もできなくなった。

$ php --version
dyld[9229]: Library not loaded: /opt/homebrew/opt/tidy-html5/lib/libtidy.5.dylib
  Referenced from: /Users/kappa/.anyenv.arm64/envs/phpenv/versions/8.0.3/bin/php
  Reason: tried: '/opt/homebrew/opt/tidy-html5/lib/libtidy.5.dylib' (no such file), '/usr/local/lib/libtidy.5.dylib' (no such file), '/usr/lib/libtidy.5.dylib' (no such file), '/opt/homebrew/Cellar/tidy-html5/5.8.0/lib/libtidy.5.dylib' (no such file), '/usr/local/lib/libtidy.5.dylib' (no such file), '/usr/lib/libtidy.5.dylib' (no such file)
Abort trap: 6

調査

phpenvでインストールしているのでtidy-html5のライブラリーがないことなないはず。 でもないこともない(ある)ので調べる。

$ brew info tidy-html5
tidy-html5: stable 5.8.0 (bottled), HEAD
Granddaddy of HTML tools, with support for modern standards
https://www.html-tidy.org/
/opt/homebrew/Cellar/tidy-html5/5.8.0 (14 files, 3MB) *
  Poured from bottle on 2021-10-07 at 00:26:41
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/tidy-html5.rb
License: Zlib
==> Dependencies
Build: cmake ✔
==> Options
--HEAD
    Install HEAD version
==> Analytics
install: 41,649 (30 days), 148,682 (90 days), 369,009 (365 days)
install-on-request: 1,669 (30 days), 5,422 (90 days), 11,714 (365 days)

ある。バージョンが違うとか?

kappa%(arm64)[~]$ find /opt/homebrew/opt/tidy-html5/lib
/opt/homebrew/opt/tidy-html5/lib
/opt/homebrew/opt/tidy-html5/lib/libtidy.58.dylib
/opt/homebrew/opt/tidy-html5/lib/libtidy.5.8.0.dylib
/opt/homebrew/opt/tidy-html5/lib/pkgconfig
/opt/homebrew/opt/tidy-html5/lib/pkgconfig/tidy.pc
/opt/homebrew/opt/tidy-html5/lib/libtidy.dylib
/opt/homebrew/opt/tidy-html5/lib/libtidy.a

バージョンのせいか homebrewをupdate/upgradeしたときに消えたのか理由はわからないけど ともかく libtidy.5.dylib という名前でダイナミックライブラリーファイルが必要らしい。

対応

その名前でシンボリックファイルを作成する。足りないと言われているのが5系っぽいので同じ5系なら勝手に作っても問題ないはず。

ln -s  /opt/homebrew/opt/tidy-html5/lib/libtidy.58.dylib   /opt/homebrew/opt/tidy-html5/lib/libtidy.5.dylib

動作を確認する。

$ php --version
PHP 8.0.3 (cli) (built: Apr  6 2021 21:16:28) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.3, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.3, Copyright (c), by Zend Technologies
    with Xdebug v3.0.3, Copyright (c) 2002-2021, by Derick Rethans

無事に動作するようになった。

phpで呼び出し元関数の引数の値を利用する

phpで呼び出し元関数の引数の値を利用する

孫呼び出しから小呼び出しの変数を利用したいときとか。

<?php
class E
{
    public function b()
    {
        $name = 'a';
        // $debug = debug_backtrace();
        // var_export($debug);
        $debug = debug_backtrace();
        $callerArgs = $debug[1]['args'];
        $data = $callerArgs[1];
        $value = $data['a'];
        echo $name.':'.var_export($value,true).PHP_EOL;
    }
}

$a = (function($aaa) {
    $hoge = 'ehoge';
    $e = new E();
    $e->b();
})('file-path', ['a'=>1,'b'=>2]);

Let's encryptのSSL証明書をワイルドカードドメインで利用するためにDNS-01対応で運用する

前提

流れ

  1. SSL証明書を作成する
  2. AWSにDNSレコード更新用のユーザーを作成する
  3. 定期的にSSL証明書を更新するcrontabを設定する

SSL証明書を作成する

sudo docker run \
    -it \
    --rm \
    --name certbot \
    -v "/etc/letsencrypt:/etc/letsencrypt" \
    -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
    -v "/root:/root" \
    -e AWS_CONFIG_FILE=/aws/.aws/credentials \
    certbot/dns-route53 \
        certonly \
        --manual \
        --server https://acme-v02.api.letsencrypt.org/directory \
        --preferred-challenges dns \
        -d *.example.com \
        -m admin@example.com \
        --agree-tos \
        --manual-public-ip-logging-ok

AWSDNSレコード更新用のユーザーを作成する

{
    "Version": "2012-10-17",
    "Id": "certbot-dns-route53 sample policy",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "route53:ListHostedZones",
                "route53:GetChange"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "route53:ChangeResourceRecordSets"
            ],
            "Resource": [
                "arn:aws:route53:::hostedzone/rewrite-your-hosttedzoneID-maybe-Z3XXXXXXXXXXXX"
            ]
        }
    ]
}
  • ユーザーを作成する
    • https://console.aws.amazon.com/iam/home?#/users$new?step=details
      • アクセスの種類: API
      • 既存のポリシーを直接アタッチする。
        • 前項で作った名前を検索ボックスに入力して検索するとすぐ見つかる。
    • ポリシーを選択する。
    • ユーザーを作成する。
    • 作成後の画面に記載されているクレデンシャルをメモっておくかCSVをダウンロードする。

定期的にSSL証明書を更新するcrontabを設定する

[default]
aws_secret_access_key = 41-letters-string
aws_access_key_id = AKIXXXXXXXXXXXXXXXXX
  • AWS route53用のcertbotのdockerイメージを取得する。なくても docker run で取得されるけど問題が起きたときに原因を切り分けたいので取得は取得で。
docker pull certbot/dns-route53
  • 更新できるか試す。作ったばかりなので更新されないがエラーが出ない確認にはなる。
sudo docker run \
-it \
--rm \
--name certbot \
-v "/etc/letsencrypt:/etc/letsencrypt" \
-v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
-v "/root:/root" \
-e AWS_CONFIG_FILE=/aws/.aws/credentials \
certbot/dns-route53 \
    certonly \
    -n \
    --agree-tos \
    --email 'admin@example.com' \
    --dns-route53 \
    --dns-route53-propagation-seconds 30 \
    -d *.example.com
  • 上記のコマンドをcrontabに記載する。これは毎月2日6時0分。運用開始の前に翌日の日付を指定して問題ないことを確認してから日付を希望の日時を指定すること。
0 6 2 * * docker run -it --rm --name certbot -v "/etc/letsencrypt:/etc/letsencrypt" -v "/var/lib/letsencrypt:/var/lib/letsencrypt" -v "/root:/root" -e AWS_CONFIG_FILE=/aws/.aws/credentials certbot/dns-route53 certonly -n --agree-tos --email 'admin@example.com' --dns-route53 --dns-route53-propagation-seconds 30 -d *.example.com

PCで複数メモリーが認識されない場合は挿す位置を入れ替えるとうまくいく事がある

環境 * マザーボード: ASUS H170-Pro * メモリー: Samsung M378A1K43BB1-CPB(DDR4 PC4-1700 8GB) x 2

現象 * 16GB積んでるメモリーWindowsからもBIOSからも8GBしか認識されない。 * 認識されているのはDIMM_B4だけ。

怪しいこと * 前にマザーボード関連でCPUやGPUを抜き差しした。 * BIOSをアップデートした。 * その時にメモリーの認識を確認していない。

やったこと 1. メモリーを抜き差しした → 変化なし 2. マザボのマニュアルを確認して、2枚組の場合はDIMMのA2, B2に挿すので間違いないのを確認した。 3. メモリーの挿す場所を入れ替えた → BIOSWindowsで認識された。

Craftopiaが4K 60FPSでサクサク動くようになった。勝利。

MacBook Pro 13-inch Ealy 2015の内蔵SSD 512GBを1TBに換装した

結論

  • MacBookが2015以前の型なら秒で換装しろ。

部品

手順

  • ぐぐったらいろいろ出てくるのでそのとおりに。