non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

node.jsでシェーダーからGIFアニメを生成するツールglsl2imgにプルリク出した件

おはようございます。週末は保育園の同じクラスのお父さんの主催のBBQに行ってきました。長男は同じクラスの大好きな女の子も一緒に来ていたので、楽しんでいまンした。一方次男は迷子放送で呼び出されていたようです。kjunichiです。

TL;DR

node.jsのリポジトリWindows対応のプルリクを出した結果以下が分かった。

  • npmでexecaなるパッケージあり、これを使うとWindowsでも.jsファイルを指定してnodeを別プロセスで起動できる

背景

を読んだ。自分はこのGLSL分野?に興味があり、昨年はmrubyのアドカレで

なる記事を投稿してたりする。同じサーバサイドで使えるツールというこで大変興味を持った。

プルリクの内容

Windowsで動かせないかなぁと、package.jsonをながめていたら、自身はピュアjsでかつ、node-canvasつかっての画像出力で これなら、Windowsで動かせそう!と試したら、

execFileSync(
  `${__dirname}/wrapper.js`,
  [width, height, file, time, uniform, out],
  { stdio: cli.flags.verbose ? 'inherit' : 'ignore' }
);

の箇所でエラー。Windowsではシェバングが使えない為、execFileSyncで.jsファイルを指定して起動することが出来なかった。

batファイルをかます

Windowsプラットフォームでは

require(‘child_process’).execFileSyncを require(‘child_process’).spawnSync に変更して、cmd.exe経由でbatファイルを起動してそこからnode.exeを起動するように以下の様に変更を加えた。 (この対応自体も、node.exeにjsファイルを直接渡せばよかったのではと、この記事書きながら反省してます。。)

if (process.platform !== 'win32') {
  execFileSync(
    `${__dirname}/wrapper.js`,
    [width, height, file, time, uniform, out],
    { stdio: cli.flags.verbose ? 'inherit' : 'ignore' }
  );
} else {
  const spawnSync = require('child_process').spawnSync;

  spawnSync(
    'cmd.exe',
    ['/c', `${__dirname}\\wrapper.bat`, `${__dirname}\\wrapper.js`, 
    width, height, file, time, uniform, out],
    { stdio: cli.flags.verbose ? 'inherit' : 'ignore' }
  );

}

プルリク不採用でした

However, I'm little afraid to write OS-specific code by myself.
I'm gonna find some npm package which takes care of enviroments.

OS依存のコードは避けたく、問題の箇所をWindowsプラットフォームでも扱える パッケージ探して対応して頂けるとのことでした。確かにその方が後々のメンテのコストも増えずに済みますから その方が良いなぁと。

そして、execaなるnpmパッケージでこの問題が解決し、Windowsでもglsl2png,glsl2gifコマンドが動くようになりました!

学んだこと

プルリクはマージされませんでいたが、いろいろ手を動かした分学びがありました。

Batファイルで受け取った引数の参照方法

MSX-DOSしか知らないし、さすがに当時の事はすっかり忘れており、 MS-DOSは詳しくないので、今回のBatで必要になった、受け取った引数を さらに別のコマンドに引き継がせる記述を学べた。

「%*」で全ての引数が渡せる。今回のケースでは、1つ目が不要なので、shiftをして削除している。

shift
node.exe %*

カバレッジ対応が課題

自分の出したプルリクだと、coverallでカバレッジ率が下がったと通知を受けるも、 これをどうやって、もとのカバレッジ率に戻すのかが分からなかった。。

appveyor.ymlの書き方

GTKを使ったnpmモジュールを使ったリポジトリのappveyor.ymlの書き方を勉強させてもらえた! 自分のプルリクではこの辺りの対応も含むことが出来ずだったので、おいしい思いが出来た。

英語でのコミュニケーション

mrubyのリポジトリ同様に英語表記であり、なんとなく日本語がネイティブレベルに通じる方の気がしつつも、 これに合わせて、こちらも英語でやり取りを試みた。

感想を伝えたかった

表現したかったこと

  • すごい、興味を持った!



分かりました

I got it.

がまっ先に思い付いたが、どうも、砕けた表現っぽい評価を見かけたので、 Understandを使おうとして勉強になった。

I understood.

でも本当は、Understoodを使うのであれば、

(It is) understood (by me).

とするべきで、I understoodはこの場合は英語として駄目っぽかった。

対応への感謝

さすがに、Thnaks.だけだと味気ないので、githubでFixした際のやり取りを検索して、 以下の表現で返信させてもらった。

it works like a charm.thank you!

関連記事

11年前の記事

10年前の記事

6年前の記事

5年前の記事

2年前の記事