.envで環境変数を設定するProcessingライブラリ “DotenvP5” を作った

最近、こんな記事を書いています。 記事を書いている時にふとこんなことを思いました。

  • 「Processingスケッチは公開したいけど公開したくない設定もあるんだよなー」
  • 「文字列の中に${YOUR_API_KEY}とか書いて伝わるかなー」
  • 「前からProcessingのプロジェクト管理をどうにかしたかったんだよなー」

ということで手始めにProcessing .env を読み込むライブラリを作りました。 と言っても、dotenv-javaをラップしただけなのですが。

そこで、この記事では今回作ったライブラリの紹介した後に、 .env ファイルのことを知らない人のために簡単な説明を書いておきます。

DotenvP5

その名も DotenvP5 です。 そのまんまですね。

使い方は簡単です。 sketchPath() (Processingスケッチのディレクトリ)に .env というファイルを作成します。 内容はこのように設定します。

そしてProcessingスケッチはこんな感じに書きます。

すると以下のような結果が出力されます。

HELLO=DOTENVP5
DEFAULT_TEST=default
*** All environment variables ***
[HELLO=DOTENVP5, ...]

はい。これだけです。 これだけでは何が便利なのかわからないかもしれないので、 以下に .env の簡単な説明を書いていこうと思います。

.env とは

.env は「ドットエンブ」や「エンブファイル」「環境ファイル」などと呼ばれます。 多くのフレームワークやプロジェクトで使用されます。 ご覧の通りファイル名が . で始まっているので隠しファイルになってます。

.env には主に環境固有の変数を記述します。 例えば外部に教えたくないAPIキーや外部APIのURL、接続先サーバのログイン情報などです。 例えば、Processingで外部APIを使用した可視化作品などを制作する際に、 APIキーなどを記述する想定です。

これらの情報はGitHubなどで共有したくないので、 .gitignore.env と記述することでGitの共有対象から除外します。 .gitignoreについてはこちらをご覧ください。

その代わりに .env.example などのファイルを作成し、 このファイルには以下のような内容を記述することで、 「このプロジェクトでは外部APIのURLとAPIキーを設定する必要があるんだな」 と気づいてもらえます。

API_URL=
API_KEY=

サーバサイドと合わせた使用例

具体的にAPIサーバと組み合わせた使用例もあげておきます。

Node.js

まず、APIキーを使った認証機能を持ったサーバを用意します。 フレームワークはExpressを使用しています。 クライアントは、APIキーをHTTPヘッダー X-MY-API-KEY として渡すものとします。 APIキーが 'PROCESSING_CLIENT_API_KEY' でなかったら、HTTPステータス403を返します。

const express = require('express')
const app = express()
const port = 3000

app.use((req, res, next) => {
    // APIキーを取得して比較する
    const apiKey = req.get('X-MY-API-KEY')
    if (apiKey !== 'PROCESSING_CLIENT_API_KEY') {
        // 比較結果が異なればHTTPステータス403を返す
        res.status(403).json({
            success: false,
        })
        return
    }
    next()
})

app.get('/', (req, res) => {
  res.json({
    success: true,
  })
})

app.listen(port, () => {
  console.log(`http://localhost:${port}`)
})

Processing

次にAPIを呼び出すProcessingスケッチを用意して実行します。 このようにAPIキーなどの機密情報を .env ファイルに持たせることができます。

.env

MY_API_KEY=PROCESSING_CLIENT_API_KEY

Processingスケッチ

import http.requests.*;
import org.enkatsu.dotenvp5.*;

DotenvP5 dotenv;

void setup() {
  size(600, 600);
  dotenv = new DotenvP5(this);
  String API_KEY = dotenv.get("MY_API_KEY");
  GetRequest get = new GetRequest("http://localhost:3000/");
  get.addHeader("X-MY-API-KEY", API_KEY);
  get.send();
  JSONObject result = parseJSONObject(get.getContent());
  println(result);
}

void draw() {
}

まとめ

いかがでしょう? 少し便利だなと思ってもらえたら幸いです。 最初に「前からProcessingのプロジェクト管理をどうにかしたかったんだよなー」 とも書きましたが、そのうちプロジェクト毎の依存ライブラリの管理方法とかもなんとかしたいですね。

今回は昔作った こちらのライブラリテンプレートを 使用して作成しました。 久しぶりに使ったので、Gradleのバージョンが上がっていて動かなくて辛かったです。 テンプレートも時間を見つけて更新しようと思います。


.envで環境変数を設定するProcessingライブラリ "DotenvP5" を作った

By Katsuya Endoh, 2024-07-02