# 設定ストレージ

設定ストレージ Storage は FIRERPA に内蔵されているキーバリューストレージで、永続性を持ちます。FIRERPA やデバイスを再起動しても、次回の起動時にこれらの変数を読み取ることができます。この Storage を使用すると、デバイス内に情報を永続的に保存し、異なるクライアントプロセスから読み取ることができます。これにより、ログインアカウントなどのデバイス設定やその他の独立した情報を共有できます。マシン内に暗号化された設定を保存することも可能です。

```{attention}
内蔵 Storage の総容量は 128MB です。大量のデータを保存するために使用しないでください。ストレージ内に存在するコンテナ名やキー名を一覧表示することはサポートされていません。コンテナから値を読み取るには、コンテナ名とキー名を完全に知っている必要があります。そうでなければ、永久に読み取ることはできません。
```

## Storage の取得

以下のコードを使用して、ストレージ Storage オブジェクトを取得できます。これにより、後続の操作を実行できるようになります。

```python
storage = d.stub("Storage")
```

## Storage のクリア

以下のコードを使用して、ストレージ Storage 内のすべての情報（コンテナを含む）をクリアできます。これは、Storage のフォーマットと簡単に理解できます。

```python
storage.clear()
```

## コンテナの取得

以下のコードを使用して、キーバリューストレージコンテナオブジェクトを取得できます。ストレージはストレージであり、コンテナはストレージ内のバケットのようなものです。後続の読み書き操作はすべてこのバケットに対して行われます。

```python
container = storage.use("container_name")
```

## 暗号化コンテナの取得

値を安全に保存する必要がある場合、例えば、デバイスが他の人に使用される可能性があるが、保存した設定を他の人に読み取られたくない場合、暗号化コンテナを使用できます。これは単純なコンテナの取得とは異なり、暗号化コンテナは設定したキーバリューを暗号化して保存します。他の人が正しく読み取るには、パスワードやその他の認証が必要です。

私たちのライブラリには FernetCryptor という暗号化・復号化機能が組み込まれています。FernetCryptor に倣って、独自の暗号化アルゴリズムを実装することも可能です。`encrypt` と `decrypt` メソッドを実装するだけで済みます。

```python
from lamda.client import FernetCryptor
container = storage.use("container_name", cryptor=FernetCryptor,
                                          key="this_is_password")
```

## コンテナの削除

以下のコードを使用して、`container_name` という名前のコンテナに保存されているすべてのキーバリューを削除できます。この操作は、バケットを削除することに相当します。

```python
storage.remove("container_name")
```

## コンテナへのキーバリューの書き込み

以下のサンプル呼び出しを使用して、`key_name` の値を "value" に設定できます。値には、msgpack でシリアライズ可能な任意の変数をサポートしています。

```python
container.set("key_name", [1, 2, 3])
container.set("key_name", {"john": "due"})
container.set("key_name", b"value")
container.set("key_name", "value")
```

## コンテナからのキーバリューの読み取り

以下のメソッドを使用して、`key_name` の値を取得できます。存在しない場合は `None` が返されます。

```python
container.get("key_name")
```

## 生存期間の取得

以下の呼び出しを使用して、`key_name` の生存期間を取得できます。-2 はキーが存在しないこと、-1 は有効期限がないこと、その他の正の整数はそのキーの残りの生存秒数を示します。

```python
container.ttl("key_name")
```

## 生存期間の設定

以下の呼び出しを使用して、キーバリューの生存期間を設定できます。例えば、以下の呼び出し方法では、キーバリューを設定すると同時に、そのキーバリューが10秒後に自動的に削除されるようになります。

```python
container.setex("key_name", "value", 10)
```

あるいは、以前にこのキーを設定済みで、それに生存期間を設定したい場合は、以下のように使用できます。60秒後、`key_name` は自動的に削除されます。

```python
container.expire("key_name", 60)
```

## 条件付き書き込み

以下のように呼び出すことができます。これにより、`key_name` が存在しない場合にのみキーバリューが設定されます。すでに存在する場合は、何も操作は行われません。

```python
container.setnx("key_name", "value")
```

## 存在確認

以下のように呼び出して、`key_name` がコンテナ内に存在するかどうかを確認できます。

```python
container.exists("key_name")
```

## コンテナからのキーバリューの削除

以下のように呼び出して、コンテナから `key_name` とその値を削除できます。

```python
container.delete("key_name")
```