あたしは成熟を目指す

プログラミング、思索、読書などの遍歴をとりとめもなく

Node.js

ここ数年、Webアプリケーション開発から縁遠くなっていて、浦島太郎状態です。

なので、Node.jsについても、他人に何かを語れるレベルではまったくありません。

そんなわけで、以下、実際にNode.jsを使いながらのメモ書きです。

環境構築

今回はCentOS 6.8に環境を構築する。

ざっくり言うと、以下のインストール方法があると思われる。

  • 公式サイトからtarボールをダウンロードしてインストール
  • YumにEPELレポジトリを登録してyum install
  • nvmをインストールしてnvm install

バージョンについて議論できるレベルに自分はないが、セキュリティアップデートが簡単にできるようにしたいという気持ちはあるので、公式サイトからtarボールをダウンロードしてインストールするのは避けたい感じである。

nvmを使うと複数のバージョンをインストールできるので良い感じに思えるが、最終的に/etc/init.d以下に起動スクリプトを展開したい。できるんだろうか? まあ、できるだろうな。ここはnvmを使うことにしよう。/etc/init.d以下に起動スクリプトを展開することがうまくいかなかったら、そのときはそのときで考えることにする。

以下にならってやってみる。

qiita.com

git clone git://github.com/creationix/nvm.git ~/.nvm

source ~/.nvm/nvm.sh

まったく簡単ですね。nvm ls-remoteして最新のLTSをインストールすることにする。

む...ローカルからのアクセスはうまくいくのだが、外からアクセスできない。

iptablesを設定してもうまくいかないのはなぜだろう...

 

Markdown編集

ここしばらく、簡単なドキュメントはもっぱらMarkdownで書いている。

不満がないわけではないのですが、レンダリングしないソースの状態での可読性が良いので、事情を知らない人にも配布しやすく、また、職場ではGitHub Enterpriseを使っているのでMarkdownで書いてソースコードとともにレポジトリに突っ込んでおくと、Webブラウザで閲覧したときに見栄えがするわけです。

1年くらい前はAtomで編集していたのですが、当時のAtomは意外に重くて快適ではありませんでした。その後、Visual Studio Codeに切り替えました。Visual Studio Codeの方が軽快であり、また、リアルタイムプレビューのスクロール位置が自動的に編集位置に来るようになって、さらに快適になったからです。

Markdownは、仕様があいまいで、最終的には自分がレンダリングに使う環境(GitHubなり、pandocなり)で確認するしかありません。それでもプレビューで確認できると、まあまあ安心感があるわけです。

ところがその後、以下のBlog記事を目にしました。

takezoe.hatenablog.com

なるほど、良さそうです。で、試してみたところ、最近のAtomは性能が改善されていることもわかりました。そういうわけで、またAtomに出戻ってきたわけです。

(すっかりEmacsから離れてしまっている...)

SPFライブラリ

OpenSPFの実装紹介のページを見ても、あんまりパッとしない状況である。

SPF: Implementations

C、PerlPythonJavaC#(.net)の各ライブラリが紹介されている。

まずPerlを確認してみよう。

PerlSPF実装は、

Julian Mehnle / Mail-SPF - search.cpan.org

である。最終更新は2013年。v2.9.0とあり、それなりの期間、更新されてきたもののおうだ。一応、候補に入れておく。

次にPythonは、

pyspf 2.0.12 : Python Package Index

である。最終更新は2015年で、v2.0.12とある。悪くなさそうだ。

Javaは前述のとおり、

jSPF – Overview

で、最終更新は2010年。SPFの2007年のテストスィートまでしかパスしていないらしく、見劣りがする。

.netは

InterPC.SPF - Home

で、最終更新は2009年。.netをLinux上で動かした経験が自分にはないし、わざわざ選ぶものではなさそう。

自分はPythonよりもPerlを好むので、ここはPerlを選んでおくのが良さそうだ。

JavaMailによるメールボックスの読み取り

JavaMailのAPIドキュメントを読んでいるが、メールボックスを読み取るにはIMAPStoreかPOP3Storeを使う必要があるようだ。

ローカルホストのMaildirを直接読む方法は実装されていないらしい。まあ、Javaらしいと言えば、Javaらしいと言えるかも知れない。(OSやMTAに依存する実装を避けて、OSやMTAに依存しない標準的なプロトコルを重視している、と言えるだろうな。)

ふうむ...JavaMailは、SPFDKIMに関連する機能を提供していないようだ。

改めて検索してみるとJavaSPF実装はjSPFというのがJAMESのサブプロジェクトとして存在しているが、2010年のバージョン0.9.8が最新リリースらしい。マジか? DKIMについてもjDKIMがJAMESのサブプロジェクトとしてあるが、バージョン0.2とか...

まともに使えそうな気がしない。JAMES自体は今年(2017年)7月にバージョン3.0がリリースされたと書かれているが...

James 3.0のソースコードの中には、SPFDKIMも含まれていないようだ...

うーむ...

 

どうやら、Javaによる処理は断念すべき気配であるな...

他の言語によるSPF/DKIMライブラリを探してみよう。

JavaMailのドキュメントを読む

ドメインのメールの引っ越しを支援するユーティリティとWebアプリを書くために、JavaMailのドキュメントを読んでいる。そのメモなど。

JavaMail API documentation

おいらがJavaMailを使ったのは、ずいぶん前のことだ。

メールを受信して、自動返信する仕組みを求められ、JavaMailでSMTPサーバを立てた記憶がある。当時、JavaMailの開発は停滞していたような印象だったが、今日は再び勢いを得ているように思える。

  • JavaMail 1.3: 2002年4月リリース
  • JavaMail 1.4: 2005年8月リリース
  • JavaMail 1.5: 2013年2月リリース
  • JavaMail 1.6: 2017年7月リリース

メール送信コードのサンプルは、SMTPを知っている者にとっては、きわめて素直なものに見える。

Properties props = new Properties();
props.put("mail.smtp.host", "my-mail-server");
Session session = Session.getInstance(props, null);

try {
    MimeMessage msg = new MimeMessage(session);
    msg.setFrom("me@example.com");
    msg.setRecipients(Message.RecipientType.TO, "you@example.com");
    msg.setSubject("JavaMail hello world example");
    msg.setSentDate(new Date());
    msg.setText("Hello, world!\n");
    Transport.send(msg, "me@example.com", "my-password");
} catch (MessagingException mex) {
    System.out.println("send failed, exception: " + mex);
}

 プロパティに設定できる項目は色々あるが、順当なものばかりなので、必要になったときに掘り下げれば良いだろう。

javax.mail以下のパッケージはJSRに準拠した標準ライブラリの位置付けであり、com.sun.mail以下のパッケージはリファレンス実装(RI)との位置付けであるらしい。

ここで私に必要なのは、あるIPアドレスから送信されてきたメールが、SPF/DKIM的に正当であるかどうかのチェック、ならびに利用者がSMTP AUTHを用いて自発的に返信を行なったかどうかの記録を確認することであり、また、あるメールボックスに届いたメールを評価して、必要ならば新しいメールアドレスを案内するメールを返信し、届いたメール自体は新しいメールアドレスに転送すること、迷惑メールであるなら無視して隔離すること、判断に迷う場合には一応隔離しつつ、隔離メールを参照するためのWebアプリへのURLをメールしたいのである。

そのためには、SPF/DKIMまわりのAPIの確認から進めていきたい。また、メールヘッダのParserも欲しいところである。

 

 

帰還

本業の方が、ここ2年ほど、セキュリティとビッグデータ関連になってしまい、あまり社外で書けない状況だった。

が、最近、プライベートの方で、久々にWebアプリを書くことに。

Reactを使ってみようと思っていた矢先、ASFがFacebookのライセンスを禁忌リストに載せるという事件が起き、今はVue.jsを勉強している。

Node.jsのことも全然知らなかったが、なるほど、これは便利だ。みんなが使うわけだね。

おいらがJavaScriptを夢中になって書いてたのは10年近く前になるので、完全に浦島太郎状態である。たいへん楽しい。