The King's Museum

ソフトウェアエンジニアのブログ。

Vercel からは SMTP ポート 25 番に接続できない

サイドプロジェクトで Vercel と Next.js で Web サイトを構築している。

その Web サイトからメールを送る必要があり、横着して SendGrid などのメールサービスを介さずに直接 SMTP 25 番で送ろうとした(SMTP auth もなし)。 もちろん、筋のいい方法ではないことが分かっており、スパム扱いされやすかったり、接続拒否される可能性はある程度想定済みだ。

状況

使ったライブラリは node-sendmail。

GitHub - guileen/node-sendmail: send mail without setting up a SMTP server

Qiita だと下記のような記事が出てくるので少し参考にした。

Node.jsにてSMTPサーバなしでメール送信 - Qiita

ローカルから送信

まず、ローカルで npm run dev で立ち上げたサーバーからメールを送信しようとしたが、タイムアウトで SMTP サーバーに接続できなかった。 送信先ドメインの MX レコードに書かれている SMTP サーバーのポート 25 番と connection を確立できず。

これは自宅で契約している ISP の NURO 光が Outbound Port25 Blocking をしているためだ。 下記に説明がある。

Outbound Port25 Blocking (OP25B)のご説明 | 基本メールボックス | NURO 光

Vercel から送信

次に Vercel からは送信できるかと思い、試してみたができなかった。

挙動としてはローカルから接続しようとしたときと同じ。Serverless Function が 60 sec timeout なので、コネクションのタイムアウトより前に 60 秒でメソッドの実行が中断してしまう。 明確に SMTP サーバーから接続が拒否されたような雰囲気ではなかったので、Vercel も Outbound Port25 Blocking なのかなと思いドキュメントを調べたら次のように書いてあった。

While the Vercel platform does not block outgoing SMTP connections, ...

ref: https://vercel.com/guides/serverless-functions-and-smtp

どうやら Vercel としては特に 25 番への接続を block していないらしい。 でも、明らかに block されいるような挙動なのでサポートに問い合わせてみた。

回答は下記のようなものだった。

I think our upstream provider is blocking outbound traffic on port 25 (SMTP) by default

ということで、Vercel としては block してないが、より上位の network provider で block されているのだろう、ということだった。 また、Vercel の Serverless Function は Dynamic IP なので、Yahoo メールなどでは明確に「接続拒否」されるから、接続できても拒否されることは多そうだよ、と説明してくれた。

https://support.yahoo-net.jp/PccMail/s/article/H000007342

結論

Vercel からは 25 番 Port へは接続できない。 外部のメールサービス(SendGrid など)を REST API で使うか、SMTP auth (587, 465) を使うことが必須である。 ドキュメントでは「外部のサービスを使うことを推奨」と書いてあるが、推奨というよりそれが必須であることが分かった。

余談

Vercel のサポートで担当だった人がとてもすばらしく、こちらがそこまで詳細に書いてないにも関わらずかなり明確に説明してくれて、サービスとしての印象がめちゃくちゃよくなった。

Rust の環境構築と Hello World

Rust を始めるので環境構築と Hello World から。

言語の Overview とかも見ようかと思ったけどとりあえず手を動かせる環境を作る。

インストール - The Rust Programming Language 日本語版

インストール

自分のプライベートマシンは Windows なので Windows 版のところ見ようかと思ったけど、WSL 使ってるから普通に Linux のやつで。 (WSL 1 だとこの手は使えないっぽい)

$ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh

↓ が表示されなくてずっと待ってたけど Enter 押したら表示された。

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation

1 を選んで標準インストール

Rust is installed now. Great!

rustup ツールをインストールされ、コンパイラがインストールされたらしい。

これに加えて、なんらかのリンカが必要になるでしょう。

なるほど。でも普通の WSL2 なら大丈夫だろう。 最近、コンパイルとリンクが必要な言語触ってなかったからなんだか懐かしい。

エディタ

個人的なコーディングは IntelliJ IDEA を使ってるのでそれに Rust プラグインをインストールしてつかう。

IntelliJ Rust: IntelliJベースIDE用のオープンソースRustプラグイン

ある程度、ちゃんとした機能がありそう。 そのうちデバッガとかも使ってみようかな。

Hello World

Hello World を書いて実行する。

Hello, World! - The Rust Programming Language 日本語版

fn main() {
    println!("Hello, World!");
}

関数定義は fn か。 println!! は副作用があることを示したりするのだろうか。

コンパイルして実行。リンカは大丈夫だったみたい。

$ rustc helloworld.rs
$ ./helloworld
Hello, World!

気になったところの備忘録。

main関数は特別です: 常に全ての実行可能なRustプログラムで走る最初のコードになります。

entry point が main 関数。

まず、Rustのスタイルは、タブではなく、4スペースでインデントするということです。

4 space indent。

2番目にprintln!はRustのマクロを呼び出すということです。代わりに関数を呼んでいたら、 println(!なし)と入力されているでしょう。Rustのマクロについて詳しくは、第19章で議論します。 とりあえず、!を使用すると、普通の関数ではなくマクロを呼んでいるのだということを知っておくだけでいいでしょう。

へー。副作用の意味かな、と思ったけどマクロなんだね。 println という関数はあるかと思ったけど関数はないらしい。

error[E0423]: expected function, found macro `println`
 --> helloworld.rs:2:5
  |
2 |     println("Hello, World!");
  |     ^^^^^^^ not a function
  |
help: use `!` to invoke the macro
  |
2 |     println!("Hello, World!");
  |            +

error: aborting due to previous error

For more information about this error, try `rustc --explain E0423`.

とりあえず最初の一歩はこんなところでおしまい。

次回

次はパッケージ管理(?)の Cargo をやってく。

Rust を勉強するよ

そろそろ何か新しいプログラミング言語を勉強しようと思い、Rust をやってみることにした。

何か強い目的があって Rust を選んだわけではなく、自分が知らないセマンティクスがある言語がいいなと思ったのが理由。 そういう意味だとたぶん Prolog とかが一番いいんだけど、少しは流行にのったほうがいいかなという思いもこめて Rust にした。

どうやって勉強しようかと思ってるが、ひさしぶりにちゃんとブログにメモでも残していきながらやろうかなと思っている。

とりあえず、The Book と呼ばれる公式のやつを読みながらすすめていこうと思う。

The Rust Programming Language 日本語版 - The Rust Programming Language 日本語版

あとは、状況を見ながら知り合いに教えてもらったこの本でもやってみようかな。

とりあえず Rust の Hello World の書き方すら分からないから、すべてが自分にとって新しいので楽しみだ。

『となりの億万長者』と『その後のとなりの億万長者』を読んだ

『となりの億万長者』と『その後のとなりの億万長者』を読んだ。

『となりの億万長者』はアメリカで書かれた本で、億万長者(純資産100万ドル超え)の人びとがどういった生活スタイルをしているかを調査した本。 初版は96年なのでちょっと前で、調査自体は70年代(?)くらいからやっていたらしくけっこう内容的には時代を感じる。 『その後のとなりの億万長者』はその続編で、『となりの億万長者』の著者とその子どもが 21 世紀に入ってから再度調査を行ってまとめなおした本。

億万長者がどのような生活スタイルをしているかを描き、資産を築いていくにはどうすればよいかを記している。 データを見ていくと億万長者にはベンチャー企業の創業者や親から大金を相続した人たちは決して多くなく、堅実に収入を貯蓄し投資していった人びとが多いことがわかる。

この本で紹介されているとても大事な点として、収入の高さが資産の多さとは必ずしも比例しないことだ。 特に一部の高収入な職業に就く人々は収入を消費に回してしまいがちな傾向が見てとれる。 また、親から資産をもらって億万長者になった人は意外に多くないことが分かる。 こちらも親から経済的援助を得るとそのまま消費してしまう人が多いことが分かる。

そういう億万長者の傾向を7つにまとめている。

  • 収入よりも低い支出で生活している
  • 資産形成のために、時間やエネルギーや資金をうまく配分している
  • 周りを気にしたり、流行を追うよりも、経済的な独立のほうが重要だと思っている
  • 両親からの遺産や相続を受けていない
  • 子供は経済的の独立している
  • 市場のチャンスをとらえるのがうまい
  • 自分に合った職業をえらんでいる

続編の方はデータが新しくなっていて 21 世紀に入ってからの調査結果が紹介されている。 ただ、前作から特に目新しいことはなくて「もう一度、調査したけどけっかは同じだった」という結論なので内容としてはほぼ同じ。

--

富を築くには収入や投資リターンはほとんど関係なく貯蓄率が大きく影響する、と以前読んだ本にも書いてあり、それとほぼ同じことが書いてあった(この本の方が元ネタだろうけど)。

thekingsmuseum.info

ある意味当り前のことしか書いてなくて、そりゃ収入の多くを数十年貯蓄して投資していったらそうなるよね、と思った。

ただ、読んでいていくつか気になる点はあった。

この本では『年収30万ドルを超えてても億万長者になれないが、年収9万ドルの人が億万長者になっている』というような例が頻繁に紹介される。 しかし、読んでいくと年収30万ドルの人も数十万ドルの資産はあることがほとんどで決して世間的に貧乏なわけではない。 だから、収入が多く、毎年のように海外旅行も行って、数年に一度は高級車を乗り換え、毎週豪華なディナーを取る生活をしていても、日本円で数千万円以上の資産はあるわけだ。 一方、年収9万ドル(おそらく最高時の年収だろう)の人は働き始めたころ(20歳前後)から貯蓄にはげみ、旅行もあまりせず、車も中古で、地価の安い地域に長年住んで、定年時にようやく資産100万ドルという状況だ。

はたして、どちらが幸せな人生なのだろうか。

本では、資産があって経済的に独立しているという人は幸福度が高い、という調査結果が合わせて紹介されている。 ただ、アメリカは公的年金が存在しないから老後のための貯蓄がないと、定年後の生活がほんとうに破綻するという不安があり、貯蓄がないことへのストレスが非常に高いのではないかと思った。 かたや、日本の場合は公的な年金制度があって、生活保護というセーフティーネットがあるわけだ。 それに、アメリカがクレジットカード大好き消費大国である一方、日本の貯蓄率の高さはいろいろなデータでも示されているわけで、あまり極端に考えなくてもいいのかと思った(本だと5年落ちの大衆中古車を15年くらい乗っている億万長者の例が出てくる)。

--

あと、出てくる億万長者の多くは60歳前後のシニア層で世界の経済成長の波にうまくのった層である。 親からの遺産がなくても自分で事業を起こして、いわゆるアメリカンドリームをつかんだシニア層のことをよく紹介している。 自分の認識だと今のアメリカの若い世代はそういう環境ではなく、以前読んだ『実力も運のうち - 能力主義は正義か』でも書かれていたように、現代のアメリカでアメリカンドリームを実現することは相当に難しい。

thekingsmuseum.info

この先、経済成長は続くのかみたいな議論もあるし、1900年代のアメリカンドリーム神話みたいなのを礼賛してる感じが強くて、ちょっと距離を置いてみておく必要がありそうだとは思った。

ただ、もちろん一般論として収入の多くを節約して貯蓄すれば資産になるというのは当たり前でそういう実例がふんだんにのっていて多少懐疑的になりつつも「貯蓄して投資するか…」という気分にはなれるので読んでみるのもいいかもしれない。

『金持ち父さん』を読むよりこの本のほうが着実に億万長者に近づけるような気もしたので、自分のようなサラリーマンは一度読んでみるのはいいかもしれない。 ただし、「となりの」の方は Kindle 版がないのが辛いが。。。

『ソフィーの世界 - 哲学者からの不思議な手紙 - 』を読んで

『ソフィーの世界 - 哲学者からの不思議な手紙 -』を読みました。

ソフィーという15歳になる少女に『あなたはだれ?』という不思議な手紙が届き、それをきっかけに読者を巻き込んで西洋哲学の歴史を学んでいくというストーリー。 それにくわえて、物語が進むにつれてソフィーの世界に隠された秘密が明らかになっていき、、、というミステリー要素もある本。 30年前くらいに出版されて世界中で1000万部以上売れたベストセラー。

発売された当時、親が買ったやつがずっと放置されてたのを小学校高学年くらいの時に読んだ。 これをきっかけにけっこう哲学に興味を持ったし、途中で明かされる秘密がけっこう強烈で記憶に焼き付いてる。 でも、けっこう分厚い本だったから途中で挫折してしまった。

ずっといつか読み切りたいと思ってて新装版が Kindle で出ていたので読んでみた。

現在の自分は哲学にはあまり興味がないんだな、と思ったw。 当時はプラトンのイデア論とか「おおー」って思って読んでたんだけど、今読むと「ふーん」って感じであまり興味を持てなかった。 西洋哲学史を学べるという点が売りだったんだろうけど、中高生くらいの読者を意識してるのか説明の比喩が強すぎて全体的に物足りないし、正しく理解できた気がしない。 登場人物の対話形式で物語が進むけど、哲学の講義の部分はほぼ説明口調で進むのもちょっと退屈。

でも、一通り読んでみて、イギリス経験論とか実存主義とかのあたりは自分の考えと近いなと思った。 昔、大学の先生に勧められてサルトルの本を読んだときはむずかしくて理解できなかったけど、こうソフィーの世界の流れをくむと多少は理解が深まったかな。

小さい頃は本の最後の数ページを先に読む癖があって、ソフィーの世界でもそれをやっていたことを思い出した。 ラスト数ページにたどりついたときに、急にその数ページを読んだ記憶が蘇ってきて 20 年かかってここにたどりついたという思いで感慨深かった。

一応読み切ったけど、人に薦めるほどではないかな。 単に西洋哲学史をなぞりたいなら今なら Youtube の解説動画見るとか、漫画で理解するみたいなシリーズのほうが分かりやすそう。 ミステリー要素もちょっと演出がくどいし、物語の半分くらいで秘密が明かされたあとはそれをずっと引っ張って進んでいくだけだった。

ただ、いつかの日かちゃんと読み切りたいなと思ってたのが達成できたという意味で、今年のうちに読めてよかったと思った本でした。

『サイバーパンク エッジランナーズ』を見たよ

Netflix のアニメ、サイバーパンク エッジラーンナーズを見た。

www.cyberpunk.net

会社の人がおすすめしてて Netflix を再開して見てみた。 元ネタは Cyberpunk 2077 っていうゲームで、自分はゲームの方は未プレイだったけどゲームやってなくてもぜんぜん面白かった。 もちろん、単語とか世界観とかちらほら分からないところが出てくるけど、公式サイトの説明文読んどけば十分。

久しぶりにいいアニメ見たなーって思った。 10話しかなくて短いなと思ったけど、その分密度が濃かった気がする。 もう少し日常回とかあってもよかったのかなって思ったけど、それがなくてもそれぞれのキャラの個性が際立ってていい味だしてた。

自分としては終り方も変にこじれないですっきりしててよかった。 こういう終り方はゲーム制作会社からの強い要望だったらしい。

www.famitsu.com

あと、音楽がとてもよかった。 OP とか ED もよかったし、劇中に流れてたこの曲がとてもよくて最近は仕事中ずっと聞いてる。

www.youtube.com

サイバーパンクっていうから攻殻機動隊に近いのかなと思ったけど、近いのは世界観くらいでストーリーの主題はけっこう違ったかなって感じ。 自分としては、作画も綺麗だったし、ストーリーも面白くて、10話でさくっと見られるからぜひおすすめしたい作品。 男女の関係がけっこう主軸だから合う合わないはあるかもしれないけど。

ゲームの方はアニメをきっかけにまたちょっと盛り上がってるみたいで自分もプレイしてみようかなーと思った。

『幸福論』を読んで

バートランド・ラッセルの『幸福論』を読みました。

大学生の頃、ちょうど15年くらい前に読んで感銘を受けた本。 30代も半ばを過ぎ、四捨五入すると40になるタイミングで人生について考えることが多くてもう一度手に取ってみた。

原題である The Conquest of Happiness が示すように、幸福は個人の努力によって獲得可能であると説く。 幸福は社会的な環境と個人的な環境の両方が満たされて実現するものだが、この本では個人の環境に焦点をあてている。 あくまで、基本的な衣食住が満たされつつも幸福になれない人たちについて論じていて、そうでないような場合はこの本では論じていない。

内容は不幸の原因と幸福の要因について章立てで書かれていて、少し冗長な気もするがだいぶ読みやすく書かれている。

  1. 不幸の原因(第一部)
    1. 何が人々を不幸にするのか
    2. バイロン風の不幸
    3. 競争
    4. 退屈と興奮
    5. 疲れ
    6. ねたみ
    7. 罪の意識
    8. 被害妄想
    9. 世評に対するおびえ
  2. 幸福をもたらすもの(第二部)
    1. 幸福はそれでも可能か
    2. 熱意
    3. 愛情
    4. 家族
    5. 仕事
    6. 私心のない趣味
    7. 努力とあきらめ
    8. 幸福な人

以前読んだときはずいぶんと感銘を受けたけど、改めて読むと感銘を受けるほどでもないかな、という感じだった。 1930年に書かれた本だから、どうしても現代と事情が違う点がちらほらあってあまりしっくりこない。 それでも、女性について述べられた部分はそれなりに先進性があったなと思った。

この本の主要な主張として「関心を内へ向けるのではなく、外界にふりむけて興味を幅広くもつこと。それが幸福への道である。」というのがあるけど、現代社会ではどちらかといえば逆なのではないかと思った。

1930年はコンピュータもなければ、インターネットもない。当然スマホもなければ Google も SNS もないわけで。 その時代、特に田舎に住んでいたら外界の情報にアクセスすることにとても苦労したはずだ。 本書の中でも知的な青年が田舎で暮らすのは知性を使う場面がなくて不幸だ、みたいな記述がある。 そのような状況下で仕事も定型的なものだと自然と内的なものに関心が向きがちになり、外的なものに関心を持つようにというアドバイスは的を射ている。

一方、現代社会は遠くの世界の情報まで簡単に手に入れることができる。 インターネットがあればどこにいても外的な情報にアクセスできる。 自然と外界の情報に目が向きやすくなり、それによって不幸になってしまうことが多々あるのではないか。 だから、最近はもっと自身の内的なものに目を向けるべきだ、という主張がよく目につく気がするな。

そうえいば、同じ時期にラッセルの『論理的原子論の哲学』というのも読んだんだけど、ちっとも理解できなかったなー。 こういう本を読むこと自体に悦を感じていただけだったような気もする。若気の至りだったのかもしれないね。

(c) The King's Museum