NodemailerをPureScriptで使えるライブラリつくっといたよ

つくったやつ

GitHub - oreshinya/purescript-nodemailer: Bindings nodemailer for PureScript

どういうライブラリ?

メール送るやつです。 フルスクラッチメーラー書くのめんどくさかったので、内部ではGitHub - nodemailer/nodemailer: ✉️ Send e-mails with Node.JS – easy as cake!を使っています。

使い方

とりあえず現段階ではAPIも少ないし、受け付けるオプションも少ないのでドキュメントを読めばわかると思います。

補足

普通の場合、この返り値つかわねーだろみたいなのは、PureScript側に渡さずに代わりにUnit渡したり、 各種オプション(型シノニム宣言されてるRecordを指している)は、本当はもっと色々受け付けるけど、とりあえず最小限のものしか受け付けないようになってたり、 など、最低限のユースケースを満たす状態でリリースしています。 あとは、私が使っていく中で色々対応するとは思うし、追加対応したいところあったらPR待ってます。

各種PureScriptパッケージを更新した

追記

本記事のパッケージのうち、以下のパッケージ以外はメンテされていません、ご注意ください。

  • purescript-crypto
  • purescript-mysql
  • purescript-simple-emitter

更新したパッケージ

先週は、PureScriptで仮想DOM用のdiff処理を書いた - oreshinyaのブログの続きの作業として、仮想DOM実装への組み込み作業を行なった。 ついでに、ほっぽっていたパッケージのdependenciesの更新と整理を行なった。

Dependenciesを更新したパッケージ

本体コードに変更を入れたパッケージ

purescript-vomについて

purescript-key-based-diffを使ってdiffのとりかたを賢くするようにした。(ようするにパフォーマンスがよくなった。)

組み込みながらpurescript-key-based-diffのインターフェースや処理を使いやすいように調整しつつ行なった。

内部処理が複雑めになるのでテストを書いておいた。 jsdom-globalFFI経由で呼び出して、生DOM部分のテストを書いている。

purescript-mysqlpurescript-conveyorについて

purescript-affという依存パッケージの新しいバージョンに対応した。 このパッケージは、雑に言えば非同期な副作用を扱うモナドで、基本的にAltjsであるPureScriptにとって、とても重要なパッケージなのだが、 これにそれなりな変更が入っていた。 私のほうで行なった対応は、インターフェースの変更に対する対応、そして、AffをFFIとして定義するときの方法やその使い方の変更に対する対応を行なった。

余談

PureScriptは公式であらたなパッケージマネージャをつくっており、その依存解決をpackage-setsを用いて行う。package-setsは、公式の人間やコミュニティの人間がPRをおくってパッケージを加えていくことによって依存解決できるようになる、という形となっている。 そこに、拙作のpurescript-cryptoというパッケージが追加されていて地味に嬉しかった。 いやーしかしPureScript 0.12から入るEffからIOへの移行はいつくるんだろうなー そのときはまたアップデート祭りだー

PureScriptで仮想DOM用のdiff処理を書いた

追記 本記事に出てくるパッケージは現在メンテされていません。 また実装に問題があるため参考にはしないでください。

動機

拙作の仮想DOM実装のpurescript-vomは、child nodeの差分計算が雑に作られていた。 しかし、そろそろ真面目にこのパッケージ使いたいなと思い、その差分計算の実装を少し賢くしようということで実装した。 それがこちらのpurescript-key-based-diffである。 まだpurescript-vomにはこの処理を組み込んでいないが、それはまた後日やる。

どういう感じなのか

馬鹿正直に実装せず、計算量が少なく済むようなリスト変更パターンで処理を進められるだけ進めるという感じになっている。 具体的にはコードを見てもらえればわかると思うが、

  • 先頭から処理を進めていった場合に、先頭が古いリストと同じリストで同じパターン
  • 末尾から処理を進めていった場合、末尾が古いリストと同じリストで同じパターン
  • 先頭から処理を進めていった場合のリストがリバースされているパターン
  • 末尾から処理を進めていった場合のリストがリバースされているパターン

を先にチェックして進めるだけ進めるようにしていて、 進めるだけ進んだら、未処理の分をぐるっとまわして、普通にkeyと要素のマップつくってから、残りの処理をするという感じ。

また、この処理は最終的にリスト操作に応じてdomへの反映処理を行うこととなるので、Effで反映処理をうけつけるようにしている。

感想

処理の性質上、すんごい手続き的な書き方になったが、すごい見栄えが悪いしコードも長かった。(通常はこんなコードにならない)

また、マジレスすると、デフォでカリー化されるPureScriptで書くより、FFI側でJSで全ての処理を書いて、インターフェースだけPureScript側に公開する形をとったほうがパフォーマンスはよいだろう。 しかし、あんまりFFIでどうにかしないようにしたいというお気持ちが強かった....

最後に

PureScriptはユーザーが少ないため、マサカリやPRが基本的にこない。そのため、マサカリ不足となっている。マサカリは能力値アップには必要不可欠であると考えるため、なるべく自分のつくったものを宣伝しようという気持ちができてきている。

GitHubに拙作のPureScriptパッケージがいくつかあるので、優しい人はPRやマサカリをなげていただけるとかなり喜ぶ。

PureScript楽しい

ブログ再開した

自分の存在をネットに残しておくことは実利があるのでやっていこうと思った。 過去に書いたものはもういいやと思って記事にしてない。

PureScript楽しい

今年はPureScriptにめっちゃハマっていて、というか言語自体が大好きになるのが初めてでとても楽しめている。 かなり好きになったので、開発するための下地を整えようと思って、基盤となるいろいろなパッケージをつくってる。 なにが気に入ってるかというと、パズル的な要素が楽しいってのもあるし、なにより、泥酔していても型パズルさえとけば、動作担保が結構できるというのが気に入っている。(なお、この記事も泥酔状態で書いている)

なんでPureScript始めたのか

急にHaskellやりたくなって、Haskellをやりはじめて、結構面白いなーと思った。 書き始める前は「頭がいい人間がマウンティングするための言語」というとても悪い印象だったが、 実際は頭の悪い人間の向けの言語に感じている。数学の知識が必要だなんだとよく言われるが「とりあえず書いていく」分には全く必要ない。(ただ高みに登るためには数学の知識は必要なのかもしれませんがしりません。)

ただ、やはり最初はキャッチアップが大変な感じはしますが、Servant(というWAFがあるのですが)を使って書き、Servantがやっていることを理解することにフォーカスするとよく使う仕組みや面白変態機能の一部をいっぺんに学べた感じがします。

また、ざっくり言ってしまえば、言語の大枠の仕組み自体は限られた仕組みとその延長線上でできていると感じること(機能が少ないと言いたいわけではない)と、 賢いコンパイラに細かいことをわかりやすく細かいエラーメッセージで怒られることによって、頭の悪い人間向けに感じているような気がしています。 そして、雰囲気で型合わせしてるだけで大体きっちり動くのがすごい。

そして、上のようにしてHaskellを楽しんだあと、フロントエンドは似たような言語を使ってみようかと思って、勢いのあるElmを書き始めた。 Elmでは型クラスやモナド、自動導出など、初学者がつまづくような仕組みは徹底して排除されていて、これはこれでよかったなとは思う。 しかし、JSONデコーダー書いていて、Haskellだったら自動導出であっさりかけるのになーと思ってしまい、別のものに移る決意をした。また、私はElm Architectureにいくらかの合わせたくない部分があったという要因もある。

ちなみにElmをディスっているわけではなく、私は別のものが良かったというだけで、Elmの割り切り方は好感をもっています。 んで、何使うかなーという段階で、GHCJSは時期尚早だという話を何かで見て、 知り合いのHaskellerに聞いたら、今だったらHaskellerはPureScriptのほうが使ってんじゃないの?という話を聞いてPureScriptを始めた。

なんでハマったのか

私は仕事でRuby、JS、Coffee、Objective-C、Swift、JavaC#あたりを経験していて(もちろん習熟度は言語によって差がある)、クラスベースの言語には飽きていたし、クラスベースの仕組みがいるのか?という疑問がありモヤモヤしていた。そんなところで、なんとなくHaskellから手を出し始めていた。 HaskellもElmも楽しかったが、私にとってPureScriptが都合が良かったのが、PureScriptにはElmと比べて十分な機能があり、AltJSなのでNode(つまりJS)でFFI書く土壌があったということである。 これを両方満たしていたので、十分な抽象化機能があり不満もほぼ出ず、外部とのやりとりはFFI(JS)でなんとかできたので、ゆとりにとってとてもやりやすかった。 そして、上にも書いたが、とにかく雰囲気で型合わせしてればいいのが最高で、酔っ払ってウェーイしてる状態で書いていても動く快感がある。(すべてのコードがこれで済むと言いたいわけではない) また、PureScriptを始めた当初からさらに機能が強化され、型レベル計算のような面白い機能も使いやすくなり、どんどん面白くなっていったのも一つの要因かもしれない。

一方で

やはり最初の学習コストは高く、とくにPureScriptの拡張可能作用は、最初はコンパイルすらなかなか通せなかった。しかし、はじめてプログラミング言語勉強したときと比べてどうかというと学習コストが高いと言えないので概念が違いすぎて貯金で済ませられないというだけな気がしています。 また、これからはIOがメインのネイティブエフェクトになるようです。

最後に

これはマンセー記事ではなくただの小学生並みの感想記事です。 周りにPureScriptフレンズがおらず、ずっと我流で書いていて寂しい。友達が欲しい。