Slide 1

Slide 1 text

Denoで簡単なCLIツールを作ってみる Kanazawa.js もくもく<会 #18 2022.02.26 Kentaro Matsushita

Slide 2

Slide 2 text

Kentaro Matsushita 金沢市内のゲーム会社でフロントエンド開発してます @_kentaro_m kentaro-m

Slide 3

Slide 3 text

本日のテーマ Deno触ってみたので雑に共有します

Slide 4

Slide 4 text

Denoとは Node.jsの作者であるRyan Dahl氏によって立ち上げられた JavaScriptおよびTypeScriptのランタイム環境 10 Things I Regret About Node.js JSConf EU 2018でRyan Dahl氏はNode.jsの設計に関する後悔 を語った Denoはこれらを解決したものとして開発されている

Slide 5

Slide 5 text

CLIツールのお題 「イベントのLT登壇順をいい感じに決めたい」

Slide 6

Slide 6 text

これまでも決める方法はあった

Slide 7

Slide 7 text

LT登壇順スクリプト Kanazawa.jsでLT登壇順の決定に使っていたスクリプト 30 Seconds of Codeの実装例をもとに、3分で作りました kanazawa-js/speaker-shuffle.js

Slide 8

Slide 8 text

/** * Fisher-Yates algorithm に基づいたシャッフル関数 * 30-seconds-of-code の実装例より * @see https://github.com/30-seconds/30-seconds-of-code/blob/master/snippets/shuffle.md */ const shuffle = ([...arr]) => { let m = arr.length while (m) { const i = Math.floor(Math.random() * m--) ;[arr[m], arr[i]] = [arr[i], arr[m]] } return arr } const speaker = [ '_kentaro_m', 'tom-256', 'yu_kgr', ] console.log(shuffle(speaker))

Slide 9

Slide 9 text

CLIツール化して利用しやすい形に

Slide 10

Slide 10 text

入力行をシャッフルして出力するコマ ンドを作りました kentaro-m/shuf

Slide 11

Slide 11 text

こんな感じで動作します $ deno install --allow-read \ --name shuf https://github.com/kentaro-m/shuf/raw/main/cli.ts $ echo 'bob\njohn\ntom' | shuf Tom Bob John $ shuf sample.csv Tom Bob John

Slide 12

Slide 12 text

shufコマンドが元ネタ 入力行をシャッフルして出力するLinuxコマンド 【 shuf 】コマンド――入力行をシャッフルして出力する: Linux基本コマンドTips(112) - @IT macOSでは gshuf コマンドが利用できる coreutils のインストールが必要

Slide 13

Slide 13 text

shufコマンドを再実装する コマンドやフラグのパースはフレームワークを利用 c4spar/deno-cliffy Denoで使えるCLIフレームワーク ファイルアクセスは標準ライブラリを利用 実行時に --allow-read オプションを付与 シャッフルロジックは元コード再利用 TypeScriptの型を追加しただけ

Slide 14

Slide 14 text

コマンドパース処理 c4spar/deno-cliffyでコマンドが簡単に定義できます。 import { Command } from "https://deno.land/x/[email protected]/command/mod.ts"; import { handler } from './handler.ts'; await new Command() .name("shuf") .version("0.1.0") .description("Write a random permutation of the input lines to standard output.") .arguments('[fileName:string]') .action(async (_, fileName: string) => await handler(fileName)) .parse(Deno.args);

Slide 15

Slide 15 text

ファイル読み取りから結果出力 ファイルと標準入力からのテキスト読み込みに対応しています。 mport { readContents, createFileReader, showResult } from './util.ts'; type Handler = (fileName: string) => void; export const handler: Handler = async (fileName) => { const isatty = Deno.isatty(Deno.stdin.rid); const reader = isatty ? await createFileReader(fileName) : Deno.stdin; if (reader) { const contents = await readContents(reader).catch(() => Deno.exit(1)); showResult(contents); }

Slide 16

Slide 16 text

感想 環境構築が楽 DenoとVSCode拡張機能のインストールで開発がはじめられる ノーセットアップでTypeScriptがそのまま書ける 最小権限で実行するので安全 Deno実行時に --allow-read オプション指定する CLIツールが簡単に配布できる https://deno.land/[email protected]/tools/script_installer

Slide 17

Slide 17 text

さいごに サクッと環境用意して、CLIツールを作ることができました。 これからも継続してDenoを勉強しようと思います。

Slide 18

Slide 18 text

END