mottox2 blog

CLIで利用するNode.jsの書き捨てプログラムを作成するコツ

devnodejs

プログラマーであれば単純作業をプログラムに任せると思います。今回は備忘録を兼ねてNode.jsで書き捨て前提のプログラムを書く際に、よく使っているテクニックをまとめてみました。
やっていることは同じなので他の言語を使っている方でも利用できるものです。

標準入力・出力に対応する

標準入力に対応して、ファイル内を変更しないで使えるようにしておくと便利です。

js
process.stdin.on('readable', () => {
  let chunk
  while ((chunk = process.stdin.read()) !== null) {
    process.stdout.write(main(chunk))
  }
})
process.stdin.on('end', () => {})

クリップボードを利用する

macOSに入っているpbpasteコマンドはクリップボードのデータを出力してくれるので、次のように利用するとクリップボードからプログラムにデータを受け渡せます。

sh
$ pbpaste | node index.js

逆に出力をクリップボードに格納したい場合にはpbcopyコマンドを利用します。

sh
$ node index.js | pbcopy

ファイル名にタイムスタンプをつけて保存する

何らかのファイルを生成する際にはタイムスタンプをつけるとわかりやすいです。
new Date()で現在時刻のインスタンスを生成してNumberにわたすとunixtimeが得られます。
YYYY/MM/DD hh:mm:ss形式を利用したい場合はJS標準のDateではなくmomentdayjsを利用すると簡単に実現できます。

js
const fs = require('fs')
const timestamp = Number(new Date()) // unixtimeを生成
const content = 'something'
fs.writeFile(`results/result-${timestamp}.pptx`, content, function() {})

コマンドを叩いて出力結果を確認する

macOSにはopenコマンドがあっていい感じにファイルやディレクトリを開いてくれます。
openを利用して生成したファイルやログファイルを開くと、プログラムの動作を把握しやすくなります。

js
const fs = require('fs')
const timestamp = Number(new Date()) // unixtimeを生成
const content = 'something'
const execSync = require('child_process').execSync
const fileName = `results/result-${timestamp}.pptx`
fs.writeFile(fileName, content, function() {
  execSync(`open ${fileName}`)
})

オプションによって動作を変える

プログラムを実行する際にオプションを渡して、動作を変えられるようにしておくと便利です。
破壊的な操作を行わずログを出力をする--dry-runのようなオプションや、ファイルを開く--openオプションなどを用意することが多いです。
コマンドラインで渡した引数はプログラム中のprocess.argvに配列で渡ってきます。配列の2番目以降を見る処理を書いておくといいでしょう。
上記のファイルを生成する処理を書く際にオプションとして用意しておくことが多いです。

js
// process.argv => ['/usr/bin/node', '/Users/mottox2/project', '--open']
if (process.argv.includes('--open')) {
  // `node index.js --open`のようにopenを指定した場合のみ実行
}

本格的なCLIツールを開発するのであれば、commanderyargsなどのライブラリを利用すると、キレイに記述できます。

B!
tool

おしゃれなコード画像を生成するCLIツール『Silicon』

自分はLT資料を作る際に、『Carbon』というおしゃれなコード画像を生成するWebサービスを利用しています。今回はCarbonをインスパイアした『Silicon』というRust製のCLIツールを発見

toolrust
event

「技術書同人誌博覧会」にサークル参加してきた

2019/07/27に大田区産業プラザPioで開催された技術書同人誌博覧会(通称「技書博」)にサークル参加してきました。 「ブログを書くまでがイベント」ということですので、新刊の話、次回の新刊、当日

技術同人誌
dev

Next.js 9からTypeScriptの利用方法が変わるのでまとめてみた

ZEIT社が開発しているReact製のフレームワークNext.jsですが、現在v.8.1.1のカナリー版がリリースされています。 v.9では様々な変更が入っていますが、個人的に注目しているのはTyp