トラブルシューティング & FAQ
NetFUNNEL Androidエージェント統合に関する一般的な問題、解決方法、およびよくある質問です。
目次
インストール問題
AARファイルがロードされない
症状:
- NetFUNNELクラスに関連するビルドエラー
- "Cannot resolve symbol"エラー
- AARファイルが見つからないエラー
解決方法:
- AARファイルの場所を確認:
.aarファイルがapp/libs/ディレクトリにあることを確認 - build.gradle構成を確認: 依存関係が正しく追加されていることを確認
- クリーンおよび再ビルド: プロジェクトをクリーンしてから再ビルド
- ファイル権限を確認: AARファイルが読み取り可能であることを確認
- Kotlin DSL (build.gradle.kts)
- Groovy DSL (build.gradle)
// build.gradle.ktsで確認
dependencies {
implementation(files("libs/netfunnel-android-agent-release-{{latest}}.aar"))
}
// build.gradleで確認
dependencies {
implementation files('libs/netfunnel-android-agent-release-{{latest}}.aar')
}
外部依存関係が解決されない
症状:
- KtorまたはKotlinx Serializationが見つからない
- 外部ライブラリに関するビルドエラー
- 欠落した依存関係の警告
解決方法:
- 必須依存関係を追加: すべての外部依存関係が追加されていることを確認
- バージョンを確認: 互換性のあるバージョンを使用
- プロジェクト同期: Gradleファイルとプロジェクトを同期
- Kotlin DSL (build.gradle.kts)
- Groovy DSL (build.gradle)
// 必須依存関係を追加
dependencies {
val ktorVersion = "2.3.12"
val serializationVersion = "1.6.3"
implementation("io.ktor:ktor-client-core:$ktorVersion")
implementation("io.ktor:ktor-client-okhttp:$ktorVersion")
implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")
implementation("io.ktor:ktor-serialization-gson:$ktorVersion")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$serializationVersion")
}
// 必須依存関係を追加
dependencies {
def ktorVersion = "2.3.12"
def serializationVersion = "1.6.3"
implementation "io.ktor:ktor-client-core:$ktorVersion"
implementation "io.ktor:ktor-client-okhttp:$ktorVersion"
implementation "io.ktor:ktor-client-content-negotiation:$ktorVersion"
implementation "io.ktor:ktor-serialization-gson:$ktorVersion"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:$serializationVersion"
}
ビルド構成問題
症状:
- コンパイルエラー
- 互換性のないAPIレベルエラー
- Javaバージョン互換性問題
解決方法:
- APIレベルを確認:
minSdk >= 22およびtargetSdk >= 22であることを確認 - Javaバージョンを確認: Java 1.8以上を使用
- ビルド機能を確認:
viewBinding = trueを有効化
- Kotlin DSL (build.gradle.kts)
- Groovy DSL (build.gradle)
// build.gradle.kts構成を確認
android {
compileSdk = 34
defaultConfig {
minSdk = 22
targetSdk = 34
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
buildFeatures {
viewBinding = true
}
}
// build.gradle構成を確認
android {
compileSdk 34
defaultConfig {
minSdk 22
targetSdk 34
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
viewBinding true
}
}
初期化問題
エージェントが初期化されない
症状:
- LogcatにNetFUNNELログがない
- 関数を使用できない
- バイパスモード動作
解決方法:
- 初期化の場所を確認: 初期化が
Application.onCreate()にあることを確認 - パラメータを確認: すべての必須パラメータが提供されていることを確認
- クライアントIDを確認:
clientIdが正しく、アクセス可能であることを確認 - ロギングを有効化: デバッグのために
printLog = trueを設定
- Kotlin
- Java
// 正しい初期化
class SampleApplication : Application() {
override fun onCreate() {
Netfunnel.initialize(
clientId = "{{CLIENT_ID}}",
printLog = true // デバッグのために有効化
)
super.onCreate()
}
}
// 正しい初期化
public class SampleApplication extends Application {
@Override
public void onCreate() {
Netfunnel.INSTANCE.initialize(
"{{CLIENT_ID}}"
);
super.onCreate();
}
}
マニフェスト登録の欠落
症状:
- Applicationクラスが呼び出されない
- 初期化が発生しない
- アプリ起動時にクラッシュ
解決方法:
- Applicationクラスを登録:
AndroidManifest.xmlに追加 - クラス名を確認: 正しいクラス名が使用されていることを確認
- パッケージを確認: パッケージ名が一致していることを確認
<!-- AndroidManifest.xml -->
<application
android:name=".SampleApplication"
android:allowBackup="true">
<!-- Activityたち -->
</application>
バイパスモード (待合室なし)
症状:
- ユーザーが待合室なしでアプリに直接アクセス
- NetFUNNELトラフィック制御なし
- 関数は動作するが保護機能なし
解決方法:
- クライアントIDを確認:
clientIdが正しく、アクセス可能であることを確認 - セグメント状態を確認: コンソールでセグメントが有効化されていることを確認
- 進入許容数を確認: 進入許容数が無制限に設定されていないことを確認
- ロギングを有効化: 初期化エラーに関するログを確認
関数呼び出しエラー
"Netfunnel is not initialized"エラー
症状:
IllegalStateException: Netfunnel is not initialized- 関数が例外をスロー
- NetFUNNEL関数呼び出し時にアプリクラッシュ
解決方法:
- 初期化を確認:
Netfunnel.initialize()が最初に呼び出されていることを確認 - タイミングを確認: 初期化前に関数を呼び出さない
- Applicationクラスを確認: Applicationクラスが正しく登録されていることを確認
- Kotlin
- Java
// 関数呼び出し前に初期化されているか確認
if (Netfunnel.isInitialized()) {
Netfunnel.nfStart(projectKey, segmentKey, callback, this)
} else {
Log.e("NetFUNNEL", "エージェントが初期化されていない")
// エラー処理または初期化
}
// 関数呼び出し前に初期化されているか確認
if (Netfunnel.INSTANCE.isInitialized()) {
Netfunnel.INSTANCE.nfStart(projectKey, segmentKey, callback, this);
} else {
Log.e("NetFUNNEL", "エージェントが初期化されていない");
// エラー処理または初期化
}
コールバックが実行されない
症状:
nfStartが呼び出されたがコールバックが実行されない- 応答を受信しない
- コールバックを待ってアプリが停止
解決方法:
- ネットワークを確認: NetFUNNELサーバーへのネットワークリクエストを確認
- ロギングを有効化: デバッグのために
printLog = trueを設定 - セグメント状態を確認: セグメントがBlock状態でないことを確認
- コールバック実装を確認: コールバックが正しく実装されていることを確認
- Kotlin
- Java
// デバッグのためにロギングを有効化
Netfunnel.initialize(
clientId = "{{CLIENT_ID}}",
printLog = true // ロギングを有効化
)
// LogcatでNetFUNNELメッセージログを確認
// デバッグのためにロギングを有効化
Netfunnel.INSTANCE.initialize(
"{{CLIENT_ID}}"
);
// LogcatでNetFUNNELメッセージログを確認
Activityコンテキスト問題
症状:
IllegalArgumentException: Activity cannot be null- コンテキスト関連エラー
- 関数呼び出し時にアプリクラッシュ
解決方法:
- Activityコンテキストを確認: 有効なActivityが渡されていることを確認
- タイミングを確認: Activityが破棄された後に関数を呼び出さない
- 適切なライフサイクルを使用: 適切なライフサイクルメソッドで関数を呼び出す
- Kotlin
- Java
// 正しい使用方法
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ここで呼び出しても安全
Netfunnel.nfStart(projectKey, segmentKey, callback, this)
}
// onDestroy以降は呼び出さない
override fun onDestroy() {
super.onDestroy()
// ここではNetFUNNEL関数を呼び出さない
}
// 正しい使用方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ここで呼び出しても安全
Netfunnel.INSTANCE.nfStart(projectKey, segmentKey, callback, this);
}
// onDestroy以降は呼び出さない
@Override
protected void onDestroy() {
super.onDestroy();
// ここではNetFUNNEL関数を呼び出さない
}
ネットワークおよび接続問題
ネットワークタイムアウトエラー
症状:
- ステータスコード1002とともに
NetworkErrorが発生 - リクエストがタイムアウト
- コールバックを受信しない
解決方法:
- タイムアウトを増加:
networkTimeoutをより高い値に設定 (最大10000ms) - 再試行を構成:
retryCountを増加 - ネットワーク回復:
useNetworkRecoveryMode = trueを有効化
- Kotlin
- Java
Netfunnel.initialize(
clientId = "{{CLIENT_ID}}",
networkTimeout = 5000, // タイムアウトを増加
retryCount = 3, // 再試行を増加
errorBypass = false
)
Netfunnel.INSTANCE.initialize(
"{{CLIENT_ID}}",
5000, // タイムアウトを増加
3, // 再試行を増加
false,
false
);
ネットワーク接続されないエラー
症状:
- ステータスコード1001とともに
NetworkErrorが発生 - インターネット接続なし
- ネットワーク権限問題
解決方法:
- 接続を確認: インターネット接続を確認
- 権限を確認:
INTERNET権限が付与されていることを確認 - ファイアウォールを確認: NetFUNNELドメインがブロックされていないことを確認
- エラー処理を実装: NetworkErrorを適切に処理
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.INTERNET" />
- Kotlin
- Java
// ネットワークエラー処理
private val callback = object : NetfunnelCallback() {
override fun onNetworkError(statusCode: Int, message: String) {
when (statusCode) {
1001 -> {
// ネットワーク接続されない
showNetworkErrorDialog()
}
1002 -> {
// ネットワークタイムアウト
showTimeoutDialog()
}
}
}
}
// ネットワークエラー処理
private final NetfunnelCallback callback = new NetfunnelCallback() {
@Override
public void onNetworkError(int statusCode, @NonNull String message) {
switch (statusCode) {
case 1001:
// ネットワーク接続されない
showNetworkErrorDialog();
break;
case 1002:
// ネットワークタイムアウト
showTimeoutDialog();
break;
}
}
};
サーバー通信問題
症状:
- NetFUNNELサーバーからの応答なし
- ログにHTTPエラー
- 認証失敗
解決方法:
- クライアント構成を確認: clientIdが正しいことを確認
- 認証を確認: 有効なclientIdを確認
- ネットワークを確認: NetFUNNELサーバーへのネットワーク接続を確認
- ログを確認: 詳細なエラーメッセージを見るためにロギングを有効化
待合室問題
待合室が表示されない
症状:
- 待合室が表示されない
- ユーザーが直接進行
- 視覚的フィードバックなし
解決方法:
- 進入許容数を確認: テストのために0に設定
- セグメント有効化を確認: セグメントが有効化されていることを確認
- テンプレート設定を確認:
useNetfunnelTemplate = trueを確認 - コールバック実装を確認: コールバックが正しく実装されていることを確認
- Kotlin
- Java
// デバッグのためにロギングを有効化
Netfunnel.initialize(
clientId = "{{CLIENT_ID}}",
printLog = true // ロギングを有効化
)
// デバッグのためにロギングを有効化
Netfunnel.INSTANCE.initialize(
"{{CLIENT_ID}}"
);
待合室が停止 (終了しない)
症状:
- 待合室が表示されるが進入を許可しない
- 無限待機
- 進行表示なし
解決方法:
- 進入許容数を確認: 進入許容数の値を増加
- セグメント状態を確認: セグメントがBlock状態でないことを確認
- ネットワークを確認: ネットワーク接続を確認
- サーバー状態を確認: NetFUNNELサーバー状態を確認
カスタムテンプレート問題
症状:
- カスタム待合室が更新されない
onContinueコールバックが呼び出されない- UIがキュー状態を反映しない
解決方法:
- テンプレートを無効化:
useNetfunnelTemplate = falseを設定 - onContinueを実装:
onContinueコールバックを処理 - コールバック実装を確認: 正しいコールバック設定を確認
- Kotlin
- Java
// 基本構成
Netfunnel.initialize(
clientId = "{{CLIENT_ID}}",
errorBypass = false
)
// onContinueコールバック実装
private val callback = object : NetfunnelCallback() {
override fun onContinue(statusCode: Int, message: String, aheadWait: Int, behindWait: Int, waitTime: String, progressRate: Int) {
// カスタム待合室UIを更新
updateCustomWaitingRoom(aheadWait, behindWait, waitTime, progressRate)
}
}
// 基本構成
Netfunnel.INSTANCE.initialize(
"{{CLIENT_ID}}"
);
// onContinueコールバック実装
private final NetfunnelCallback callback = new NetfunnelCallback() {
@Override
public void onContinue(int statusCode, @NonNull String message, int aheadWait, int behindWait, @NonNull String waitTime, int progressRate) {
// カスタム待合室UIを更新
updateCustomWaitingRoom(aheadWait, behindWait, waitTime, progressRate);
}
};
キー管理問題
キーが返却されない
症状:
- 次のユーザーが無限に待機
- キューが進行しない
- キー管理に関するサーバーエラー
解決方法:
- 常にnfStopを呼び出し:
nfStop/nfStopSectionが呼び出されていることを確認 - エラー処理: エラーシナリオでもキーを返却
- タイミングを確認: 開始が完了する前に停止を呼び出さない
- キー一致を確認: 開始/停止関数に同じキーを使用
- Kotlin
- Java
// 常にキーを返却
private val callback = object : NetfunnelCallback() {
override fun onSuccess(statusCode: Int, message: String) {
try {
performAction()
} finally {
// 常にキーを返却
Netfunnel.nfStop(projectKey, segmentKey, completeCallback)
}
}
override fun onError(statusCode: Int, message: String) {
// エラーが発生してもキーを返却
Netfunnel.nfStop(projectKey, segmentKey, completeCallback)
}
}
// 常にキーを返却
private final NetfunnelCallback callback = new NetfunnelCallback() {
@Override
public void onSuccess(int statusCode, @NonNull String message) {
try {
performAction();
} finally {
// 常にキーを返却
Netfunnel.INSTANCE.nfStop(projectKey, segmentKey, completeCallback);
}
}
@Override
public void onError(int statusCode, @NonNull String message) {
// エラーが発生してもキーを返却
Netfunnel.INSTANCE.nfStop(projectKey, segmentKey, completeCallback);
}
};
キー不一致エラー
症状:
- 不正なキーに関するサーバーエラー
- キーが見つからないエラー
- 関数呼び出し失敗
解決方法:
- キー一貫性: 開始/停止関数に同じキーを使用
- キースコープ: 他の作業でキーを再利用しない
- タイミング: 開始が完了する前に停止を呼び出さない
- コンソールを確認: キーがコンソールと正確に一致していることを確認
- Kotlin
- Java
// 一貫したキー使用
val projectKey = "service_1"
val segmentKey = "segKey_123"
// 開始
Netfunnel.nfStart(projectKey, segmentKey, callback, this)
// 停止 (同じキーを使用する必要がある)
Netfunnel.nfStop(projectKey, segmentKey, completeCallback)
// 一貫したキー使用
String projectKey = "service_1";
String segmentKey = "segKey_123";
// 開始
Netfunnel.INSTANCE.nfStart(projectKey, segmentKey, callback, this);
// 停止 (同じキーを使用する必要がある)
Netfunnel.INSTANCE.nfStop(projectKey, segmentKey, completeCallback);
設定問題
不正なプロジェクト/セグメントキー
症状:
- 関数が呼び出されたが効果なし
- 不正なセグメント動作
- サーバーエラー
解決方法:
- コンソールを確認: NetFUNNELコンソールでキーを再度確認
- 正確にコピー: コンソールに表示されているとおりにキーを正確にコピー
- 環境: 正しい環境を使用 (プロダクション vs ステージング)
- セグメントタイプを確認: 正しいセグメントタイプを使用 (基本コントロール vs 区間コントロール)
パラメータ有効性検証エラー
症状:
- 初期化失敗
IllegalArgumentExceptionエラー- 不正なパラメータ警告
解決方法:
- パラメータ範囲を確認: 値が許可された範囲内にあることを確認
- 必須パラメータを確認: すべての必須パラメータが提供されていることを確認
- パラメータタイプを確認: 正しいデータタイプが使用されていることを確認
- Kotlin
- Java
// 有効なパラメータ範囲
Netfunnel.initialize(
clientId = "{{CLIENT_ID}}", // 必須
networkTimeout = 5000, // 100-10000である必要がある
retryCount = 3, // 0-10である必要がある
printLog = true, // Boolean
errorBypass = false // Boolean
)
// 有効なパラメータ範囲
Netfunnel.INSTANCE.initialize(
"{{CLIENT_ID}}", // 必須
5000, // 100-10000である必要がある
3, // 0-10である必要がある
true, // Boolean
false // Boolean
);
ビルドおよび環境問題
ProGuard/R8問題
症状:
- デバッグでは動作するがリリースでは動作しない
- クラスが見つからないエラー
- メソッドが見つからないエラー
- リリースビルドでNetFUNNEL関数が動作しない
解決方法:
- ProGuardルールを追加: NetFUNNELクラスをProGuardルールに追加
- R8構成を確認: R8がNetFUNNELクラスを難読化しないように確認
- リリースビルドをテスト: リリースビルド構成でテスト
必須ProGuardルール:
app/proguard-rules.proファイルに次のルールを追加してください:
# NetFUNNEL Android Agent - 主要パッケージおよびクラスを保護
-keep class com.nf4.** { *; }
# NetFUNNEL Android Agent - リフレクション関連クラスおよびメンバーを保持
-keepclassmembers class com.nf4.** { *; }
必須な理由:
- リリースビルドはコード縮小、難読化、および最適化を使用
- NetFUNNEL Android Agentはリフレクションおよび動的クラスローディングを使用
- これらのルールなしではNetFUNNELクラスが難読化され、機能が中断される
- この構成はプロダクションリリースに必須です
テスト:
- リリースAPK/Bundleをビルド
- デバイスにインストール
- NetFUNNEL機能をテスト
- クラスローディングエラーに関するLogcatを確認
Androidバージョン互換性
症状:
- 以前のAndroidバージョンでアプリクラッシュ
- APIレベル互換性エラー
- 機能を使用できないエラー
解決方法:
- minSdkを確認:
minSdk >= 22であることを確認 - targetSdkを確認:
targetSdk >= 22であることを確認 - デバイスでテスト: 異なるAndroidバージョンの実際のデバイスでテスト
- API使用を確認: 互換性のあるAPI使用を確認
開発 vs プロダクション
症状:
- 開発では動作するがプロダクションでは動作しない
- 環境間で異なる動作
- 構成の違い
解決方法:
- 環境構成: 各環境に対する正しい構成を使用
- コンソール設定: dev/prod用の別々のセグメント設定
- ビルド構成: 正しいビルド構成を確認
- テスト: 開発およびプロダクションビルドの両方をテスト
FAQ
同じアプリで基本コントロールと区間コントロールの両方を使用できますか?
回答: はい、同じアプリケーションで両方の方法を使用できます:
- Kotlin
- Java
// ログインのための基本コントロール
fun handleLogin() {
Netfunnel.nfStart("login_project", "login_segment", loginCallback, this)
}
// チェックアウトのための区間コントロール
fun startCheckout() {
Netfunnel.nfStartSection("checkout_project", "checkout_segment", checkoutCallback, this)
}
// ログインのための基本コントロール
public void handleLogin() {
Netfunnel.INSTANCE.nfStart("login_project", "login_segment", loginCallback, this);
}
// チェックアウトのための区間コントロール
public void startCheckout() {
Netfunnel.INSTANCE.nfStartSection("checkout_project", "checkout_segment", checkoutCallback, this);
}
NetworkErrorをどのように処理すべきですか?
回答: ユーザーに通知し、再試行するか元のロジックを進行してください:
- Kotlin
- Java
private val callback = object : NetfunnelCallback() {
override fun onNetworkError(statusCode: Int, message: String) {
when (statusCode) {
1001 -> {
// ネットワーク接続されない
showNetworkErrorDialog()
}
1002 -> {
// ネットワークタイムアウト - 再試行
retryWithDelay()
}
}
}
}
private fun retryWithDelay() {
Handler(Looper.getMainLooper()).postDelayed({
Netfunnel.nfStart(projectKey, segmentKey, callback, this)
}, 2000)
}
private final NetfunnelCallback callback = new NetfunnelCallback() {
@Override
public void onNetworkError(int statusCode, @NonNull String message) {
switch (statusCode) {
case 1001:
// ネットワーク接続されない
showNetworkErrorDialog();
break;
case 1002:
// ネットワークタイムアウト - 再試行
retryWithDelay();
break;
}
}
};
private void retryWithDelay() {
new Handler(Looper.getMainLooper()).postDelayed(() -> {
Netfunnel.INSTANCE.nfStart(projectKey, segmentKey, callback, this);
}, 2000);
}
キー返却を忘れた場合はどうなりますか?
回答: キーはサーバータイムアウトによって自動返却される可能性がありますが、これはボトルネックを引き起こす可能性があります。常に明示的に返却してください:
- Kotlin
- Java
// 良い: 常にキーを返却
private val callback = object : NetfunnelCallback() {
override fun onSuccess(statusCode: Int, message: String) {
performAction()
.onSuccess {
Netfunnel.nfStop(projectKey, segmentKey, completeCallback)
}
.onFailure {
Netfunnel.nfStop(projectKey, segmentKey, completeCallback) // エラーが発生しても
}
}
}
// 良い: 常にキーを返却
private final NetfunnelCallback callback = new NetfunnelCallback() {
@Override
public void onSuccess(int statusCode, @NonNull String message) {
performAction()
.onSuccess(() -> {
Netfunnel.INSTANCE.nfStop(projectKey, segmentKey, completeCallback);
})
.onFailure(() -> {
Netfunnel.INSTANCE.nfStop(projectKey, segmentKey, completeCallback); // エラーが発生しても
});
}
};
NetFUNNELを複数回初期化できますか?
回答: いいえ、NetFUNNELはApplicationクラスで一度だけ初期化する必要があります。複数回初期化すると予期しない動作が発生する可能性があります。
NetFUNNEL統合をどのようにデバッグしますか?
回答: ロギングを有効化し、ログを確認してください:
- Kotlin
- Java
Netfunnel.initialize(
clientId = "{{CLIENT_ID}}",
printLog = true // ロギングを有効化
)
Netfunnel.INSTANCE.initialize(
"{{CLIENT_ID}}"
);
その後、LogcatでNetFUNNELログメッセージを確認してください。
基本コントロールと区間コントロールの違いは何ですか?
回答:
- 基本コントロール: 進入速度を制限 (ユーザーがどれだけ速く進入できるか)
- 区間コントロール: 固定された同時ユーザー数を維持 (同時にアクティブにできるユーザー数)
シンプルな進入制限には基本コントロールを、特定の同時性レベル維持には区間コントロールを使用してください。
FragmentでNetFUNNELを使用できますか?
回答: はい、ただしActivityコンテキストを渡す必要があります:
- Kotlin
- Java
class MyFragment : Fragment() {
fun startNetFUNNEL() {
activity?.let { activity ->
Netfunnel.nfStart(projectKey, segmentKey, callback, activity)
}
}
}
public class MyFragment extends Fragment {
public void startNetFUNNEL() {
Activity activity = getActivity();
if (activity != null) {
Netfunnel.INSTANCE.nfStart(projectKey, segmentKey, callback, activity);
}
}
}
ヘルプを受ける
まだ問題が発生する場合:
- ログを確認:
printLog = trueを有効化し、Logcatを確認 - 構成を確認: NetFUNNELコンソールのすべての設定を再度確認
- シンプルな設定でテスト: 基本構成から開始し、段階的に複雑さを追加
- サポートチームに問い合わせ: 具体的なエラー詳細とともにNetFUNNELサポートチームに問い合わせ
関連ドキュメント
- クイックスタート: 迅速に開始
- インストールおよび初期化: 基本設定ガイド
- 統合方法概要: 基本コントロール vs 区間コントロールアプローチの比較
- 基本コントロール統合: 実装ガイド
- 区間コントロール統合: 実装ガイド
- APIリファレンス: 完全な関数仕様
- 初期化オプションリファレンス: 利用可能なすべてのオプション