💖

Denoをカジュアルに使い始めよう!

2025/01/02に公開

Deno は小さなところから使い始めることができます!

  • Deno x Jupyter は遊び場としてオススメだよ
  • お手軽にスクリプトを CLI ツール化できるよ

ということを簡単に紹介させて頂きます。

Deno をインストールする

下記サイトを参照してインストールします。様々な方法が用意されていますね!

https://docs.deno.com/runtime/getting_started/installation/

執筆時点のバージョンは以下の通りです。

> deno --version
deno 2.1.4 (stable, release, aarch64-apple-darwin)
v8 13.0.245.12-rusty
typescript 5.6.2

Deno を Jupyter Notebook で動かす

Jupyter Notebook とは

一言で書くと、セル単位でコードを実行し、結果を確認できるツールです。
Google Colab など、Python の機械学習用途でよく見かけます。

Python だけ動かせる印象ですが、実は Deno も動かすことができます!
(簡単な使い方は後ほど説明します)

セットアップ

Jupyter をインストール

jupyter コマンドが必要なため、下記サイトを参照してインストールします。

https://jupyter.org/install

執筆時点のバージョンは以下の通りです。

> jupyter --version
Selected Jupyter core packages...
IPython          : 8.31.0
ipykernel        : 6.29.5
ipywidgets       : not installed
jupyter_client   : 8.6.3
jupyter_core     : 5.7.2
jupyter_server   : 2.15.0
jupyterlab       : 4.3.4
nbclient         : 0.10.2
nbconvert        : 7.16.4
nbformat         : 5.10.4
notebook         : 7.3.2
qtconsole        : not installed
traitlets        : 5.14.3

Deno kernel をインストール

Deno を Jupyter で実行するための kernel をインストールします。
以下のコマンドを実行するとインストールできます。

deno jupyter --unstable --install

https://docs.deno.com/runtime/reference/cli/jupyter/

Jupyter の VS Code 拡張機能をインストール

今回は VS Code で開発を進めるので、以下の拡張機能をインストールします。
これでセットアップは完了です!

https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter

Deno x Jupyter で遊ぶ

ファイルを作る

VS Code で *.ipynb ファイルを作成して開くと以下のような画面になります。
右上のアイコンからカーネルの変更ができます。

クリックすると、カーネルの一覧が表示されるので、「Deno」を選択してください。

もし表示されない場合は、
「別のカーネルを選択…」→「Jupyter Kernel…」→「Deno」の順で選択します。

簡単に使い方を紹介

セルの中にコードを書けて、セル単位でコードを実行できます。

1 つのセルに複数行のコードを書けて、行の最後の値が自動で表示されます。
また、前のセルで定義した値を参照できます。

下のセルを実行した後、上のセルだけ編集して実行すると、
プログラムを上から順に実行したときと違う結果が表示されているような状態も起こり得ます。

そんなときは、「すべてを実行」「該当セルを含まない上セルを全て実行」「該当セルを含む下セルを全て実行」するボタンを使い分けて利用しましょう!

パッケージを使って遊ぶ

Deno は URL 形式でパッケージをインポートできるので、新しくプロジェクトを用意することなく、Jupyter 上でお手軽に試せます!
npm:{パッケージ名}(@{バージョン}) で npm パッケージも利用できるので、openai を利用して OpenAI の API を叩いてみます!

※プログラムの内容は重要では無いのですが、以下のプログラムを実行する場合は OpenAI developer platform で API key の発行が必要になります。

import OpenAI from "npm:openai@4.77.0"
const client = new OpenAI({
  // 事前に `export MY_OPENAI_API_KEY={発行したkey}` などで環境変数の設定が必要です
  apiKey: Deno.env.get("MY_OPENAI_API_KEY"),
})
const chatRes = await client.chat.completions.create({
  model: "gpt-4o-mini",
  messages: [
    { role: "system", content: "You are a helpful assistant." },
    { role: "user", content: "こんにちは!" },
  ],
})

上記コードを実行したあと、chatRes にどんな値が入るか気になりますね。
セルに chatRes だけ入力して実行してみます。

chatRes.choices[0].message.content に欲しい値が入っているので、次のセルに入力して実行します。

欲しい値が取れましたね!
これを関数にして、任意のテキストをチャット送信できるようにします。

const myChat = async (text: string): string => {
  const client = new OpenAI({
    apiKey: Deno.env.get("MY_OPENAI_API_KEY"),
  })

  const chatRes = await client.chat.completions.create({
    model: "gpt-4o-mini",
    messages: [
      { role: "system", content: "You are a helpful assistant." },
      { role: "user", content: text },
    ],
  })

  return chatRes.choices[0].message.content
}

myChat 関数を実行してみます。

期待通りの動きになりましたね!

このように、任意のパッケージをインポートして、手軽に実行できる遊び場(Playground)として良い環境というお話でした!
セルの実行結果もファイルに残るので、メモとして残して、後から見返すこともできます!

また、今回は文字列の出力しか扱いませんでしたが、Jupyter Notebook 上で HTML や Markdown、画像なども表示できます。

スクリプトを CLI ツール化する

Shebang で Deno を呼び出す

Shebang は、シェルスクリプトの 1 行目にある #!/bin/sh のような記述です。
#!/usr/bin/env -S deno run にすることで、シェルスクリプトから Deno を呼び出せます!

https://docs.deno.com/examples/hashbang_tutorial/

test.ts というファイルを作り、以下の内容にします。

test.ts
#!/usr/bin/env -S deno run -A
console.log(Deno.args[0])

実行権限を与えて、実行してみます。

> chmod u+x test.ts
> ./test.ts こんにちは!
こんにちは!

Deno が実行されましたね!

mychat コマンドを作る

それでは、myChat 関数を CLI ツール化してみます!
次は mychat という拡張子なしのファイルを作ります。

mychat
#!/usr/bin/env -S deno run -A --ext=ts
import OpenAI from "npm:openai@4.77.0"
const myChat = async (text: string): string => {/** 省略 */}

console.log(await myChat(Deno.args[0]))

deno run -A の後に --ext=ts を追加しています。
これは拡張子無しでも、TypeScript として扱って貰う為のオプションです。

先ほどと同じように、実行権限を与えて、実行してみます。

> chmod u+x mychat
> ./mychat こんにちは!
こんにちは!どういったことをお手伝いしましょうか?

> ./mychat Denoについて、簡潔に説明してください。
Denoは、Node.jsの創始者であるライアン・ダールによって開発された、モダンなJavaScriptおよびTypeScriptの実行環境です。Denoは以下の特徴を持っています。

1. **セキュリティ**: Denoはデフォルトで安全で、ファイルシステムやネットワークへのアクセスを明示的に許可する必要があります。
2. **TypeScriptサポート**: TypeScriptがネイティブにサポートされており、コンパイルなしで直接実行できます。
3. **シンプルなモジュール管理**: モジュールはURLから直接インポートでき、npmのようなパッケージマネージャが不要です。
4. **標準ライブラリ**: Denoには、ウェブ標準に準拠した豊富な標準ライブラリが含まれています。

Denoは、開発者に現代的で安全な開発体験を提供することを目指しています。

期待通りに動きました!
mychat への PATH を追加すれば、どこからでも呼び出せる CLI ツールになりますね!

まとめ

  • Deno x Jupyter は遊び場としてオススメだよ
  • お手軽にスクリプトを CLI ツール化できるよ

という紹介記事でした。
最後までご覧いただき、ありがとうございました。

Discussion