mayaの実験場

この人生は沼だらけ

XCodeでプロジェクトの名称をやや力技で変更した話

f:id:xx_maya_xx:20200120183230p:plain

たぶんあまり参考にならないシリーズ。

kimagureneet.hatenablog.com

この辺りをさらっと読んでガリガリ置換。

しかぁし…なんかパッケージの名称が変わってくれない。
Finderで旧プロジェクト名称を検索すると、main.storyboardに居たりする。

仕方ないのでFinderでフォルダ内を検索して手作業で変更しました。

最初のリンク読んでおけばよかったじゃん…。

Firebase Authでエラーコード17999を踏んだ話

f:id:xx_maya_xx:20191225152859p:plain

mayatan.hatenablog.jp

この続き。

前回の前提、および経緯
・定数はConst.swiftに外出し ・Utility.debugLogはどこかからパクったんだけどデバッグウィンドウにファイル名称、行数込みで表示してくれる嬉しいfunction
・Const().actionCodeSettingsUrl = "https://hogehoge-ba123.firebaseio.com"←firebaseioとか聞いたことないドメインなので焦った
・self.showAlert()はAlert表示、およびその後の処理をまとめたもの

前回の前提の瑕疵

・Const().actionCodeSettingsUrl = "https://hogehoge-ba123.firebaseio.com"←firebaseioとか聞いたことないドメインなので焦った
https://hogehoge-ba123.firebaseio.com とか言うのを https://hogehoge-ba123.firebaseapp.comに読み替えてアクセス…404

これ勘違い。
節子、firebaseio.comはデータベースのURLや。

firebase hostsにactionCodeSettings.urlのエンドポイントを作っていなければならなかったので→開発環境にあったファイルを配置。
で、よしなに https://hogehoge-ba123.firebaseapp.com を実装。

今回の現象

以下のコードの Utility.debugLog(errCode.rawValue ) が17999を返す

let actionCodeSettings = ActionCodeSettings()
actionCodeSettings.url = URL(string: Const().actionCodeSettingsUrl)
actionCodeSettings.handleCodeInApp = true
actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!)
actionCodeSettings.setAndroidPackageName(Const().package_name,
                                          installIfNotAvailable: false, minimumVersion: "12")

UserDefaults.standard.set(nil, forKey: "Email")

Auth.auth().sendSignInLink(
    toEmail:email!,
    actionCodeSettings: actionCodeSettings) { error in
        if let error = error {
            Utility.debugLog(error.localizedDescription)
            if let errCode = AuthErrorCode(rawValue: error._code) {
                Utility.debugLog(errCode.rawValue )←ココ
            }
            return
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        Utility.debugLog(email)
        UserDefaults.standard.set(email!, forKey: "Email")
        self.showAlert(alert_message:"登録メールアドレス宛に認証メールをお送り致しました。", flag: false)
}

解決法
わかんねえんならわかんねえでいいからドキュメントくらいはちゃんと読め。という話でした。

firebase.google.com

Firebase Auth では、モバイルアプリで開かれるリンクを送信するときに Firebase Dynamic Links が使用されます。

Dynamic LinksのURL接頭辞をよしなに作成。hogehoge-ba123.page.linkとか提案されるのでそのまま作る。
ダイナミックリンクはなくてOK。

この hogehoge-ba123.page.link が認証メール内のドメインに適用され、こんなURLが認証メールに記述されます。

https://hogehoge-ba123.page.link/?link=https://hogehoge-ba123.firebaseapp.com/__/auth/action?apiKeyほにゃらら

これで幸せになれました。

但し謎が残りました。

https://hogehoge-ba123.firebaseapp.com に配置している、認証メールの中継ページの元ネタですw
私のことだからどこかから拝借してる筈なんですがww

CodeIgniterでできると思ってたものができず焦った件

f:id:xx_maya_xx:20191223144311p:plain

SELECT HEX(AES_ENCRYPT('hogehoge', '暗号化のタネ')) as enc_password FROM `account`

こういうことやりたかったんですが。

CIで直訳するとこうなる。

$this->db->select("HEX(AES_ENCRYPT('hogehoge', '暗号化のタネ')) as enc_password");
$enc_password_query = $this->db->get('account');
$enc_password = $enc_password_query->row_array()['enc_password'];

$enc_password_query->num_rows() = 0になっちゃうんだ。
クエリビルダで吐き出されてるクエリをMySQLWorkBenchで流したらちゃんと帰ってくるから、正しいには正しい筈なんだ。orz
ただ100%正解ではないからCIとか通すといけない。
多分fromテーブルを指定してしまうから、そんなレコードおらんのじゃと素直に言われるんだ。

仕方ないからこうやった。

$enc_password = $this->db
->query("select HEX(AES_ENCRYPT('hogehoge', '暗号化のタネ')) as enc_password")
->row_array()['enc_password'];

なんか乱暴なことした様な気がするけどまあいい。

pdflibをPHPで使える様Amazon Linuxにインストールしてみる

f:id:xx_maya_xx:20190923155317p:plain

MacLAMP環境で試した拙稿はこちら。

mayatan.hatenablog.jp

今回はAmazon Linux

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/install-LAMP.htmldocs.aws.amazon.com

上記リンクのステップ3まで完了している+mbstringをインストール+タイムゾーンを日本時間に変更+なければswap構築をしている前提で進めます。
ここは日本語圏なので必ず使う筈が、必ずインストールを忘れるのです。

qiita.com

qiita.com


www.pdflib.jp

www.pdflib.jp

例によってここからパッケージをダウンロードします。
Linux x86 じゃなくて、Linux Intel 64 だからね!
↑間違えて php_pdflib.so: wrong ELF class: ELFCLASS32 in Unknown on line 0 とか言われて、手間取ったw

wget https://www.pdflib.com/binaries/PDFlib/920/PDFlib-9.2.0-Linux-x86_64-php.tar.gz

wget https://www.pdflib.com/binaries/PLOP/53/PLOP-5.3p1-Linux-x86_64.tar.gz

解凍してみます。
解凍コマンドは本当によく忘れるので、コピペする。

qiita.com

tar -zxvf PDFlib-9.2.0-Linux-x86_64-php.tar.gz

tar -zxvf PLOP-5.3p1-Linux-x86_64.tar.gz
sudo cp ./PDFlib-9.2.0-Linux-x86_64-php/bind/php/php-700-nts/php_pdflib.so /usr/lib64/php/7.0/modules

sudo cp ./PLOP-5.3p1-Linux-x86_64/bind/php/php-700-nts/php_plop.so /usr/lib64/php/7.0/modules

phpinfoの中にPDFlibplopの表記が確認できたら、OK!

Firebase Authで「Domain not whitelisted by project」を踏んだ理由が意外な理由だった話

f:id:xx_maya_xx:20191220144544p:plain

ちょっと気づくのに時間がかかり手こずった記念。

前提
・定数はConst.swiftに外出し ・Utility.debugLogはどこかからパクったんだけどデバッグウィンドウにファイル名称、行数込みで表示してくれる嬉しいfunction
・Const().actionCodeSettingsUrl = "https://hogehoge-ba123.firebaseio.com"←firebaseioとか聞いたことないドメインなので焦った
・self.showAlert()はAlert表示、およびその後の処理をまとめたもの

現象
アカウント作成時に承認メールをもらうはずが、「Domain not whitelisted by project」と叱られた。

以下該当箇所のSwift。概ね公式のソースコードと変わらないですが。

let actionCodeSettings = ActionCodeSettings()
actionCodeSettings.url = URL(string: Const().actionCodeSettingsUrl)
actionCodeSettings.handleCodeInApp = true
actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!)
actionCodeSettings.setAndroidPackageName(Const().package_name,
                                          installIfNotAvailable: false, minimumVersion: "12")
Auth.auth().sendSignInLink(
    toEmail:email!,
    actionCodeSettings: actionCodeSettings) { error in
        if let error = error {
            Utility.debugLog(error.localizedDescription) ←ここで叱られた
            return
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        UserDefaults.standard.set(email!, forKey: "Email")
        self.showAlert(alert_message:"登録メールアドレス宛に認証メールをお送り致しました。", flag: false)
}

stackoverflow.com

上記の様に言われたので、Auth のログイン認証の承認済みドメインに登録。

…改善しねえ…。

次にactionCodeSettings.urlに格納しているURLを疑う。

teratail.com

https://hogehoge-ba123.firebaseio.com とか言うのを https://hogehoge-ba123.firebaseapp.comに読み替えてアクセス…404、だとぉ?

ならば…と、開発環境と運用環境のfirebaseプロジェクト全体を見直す。

プロジェクトの設定→クラウドメッセージング→iOSアプリの設定 の、通知に使うAPNs証明書が、運用環境ではブランク。
シャチョーに作らせてSlackでアーカイブもらっといてまだ反映してないんだけど、…もしやこれか?

これだったw orz
と言うわけで、開発にかかる前に証明書は耳を揃えてもらっておかないといかんと言う話でした。

xcodeが古くビルドができない場合の対応

f:id:xx_maya_xx:20191220114600p:plain

この日が来やがった。実機をつないでRunしたら→XCodeが対応していません件です。

mayatan.hatenablog.jp

この方法で誤魔化してたんだけどw 遂に違和感に気づいたのか(はたまたまだリリースされてないバージョンのダミーフォルダまで作ったせいかw)やはり叱られたので、

正攻法を試します。

developer.apple.com

https://developer.apple.com/download/

まずここでベータ版のxcodeを探す…も、2019/12/19現在でベータリリースのxcodeがいない。のでここでは見つからない。

そこで、深追いするw

developer.apple.com

https://developer.apple.com/download/more/

f:id:xx_maya_xx:20191220115701p:plain

ほらいた。

このアーカイブを落として来て、解凍。OSのバージョンが合わないので使えません旨バッテンがついてるアイコンの、パッケージの中身を見る。

f:id:xx_maya_xx:20191220115843p:plain

f:id:xx_maya_xx:20191220120032p:plain

Contents → Developer → Plathomes → iPhoneOS.platform → DeviceSupport の中に各バージョンのiOSのフォルダがあるので、これらを運用中のxcodeにコピペ。

アプリケーションフォルダ内のxcodeのパッケージの中身を展開し、上記と同様のフォルダへペースト。

その後、xcodeを再起動すると幸せになれます。

Amazon SESを生涯初めてセットアップした話

f:id:xx_maya_xx:20190923151715p:plain

経緯としては以下の通り
・Lightsailにてsendmailから発信する、GSuiteでアカウント作ったメールの配信が遅延する
・maillogを漁っていると、以下のメッセージ

Deferred: Connection timed out with aspmx.l.google.com.

・他のサーバでは発生していない

・そのくせメールの遅配が命取りになり兼ねないオーダーなので、仕方ないからAmazon SESを使う旨提案

aws.amazon.com

Amazon SESがどの様なものかは以下に詳しいです。

dev.classmethod.jp

超ざっくり言うと、今までEC2が散々スパムの踏み台にされて来たのでメールの発信元の裏どりをしてくれる様です。

まずAWSのコンソールに入り、Amazon SESを探し出し画面を展開

2019/12/19現在、東京リージョンで展開されていない
ムンバイ、シドニー、フランクフルト、アイルランドバージニアオレゴン…さあどこにしよう、という次第でバージニア

f:id:xx_maya_xx:20191219140242p:plain

ここで認証して欲しい送信元のドメイン、もしくはメルアドを指定します。今回はドメインの認証をもらいます。

qiita.com

手順はこちらに詳しいです。

ドメインを認証する為にDNSレコードに入れる設定値をもらえます。認証が通るとVerifiedになります。

f:id:xx_maya_xx:20191219141510p:plain

認証が通ったので送信実験を行うも、外部ドメインに発信しようとすると

Email address is not verified. The following identities failed the check in region ほにゃらら

と叱られます。さっきVerified言ったじゃんorz

  • ハマりポイント1
    ところが鈴木雅之さんくらい「違う、そうじゃない」話でした。
    デフォルトはSandboxモードなので外部への発信を行うにはAWS様にお断りを入れろ、的な話なんです。
    その旨まっすぐ言ってくれればいいのにorz

そこでサポートへお断りを入れます。

michimani.net

入力項目が煩雑でわかりにくいですが手順はこちらが詳しいです。

んで実作業を行うのは多分バージニアなので一晩待機。Resolvedになったら、コマンドラインでメールが送れるかを検証します。

コマンドラインでの作業含めSESからメールを発信するにはSMTP情報が必要になります。

https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/smtp-credentials.htmlldocs.aws.amazon.com

SMTP情報はIAMユーザーに付与されるので、以下の画面の「Create My SMTP Credentials」からIAMの画面を展開して登録します。

f:id:xx_maya_xx:20191219143026p:plain

f:id:xx_maya_xx:20191219143302p:plain

自分で忘れさえしなければデフォルト値でOK。

  • ハマりポイント2

f:id:xx_maya_xx:20191219143500p:plain

そして、IAMのアクセスキー等々とSMTP情報は別物なので、この画面から取得できる情報またはCredential.csvを保持して使わないとなりません。

やっと以下の通りに、サーバのコマンドラインでコマンドを流してみて送信確認をとります。

https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/send-email-smtp-client-command-line.htmldocs.aws.amazon.com

  • ハマりポイント3

なおここで

OpenSSL を使用して SMTP インターフェイスに接続する場合は、base64 エンコードを使用して SMTP 認証情報をエンコードする必要があります。

この1文を読み飛ばしていた為ハマりました。orz

openssl s_client -crlf -quiet -starttls smtp -connect email-smtp.us-west-2.amazonaws.com:587<br>
openssl s_client -crlf -quiet -connect email-smtp.us-west-2.amazonaws.com:465<br>

ここで email-smtp.us-west-2.amazonaws.com を任意のリージョンのそれに読み替えます。

よしなにメールが飛んだところを確認したら、やっとPHPに組み込んでやります。

システムはPHP+CodeIgniterなので、

$this->load->library('email');
$config['protocol']  = 'smtp';
$config['smtp_port'] = '587';
$config['smtp_host'] = 'email-smtp.us-east-1.amazonaws.com';
$config['smtp_user'] = 'base64する前のユーザーID';
$config['smtp_pass'] = 'base64する前のパスワード';
$config['smtp_timeout'] = 15;

と書いていた。

Error: 530 Must issue a STARTTLS command first

と叱られた。orz

$config['smtp_crypto'] = 'tls';

この1行がいなかった。
斯くして…飛んだ!!

駄菓子菓子。

Action: failed
Remote-MTA: dns; amazonses.com
Final-Recipient: rfc822; hoge@foo.bar
Diagnostic-Code: Amazon SES did not send the message to this address because it is on the suppression list for your account. For more information about removing addresses from the suppression list, see the Amazon SES Developer Guide at https://docs.aws.amazon.com/ses/latest/DeveloperGuide/sending-email-suppression-list.html
Status: 5.1.1

と仰られる。orz
調べると

https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/receiving-email-action-bounce.htmldocs.aws.amazon.com

Mailbox Does Not Exist

要するにいつも悩んでるんですが独自ドメインのサーバから同一のドメイン先にメールを送信しようとするとメールがサーバの外に出てくれない現象なので
今回は幸いGSuite。
ドメイン名の後ろに hoge@foo.com.test-google-x.com とかつく予備メルアドが有るので、これを使わせていただくことにしましたw

しかし

独自ドメインのサーバから同一のドメイン先にメールを送信しようとするとメールがサーバの外に出てくれない

以前解決した様な気がしたんだけどなー、これ。
すごく時間がある時に調べよう。なんか勘違いしてるかもしれないし。