21
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Microservices 風 Emacs HTTP Server(s) on Heroku

Posted at

概要

  • Emacs HTTP Server (elnode) を Heroku で動かしてみた
  • Emacs on Heroku 同士でデータのやりとりを行ってみた

といった出来事から得られた感想を述べます。

タイトルで Microservices と書きましたが、要するに Emacs の環境が Heroku 上に簡単に用意できる ことを知っていただくことが本記事のメインとなっております。

経緯

Emacs ユーザの皆様におかれましては

「Emacs で HTTP Server を起動できるから Heroku で動かしたい!!」

と日頃より思い悩んでいるはずで、偶然にも最近 gongo/emacs-heroku-docker を作成したことで
その悩みは解消されることと存じ上げます。

簡単に説明すると、この Docker Image を利用して Heroku にリリースすることで、
Cask で依存パッケージをインストールしつつ、好きな Emacs プロセスを起動できます。
Heroku なのでおそらくは elnodesimple-httpd を起動することになるでしょう。

Example:

これにより、いくつでも Emacs on Heroku の環境を起動できるようになりました。

そして、複数の HTTP Server を立てられるようになった人類は、
お互いにデータのやりとりを望むようになります。一つになりたい。

作ってみました

JSON テキストを整形するやつです。
拙作 gongo/json-reformat の Web 版といったところです。

emacs-json-formatter.gif

1. 構成

  • ejf-front = UI を提供する
    • 整形したい JSON テキスト入力フィールド
    • 整形後の JSON テキスト表示フィールド
  • ejf-api = POST されてきた JSON テキストを整形して返す
    • 整形時、JSON テキストに不備(カンマがない、キーの書き方がおかしい、など)があれば、その旨とおおよその原因の位置を返す(おおよそです)

2. 仕組み

2つのサーバ(サービス)で構成されているので、そこまで複雑ではありません。

  1. ejf-front で、整形したい JSON テキストを入力し、ボタンクリック
  2. 入力された JSON テキストを superagent.jsejf-api に POST する
  3. ejf-api で、受けとった JSON テキストを整形する
  4. 整形に成功すればそのテキストを、失敗すれば原因と詳細な情報をレスポンスとする
  5. ejf-front は整形後のテキスト or エラーメッセージを表示する

3. コメント

概ね動いているのですが、本記事執筆までに達成できなかった点が不満として残りました。皆様方お気付きかと思いますが

サーバ間のやりとりが Emacs で行われていない

これは Emacs の限界ではなく、単に私がめんどくさがってやらなかっただけです。


Emacs で HTTP 通信を行う際、私はよく emacs-request を愛用しています。
本作も途中までは emacs-request で JSON テキストを POST していましたが、
現在の emacs-request のバージョン (0.2.0) だと

GET/POST のレスポンスステータスが失敗系の場合、そのレスポンスボディが破棄される

という問題がある(仕様である)1ということがわかりました。

ejf-api は整形失敗時に JSON でエラーメッセージやら怪しい箇所の情報をレスポンスしてくれるため、
これが破棄されてしまうと ejf-front 側では「とりあえずエラーになった」ということしかわかりません。

もしかしたらいい抜け道があったかもしれません。emacs-request を使わない手もありましたが、
今回はそこまで追求せず、結局 POST は JavaScript に頼ることにしました。


先述の通り私がめんどくさがってやらなかっただけで、
自力で頑張れば Pure Emacs Lisp で Emacs 同士の HTTP 通信は問題ないでしょう。
他にも ルーターは簡単に書ける し、Emacs が持つパワフル文字列処理パワーを存分に発揮できるので、
「データを受けとって変換して返す」という基本的な Web サービスとしては充分やっていけるのではないでしょうか。

まとめ

  • Emacs の環境を簡単に Heroku 上に用意できる
  • (今回はお見せできなかったが)Pure Emacs Lisp で Microservices もがんばればいける

皆様も是非 Emacs on Heroku で世界にあなただけの Emacs を見せつけましょう

参考資料

  1. 自分が見つけられなかっただけで、実は回避策あるかも

21
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?