node.jsをSAORIとして動かした話
これは伺か Advent Calendar 2015 - Adventar18日目の記事です。
サーバサイドJavaScript実行環境であるnode.jsには、Windows用のexeとして用意されているものが存在します。また、コンソールから引数を得ることで、任意の.jsファイルも実行できます。
とあるJavaScript用のライブラリをどうにか里々でも使えるようにならないかとTwitterで発言していた折に、これをSAORI BASICとして使えばどうかというアドバイスをいただき、実際に試してました。ですが、どうにも文字コード周りで既存のSAORI BASIC実装とnode.jsとで齟齬があり、SHIORIとnode.js間で上手く文字列の受け渡しが出来ませんでした。
当エントリはその解決に使った方法と、それらを用いて里々からnode.jsでテキストファイルの書き出しを行う簡単なサンプルを紹介します。
原因と対処
node.jsが標準出力にUTF-8として文字列を出す一方で、proxy.dllや里々の出力を受け取る側が一律にshift_jisで文字列を受け取っていることが上手く行かない原因でした。そこで、文字列の受け取り時にどの文字コードを用いるのかを使用者が指定できるproxy.dllを作成しました。
ページ一番下の欄の拡張版proxy.dllというやつがそれです。
受け取り側にUTF-8を指定することで、proxy.dll内で適当に文字コードを変換し、SHIORI側に渡してくれるようになりました。
node.jsを里々でSAORIとして使う
以下、軽く手順を記述しておきます。
SAORIに用いる為のnode.exeとライセンス文の入手
https://nodejs.org/en/ の、インストーラのダウンロードリンクの直下にある「Other Downloads」のリンクから「win-x86」→「node.exe」と追って、SAORIとして起動させるnode.exeを入手しておきます。今回自分はv5.3.0stableを入れました。
また、再配布時のライセンスとしてnode.exeはMIT Licenseを指定しているので、 https://github.com/nodejs/node/blob/master/LICENSE からライセンス文もダウンロードします。
SAORIとして用いる準備
ダウンロードしたnode.exe、ライセンス文に加え、上記の拡張版proxy.dllをまとめてghost/master/saoriに入れます。
その上で、SAORIとして呼びだされた際に実行するスクリプトを新規に用意します。今回は「fs.js」という名前で以下の内容の.jsファイルを作成し、文字列を.txtファイルに書き出すことを目標とします。文字コードはUTF-8、改行はLFに指定しておきます。
if (process.argv.length < 3) { console.log('引数が足りません。'); return; } var fs = require('fs'); fs.writeFile( process.argv[2] , process.argv[3] ); process.stdout.write("文章「"+process.argv[3]+"」をファイルに書き込みました。");
次に、satori_conf.txtの@SAORI単語群に拡張版proxy.dllとnode.exeをSAORIとして呼び出せるように登録しておきます。
@SAORI nodejs,saori/proxy.dll,UTF-8,node.exe
このproxy.dllは第一引数に標準出力からどの文字コードで文字列を受け取るかを与えることができますので、今回はUTF-8を指定します。
後は適当な状況で、なにか値をテキストに書き込みたい時に、
(nodejs,fs.js,./karaage.txt,唐揚げ食べたい)
というように呼び出します。
結語
node.jsにはnpmというパッケージマネージャが存在しており、例えば https://www.npmjs.com/package/jsonfile のようなjsonの読み書きに用いるものなど、様々な機能がパッケージとして配布されています。必要な機能があった場合にまず先行して実装されているパッケージを探せるというのはやはり気が楽です。
また、冒頭でも触れたように、node.jsというより、JavaScript用としてすでに用意されているライブラリも修正次第で利用できるというのもありがたいです。
参考
- http://buynowforsale.sakura.ne.jp/archive/segmentize.zip
- 冒頭で触れた、里々で使用したいと思ったJavaScript用ライブラリであるTinySegmenter: Javascriptだけで実装されたコンパクトな分かち書きソフトウェアを、上記の方法でSAORIとして動かしているものです。