# ライセンス管理
このページでは,**`qbpp-license`** コマンドラインユーティリティを使用した Hi-QUBO ライセンスの管理方法を説明します.
ライセンスシステムは **Hi-QUBO (C++)** と **PyQBPP (Python)** で共通です.
## ライセンスの種類
Hi-QUBO では,変数数の上限と有効期間が異なる複数のライセンスタイプが用意されています.
| ライセンスタイプ | キー必要 | 有効期間 | CPU 変数数 | GPU 変数数 |
| ---------------- | -------- | --------------- | ---------- | ---------- |
| **Trial** | 必要 | 30日間 (更新可) | 10,000 | 10,000 |
| **Standard** | 必要 | 契約期間 | Unlimited | 10,000 |
| **Professional** | 必要 | 契約期間 | Unlimited | Unlimited |
| **Fallback** | N/A | 常時 | 100 | 100 |
- **Trial License**: 無料・セルフサービス.`qbpp-license -s` で印字されるサインアップコードを使い,[Hi-QUBO User Portal](https://qubo-plus.github.io/portal/) で登録してください.登録完了後,Trial ライセンスキーが画面に表示されます.
- **Standard License**: 本番利用向け.大規模な CPU 最適化をサポートします.
- **Professional License**: GPU アクセラレーション(ABS3 Solver,Exhaustive Solver)を使用した本番利用向けです.
- **Fallback Mode**: 有効なライセンスが設定されていないかキャッシュが期限切れでネットワーク不通の場合,Hi-QUBO は100変数の制限で動作します.
### 変数数の数え方
表の変数数は,バイナリ変数とネイティブ整数変数を合わせた合計に対する上限で,
次のように数えます:
- **バイナリ変数**: 1 個につき 1
- **[ネイティブ整数変数](../basic/integer-variables-and-linear-systems.md)**: 範囲(上限 − 下限)を $r$ とすると,
1 個につき $\lceil \log_2 (r+1) \rceil$
整数変数の数え方は,バイナリエンコーディングの整数変数(`var_int`)が消費する
変数数と同じです.どちらの表現を選んでもライセンス上の消費は変わりません.
現在の使用量は `qbpp::used_var_count()`(Python では `qbpp.used_var_count()`)
で確認できます.Trial の 10,000 や Fallback の 100 に収まっているかは,
この値で判断してください.
### Unlimited の意味
Standard・Professional の Unlimited は,ライセンスによる変数数の制限が
ないことを意味します.Trial の 10,000 や Fallback の 100 のような
数え方による上限はかかりません.
ただし,Hi-QUBO の実装上の容量は残ります.バイナリ変数・
[ネイティブ整数変数](../basic/integer-variables-and-linear-systems.md)は**それぞれ最大 $2^{30}-1$ =
1,073,741,823 個**まで使えます.この容量に達した場合は,ライセンスの
エラーではなく容量超過の明示的なエラーになります.
## Trial ライセンスの取得
1. Linux マシンに Hi-QUBO をインストールします.
2. `qbpp-license -s` を実行 — 端末に本日の8文字サインアップコードと portal URL が表示されます:
```{include} /../programFiles/markDown/licenseManage/license-manage.md
:start-after:
:end-before:
```
3. を開き,サインアップフォームに 2. のコード `XXXXXXXX` を入力します.
4. メール検証後,Trial ライセンスキー (`T-PREFIX-XXXXXX-XXXXXX-XXXXXX`,PREFIX はメールローカル部から導出) が portal 上に表示されます.
5. マシンで `qbpp-license -k T-... -a` でアクティベートしてください:
```{include} /../programFiles/markDown/licenseManage/license-manage.md
:start-after:
:end-before:
```
30日のTrial期間はサインアップ時から開始します — キー発行と同時に期限が確定するため,portal 上ですぐに有効期限を確認できます.期限の1週間前から User Portal で Trial の更新が可能です.更新時は同じライセンスキーがそのまま使われ,有効期限のみが30日延長されます — マシンのアクティベーション情報も保持されるため,再アクティベートは不要です.
## ライセンスキーの設定とアクティベーション
> **本節の対象:** 以下のアクティベーションフロー,および [ライセンス状態の確認](#ライセンス状態の確認)・[ライセンスのディアクティベーション](#ライセンスのディアクティベーション) は,**ノードロックライセンス** (Trial,Standard,Professional の単一マシン用キー) を対象としています.アクティベーションはキーを特定の物理マシンに紐づけます.フローティングライセンスについては,本ページ末尾の [フローティングライセンス](#フローティングライセンス) を参照してください.
>
> **Docker・VM・使い捨てコンテナなどの仮想環境では,ノードロックライセンスの動作は保証されません.** マシン指紋が安定せずアクティベートに失敗することがあるほか,コンテナを再ビルドした際にキャッシュされたアクティベーション情報が消失し,サーバ側のアクティベーション枠が宙ぶらりんで残ってしまう恐れがあります.仮想環境で Hi-QUBO を利用する場合は,**フローティングライセンス**を使用してください.フローティングライセンスはこの用途のために設計されており,マシンごとのアクティベーションを行わずに動作します.
ライセンスキーをお持ちの場合は,以下のいずれかの方法で設定してください.
### 方法1: `qbpp-license` でアクティベート(推奨)
マシンごとに以下のコマンドを一度実行します:
```{include} /../programFiles/markDown/licenseManage/license-manage.md
:start-after:
:end-before:
```
ライセンスキーは暗号化されてローカルにキャッシュされます.アクティベーション後,以降の実行では環境変数や `-k` オプションは不要です — Hi-QUBO プログラムはキャッシュされたキーを自動的に使用します.
再アクティベーションやキーの変更は,新しいキーでコマンドを再度実行するだけです.
### 方法2: 環境変数
ローカルキャッシュに書き込まずにキーを与えたい場合(デプロイスクリプトや CI のシークレットから注入する場合など)に,`QBPP_LICENSE_KEY` 環境変数を設定します.
```{include} /../programFiles/markDown/licenseManage/license-manage.md
:start-after:
:end-before:
```
> **ノードロックライセンスは,この環境変数を使っても Docker・VM・使い捨て環境では推奨されません.** アクティベーションはこれらの環境では不安定なマシン指紋に紐づくため,ノードロックキーを安定して動作させることはできません.Docker・VM・CI では,マシンに紐づかず同じ `QBPP_LICENSE_KEY` 環境変数を読む[フローティングライセンス](#フローティングライセンス)を使用してください.
### 方法3: コードへの埋め込み
アプリケーションにライセンスキーを同梱する場合は,コード内で `license_key()` を呼び出します.
```{include} /../programFiles/markDown/licenseManage/license-manage.md
:start-after:
:end-before:
```
```python
# Python
import pyqbpp as qbpp
qbpp.license_key("XXXXXX-XXXXXX-XXXXXX-XXXXXX")
```
この形(既定)で設定したキーは**埋め込み既定キー**として扱われ,優先順位は最低になります.
環境変数やアクティベーション済みキーが無いマシンでのみ使われるため,アプリの利用者は
`QBPP_LICENSE_KEY` を設定するだけで自分のライセンスに切り替えられます.
環境変数やキャッシュを上書きして強制したい場合は,第2引数に `true`(Python は
`force=True`)を指定します(`qbpp-license -k` と同じ扱い).
```{include} /../programFiles/markDown/licenseManage/license-manage.md
:start-after:
:end-before:
```
### 優先順位
複数の方法が使用されている場合,以下の優先順位が適用されます:
1. **`-k` 引数** またはコード内の `qbpp::license_key(key, true)`(最高優先)
2. **`QBPP_LICENSE_KEY` 環境変数**
3. **キャッシュされたキー**
4. **コード内の `qbpp::license_key(key)`**(埋め込み既定キー,最低優先)
> **注意**: 評価目的でも Trial キーが必要です.`qbpp-license -s` でサインアップコードを取得し,[User Portal](https://qubo-plus.github.io/portal/) で登録してください.
## ライセンス状態の確認
変更を加えずに現在のライセンス状態を表示するには:
```{include} /../programFiles/markDown/licenseManage/license-manage.md
:start-after:
:end-before:
```
ライセンスタイプ,有効期限,変数数の上限,アクティベーション使用状況が表示されます.このコマンドはライセンスサーバーに接続して状態を更新します.
## ライセンスのディアクティベーション
ライセンスを別のマシンに移動するには,まず現在のマシンでディアクティベートします:
```{include} /../programFiles/markDown/licenseManage/license-manage.md
:start-after:
:end-before:
```
- 各ライセンスキーには許可されたアクティベーション数の上限があります.
- ディアクティベーションによりアクティベーション枠が1つ解放されます.
- ローカルにキャッシュされたキーも削除されます.再度このマシンで使用するには `qbpp-license -k KEY -a` を実行してください(キーは [User Portal](https://qubo-plus.github.io/portal/) でいつでも確認できます).
- 悪用防止のため,連続するディアクティベーション間には **24時間のクールダウン** があります.
## コマンドリファレンス
```{include} /../programFiles/markDown/licenseManage/license-manage.md
:start-after:
:end-before:
```
### 使用例
| コマンド | 説明 |
| ------------------------------ | --------------------------------------------------------------------- |
| `qbpp-license` | 現在のライセンス状態を表示 |
| `qbpp-license -s` | portal 登録用の本日のサインアップコードを表示 |
| `qbpp-license -k KEY` | 指定したキーの情報を表示(状態は変更しない) |
| `qbpp-license -k KEY -a` | 指定したキーでアクティベート |
| `qbpp-license -d` | このマシンでライセンスをディアクティベートし,キャッシュ済みキーを削除 |
| `qbpp-license -t 60` | 60秒のタイムアウトで状態を確認 |
| `qbpp-license -k KEY -t 60 -a` | キーと延長タイムアウトでアクティベート |
## ライセンス認証の仕組み
- **`qbpp-license` コマンド**: 常にライセンスサーバーに接続して最新の状態を取得します.ネットワーク状況によっては数秒かかることがあります.
- **Hi-QUBO プログラム**: **ローカルキャッシュ**を使用してライセンスを検証し,サーバー通信でブロックしません.サーバーへの接続はキャッシュの更新が必要な場合(例:長期間同期されていない場合)のみ行われます.
- **ライセンスキーの保存**: ライセンスがアクティベートされると,キーは暗号化されてローカルにキャッシュされます.これにより,キーを再設定せずに以降の実行が可能になります.
## ネットワークとタイムアウト
ネットワークが遅い場合やファイアウォール/プロキシの背後にある場合,デフォルトの20秒のタイムアウトでは不十分な場合があります.
タイムアウトを延長するには:
```{include} /../programFiles/markDown/licenseManage/license-manage.md
:start-after:
:end-before:
```
サーバーに到達できない場合,Hi-QUBO はキャッシュされたライセンス状態にフォールバックします.キャッシュが存在しない場合,Hi-QUBO は **Fallback Mode**(100変数制限)で動作します.
### プログラムは動作するが変数数が制限される
- Hi-QUBO が Fallback Mode で動作している可能性があります.ライセンス状態を確認してください:
```bash
$ qbpp-license
```
- `qbpp-license -k KEY -a` または `QBPP_LICENSE_KEY` でライセンスキーが正しく設定されているか確認してください.
- 必要に応じて再アクティベートしてください:`qbpp-license -a`
### 「ディアクティベーションのクールダウン」
- 連続するディアクティベーション間には24時間の待機期間があります.
- クールダウン期間が経過してから再試行してください.
## フローティングライセンス
フローティングライセンスは,組織内の複数のマシン間での共有アクセスを可能にします.マシンに永続的にロックされる代わりに,フローティングライセンスは**リースベース**の仕組みを使用します.
- Hi-QUBO プログラムの起動時に,ライセンスサーバーからリースを取得します.
- プログラムの実行中,リースは自動的に更新されます.
- プログラムの終了時にリースが解放され,他のマシンがそのスロットを使用できるようになります.
- プログラムがクラッシュしたりネットワークが切断された場合,リースはタイムアウト期間後に自動的に失効します.
- **Docker・VM・使い捨てコンテナなどの仮想環境でも問題なく動作します.** フローティングライセンスはマシン指紋に紐づかないため,コンテナの再ビルドや VM の作り直しでアクティベーション枠が宙ぶらりんになる心配がありません.
フローティングライセンスキーの指定方法は 2 通りあります.
**アクティベートしてキャッシュ(永続的なマシン向け):**
```{include} /../programFiles/markDown/licenseManage/license-manage.md
:start-after:
:end-before:
```
キーは暗号化されてローカルにキャッシュされ,以降の実行では自動的に使用されます.長期稼働のワークステーションやサーバで便利です.
**環境変数(Docker・CI・使い捨て環境では推奨):**
```{include} /../programFiles/markDown/licenseManage/license-manage.md
:start-after:
:end-before:
```
`qbpp-license -a` によるアクティベーションのキャッシュはホームディレクトリに保存されるため,**コンテナや VM を再ビルドするたびに消えてしまいます** — そのままでは起動のたびに `qbpp-license -a` をやり直す必要があります.`QBPP_LICENSE_KEY` を設定すればこれを完全に回避できます.各 Hi-QUBO プログラムは環境変数から直接キーを読み取ってリースを取得するため,**ローカルのアクティベーションキャッシュは不要**です.フローティングライセンスはマシン指紋に紐づかないので,同じキーを任意の数のコンテナで共有してもマシンごとのアクティベーション枠を消費・滞留させることはありません.そのため,Docker イメージや `docker run -e`,Kubernetes Secret,CI ジョブにフローティングキーを渡すには環境変数が最適です.
> `QBPP_LICENSE_KEY` の値は**有効なキーである場合のみ**使用されます.古い値や不正な値は(警告を出して)無視され,キャッシュ済みのキーにフォールバックするため,誤った環境変数がアクティベート済みマシンを壊すことはありません.