From 4ddddce248118ecc628d9db342dcb8291e584a41 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Mon, 7 Jul 2025 07:24:13 +0000 Subject: [PATCH] docs(ja): sync translations from c55404f to e90a4a8 --- ja_JP/changes/all-changes-ee.md | 11 +- ja_JP/changes/changes-ee-v4.md | 152 ++++++++ ja_JP/changes/changes-ee-v5.md | 109 +++++- ja_JP/dashboard/introduction.md | 97 ++++-- .../data-integration/data-bridge-rocketmq.md | 102 +++--- .../rule-sql-builtin-functions.md | 328 +++++++++--------- ja_JP/data-integration/snowflake.md | 323 ++++++++++------- ja_JP/last_translation_commit | 2 +- .../assets/e2e-dashboard-conf-en.png | Bin 0 -> 308451 bytes .../observability/opentelemetry/e2e-traces.md | 166 +++++---- ja_JP/observability/opentelemetry/logs.md | 47 +-- ja_JP/observability/opentelemetry/metrics.md | 17 +- .../opentelemetry/opentelemetry.md | 10 +- ja_JP/support/technical-support.md | 27 +- 14 files changed, 907 insertions(+), 484 deletions(-) create mode 100644 ja_JP/observability/opentelemetry/assets/e2e-dashboard-conf-en.png diff --git a/ja_JP/changes/all-changes-ee.md b/ja_JP/changes/all-changes-ee.md index 5fdfe1a9c..9812a4e57 100644 --- a/ja_JP/changes/all-changes-ee.md +++ b/ja_JP/changes/all-changes-ee.md @@ -1,13 +1,15 @@ # EMQX Enterprise リリースノート -EMQX Enterprise のリリースノートページでは、各バージョンに含まれるアップデート、機能強化、および修正の詳細な記録を提供しています。 +EMQX Enterprise のリリースノートページでは、各バージョンに含まれる更新、機能強化、および修正の詳細な記録を提供しています。 ## v5.9 +- [5.9.1](./changes-ee-v5.md#_5-9-1): 2025-07-02 - [5.9.0](./changes-ee-v5.md#_5-9-0): 2025-05-02 ## v5.8 +- [5.8.7](./changes-ee-v5.md#_5-8-7): 2025-07-02 - [5.8.6](./changes-ee-v5.md#_5-8-6): 2025-03-25 - [5.8.5](./changes-ee-v5.md#_5-8-5): 2025-02-25 - [5.8.4](./changes-ee-v5.md#_5-8-4): 2024-12-26 @@ -63,6 +65,13 @@ EMQX Enterprise のリリースノートページでは、各バージョンに ## v4.4 +- [4.4.30](./changes-ee-v4.md#_4-4-30): 2025-06-20 +- [4.4.29](./changes-ee-v4.md#_4-4-29): 2025-03-07 +- [4.4.28](./changes-ee-v4.md#_4-4-28): 2025-01-23 +- [4.4.27](./changes-ee-v4.md#_4-4-27): 2024-11-28 +- [4.4.26](./changes-ee-v4.md#_4-4-26): 2024-09-26 +- [4.4.25](./changes-ee-v4.md#_4-4-25): 2024-09-13 +- [4.4.24](./changes-ee-v4.md#_4-4-24): 2024-04-16 - [4.4.23](./changes-ee-v4.md#_4-4-23): 2023-11-24 - [4.4.22](./changes-ee-v4.md#_4-4-22): 2023-11-01 - [4.4.21](./changes-ee-v4.md#_4-4-21): 2023-10-16 diff --git a/ja_JP/changes/changes-ee-v4.md b/ja_JP/changes/changes-ee-v4.md index 541e2392a..b51410c49 100644 --- a/ja_JP/changes/changes-ee-v4.md +++ b/ja_JP/changes/changes-ee-v4.md @@ -1,5 +1,157 @@ # EMQX Enterprise Version 4 +## e4.4.30 + +*Release Date: 2025-06-20* + +### Enhancements + +- Smoother global garbage collection. + + EMQX periodically performs garbage collection on all processes, with the interval controlled by the `node.global_gc_interval` setting (default: 15 minutes). This mechanism helps prevent situations where the Erlang VM's default garbage collection fails to reclaim off-heap binary memory in time under extreme conditions. However, this can cause noticeable periodic spikes in CPU usage. + + The new global garbage collection mechanism performs garbage collection on processes in batches during each cycle, reducing fluctuations in CPU usage. This optimization only takes effect when `node.global_gc_interval` is set to more than one minute. + +### Bug Fixes + +- Fixed an issue where some connections would be disconnected when hot upgrading from older versions to 4.4.28 or 4.4.29. The number of disconnected clients is positively correlated with the message rate on the current node. + + +## e4.4.29 + +*Release Date: 2025-03-07* + +### Enhancements + +- Optimized License check performance. + + This optimization reduces the performance overhead of checking the total number of connections against the License when clients establish connections by minimizing inter-node RPC calls. + +- Improved connection management during mass client reconnections to prevent connection rejections due to License limits. + + After this optimization, even if the current connection count exceeds the License limit, EMQX will still allow clients with an already established ClientID to reconnect. + +- Enhanced Wolff to support Kafka topics being rebuilt with fewer partitions. + + Previously, Wolff (EMQX’s Kafka driver) only supported increasing the number of partitions in a Kafka topic (scaling up) but did not support reducing partitions (scaling down). + + Since Kafka does not allow direct partition reduction, users typically need to create a new topic and migrate data, or delete the old topic and create a new one with the same name if data loss is acceptable. Before this improvement, Wolff could not handle such cases correctly, potentially causing some producers to fail to reconnect. + +- Unified default values for the `acceptors` and `max_connections` settings across all listeners. + + After the improvement, the default value for the `acceptors` setting is unified to 16 across all listener types, and the default value for `max_connections` is 1,024,000. + +- Expanded configuration options for the Trace module. + + The Trace module now supports three new options: + + - **Line Max Size:** Controls the maximum number of characters per line in the log file (default: `2048`). + - **File Max Size:** Sets the maximum size of a log file (default: `1GB`). + - **Client Process Max Heap Size:** The default value is `512MB`, which helps prevent client connection processes from being terminated due to low default memory limits (64MB on 64-bit systems) when log tracing is enabled. + +- Added a Warning log when a client process is terminated. + + Previously, when a client process was terminated due to memory constraints, the only available log was an Erlang/OTP error message, which did not specify which client was affected: + + ``` + [error] Process: <0.3540.0> on node 'emqx@127.0.0.1', Context: maximum heap size reached, Max Heap Size: 167772160, Total Heap Size: 200934817, Kill: true, ... + ``` + + Now, EMQX adds a Warning log alongside this message to help users identify the affected client: + + ``` + [warning] [CM] Clean down, clientid: abcd_bench_pub_1, pid: <0.3540.0>, reason: killed + ``` + +### Bug Fixes + +- Fixed an issue where EMQX deployed in containers could not update the `acceptors` and `max_connections` settings using the hot configuration feature. + +- Fixed an issue where EMQX might fail to reconnect to Redis after a master-slave switch in Redis Cluster mode. + + Previously, if EMQX could not connect to the new Redis master node after a failover due to network issues, `eredis_cluster` (EMQX’s Redis Cluster driver) would enter an abnormal state, preventing it from reconnecting to Redis properly. + +- Fixed an occasional unresponsiveness issue when downloading log tracing files from the Dashboard. + +- Fixed a packet parsing issue in the Pulsar driver. + +## e4.4.28 + +*Release Date: 2025-01-23* + +### Enhancements + +- Improved the self-healing capability of the EMQX cluster. + + Previously, EMQX could only self-heal simple split-brain scenarios, but not others: + + - When one node can maintain contact with all other nodes, it is used as the base node, and other nodes are restarted to restore the cluster. + - When the split-brain forms two sub-clusters, the sub-cluster with fewer nodes is restarted to restore the cluster. + + After the improvement, even if the split-brain becomes multiple complex and asymmetric clusters, EMQX can still self-heal. + +- Optimized the performance of handling wildcard subscriptions and un-subscriptions in EMQX. + + This improvement changes the prefix tree table from a `mnesia` table that needs to be replicated between nodes to an `ETS` table, eliminating the time spent synchronizing prefix tree information between nodes. After the improvement, EMQX's subscription handling is **asynchronous**: + + 1. First, EMQX updates the prefix tree and routing records locally and replies with SUBACK. + 2. The routing information is asynchronously updated to other nodes, which then update their own prefix trees. + + This optimization will significantly improve the performance of handling subscriptions and un-subscriptions in EMQX, especially when there are many nodes and high network latency between nodes. + + Note that if there are older versions of EMQX nodes in the cluster, wildcard subscriptions added on the older nodes can be correctly established on the new version nodes, but not vice versa. This means that during a rolling upgrade, wildcard subscriptions made on newly upgraded nodes may not receive messages from older nodes. This issue is automatically resolved once all nodes are upgraded. After a node is upgraded, the prefix tree will be rebuilt through the routing table, so routing information will not be lost during the rolling upgrade. + +- Optimized the matching performance of the rule engine. + + This optimization improves the matching performance of the rule engine by caching the topic prefix tree and removing excessive topic splitting operations. This optimization is more significant in scenarios with many rules. + +- Added a "Buffer Max Linger Time" option to the Kafka action. + + This option controls the maximum wait time for the producer to collect messages for each partition before writing them to the buffer in batches. The default value of `0ms` means no waiting. For non-memory buffering modes, it is recommended to set at least `5ms` to reduce IOPS. + +- Changed the handling of alarms to asynchronous mode. + + Previously, alarms were handled synchronously, and a large number of `conn_congestion` alarms could affect the MQTT connection process. Now, alarms are handled asynchronously, and overload protection has been added. When the alarm system is overloaded, alarms will enter a "silent period" of one minute, during which any alarms will be discarded. + +- Added monitoring and alarming for process message queue length. + + Two new configuration items `vm_mon.process_long_msgq` and `vm_mon.process_alarm_top_n` have been added to control the monitoring and alarming of process message queue length. + + - `vm_mon.process_long_msgq`: Triggers an alarm when the mailbox of a process in EMQX exceeds this length, with a default value of `80`. + - `vm_mon.process_alarm_top_n`: When an alarm is triggered, include the information of the top N processes with the longest non-zero message queues in the alarm. The default value is `5`. + +- Optimized the logging of CONNECT packet parsing failures. + + After the improvement, if an MQTT connection is disconnected due to a failure in parsing the CONNECT variable header, `esockd` will no longer log such errors, and the disconnection reason will be marked as: `malformed_connect_variable_header`: + + ``` + [error] supervisor: 'esockd_connection_sup - <0.5949.0>', errorContext: connection_shutdown, reason: {badmatch,<<>>}, offender: [{pid,<0.13949.4720>}, ...] + ``` + +- Changed the log to "Always Asynchronous" mode. + + Previously, the default value of the `log.sync_mode_qlen` configuration was 100, meaning that when the log queue length exceeded 100, the log would switch to synchronous mode. This has been changed to 3000, consistent with the default value of `log.drop_mode_qlen`, so that the log handler always works in asynchronous mode and starts discarding logs when the queue length exceeds 3000. + +- Optimized the performance of slow subscriptions. + + This optimization slightly reduces the performance overhead of the slow subscription feature by avoiding calling `ets:info(emqx_slow_subs_topk, size)`. + +- Reduced the time spent updating listeners through hot configuration. + + Previously, when updating listener configurations through hot configuration, EMQX would sequentially update and restart listeners on each node, which could take a long time when there were many connections. Now, by using `erpc:multicall/4`, EMQX will update listeners on each node in parallel, reducing the time spent. + +- Avoid blocking `ecpool_sup` by slow-starting `ecpool_worker`. + +### Bug Fixes + +- Fixed an issue where the username of a persistent session would disappear from the username quota page. + + Before the fix, the username of a persistent session's MQTT client would disappear from the username quota page after reconnecting. + +- Fixed a performance degradation issue caused by log throttling. + + Before the fix, due to issues in the log throttling feature, enabling log tracing would significantly increase EMQX's resource consumption. + ## 4.4.27 *Release Date: 2024-11-28* diff --git a/ja_JP/changes/changes-ee-v5.md b/ja_JP/changes/changes-ee-v5.md index 1db1bbeff..d8dbeeeff 100644 --- a/ja_JP/changes/changes-ee-v5.md +++ b/ja_JP/changes/changes-ee-v5.md @@ -1,5 +1,77 @@ # EMQX Enterprise Version 5 +## 5.9.1 + +*Release Date: 2025-07-02* + +Make sure to check the breaking changes and known issues before upgrading to EMQX 5.9.1. + +### Enhancements + +- [#15364](https://github.com/emqx/emqx/pull/15364) Added support for custom HTTP headers in the OpenTelemetry gRPC (over HTTP/2) integration. This enhancement enables compatibility with collectors that require HTTP authentication. + +- [#15160](https://github.com/emqx/emqx/pull/15160) Added the `DELETE /mt/bulk_delete_ns` API for multi-tenancy management, which allows deleting namespaces in bulk. + +- [#15158](https://github.com/emqx/emqx/pull/15158) Added new `emqx ctl conf remove x.y.z` command, which removes the configuration key path `x.y.z` from the existing configuration. + +- [#15157](https://github.com/emqx/emqx/pull/15157) Added support for specifying private key file path for Snowflake Connector instead of using password. + + Users should either use password, private key, or neither (set parameters in `/etc/odbc.ini`). + +- [#15043](https://github.com/emqx/emqx/pull/15043) Instrument the DS Raft backend with basic metrics to provide insights into cluster status, database overview, shard replication, and replica transitions. + +### Bug Fixes + +#### Data Integration + +- [#15331](https://github.com/emqx/emqx/pull/15331) Fixed an issue in the InfluxDB action where line protocol conversion failed if the `timestamp` in `WriteSyntax` was left blank and no timestamp field was provided in the rule. + Now the system's current millisecond value is used instead, and millisecond precision is enforced. + +- [#15274](https://github.com/emqx/emqx/pull/15274) Improved the resilience of Postgres, Matrix, and TimescaleDB connectors by triggering a full reconnection on any health check failure. Previously, failed health checks could leave the connection in a broken state, causing operations to hang and potentially leading to out-of-memory issues. + +- [#15154](https://github.com/emqx/emqx/pull/15154) Fixed a rare race condition in Actions running in aggregated mode (e.g., S3, Azure Blob Storage, Snowflake) that could lead to a crash with errors like: + + ``` + ** Reason for termination == + ** {function_clause,[{emqx_connector_aggregator,handle_close_buffer,[...], ... + ``` + +- [#15147](https://github.com/emqx/emqx/pull/15147) Fixed an issue where some Actions failed to emit trace events during rule testing with simulated input data, even after request rendering. + + Affected Actions: + + - Couchbase + - Snowflake + - IoTDB (Thrift driver) + +- [#15383](https://github.com/emqx/emqx/pull/15383) Fixed a potential resource leak in the MQTT bridge. When the bridge failed to start, the topic index table was not properly cleaned up. This fix ensures that the index table is correctly deleted to prevent resource leaks. + +#### Smart Data Hub + +- [#15224](https://github.com/emqx/emqx/pull/15224) Fixed an issue where updating an External Schema Registry via the Dashboard would unintentionally overwrite the existing password with `******`. The password is now correctly preserved during updates. +- [#15190](https://github.com/emqx/emqx/pull/15190) Enhanced Message Transformation by allowing hard-coded values for QoS and topic. + +#### Observability + +- [#15299](https://github.com/emqx/emqx/pull/15299) Fixed a `badarg` error that occurred when exporting OpenTelemetry metrics. + +#### Telemetry + +- [#15216](https://github.com/emqx/emqx/pull/15216) Fixed a crash in the `emqx_telemetry` process that could occur when plugins were activated. + +#### Access Control + +- [#15184](https://github.com/emqx/emqx/pull/15184) Fixed the formatting of error messages returned when creating a blacklist fails. + +#### Clustering + +- [#15180](https://github.com/emqx/emqx/pull/15180) Reduced the risk of deadlocks during channel registration by fixing improper handling of `badrpc` errors in the `ekka_locker` module. These errors previously led to false positives in lock operations, potentially causing inconsistent cluster state and deadlocks. + +#### Security + + +- [#15159](https://github.com/emqx/emqx/pull/15159) Improved handling of Certificate Revocation List (CRL) Distribution Point URLs by stopping their refresh after repeated failures (default: 60 seconds). This prevents excessive error logs from unreachable URLs and improves overall system stability. + ## 5.9.0 *Release Date: 2025-05-02* @@ -118,7 +190,7 @@ Make sure to check the breaking changes and known issues before upgrading to EMQ - [#14892](https://github.com/emqx/emqx/pull/14892) Enhanced cluster load rebalancing: - Fixed load imbalance in core/replicant cluster. Previously, under certain conditions, all transactions from the replicants could be sent to a single core node. - + - Add CLI commands for rebalancing replicant nodes in relation to core nodes: - `emqx_ctl cluster core rebalance plan` @@ -434,6 +506,41 @@ Make sure to check the breaking changes and known issues before upgrading to EMQ - [#14775](https://github.com/emqx/emqx/pull/14775) QUIC Listener: Fixed issue where zone configurations are not applied after a config reload. +## 5.8.7 + +*Release Date: 2025-07-02* + +### Enhancements + +- [#15364](https://github.com/emqx/emqx/pull/15364) Added support for custom HTTP headers in the OpenTelemetry gRPC (over HTTP/2) integration. This enhancement enables compatibility with collectors that require HTTP authentication. + +### Bug Fixes + +- [#15383](https://github.com/emqx/emqx/pull/15383) Fixed a potential resource leak in the MQTT bridge. When the bridge failed to start, the topic index table was not properly cleaned up. This fix ensures that the index table is correctly deleted to prevent resource leaks. +- [#15331](https://github.com/emqx/emqx/pull/15331) Fixed an issue in the InfluxDB action where line protocol conversion failed if the `timestamp` in `WriteSyntax` was left blank and no timestamp field was provided in the rule. Now the system's current millisecond value is used instead, and millisecond precision is enforced. +- [#15274](https://github.com/emqx/emqx/pull/15274) Improved the resilience of Postgres, Matrix, and TimescaleDB connectors by triggering a full reconnection on any health check failure. Previously, failed health checks could leave the connection in a broken state, causing operations to hang and potentially leading to out-of-memory issues. +- [#15224](https://github.com/emqx/emqx/pull/15224) Fixed an issue where updating an External Schema Registry via the Dashboard would unintentionally overwrite the existing password with `******`. The password is now correctly preserved during updates. +- [#14989](https://github.com/emqx/emqx/pull/14989) Optimized the Kinesis Connector and Action to significantly reduce the number of AWS API calls during startup and health checks. This change helps prevent exceeding AWS Kinesis API rate limits (e.g., `ListStreams` and `DescribeStream`), which previously led to frequent health check failures when using larger connection pools or multiple connectors. +- [#15299](https://github.com/emqx/emqx/pull/15299) Fixed a `badarg` error that occurred when exporting OpenTelemetry metrics. + +## 5.8.7 + +*Release Date: 2025-07-02* + +### Enhancements + +- [#15364](https://github.com/emqx/emqx/pull/15364) Added support for custom HTTP headers in the OpenTelemetry gRPC (over HTTP/2) integration. This enhancement enables compatibility with collectors that require HTTP authentication. + +### Bug Fixes + +- [#15383](https://github.com/emqx/emqx/pull/15383) Fixed a potential resource leak in the MQTT bridge. When the bridge failed to start, the topic index table was not properly cleaned up. This fix ensures that the index table is correctly deleted to prevent resource leaks. +- [#15331](https://github.com/emqx/emqx/pull/15331) Fixed an issue in the InfluxDB action where line protocol conversion failed if the `timestamp` in `WriteSyntax` was left blank and no timestamp field was provided in the rule. + Now the system's current millisecond value is used instead, and millisecond precision is enforced. +- [#15274](https://github.com/emqx/emqx/pull/15274) Improved the resilience of Postgres, Matrix, and TimescaleDB connectors by triggering a full reconnection on any health check failure. Previously, failed health checks could leave the connection in a broken state, causing operations to hang and potentially leading to out-of-memory issues. +- [#15224](https://github.com/emqx/emqx/pull/15224) Fixed an issue where updating an External Schema Registry via the Dashboard would unintentionally overwrite the existing password with `******`. The password is now correctly preserved during updates. +- [#14989](https://github.com/emqx/emqx/pull/14989) Optimized the Kinesis Connector and Action to significantly reduce the number of AWS API calls during startup and health checks. This change helps prevent exceeding AWS Kinesis API rate limits (e.g., `ListStreams` and `DescribeStream`), which previously led to frequent health check failures when using larger connection pools or multiple connectors. +- [#15299](https://github.com/emqx/emqx/pull/15299) Fixed a `badarg` error that occurred when exporting OpenTelemetry metrics. + ## 5.8.6 *Release Date: 2025-03-25* diff --git a/ja_JP/dashboard/introduction.md b/ja_JP/dashboard/introduction.md index 191bbb194..6525387f8 100644 --- a/ja_JP/dashboard/introduction.md +++ b/ja_JP/dashboard/introduction.md @@ -1,76 +1,115 @@ -# EMQX Dashboard +# EMQX ダッシュボード -EMQXは、EMQXクラスターの監視および管理を行い、必要な機能をウェブページ経由で設定できる組み込みのDashboard管理コンソールを提供します。新しいDashboardは刷新されたデザインを採用し、使いやすいMQTTブローカー管理UIを提供します。 +EMQX は、EMQX クラスターの監視および管理を行い、必要な機能をウェブページ上で設定できる組み込みのダッシュボード管理コンソールを提供しています。新しいダッシュボードは刷新されたデザインを採用し、使いやすい MQTT ブローカー管理用の UI を備えています。 -EMQX Dashboardの新しいUI/UXデザインは、主要なデータやメトリクスの表示と内容を最適化し、視覚的な体験を向上させるとともに、接続、サブスクライブ、パブリッシュの認証・認可管理、データブリッジやルールエンジンを用いたデータ統合変換のサポートなど、より包括的で強力かつ使いやすい組み込み機能を提供します。ブラウザからの迅速かつ簡単なアクセスにより、ユーザーはより便利にEMQXを利用してIoTビジネスの開発を進められます。 +EMQX ダッシュボードの新しい UI/UX デザインは、主要なデータやメトリクスの表示と内容を最適化し、視覚的な体験を向上させるとともに、接続、サブスクライブ、パブリッシュの認証・認可管理、データブリッジやルールエンジンを用いたデータ統合変換のサポートなど、より包括的で強力かつ使いやすい組み込み機能を提供します。ブラウザからの迅速かつ簡単なアクセスにより、ユーザーはより便利に EMQX を利用して IoT ビジネスの開発を進められます。 ![image](./assets/dashboard_preview.png) ## 主な機能 -このセクションでは、Dashboardを通じて設定および管理可能なEMQXの各種機能を紹介します。 +このセクションでは、ダッシュボードを通じて設定および管理できる EMQX のさまざまな機能を紹介します。 ### [モニタリング](./monitoring.md) -稼働中のEMQXクラスターの全体情報を表示します。接続数、サブスクライブされたトピック、メッセージ配信数、インバウンド/アウトバウンドレートなどを含みます。また、ノード一覧、ノード情報、各種システムメトリクス情報も確認可能です。さらに、クライアント接続やサブスクリプションデータの閲覧・管理も行えます。 +稼働中の EMQX クラスターの全体情報を表示します。接続数、サブスクライブされたトピック、メッセージ配信数、受信レート、送信レートなどが含まれます。また、ノード一覧、ノード情報、各種システムメトリクス情報も確認できます。さらに、クライアント接続やサブスクリプションデータの閲覧・管理も可能です。 ### [アクセス制御](./acloverview.md) -EMQXの認証および認可機構を視覚的に追加・設定できます。 +EMQX の認証および認可機構を視覚的に追加・設定できます。 ### [統合](./bridgeoverview.md) -強力なSQLベースのルールエンジンやデータ統合機能、またはFlowエディターのビジュアル機能を活用し、ローコードでのデータ処理と統合を実現します。これにより、MQTTデータのリアルタイム抽出、フィルタリング、強化、変換、保存、検証が可能です。 +強力な SQL ベースのルールエンジンとデータ統合機能、または Flowデザイナーのビジュアル機能を活用し、ローコードでのデータ処理および統合を実現します。これにより、MQTT データのリアルタイム抽出、フィルタリング、エンリッチメント、変換、保存、検証が可能です。 ### 管理 #### クラスター設定 -MQTT、ログ、リスナーなどの設定項目をオンラインで変更・更新でき、更新成功後は即時反映されます。 +MQTT、ログ、リスナーなどの設定項目をオンラインで変更・更新でき、更新成功後すぐに反映されます。 -#### 高度なMQTT設定 +#### 高度な MQTT -トピック書き換え、自動サブスクライブ、遅延パブリッシュ、ファイル転送機能の管理と設定が可能です。 +トピックの書き換え、自動サブスクライブ、遅延パブリッシュ、ファイル転送機能の管理および設定が可能です。 #### 拡張機能 -カスタムプラグインの統合により、組み込みのゲートウェイ管理・設定を通じて接続プロトコルを拡張できます。また、Hooksを利用して関数呼び出しやメッセージ、モジュール間のイベント伝達をインターセプトし、システム機能を修正・拡張できます。 +カスタムプラグインを統合し、組み込みのゲートウェイ管理および設定を通じて接続プロトコルを拡張できます。また、Hooks を利用して、関数呼び出し、メッセージの送受信、モジュール間のイベント伝達をインターセプトし、システム機能の変更や拡張が可能です。 -### 問題分析と診断 +### 問題分析および診断 -オンラインのMQTT over WebSocketクライアント接続やトピックメトリクスによるデバッグに加え、スロウサブスクリプションやログトレースなどの機能を用いた診断や問題発見もサポートしています。 +オンラインの MQTT over WebSocket クライアント接続やトピックメトリクスによるデバッグに加え、スロウサブスクリプションやログトレースなどの機能を用いた診断や問題発見をサポートします。 ### システム -ユーザーアカウント、監査ログ、APIキー、ライセンス設定、シングルサインオン機能の管理と設定が可能です。 +ユーザーアカウント、監査ログ、API キー、ライセンス設定、シングルサインオン機能の管理および設定が可能です。 -## Dashboardの起動 +## ダッシュボードの起動 -EMQX Dashboardはウェブアプリケーションで、デフォルトでポート`18083`をリッスンします。EMQXを正常にインストール後、ブラウザで (非ローカル環境の場合はlocalhostを実際のIPアドレスに置き換えてください)にアクセスすることでDashboardを利用できます。 +EMQX ダッシュボードはウェブアプリケーションであり、デフォルトでポート `18083` をリッスンします。EMQX を正常にインストールした後、ブラウザで (ローカル以外のマシンにデプロイしている場合は localhost を実際の IP アドレスに置き換えてください)にアクセスすることで EMQX ダッシュボードを利用できます。 ::: tip -Dashboardを有効にしなくてもEMQXは通常通り利用可能です。Dashboardはユーザーが視覚的に操作するためのオプション機能です。 +EMQX はダッシュボードを有効にしなくても通常通り使用可能です。ダッシュボードはあくまで視覚的に利用するためのオプションです。 ::: ### 初回ログイン -EMQXを初めてインストールしたユーザーは、Dashboardをブラウザで開いた後、デフォルトのユーザー名`admin`とパスワード`public`でログインできます。 +EMQX を初めてインストールしたユーザーは、ブラウザでダッシュボードを開いた後、デフォルトのユーザー名 `admin` とデフォルトのパスワード `public` を使ってログインできます。 -初回ログイン時、システムはデフォルトのユーザー名とパスワードでのログインを検出し、セキュリティ確保のためパスワードの変更を強制します。変更後のパスワードは元のパスワードと同一にできず、`public`の再利用は推奨されません。 +初回ログイン時、システムはデフォルトのユーザー名とパスワードでのログインを自動検出し、ダッシュボードのセキュリティ向上のためパスワード変更を強制します。変更後のパスワードは元のパスワードと同じにできず、再度 `public` を使用することは推奨されません。 -### パスワードのリセット +### URL を用いたトークンベースログイン -Dashboardのログインパスワードは`admins`コマンドでリセット可能です。詳細は[CLI - admins](../admin/cli.md#admins)をご覧ください。 +EMQX 5.6.0 以降、ダッシュボードは URL に認証情報を埋め込むことで直接ログインできるトークンベースのログイン方法をサポートしています。 + +この機能は、ユーザーが手動で認証情報を入力せずに自動的にログインする必要があるシームレスなリダイレクトや統合シナリオに特に有用です。 + +#### 利用方法 + +1. `/login` エンドポイントを使って認証トークンを取得します。レスポンスにはユーザー名が含まれないため、JSON ペイロード全体をエンコードする前に手動でユーザー名を追加する必要があります。 + + 以下のように、トークン取得、ユーザー名の挿入、Base64 エンコードを一括で実行できます。 + + ``` + curl -s -X POST "http://127.0.0.1:18083/api/v5/login" \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{"username": "admin","password": "public"}' | jq '.username = "admin"' | base64 + ``` + +2. ログイン URL を構築します。エンコードした文字列をダッシュボード URL の `login_meta` クエリパラメータに埋め込みます。例: + + EMQX バージョン **5.6.0 未満** の場合: + + ```bash + http://localhost:18083?login_meta=BASE64_ENCODED_STRING + ``` + + これによりデフォルトのクラスター概要ページにリダイレクトされます。 + + EMQX **5.6.0 以降** の場合: + + ```bash + http://localhost:18083/#/dashboard/overview?login_meta=BASE64_ENCODED_STRING + ``` + + ログイン後の遷移先ページを指定できます。 + +この方法により、事前認証されたスムーズなユーザー体験で EMQX ダッシュボードにアクセス可能です。トークンは安全に管理し、有効期限やスコープの制限を適切に設定してください。 + +### パスワードリセット + +ダッシュボードのログインパスワードは `admins` コマンドでリセットできます。詳細は [CLI - admins](../admin/cli.md#admins) を参照してください。 ```bash ./bin/emqx ctl admins passwd ``` -### パスワードの有効期限 +### パスワード有効期限 -現在のDashboardログインパスワードの使用期間が設定された有効期限(`password_expired_time`)を超えると、ログイン時にパスワード更新を促されます。`password_expired_time`設定の詳細は[Dashboard設定](../configuration/dashboard.md)を参照してください。 +現在のダッシュボードログインパスワードの使用期間が設定されたパスワード有効期限(`password_expired_time`)を超えると、ログイン時にパスワード更新を促されます。`password_expired_time` 設定の詳細は [ダッシュボード設定](../configuration/dashboard.md) をご覧ください。 -「管理者」ロールのユーザーは[REST API](../admin/api.md)を使ってパスワード有効期限を設定することも可能です。 +「管理者」ロールのユーザーは、[REST API](../admin/api.md) を使ってパスワード有効期限を設定可能です。 **例**: @@ -86,12 +125,12 @@ curl -X 'PUT' \ ### アカウントロックと解除 -セキュリティ強化のため、EMQX Dashboardは「アカウントロックと解除」機能を実装しています。ユーザーが5分間に5回パスワードを誤入力すると、そのアカウントは10分間ロックされます。 +セキュリティ強化のため、EMQX ダッシュボードは「アカウントロックと解除」機能を実装しています。ユーザーが5分間に5回誤ったパスワードを入力すると、そのアカウントは10分間ロックされます。 -「管理者」ロールのユーザーはCLIからユーザーのパスワードをリセットすることで手動でアカウントを解除できます。10分経過後は自動的にロックが解除され、通常通りログイン可能になります。 +「管理者」ロールのユーザーは CLI を使ってユーザーのパスワードをリセットし、手動でアカウントロックを解除できます。10分経過後は自動的にロックが解除され、通常通りログイン可能になります。 -管理者はバックエンド設定を通じてロック時間やロック発動までの失敗回数も設定可能です。詳細は[Dashboard設定](../configuration/dashboard.md)をご覧ください。 +管理者はロック時間やロックに至る失敗回数をバックエンド設定で変更可能です。設定の詳細は [ダッシュボード設定](../configuration/dashboard.md) を参照してください。 -## Dashboardの設定 +## ダッシュボードの設定 -DashboardはデフォルトでHTTPをリッスンし、ポート番号は18083です。ユーザーはHTTPSを有効化したり、リスナーポートを変更したりできます。Dashboard設定の詳細な変更方法については、[EMQX Enterprise設定マニュアル](https://docs.emqx.com/en/enterprise/v@EE_VERSION@/hocon/)を参照してください。 +ダッシュボードはデフォルトで HTTP をリッスンし、ポート番号は 18083 です。ユーザーは HTTPS を有効にしたり、リスナーポートを変更したりできます。ダッシュボード設定の詳細な変更方法は [EMQX Enterprise 設定マニュアル](https://docs.emqx.com/en/enterprise/v@EE_VERSION@/hocon/) をご参照ください。 diff --git a/ja_JP/data-integration/data-bridge-rocketmq.md b/ja_JP/data-integration/data-bridge-rocketmq.md index 2cc7db057..63df591ce 100644 --- a/ja_JP/data-integration/data-bridge-rocketmq.md +++ b/ja_JP/data-integration/data-bridge-rocketmq.md @@ -1,52 +1,52 @@ -# Bridge MQTT Data into RocketMQ +# RocketMQへのMQTTデータブリッジ -EMQXは[RocketMQ](https://rocketmq.apache.org/)へのデータブリッジをサポートしており、MQTTメッセージやクライアントイベントをRocketMQに転送できます。例えば、RocketMQを使ってデバイスからのセンサーデータやログデータを収集することが可能です。 +EMQXは[RocketMQ](https://rocketmq.apache.org/)へのデータブリッジをサポートしており、MQTTメッセージやクライアントイベントをRocketMQに転送できます。例えば、RocketMQを利用してデバイスからのセンサーデータやログデータを収集することが可能です。 -本ページでは、EMQXとRocketMQ間のデータ連携の詳細な概要と、データ連携の作成および検証に関する実践的な手順を提供します。 +本ページでは、EMQXとRocketMQ間のデータ統合について詳細に解説し、データ統合の作成および検証手順を実践的に説明します。 ::: tip 注意 -Alibaba CloudがホストするRocketMQサービスを利用する場合、このデータ連携はバッチモードをサポートしていません。 +Alibaba Cloudが提供するRocketMQサービスを利用する場合、本データ統合はバッチモードをサポートしていません。 ::: -## 動作原理 +## 動作概要 -RocketMQデータ連携は、EMQXに標準搭載された機能であり、EMQXのリアルタイムデータキャプチャと送信機能をRocketMQの強力なメッセージキュー処理機能と組み合わせています。組み込みの[ルールエンジン](./rules.md)コンポーネントにより、EMQXからRocketMQへのデータ取り込みが簡素化され、複雑なコーディングが不要になります。 +RocketMQデータ統合はEMQXに標準搭載された機能であり、EMQXのリアルタイムデータキャプチャおよび送信機能とRocketMQの強力なメッセージキュー処理機能を組み合わせています。組み込みの[ルールエンジン](./rules.md)コンポーネントにより、EMQXからRocketMQへのデータ取り込みを簡素化し、複雑なコーディングを不要にします。 -以下の図は、EMQXとRocketMQ間の典型的なデータ連携アーキテクチャを示しています。 +以下の図は、EMQXとRocketMQ間の典型的なデータ統合アーキテクチャを示しています。 ![EMQX Integration RocketMQ](./assets/emqx-integration-rocketmq.png) -MQTTデータをRocketMQに取り込む流れは次の通りです: +MQTTデータをRocketMQに取り込む流れは以下の通りです: -1. **メッセージのパブリッシュと受信**:産業用IoTデバイスはMQTTプロトコルを通じてEMQXに正常に接続し、リアルタイムMQTTデータをEMQXにパブリッシュします。EMQXがこれらのメッセージを受信すると、ルールエンジン内でマッチング処理を開始します。 -2. **メッセージデータの処理**:メッセージが到着するとルールエンジンを通過し、EMQXで定義されたルールによって処理されます。ルールは事前定義された条件に基づき、RocketMQにルーティングすべきメッセージを判別します。ペイロードの変換が指定されている場合は、データ形式の変換、特定情報のフィルタリング、追加コンテキストによるペイロードの強化などが適用されます。 -3. **RocketMQへのデータ取り込み**:ルールによる処理が完了したメッセージは、RocketMQへの転送アクションがトリガーされます。処理済みデータはシームレスにRocketMQに書き込まれます。 -4. **データの保存と活用**:データがRocketMQに保存された後、企業はそのクエリ機能を活用して様々なユースケースに対応できます。例えば金融業界では、RocketMQを信頼性の高い高性能メッセージキューとして利用し、決済端末や取引システムからのデータを管理します。これにより、リスク管理、不正検知・防止、規制遵守などの要件を満たすためのデータ分析や規制プラットフォームと連携可能です。 +1. **メッセージのパブリッシュと受信**:産業用IoTデバイスはMQTTプロトコルを介してEMQXに正常に接続し、リアルタイムのMQTTデータをEMQXにパブリッシュします。EMQXがこれらのメッセージを受信すると、ルールエンジン内でマッチング処理を開始します。 +2. **メッセージデータの処理**:メッセージが到着すると、ルールエンジンを通過し、EMQXに定義されたルールによって処理されます。ルールは事前に定義された条件に基づき、RocketMQへルーティングすべきメッセージを判別します。ペイロード変換が指定されている場合は、データ形式の変換、特定情報のフィルタリング、追加コンテキストによるペイロードの拡充などが適用されます。 +3. **RocketMQへのデータ取り込み**:ルールによる処理が完了すると、メッセージ転送アクションがトリガーされ、処理済みデータがRocketMQにシームレスに書き込まれます。 +4. **データの保存と活用**:データがRocketMQに保存されることで、企業はそのクエリ機能を活用し多様なユースケースに対応可能です。例えば金融業界では、RocketMQを高信頼・高性能なメッセージキューとして利用し、決済端末や取引システムからのデータを管理し、リスク管理、不正検知・防止、法令遵守などの要件を満たすためのデータ分析や規制プラットフォームと連携できます。 ## 特長と利点 -RocketMQとのデータ連携は、以下の特長と利点をビジネスにもたらします: +RocketMQとのデータ統合は、以下の特長とメリットをビジネスにもたらします: - **信頼性の高いIoTデータメッセージ配信**:EMQXはMQTTメッセージを信頼性高くバッチ送信でき、IoTデバイスとRocketMQおよびアプリケーションシステムの統合を実現します。 -- **MQTTメッセージの変換**:ルールエンジンを活用し、EMQXはMQTTメッセージの抽出、フィルタリング、強化、変換を行い、RocketMQに送信します。 -- **クラウドネイティブな弾力的スケーリング**:EMQXとRocketMQは共にクラウドネイティブアーキテクチャで構築されており、Kubernetes(K8s)をはじめとしたクラウドネイティブエコシステムとの親和性が高く、ビジネスの急速な成長に対応する無限の弾力的スケールが可能です。 -- **柔軟なトピックマッピング**:RocketMQデータ連携はMQTTトピックとRocketMQトピックの柔軟なマッピングをサポートし、RocketMQメッセージ内のキー(Key)や値(Value)の設定を簡単に行えます。 -- **高スループットシナリオでの処理能力**:RocketMQデータ連携は同期・非同期の両書き込みモードをサポートし、シナリオに応じてレイテンシとスループットのバランスを柔軟に調整可能です。 +- **MQTTメッセージの変換**:ルールエンジンを用いてMQTTメッセージのフィルタリングや変換が可能です。データ抽出、フィルタリング、拡充、変換を経てRocketMQに送信されます。 +- **クラウドネイティブな弾力的スケーリング**:EMQXとRocketMQは共にクラウドネイティブアーキテクチャを採用し、Kubernetes(K8s)に親和性が高く、クラウドネイティブエコシステムと統合されています。ビジネスの急速な成長に合わせて無限かつ弾力的にスケール可能です。 +- **柔軟なトピックマッピング**:RocketMQデータ統合はMQTTトピックとRocketMQトピックの柔軟なマッピングをサポートし、RocketMQメッセージ内のキー(Key)や値(Value)を簡単に設定できます。 +- **高スループットシナリオでの処理能力**:RocketMQデータ統合は同期・非同期の書き込みモードに対応し、シナリオに応じてレイテンシとスループットのバランスを柔軟に調整可能です。 ## はじめる前に -このセクションでは、RocketMQデータ連携を作成する前に必要な準備とRocketMQサーバーのセットアップ方法を説明します。 +本節では、RocketMQデータ統合の作成を開始する前に必要な準備事項とRocketMQサーバーのセットアップ方法を説明します。 ### 前提条件 -- EMQXデータ連携の[ルール](./rules.md)に関する知識 -- [データ連携](./data-bridges.md)に関する知識 +- EMQXデータ統合の[ルール](./rules.md)に関する知識 +- [データ統合](./data-bridges.md)に関する知識 ### RocketMQのインストール -1. RocketMQをセットアップするためのdocker-composeファイル`rocketmq.yaml`を準備します。 +1. RocketMQをセットアップするためのdocker-composeファイル`rocketmq.yaml`を用意します。 ```yaml version: '3.9' @@ -81,7 +81,7 @@ services: - mqnamesrv ``` -2. RocketMQの実行に必要なフォルダと設定を作成します。 +2. RocketMQの実行に必要なフォルダと設定を準備します。 ```bash mkdir rocketmq @@ -137,32 +137,32 @@ Linux環境では、`host.docker.internal`を実際のIPアドレスに変更し ## コネクターの作成 -このセクションでは、SinkをRocketMQサーバーに接続するためのコネクター作成方法を説明します。 +本節では、SinkをRocketMQサーバーに接続するためのコネクター作成方法を説明します。 -以下の手順は、EMQXとRocketMQをローカルマシンで実行している場合を想定しています。リモートで実行している場合は設定を適宜調整してください。 +以下の手順は、EMQXとRocketMQの両方をローカルマシンで実行している場合を想定しています。リモート環境で実行している場合は設定を適宜調整してください。 -1. EMQXダッシュボードに入り、**Integration** -> **Connectors**をクリックします。 +1. EMQXダッシュボードにアクセスし、**Integration** -> **Connectors**をクリックします。 2. ページ右上の**Create**をクリックします。 3. **Create Connector**ページで**RocketMQ**を選択し、**Next**をクリックします。 4. **Configuration**ステップで以下を設定します: - - **Connector name**:コネクター名を入力します。英数字の組み合わせで、例:`my_rocketmq` - - **Servers**:`127.0.0.1:9876`を入力 - - **Namespace**:RocketMQサービスにネームスペースが設定されていなければ空欄のまま。 - - **AccessKey**、**SecretKey**、**Secret Token**:サービス構成に応じて空欄または入力 - - その他はデフォルトのまま -5. 詳細設定(任意):[Sinkの機能](./data-bridges.md#features-of-sink)を参照 -6. **Create**をクリックする前に、**Test Connectivity**でRocketMQサーバーへの接続確認が可能です。 -7. ページ下部の**Create**ボタンをクリックしてコネクター作成を完了します。ポップアップで**Back to Connector List**か**Create Rule**を選択可能です。ルール作成については、[メッセージ保存用RocketMQ Sinkのルール作成](#create-a-rule-with-rocketmq-sink-for-message-storage)および[イベント記録用RocketMQ Sinkのルール作成](#create-a-rule-with-rocketmq-sink-for-events-recording)を参照してください。 + - **Connector name**:コネクター名を入力します。英数字の組み合わせで、例:`my_rocketmq`。 + - **Servers**:`127.0.0.1:9876`を入力します。 + - **Namespace**:RocketMQサービスにネームスペースが設定されていなければ空欄のままにします。 + - **AccessKey**、**SecretKey**、**Secret Token**:RocketMQサービスの設定に応じて空欄または入力します。 + - その他はデフォルトのままにします。 +5. 詳細設定(任意):詳細は[Sinkの機能](./data-bridges.md#features-of-sink)を参照してください。 +6. **Create**をクリックする前に、**Test Connectivity**をクリックしてコネクターがRocketMQサーバーに接続可能かテストできます。 +7. ページ下部の**Create**ボタンをクリックしてコネクター作成を完了します。ポップアップダイアログで**Back to Connector List**をクリックするか、**Create Rule**をクリックしてSinkを用いたルール作成に進めます。詳細な手順は[メッセージ保存用RocketMQ Sinkのルール作成](#create-a-rule-with-rocketmq-sink-for-message-storage)および[イベント記録用RocketMQ Sinkのルール作成](#create-a-rule-with-rocketmq-sink-for-events-recording)を参照してください。 ## メッセージ保存用RocketMQ Sinkのルール作成 -このセクションでは、ダッシュボードでソースMQTTトピック`t/#`のメッセージを処理し、処理済みデータを設定済みのSink経由でRocketMQトピック`TopicTest`に転送するルールの作成方法を説明します。 +本節では、ソースMQTTトピック`t/#`からのメッセージを処理し、処理済みデータを設定済みSink経由でRocketMQトピック`TopicTest`に転送するルールをダッシュボードで作成する方法を示します。 1. EMQXダッシュボードで**Integration** -> **Rules**をクリックします。 2. ページ右上の**Create**をクリックします。 -3. ルールIDに`my_rule`を入力します。メッセージ保存用ルールのSQL文は以下の通りです。これはトピック`t/#`配下のMQTTメッセージをRocketMQに保存することを意味します。 +3. ルールIDに`my_rule`を入力し、メッセージ保存用のルールとして以下のSQL文を**SQL Editor**に入力します。これはトピック`t/#`配下のMQTTメッセージをRocketMQに保存することを意味します。 注意:独自のSQL文を指定する場合は、Sinkが必要とするすべてのフィールドを`SELECT`句に含めてください。 @@ -175,19 +175,19 @@ Linux環境では、`host.docker.internal`を実際のIPアドレスに変更し ::: tip - 初心者の方は**SQL Examples**や**Enable Test**を使ってSQLルールの学習とテストが可能です。 + 初心者の方は、**SQL Examples**をクリックし、**Enable Test**でSQLルールの学習とテストを行うことを推奨します。 ::: -4. + **Add Action**ボタンをクリックし、ルールでトリガーされるアクションを定義します。このアクションによりEMQXはルールで処理したデータをRocketMQに送信します。 +4. + **Add Action**ボタンをクリックし、ルールがトリガーした際のアクションを定義します。このアクションにより、EMQXはルールで処理したデータをRocketMQに送信します。 -5. **Type of Action**ドロップダウンから`RocketMQ`を選択します。**Action**はデフォルトの`Create Action`のままにします。既存のSinkがあれば選択可能ですが、ここでは新規Sinkを作成します。 +5. **Type of Action**ドロップダウンリストから`RocketMQ`を選択します。**Action**はデフォルトの`Create Action`のままにします。既存のSinkがあれば選択可能ですが、本デモでは新規Sinkを作成します。 -6. Sinkの名前を入力します。英数字の組み合わせで指定してください。 +6. Sink名を入力します。英数字の組み合わせで指定してください。 -7. **Connector**ドロップダウンから先に作成した`my_rocketmq`を選択します。新規コネクターはドロップダウン横のボタンで作成可能です。設定パラメータは[コネクターの作成](#create-a-connector)を参照してください。 +7. **Connector**ドロップダウンから先ほど作成した`my_rocketmq`を選択します。新規コネクターはドロップダウン横のボタンから作成可能です。設定パラメータは[コネクターの作成](#create-a-connector)を参照してください。 -8. **RocketMQ Topic**欄に`TopicTest`を入力します。 +8. **RocketMQ Topic**欄に`TopicTest`と入力します。 9. **Template**はデフォルトで空欄のままにします。 @@ -199,23 +199,23 @@ Linux環境では、`host.docker.internal`を実際のIPアドレスに変更し 10. **Fallback Actions(任意)**:メッセージ配信失敗時の信頼性向上のため、1つ以上のフォールバックアクションを定義できます。詳細は[Fallback Actions](./data-bridges.md#fallback-actions)を参照してください。 -11. **詳細設定(任意)**:[Sinkの機能](./data-bridges.md#features-of-sink)を参照してください。 +11. **詳細設定(任意)**:詳細は[Sinkの機能](./data-bridges.md#features-of-sink)を参照してください。 -12. **Create**をクリックする前に、**Test Connectivity**でSinkがRocketMQサーバーに接続できるか確認できます。 +12. **Create**をクリックする前に、**Test Connectivity**でSinkがRocketMQサーバーに接続可能かテストできます。 -13. **Create**ボタンをクリックし、Sink設定を完了します。新しいSinkが**Action Outputs**に追加されます。 +13. **Create**をクリックし、Sink設定を完了します。新しいSinkが**Action Outputs**に追加されます。 -14. **Create Rule**ページに戻り、設定内容を確認後、**Create**ボタンをクリックしてルールを生成します。 +14. **Create Rule**ページに戻り、設定内容を確認後、**Create**をクリックしてルールを生成します。 -これでRocketMQ Sink用のルール作成が完了しました。**Integration** -> **Rules**ページで新規作成したルールを確認できます。**Actions(Sink)**タブをクリックすると新しいRocketMQ Sinkが表示されます。 +これでRocketMQ Sink用のルールが正常に作成されました。**Integration** -> **Rules**ページで新規作成ルールを確認できます。**Actions(Sink)**タブをクリックすると新しいRocketMQ Sinkが表示されます。 -また、**Integration** -> **Flow Designer**でトポロジーを確認すると、トピック`t/#`配下のメッセージがルール`my_rule`で解析され、RocketMQに送信・保存されていることがわかります。 +また、**Integration** -> **Flow Designer**を開くとトポロジーが表示され、トピック`t/#`配下のメッセージがルール`my_rule`で解析され、RocketMQに送信・保存されていることが確認できます。 ## イベント記録用RocketMQ Sinkのルール作成 -このセクションでは、クライアントのオンライン/オフライン状態を記録し、イベントデータを設定済みSink経由でRocketMQトピック`TestTopic`に転送するルールの作成方法を説明します。 +本節では、クライアントのオンライン/オフライン状態を記録し、イベントデータを設定済みSink経由でRocketMQトピック`TestTopic`に転送するルールの作成方法を示します。 -ルール作成手順は[メッセージ保存用RocketMQ Sinkのルール作成](#create-a-rule-with-rocketmq-sink-for-message-storage)とほぼ同様ですが、SQLルールの文法が異なります。 +ルール作成手順は[メッセージ保存用RocketMQ Sinkのルール作成](#create-a-rule-with-rocketmq-sink-for-message-storage)とほぼ同様ですが、SQLルール文が異なります。 オンライン/オフライン状態記録用のSQLルール文は以下の通りです: @@ -228,7 +228,7 @@ FROM ::: tip -便宜上、オンライン/オフラインイベントの受信用に`TopicTest`トピックを再利用します。 +便宜上、オンライン/オフラインイベントの受け取りに`TopicTest`トピックを再利用します。 ::: @@ -244,7 +244,7 @@ Sinkの稼働状況を確認すると、新規の受信メッセージと送信 データが`TopicTest`トピックに転送されているか確認してください。 -以下のようなデータがコンシューマーに表示されます。 +以下のようなデータがコンシューマーにより出力されます。 ```bash ConsumeMessageThread_please_rename_unique_group_name_4_1 Receive New Messages: [MessageExt [brokerName=broker-a, queueId=3, storeSize=581, queueOffset=0, sysFlag=0, bornTimestamp=1679037578889, bornHost=/172.26.83.106:43920, storeTimestamp=1679037578891, storeHost=/172.26.83.106:10911, msgId=AC1A536A00002A9F000000000000060E, commitLogOffset=1550, bodyCRC=7414108, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=8, CONSUME_START_TIME=1679037605342, CLUSTER=DefaultCluster}, body=[...], transactionId='null'}]] diff --git a/ja_JP/data-integration/rule-sql-builtin-functions.md b/ja_JP/data-integration/rule-sql-builtin-functions.md index 49dea3120..67839c17f 100644 --- a/ja_JP/data-integration/rule-sql-builtin-functions.md +++ b/ja_JP/data-integration/rule-sql-builtin-functions.md @@ -18,20 +18,20 @@ - [システム関数](#system-function) - [条件関数](#conditional-functions) -本節では、すべての関数宣言は以下の形式に準拠しています: +本節の関数宣言はすべて以下の形式に準拠しています: ```bash FuncName(Arg 1: Type 1 | ..., ...) -> Type 1 | ... ``` -例えば、`abs(X: integer | float) -> integer | float` は、引数 `X` のデータ型が整数または浮動小数点数であり、戻り値の型もそれに対応することを意味します。 +例えば、`abs(X: integer | float) -> integer | float` は、引数 `X` のデータ型が整数または浮動小数点数であり、戻り値の型もそれに対応して整数または浮動小数点数であることを意味します。 -指定された引数が範囲外であったり、サポートされていないデータ型を使用した場合、現在のSQL実行は失敗し、失敗回数が1増加しますのでご注意ください。 +引数が指定範囲外であったり、サポートされていないデータ型の場合は、現在のSQL実行が失敗し、失敗回数が1増加しますのでご注意ください。 :::tip -1. 一部のエスケープシーケンスは使用時にアンエスケープが必要です。詳細は [unescape関数](#unescapestring-string---string) を参照してください。 -2. EMQX 5.0以降、複雑なデータ変換に [jq構文](https://stedolan.github.io/jq/manual/) を利用可能です。詳細は [jq関数](./rule-sql-jq.md) をご覧ください。 +1. 一部のエスケープシーケンスは使用時にアンエスケープが必要です。詳細は[unescape関数](#unescapestring-string---string)をご覧ください。 +2. EMQX 5.0以降では、複雑なデータ変換に[jq構文](https://stedolan.github.io/jq/manual/)も利用可能です。詳細は[jq関数](./rule-sql-jq.md)をご参照ください。 ::: @@ -41,7 +41,7 @@ EMQXは幅広い数学関数をサポートしています: - 三角関数および双曲線関数:sin, cos, tan, asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh - 数値関数:abs, ceil, floor, round, sqrt, fmod -- 指数関数および対数関数:exp, power, log, log10, log2 +- 指数・対数関数:exp, power, log, log10, log2 ### abs(X: integer | float) -> integer | float @@ -54,7 +54,7 @@ abs(-1.2) = 1.2 ### acos(X: integer | float) -> float -`X` のアークコサイン(ラジアン単位)を返します。`X` の範囲は `[-1, 1]` です。例: +`X` のアークコサインをラジアンで返します。`X` の範囲は `[-1, 1]` です。例: ```bash acos(0.5) = 1.0471975511965976 @@ -62,7 +62,7 @@ acos(0.5) = 1.0471975511965976 ### acosh(X: integer | float) -> float -`X` の双曲線アークコサイン(ラジアン単位)を返します。`X` は1以上でなければなりません。例: +`X` の双曲線アークコサインをラジアンで返します。`X` は1以上でなければなりません。例: ```bash acosh(1.5) = 0.9624236501192069 @@ -70,7 +70,7 @@ acosh(1.5) = 0.9624236501192069 ### asin(X: integer | float) -> float -`X` のアークサイン(ラジアン単位)を返します。`X` の範囲は `[-1, 1]` です。例: +`X` のアークサインをラジアンで返します。`X` の範囲は `[-1, 1]` です。例: ```bash asin(0.5) = 0.5235987755982988 @@ -86,7 +86,7 @@ asinh(0.5) = 0.48121182505960347 ### atan(X: integer | float) -> float -`X` のアークタンジェント(ラジアン単位)を返します。例: +`X` のアークタンジェントをラジアンで返します。例: ```bash atan(0.5) = 0.46364760900080615 @@ -110,7 +110,7 @@ ceil(0.8) = 1 ### cos(X: integer | float) -> float -角度 `X`(ラジアン単位)のコサインを返します。例: +角度 `X`(ラジアン)のコサインを返します。例: ```bash cos(0.5) = 0.8775825618903728 @@ -126,7 +126,7 @@ cosh(0.5) = 1.1276259652063807 ### exp(X: integer | float) -> float -自然対数の底 `e` の `X` 乗を返します。例: +自然対数の底 e の `X` 乗を返します。例: ```bash exp(1) = 2.718281828459045 @@ -158,7 +158,7 @@ log(7.38905609893065) = 2.0 ### log10(X: integer | float) -> float -`X` の底10の対数を返します。`X` は0より大きい必要があります。例: +`X` の常用対数(底10)を返します。`X` は0より大きい必要があります。例: ```bash log10(100) = 2.0 @@ -199,7 +199,7 @@ random() = 0.5400050092601868 ### sin(X: integer | float) -> float -角度 `X`(ラジアン単位)のサインを返します。例: +角度 `X`(ラジアン)のサインを返します。例: ```bash sin(0.5) = 0.479425538604203 @@ -223,7 +223,7 @@ sqrt(9) = 3.0 ### tan(X: integer | float) -> float -角度 `X`(ラジアン単位)のタンジェントを返します。例: +角度 `X`(ラジアン)のタンジェントを返します。例: ```bash tan(0.5) = 0.5463024898437905 @@ -239,7 +239,7 @@ tanh(0.5) = 0.46211715726000974 ## データ型判定関数 -指定したフィールドのデータ型を判定し、指定したデータ型に合致するかどうかを真偽値で返します。 +指定したフィールドのデータ型を判定し、指定の型に合致するかどうかを真偽値で返します。 ### is_array(Term: any) -> boolean @@ -292,8 +292,7 @@ is_map(json_decode('[{"value": 1}]')) = false ### is_null(Term: any) -> boolean -変数 `Term` が未定義か判定します。 -この関数は変数に値が割り当てられているかを判定するために使い、値がJSONの `null` であっても未定義とはみなしません。 +変数 `Term` が未定義か判定します。値がJSONの `null` であっても割り当て済みとみなされます。 例: @@ -315,7 +314,7 @@ is_null_var(map_get('b', json_decode('{"b": null}'))) = true ### is_not_null_var(Term: any) -> boolean -`is_null_var` の逆で、変数 `Term` が定義されておりかつ `null` でないか判定します。 +`is_null_var` の逆で、変数 `Term` が定義済みかつ `null` でないか判定します。 ### is_num(Term: any) -> boolean @@ -338,7 +337,7 @@ is_str(123) = false ### is_empty(Array or Map) -> boolean -配列またはマップが空か判定します。例: +`Array` または `Map` が空か判定します。例: ```bash is_empty(json_decode('{}')) = true @@ -352,7 +351,7 @@ is_empty(map_get('key', '{"key" : [1}')) = false ### bool(Term: boolean | integer | string) -> boolean -`Term` をブール型に変換します。`Term` はブール型、整数型の0または1、文字列型のtrueまたはfalseのみ許容されます。 +`Term` をブール型に変換します。`Term` はブール型、0または1の整数型、または文字列型で `true` または `false` のみ許容されます。 例: @@ -362,7 +361,7 @@ bool(true) = true bool(0) = false bool('false') = false -# 誤り例 +# 誤った例 bool(20) bool('True') ``` @@ -371,7 +370,7 @@ bool('True') `Term` を浮動小数点数に変換します。 -`Term` が文字列の場合、科学的記数法が利用可能です(例:`float('3.14e4')`)。浮動小数点数は最大16桁の有効数字をサポートします。文字列で表現された浮動小数点数の有効数字が16桁を超える場合、変換時に丸め誤差が発生する可能性があります。 +`Term` が文字列の場合、指数表記も使用可能です(例:`float('3.14e4')`)。浮動小数点数は最大16桁の有効数字をサポートします。文字列 `Term` が表す浮動小数点数の有効数字が16桁を超える場合、変換時に丸め誤差が発生する可能性があります。 例: @@ -391,7 +390,7 @@ float('0.12345678901234567') = 0.12345678901234566 ### float(Term: float | integer | string, Decimals: integer) -> float -`Term` を小数点以下最大 `Decimals` 桁の浮動小数点数に変換します。`Decimals` の範囲は `(0, 253]` です。その他の動作は `float/1` と同様です。例: +`Term` を小数点以下最大 `Decimals` 桁の浮動小数点数に変換します。`Decimals` の範囲は `(0, 253]` です。その他の挙動は `float/1` と同じです。例: ```bash float('3.1415926', 3) = 3.142 @@ -400,9 +399,9 @@ float('0.000012345', 5) = 0.00001 ### float2str(Float: float, Decimals: integer) -> string -浮動小数点数 `Float` を文字列に変換します。小数点以下最大 `Decimals` 桁まで含み、末尾のゼロは切り捨てられます。`Decimals` の範囲は `[0, 253]` です。`Float` の有効数字が16桁を超える場合、変換時に丸め誤差が発生する可能性があります。 +浮動小数点数 `Float` を文字列に変換します。小数点以下最大 `Decimals` 桁まで表示し、末尾のゼロは切り捨てます。`Decimals` の範囲は `[0, 253]` です。`Float` の有効数字が16桁を超える場合、変換時に丸め誤差が発生する可能性があります。 -浮動小数点数はコンピュータ上で正確に保存できないため、`Decimals` が `Float` の小数点以下の桁数(先行ゼロ含む)を超える場合、`float2str` は `Float` の2進近似値の10進表現を返すことがあります。 +浮動小数点数はコンピューター上で正確に保存できないため、`Decimals` が `Float` の小数点以下桁数(先行ゼロ含む)より大きい場合、`float2str` は `Float` の2進近似の10進表現を返すことがあります。 例: @@ -424,9 +423,9 @@ float2str(123456789.01234566, 8) = '123456789.01234566' `Term` を整数に変換します。 -- `Term` がブール型の場合、trueは1、falseは0に変換されます。 +- `Term` がブール型の場合、`true` は1、`false` は0に変換されます。 - `Term` が浮動小数点型の場合、`Term` 以下の最大の整数に切り捨てられます。 -- `Term` が文字列の場合、少なくとも1つの数字を含み、先頭に `+` または `-` の1文字の接頭辞が付くことができ、先行ゼロは無視されます。数学的表記もサポートします。 +- `Term` が文字列の場合、少なくとも1つの数字を含み、先頭に `+` または `-` の単一文字の接頭辞を持つことができ、先行ゼロは無視されます。数学的表記もサポートされます。 - `Term` が整数の場合、そのまま返されます。 例: @@ -442,7 +441,7 @@ int('0010') = 10 int('3.1415e2') = 314 int(substr('Number 100', 7)) = 100 -# 誤り例 +# 誤った例 int('-100+200') int('Number 100') ``` @@ -451,8 +450,9 @@ int('Number 100') 任意の型の `Term` を文字列に変換します。 -- `Term` がマップまたは配列の場合、`str` 関数は `Term` をJSONエンコードしようとします。 -- `Term` が浮動小数点数の場合、末尾のゼロを切り捨てた対応する文字列を返します。戻り値の文字列は小数点以下最大10桁まで保持します。より多くの小数桁を返すには `float2str` 関数を使用してください。 +`Term` がマップまたは配列の場合、`str` 関数は `Term` をJSONエンコードしようとします。 + +`Term` が浮動小数点数の場合、末尾のゼロを切り捨てた対応する文字列を返します。返される文字列は小数点以下最大10桁まで保持します。より多くの小数桁を返すには `float2str` 関数を使用してください。 例: @@ -463,11 +463,12 @@ str(json_decode({"msg": "hello"})) = '{"msg":"hello"}' str(json_decode('[{"msg": "hello"}]')) = '[{"msg":"hello"}]' # 末尾のゼロは切り捨てられます -# 小数点以下最大10桁を保持 +# 小数点以下最大10桁まで保持 str(0.30000000040) = '0.3000000004' str(0.30000000004) = '0.3' # 小数点以下10桁で丸められます +# 10桁目以降で丸め str(3.14159265359) = '3.1415926536' str(0.000000314159265359) = '0.0000003142' ``` @@ -476,7 +477,7 @@ str(0.000000314159265359) = '0.0000003142' 任意の `Term` をUTF-8エンコードされた文字列に変換します。 -動作は `str(Any)` と同一です。 +その他の挙動は `str(Any)` と同じです。 ```bash str_utf8(100) = '100' @@ -485,28 +486,29 @@ str_utf8(json_decode({"msg": "hello"})) = '{"msg":"hello"}' str_utf8(json_decode('[{"msg": "hello"}]')) = '[{"msg":"hello"}]' # 末尾のゼロは切り捨てられます -# 小数点以下最大10桁を保持 +# 小数点以下最大10桁まで保持 str_utf8(0.30000000040) = '0.3000000004' str_utf8(0.30000000004) = '0.3' # 小数点以下10桁で丸められます +# 10桁目以降で丸め str_utf8(3.14159265359) = '3.1415926536' str_utf8(0.000000314159265359) = '0.0000003142' ``` ### str_utf16_le(Term: any) -> binary -任意の `Term` をUTF-16リトルエンディアンでエンコードされたバイナリ文字列に変換します。 +任意の `Term` をUTF-16リトルエンディアンエンコードされたバイナリ文字列に変換します。 ::: tip -UTF-16リトルエンディアンエンコード文字列はJSONオブジェクト内で正しく表示されない場合があります。EMQXでは通常バイナリデータとして扱われます。可読な16進文字列に変換するには `bin2hexstr` 関数を使用してください。 -このエンコードはMicrosoft SQL Serverなど、リトルエンディアンUTF-16を利用するシステムで一般的に使用されます。 +UTF-16リトルエンディアンエンコード文字列はJSONオブジェクト内で正しく表示されない場合があります。EMQXでは通常バイナリデータとして扱われます。16進数文字列の可読文字列に変換するには `bin2hexstr` 関数を使用してください。 +このエンコードはMicrosoft SQL Serverなど、リトルエンディアンUTF-16を使用するシステムで一般的に用いられます。 ::: ```bash -# Unicodeの 'h' の例: +# Unicodeの `h`: # | h(\u68) | # | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | (ビッグエンディアン) # | 0x00 | 0x68 | @@ -519,11 +521,11 @@ bin2hexstr(str_utf16_le('hello')) = '680065006C006C006F00' ## 文字列操作関数 -文字列の大文字・小文字変換、空白削除、部分文字列抽出、置換、エスケープ・アンエスケープなどに利用できます。 +文字列の大文字小文字変換、空白除去、部分文字列抽出、置換、エスケープ/アンエスケープなどに利用できます。 ### ascii(Char: string) -> integer -文字 `Char` のASCIIコードを返します。`Char` に複数文字が含まれる場合、最初の1文字のコードのみ返します。例: +文字 `Char` のASCIIコードを返します。複数文字の場合は最初の文字のコードのみ返します。例: ```bash ascii('a') = 97 @@ -540,7 +542,7 @@ concat('Name:', 'John') = 'Name:John' ### find(String: string, SearchPattern: string) -> string -`String` 内で部分文字列 `SearchPattern` を検索し、`SearchPattern` より前の部分を削除して残りを返します。`SearchPattern` が見つからない場合は空文字列を返します。`find(String, SearchPattern, 'leading')` と同等です。 +`String` 内で部分文字列 `SearchPattern` を検索し、`SearchPattern` より前の部分を削除して残りを返します。`SearchPattern` が見つからなければ空文字列を返します。この関数は `find(String, SearchPattern, 'leading')` と同等です。 例: @@ -551,9 +553,7 @@ find('..., Value: 1.2', 'Data') = '' ### find(String: string, SearchPattern: string, Direction: string) -> string -`find/2` と同様ですが、`Direction` で検索方向を指定できます。 - -例: +`find/2` と同様ですが、`Direction` で検索方向を指定できます。例: ```bash find('Front, Middle, End', ', ', 'leading') = ', Middle, End' @@ -562,7 +562,7 @@ find('Front, Middle, End', ', ', 'trailing') = ', End' ### join_to_string(Sep: string, Array: array) -> string -配列 `Array` の要素を区切り文字 `Sep` で連結して1つの文字列にします。例: +`Array` の要素を区切り文字 `Sep` で連結して1つの文字列にします。例: ```bash join_to_string(', ', ['a', 'b', 'c']) = 'a, b, c' @@ -578,7 +578,7 @@ lower('Hello') = 'hello' ### ltrim(String: string) -> string -`trim/1` と同様ですが、文字列の先頭の空白文字のみを削除します。例: +`trim/1` と同様ですが、先頭の空白文字のみ削除します。例: ```bash ltrim('\t hello \n') = 'hello \n' @@ -587,7 +587,7 @@ ltrim('\t hello \r\n') = 'hello \r\n' ### pad(String: string, Length: integer) -> string -`String` の末尾に空白を追加して指定長さ `Length` にパディングします。例: +`String` を指定長さ `Length` になるよう末尾にスペースでパディングします。例: ```bash pad('hello', 8) = 'hello ' @@ -595,9 +595,9 @@ pad('hello', 8) = 'hello ' ### pad(String: string, Length: integer, Direction: string) -> string -`pad/2` と同様ですが、`Direction` でパディング方向を指定できます。 -`leading` は先頭に空白を埋め、`trailing` は末尾に空白を埋め、`both` は両端に空白を埋めます。 -`both` 指定時、埋める空白数が奇数の場合は末尾に多く埋めます。 +`pad/2` と同様ですが、`Direction` でパディング方向を指定できます。`leading` は先頭、`trailing` は末尾、`both` は両端にスペースを埋めます。 + +`both` 指定時、埋めるスペース数が奇数の場合は末尾に多く埋めます。 例: @@ -611,7 +611,7 @@ pad('hello', 8, 'both') = ' hello ' `pad/3` と同様ですが、指定したグラフェムクラスタ `Char` でパディングします。 -ルールエンジンは `Char` が合法なグラフェムクラスタかをチェックしないため、`Char` が複数文字でも1文字分として扱われます。例: +ルールエンジンは `Char` が合法なグラフェムクラスタか検証しないため、`Char` の文字数に関わらず1文字分として扱います。例: ```bash pad('hello', 8, 'trailing', '!') = 'hello!!!' @@ -630,7 +630,7 @@ regex_match('a23', '^\d+$') = false ### regex_replace(String: string, Expression: string, Replacement: string) -> string -文字列 `String` の正規表現 `Expression` にマッチする部分を `Replacement` に置換します。マッチがなければ元の文字列を返します。例: +文字列 `String` の正規表現 `Expression` にマッチする部分を `Replacement` に置換します。マッチしない場合は元の文字列を返します。例: ```bash regex_replace('hello 123', '\d+', 'world') = 'hello world' @@ -645,7 +645,9 @@ regex_replace('a;b; c', ';\s*', ',') = 'a,b,c' ::: -正規表現のキャプチャグループを用いて文字列から部分抽出を行います。完全一致部分は除き、キャプチャされたグループのリストを返します。マッチしない場合やグループがない場合は空リストを返します。 +正規表現のキャプチャグループを用いて、文字列から部分文字列を非グローバルに検索・抽出します。完全一致部分は除外されます。 + +マッチがあればキャプチャされたすべてのグループのリストを返し、マッチなしまたはキャプチャなしの場合は空リストを返します。 例: @@ -658,7 +660,7 @@ regex_extract('Date: 2021-05-20', '(\d{4})-(\d{2})-(\d{2})') -> ['2021', '05', ' ### replace(String: string, SearchPattern: string, Replacement: string) -> string -文字列 `String` のすべての `SearchPattern` を `Replacement` に置換します。例: +`String` 内のすべての `SearchPattern` を `Replacement` に置換します。例: ```bash replace('ab..cd..ef', '..', '**') = 'ab**cd**ef' @@ -671,9 +673,9 @@ replace('ab..cd..ef', '..', '') = 'abcdef' `Where` の値は以下の通りです: -- `all`: すべての `SearchPattern` を置換(`replace/3` と同等) -- `leading`: 先頭の `SearchPattern` のみ置換 -- `trailing`: 末尾の `SearchPattern` のみ置換 +- `all`: すべて置換(`replace/3` と同等) +- `leading`: 先頭の1回のみ置換 +- `trailing`: 末尾の1回のみ置換 例: @@ -693,7 +695,7 @@ reverse('hello') = 'olleh' ### rm_prefix(String: string, Prefix: string) -> string -文字列 `String` の先頭にある `Prefix` を削除します。`String` が `Prefix` で始まらない場合は元の文字列を返します。例: +文字列 `String` の先頭から `Prefix` を削除します。`String` が `Prefix` で始まらない場合は元の文字列を返します。例: ```bash rm_prefix('foo/bar', 'foo/') = 'bar' @@ -702,7 +704,7 @@ rm_prefix('foo/bar', 'xxx/') = 'foo/bar' ### rtrim(String: string) -> string -`trim/1` と同様ですが、文字列の末尾の空白文字のみを削除します。例: +`trim/1` と同様ですが、末尾の空白文字のみ削除します。例: ```bash rtrim('\t hello \n') = '\t hello' @@ -713,9 +715,9 @@ rtrim('\t hello \r\n') = '\t hello' `String` を区切り文字 `Separator` で分割し、部分文字列の配列を返します。 -2つ以上の連続した区切り文字は1つとして扱われません。`split/2` は出力結果のトリムと空文字列の除外をデフォルトで行います。空文字列を残したい場合は `split(String, Separator, 'notrim')` を使用してください。 +連続する複数の区切り文字は1つとして扱われません。そのため空文字列が結果に含まれる場合があります。`split/2` はデフォルトで結果のトリムと空文字列の除去を行います。空文字列を残したい場合は `split(String, Separator, 'notrim')` を使用してください。 -`Separator` は複数文字でも構いませんが、全体として扱われます。複数の区切り文字を同時に指定したい場合は `tokens` 関数を使用してください。 +`Separator` は複数文字でも構い、全体で1つの区切り文字として扱われます。複数の区切り文字を同時に指定したい場合は `tokens` 関数を使用してください。 例: @@ -724,18 +726,18 @@ split('a;', ';') = ['a'] split('a;b;c', ';') = ['a', 'b', 'c'] split('a;;b;;c', ';') = ['a', 'b', 'c'] -# Howell Wise の前の空白に注意 +# Howell Wise の前のスペースに注意 split('Sienna Blake; Howell Wise', ';') = ['Sienna Blake', ' Howell Wise'] split('Sienna Blake; Howell Wise', '; ') = ['Sienna Blake', 'Howell Wise'] ``` ### split(String: string, Separator: string, Option: string) -> array -`split/2` と同様ですが、`Option` で処理する区切り文字の位置や空文字列の返却有無を指定できます。 +`split/2` と同様ですが、`Option` で区切り文字の処理位置や空文字列の返却有無を指定できます。 `Option` の値は以下の通りです: -- `notrim`: 文字列内のすべての区切り文字を処理し、空文字列を含む可能性あり +- `notrim`: 文字列中のすべての区切り文字を処理し、空文字列を含む可能性あり - `leading`: 先頭の区切り文字のみ処理し、空文字列は含まない - `leading_notrim`: 先頭の区切り文字のみ処理し、空文字列を含む可能性あり - `trailing`: 末尾の区切り文字のみ処理し、空文字列は含まない @@ -753,11 +755,11 @@ split('a;b;c;', ';', 'trailing_notrim') = ['a;b;c', ''] ### sprintf(Format, ...) -> string -`Format` に従ってフォーマットされた文字列を返します。`Format` 文字列は通常の文字とフォーマット用制御シーケンスを含みます。 +`Format` に従いフォーマットされた文字列を返します。`Format` 文字列は通常文字とフォーマット制御シーケンスを含みます。 -制御シーケンスの形式は一般的に `~F.P.PadModC` です。 +制御シーケンスの形式は一般に `~F.P.PadModC` です。 -`C` は制御シーケンスの種類を示し必須です。`F`, `P`, `Pad`, `Mod` は任意です。詳細は https://www.erlang.org/doc/man/io.html#fwrite-1 を参照してください。 +`C` は制御シーケンスの型を決定し必須です。`F`, `P`, `Pad`, `Mod` は任意です。詳細は https://www.erlang.org/doc/man/io.html#fwrite-1 を参照してください。 例: @@ -768,7 +770,7 @@ sprintf('count: ~p~n', 100) = 'count: 100\n' ### strlen(String: string) -> integer -文字列 `String` の長さを返します。例: +`String` の長さを返します。例: ```bash strlen('hello') = 5 @@ -777,7 +779,7 @@ strlen('hello\n') = 6 ### substr(String: string, Start: integer) -> string -文字列 `String` の位置 `Start` から末尾までの部分文字列を返します。文字列の添字は0始まりです。例: +`String` の `Start` 位置から末尾までの部分文字列を返します。文字列の添字は0始まりです。例: ```bash substr('hello', 0) = 'hello' @@ -786,7 +788,7 @@ substr('hello world', 6) = 'world' ### substr(String: string, Start: integer, Length: integer) -> string -文字列 `String` の位置 `Start` から最大長 `Length` の部分文字列を返します。添字は0始まりです。例: +`String` の `Start` 位置から最大 `Length` 文字の部分文字列を返します。添字は0始まりです。例: ```bash substr('hello world!', 6, 5) = 'world' @@ -796,7 +798,7 @@ substr('hello world!', 6, 5) = 'world' `String` を `SeparatorList` に含まれる文字で分割し、部分文字列のリストを返します。 -2つ以上の連続した区切り文字は1つとして扱われ、空文字列は発生しません。 +連続する区切り文字は1つとして扱われ、空文字列は発生しません。 例: @@ -815,7 +817,7 @@ tokens('a\rb\nc\r\nd', ';', 'nocrlf') = ['a', 'b', 'c', 'd'] ### trim(String: string) -> string -文字列 `String` の先頭と末尾から空白文字(スペース、タブ、改ページ、改行など)を削除します。`\r\n` はUnicodeのグラフェムクラスタとして扱われるため、まとめて削除されます。例: +`String` の先頭と末尾から空白文字(スペース、タブ、フォームフィード、改行など)を削除します。`\r\n` はUnicodeのグラフェムクラスタとしてまとめて削除されます。例: ```bash trim('\t hello \n') = 'hello' @@ -824,7 +826,7 @@ trim('\t hello \r\n') = 'hello' ### unescape(String: string) -> string -エスケープシーケンスを元の文字に戻します。SQL内でエスケープシーケンスを使う場合は、この関数でアンエスケープしてから処理してください。 +エスケープシーケンスを元の文字に戻します。SQL内でエスケープシーケンスを使用する場合は、この関数でアンエスケープしてから処理してください。 ::: tip @@ -847,7 +849,7 @@ my-device SELECT split(payload, '\n') as device_info FROM 't/#' ``` -出力結果: +出力: ```json { @@ -857,13 +859,13 @@ SELECT split(payload, '\n') as device_info FROM 't/#' } ``` -`unescape` 関数で `\n` をアンエスケープすると期待通りの結果が得られます: +`unescape` 関数でアンエスケープすると期待通りの結果が得られます: ```sql SELECT split(payload, unescape('\n')) as device_info FROM 't/#' ``` -出力結果: +出力: ```json { @@ -884,7 +886,7 @@ SELECT split(payload, unescape('\n')) as device_info FROM 't/#' - `\t`:水平タブ(HT) - `\r`:復帰(CR) - `\b`:バックスペース(BS) - - `\f`:改ページ(FF) + - `\f`:フォームフィード(FF) - `\v`:垂直タブ(VT) - `\'`:シングルクォート(') - `\"`:ダブルクォート(") @@ -894,13 +896,13 @@ SELECT split(payload, unescape('\n')) as device_info FROM 't/#' - 16進エスケープコード: - - `\xH...`:`H...` は1文字以上の16進数(0-9, A-F, a-f)で、任意のUTF-32文字をエンコード可能。 + - `\xH...`:`H...` は1つ以上の16進数(0-9, A-F, a-f)で任意のutf32文字をエンコード可能 -認識できないエスケープシーケンスや無効なUnicode文字の場合は例外が発生します。 +認識されないエスケープシーケンスや無効なUnicode文字の場合は例外をスローします。 ### upper(String: string) -> string -文字列 `String` の小文字を大文字に変換します。例: +`String` の小文字を大文字に変換します。例: ```bash upper('hello') = 'Hello' @@ -910,7 +912,7 @@ upper('hello') = 'Hello' ### map_get(Key: string, Map: map) -> any -`Map` の指定した `Key` の値を返します。`Key` が存在しない場合は `undefined` を返します。例: +`Map` の指定した `Key` の値を返します。`Key` が存在しなければ `undefined` を返します。例: ```bash map_get('msg', json_decode('{"msg": "hello"}')) = 'hello' @@ -928,7 +930,7 @@ map_get('value', json_decode('{"data": [1.2, 1.3]}'), []) = [] ### map_keys(Map: map) -> array -`Map` のすべてのキーの配列を返します。例: +`Map` のすべてのキーを配列で返します。例: ```bash map_keys(json_decode('{"a": 1, "b": 2}')) = ['a', 'b'] @@ -936,7 +938,7 @@ map_keys(json_decode('{"a": 1, "b": 2}')) = ['a', 'b'] ### map_put(Key: string, Value: any, Map: map) -> map -`Map` に `Key` と対応する `Value` を挿入し、更新されたマップを返します。`Key` が既に存在する場合は値を上書きします。例: +`Map` に `Key` と対応する `Value` を挿入し、更新済みのマップを返します。`Key` が既に存在する場合は値を上書きします。例: ```bash map_get('b', map_put('b', 1, json_decode('{"a": 1}'))) = 1 @@ -953,9 +955,9 @@ map_get('a', map_put('a', 2, json_decode('{"a": 1}'))) = 2 マップをRedisの `HSET`(または `HMSET`)コマンド用のフィールド名と値のリストに変換します。 -例:`SELECT map_to_redis_hset_args(payload.value) as hset_fields FROM t/1` のように使用し、`hset_fields` をRedisアクションのテンプレート `HMSET name1 ${hset_fields}` に組み込みます。 +例:`SELECT map_to_redis_hset_args(payload.value) as hset_fields FROM t/1` のように使用し、Redisアクションのテンプレートで `HMSET name1 ${hset_fields}` の形で利用します。 -例えば、`payload.value` が `{"a" : 1, "b": 2}` の場合、コマンドは `HMSET name1 b 2 a 1` のようになります。マップのフィールド順序は非決定的です。 +例えば、`payload.value` が `{"a" : 1, "b": 2}` の場合、生成されるコマンドは `HMSET name1 b 2 a 1` となります。マップのフィールド順序は非決定的です。 ### map_to_entries(Map: map) -> array @@ -967,7 +969,7 @@ map_to_entries(json_decode('{"a": 1, "b": 2}')) = [{"key": "a", "value": 1},{"ke ### map_values(Map: map) -> array -`Map` のすべての値の配列を返します。例: +`Map` のすべての値を配列で返します。例: ```bash map_values(json_decode('{"a": 1, "b": 2}')) = [1, 2] @@ -975,7 +977,7 @@ map_values(json_decode('{"a": 1, "b": 2}')) = [1, 2] ### mget(Key: string | array, Map: map) -> any -`Map` の指定した `Key` の値を返します。`Key` が存在しない場合は `undefined` を返します。配列で複数キーを指定すると、ネストしたマップから対応する値を取得します。例: +`Map` の指定した `Key` の値を返します。`Key` が存在しなければ `undefined` を返します。配列で複数キーを指定するとネストしたマップから値を取得できます。例: ```bash mget('c', json_decode('{"a": {"b": 1}}')) = undefined @@ -985,7 +987,7 @@ mget(['a', 'b'], json_decode('{"a": {"b": 1}}')) = 1 ### mput(Key: string | array, Value: any, Map: map) -> map -`Map` に `Key` と対応する `Value` を挿入し、更新されたマップを返します。`Key` が既に存在する場合は値を上書きします。配列で複数キーを指定すると、ネストしたマップにデータを挿入します。例: +`Map` に `Key` と対応する `Value` を挿入し、更新済みのマップを返します。`Key` が既に存在する場合は値を上書きします。配列で複数キーを指定するとネストしたマップに挿入できます。例: ```bash mget(['a', 'b'], mput(['a', 'b'], 2, json_decode('{"a": {"b": 1}}'))) = 2 @@ -994,7 +996,7 @@ mget(['a', 'b'], mput(['a', 'b'], 2, json_decode('{"c": 1}'))) = 2 ### map_size(Map: map) -> any -`Map` のキーの数を返します。例: +`Map` のキー数を返します。例: ```bash map_size(json_decode('{}')) = 0 @@ -1023,7 +1025,7 @@ contains(json_decode('{"a": 1}'), [json_decode('{"a": 1}'), json_decode('{"b": 2 # 正しい例 first(['John', 'David']) = 'John' -# 誤り例 +# 誤った例 first([]) ``` @@ -1035,7 +1037,7 @@ first([]) # 正しい例 last(['John', 'David']) = 'David' -# 誤り例 +# 誤った例 last([]) ``` @@ -1050,20 +1052,20 @@ length([]) = 0 ### nth(N: integer, Array: array) -> any -配列 `Array` のN番目の要素を返します。`N` は配列の長さを超えてはいけません。例: +配列 `Array` のN番目の要素を返します。`N` は配列長以下でなければなりません。例: ```bash # 正しい例 nth(1, [1,2,3]) = 1 -# 誤り例 +# 誤った例 nth(0, [1,2,3]) nth(4, [1,2,3]) ``` ### sublist(Length: integer, Array: array) -> any -配列 `Array` の先頭から最大長 `Length` の部分配列を返します。`Length` が配列長を超える場合は全配列を返します。例: +配列 `Array` の先頭から最大 `Length` 要素の部分配列を返します。`Length` が配列長を超える場合は全体を返します。例: ```bash sublist(3, [1,2,3,4]) = [1,2,3] @@ -1072,7 +1074,7 @@ sublist(10, [1,2,3,4]) = [1,2,3,4] ### sublist(Start: integer, Length: integer, Array:array) -> any -`sublist/2` と同様ですが、`Start` で返す開始要素を指定できます。`Start` + `Length` が配列長を超える場合は全配列を返します。例: +`sublist/2` と同様ですが、`Start` で開始位置を指定できます。`Start` + `Length` が配列長を超える場合は全体を返します。例: ```bash sublist(2, 10, [1,2,3,4]) = [2,3,4] @@ -1082,7 +1084,7 @@ sublist(2, 10, [1,2,3,4]) = [2,3,4] ### md5(String: string) -> string -任意長の文字列 `String` に対し、128ビット長のMD5ハッシュ値を計算します。ハッシュ値は32桁の16進数文字列で返され、小文字(a〜f)固定です。 +任意長の文字列 `String` の128ビット固定長MD5ハッシュ値を計算します。ハッシュ値は32桁の16進数文字列で返され、小文字(a~f)固定です。 例: @@ -1092,7 +1094,7 @@ md5('hello') = '5d41402abc4b2a76b9719d911017c592' ### sha(String: string) -> string -任意長の文字列 `String` に対し、160ビット長のSHA-1ハッシュ値を計算します。ハッシュ値は40桁の16進数文字列で返され、小文字(a〜f)固定です。 +任意長の文字列 `String` の160ビット固定長SHA-1ハッシュ値を計算します。ハッシュ値は40桁の16進数文字列で返され、小文字(a~f)固定です。 例: @@ -1102,7 +1104,7 @@ sha('hello') = 'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d' ### sha256(String: string) -> string -任意長の文字列 `String` に対し、256ビット長のSHA-2ハッシュ値を計算します。ハッシュ値は64桁の16進数文字列で返され、小文字(a〜f)固定です。 +任意長の文字列 `String` の256ビット固定長SHA-2ハッシュ値を計算します。ハッシュ値は64桁の16進数文字列で返され、小文字(a~f)固定です。 例: @@ -1112,7 +1114,7 @@ sha256('hello') = '2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9 ## 圧縮・解凍関数 -注意:バイナリデータは直接JSONエンコードできません。`bin2hexstr` 関数で16進文字列に変換してください。 +注意:バイナリデータは直接JSONエンコードできないため、16進数文字列に変換するには `bin2hexstr` 関数を使用してください。 ### gunzip(Data: binary) -> binary | string @@ -1166,7 +1168,7 @@ zip_uncompress(hexstr2bin('789CCB48CDC9C90700062C0215')) = 'hello' ### bitand(Num1: integer, Num2: integer) -> integer -`Num1` と `Num2` のビットAND演算結果を返します。入力・出力は符号付き整数です。例: +`Num1` と `Num2` のビットごとのAND演算結果を返します。入力・出力は符号付き整数です。例: ```bash bitand(10, 8) = 8 @@ -1175,7 +1177,7 @@ bitand(-10, -8) = -16 ### bitnot(Num: integer) -> integer -`Num` のビット否定演算結果を返します。入力・出力は符号付き整数です。例: +`Num` のビットごとの否定(NOT)演算結果を返します。入力・出力は符号付き整数です。例: ```bash bitnot(10) = -11 @@ -1184,7 +1186,7 @@ bitnot(-12) = 11 ### bitsl(Num: integer, Shift: integer) -> integer -`Num` を左に `Shift` ビットシフトし、右端を0で埋めます。例: +`Num` をビット単位で左に `Shift` ビットシフトし、右端を0で埋めます。例: ```bash bitsl(8, 2) = 32 @@ -1193,7 +1195,7 @@ bitsl(-8, 2) = -32 ### bitsr(Num: integer, Shift: integer) -> integer -`Num` を右に `Shift` ビットシフトし、左端を符号ビットで埋めます(正数は0、負数は1)。例: +`Num` をビット単位で右に `Shift` ビットシフトし、左端を符号ビットで埋めます(正数は0、負数は1)。例: ```bash bitsr(8, 2) = 2 @@ -1204,7 +1206,7 @@ bitsr(-8, 6) = -1 ### bitor(Num1: integer, Num2: integer) -> integer -`Num1` と `Num2` のビットOR演算結果を返します。例: +`Num1` と `Num2` のビットごとのOR演算結果を返します。例: ```bash bitor(10, 8) = 10 @@ -1213,7 +1215,7 @@ bitor(-10, -8) = -2 ### bitxor(Num1: integer, Num2: integer) -> integer -`Num1` と `Num2` のビットXOR演算結果を返します。例: +`Num1` と `Num2` のビットごとのXOR演算結果を返します。例: ```bash bitxor(10, 8) = 2 @@ -1222,16 +1224,15 @@ bitxor(-10, -8) = 14 ## ビット列操作関数 -ルールエンジンはビット列操作関数を提供します。例えば `subbits` はビット列から指定長のビットを抽出し、指定データ型に変換します。 +ルールエンジンはビット列操作関数を提供します。例えば `subbits` はビット列から指定長のビットを抽出し、指定のデータ型に変換します。 :::tip -`binary` 型はバイト列を表し、各バイトは8ビットで構成されるため、ビット数は8の倍数でなければなりません。 -`bitstring` 型は任意長のビット列を表し、8の倍数でなくてもよいです。 +`binary` 型はバイト列を表し、1バイトは8ビットで、バイト数は8の倍数でなければなりません。`bitstring` 型は任意長のビット列を表します。 -つまり、すべての `binary` は `bitstring` ですが、逆は成り立ちません。 +つまり、すべての `binary` は `bitstring` ですが、逆は必ずしも真ではありません。 -`bitstring` の長さが8の倍数でない場合、JSONなど外部フォーマットに直接シリアライズできません。通常は整数など適切な型に変換する前の中間値として利用されます。 +`bitstring` は長さが8の倍数でない場合、JSONなど外部形式に直接シリアライズできません。通常は整数などに変換する前の中間値として使われます。 ::: @@ -1289,20 +1290,23 @@ subbits(base64_decode('n05Y'), 9, 4) = 4 ### subbits(Bin: binary, Start: integer, BitNum: integer, OutputType: string, Signedness: string, Endianness: string) -> bitstring | integer | float -バイト列 `Bin` の位置 `Start`(1始まり)から長さ `BitNum` のビットを抽出し、指定したバイト順 `Endianness` と符号属性 `Signedness` に従い、指定型 `OutputType` に変換します。 +バイト列 `Bin` の位置 `Start`(1始まり)から長さ `BitNum` のビットを抽出し、指定したバイト順 `Endianness` と符号属性 `Signedness` に従い、指定の型 `OutputType` に変換します。 + +`OutputType` の値: + +- bits(bitstringの略) +- integer +- float + +`Signedness` の値: -- `OutputType` の可能な値: - - bits(bitstringの略) - - integer - - float +- signed +- unsigned -- `Signedness` の可能な値: - - signed - - unsigned +`Endianness` の値: -- `Endianness` の可能な値: - - big - - little +- big +- little `OutputType` が `float` の場合、`Signedness` は無効です。`OutputType` が `bits` の場合、`Signedness` と `Endianness` は無効です。 @@ -1324,7 +1328,7 @@ subbits(hexstr2bin('9F4E58'), 1, 16, 'float', 'signed', 'big') = -0.007133483886 ### base64_decode(Data: string) -> bytes | string -`Data` をBase64形式からデコードします。例: +`Data` をbase64形式からデコードします。例: ```bash base64_decode('aGVsbG8=') = 'hello' @@ -1333,7 +1337,7 @@ bin2hexstr(base64_decode('y0jN')) = 'CB48CD' ### base64_encode(Data: binary | string) -> string -`Data` をBase64形式にエンコードします。例: +`Data` をbase64形式にエンコードします。例: ```bash base64_encode('hello') = 'aGVsbG8=' @@ -1358,7 +1362,7 @@ json_encode([1,2,3]) = '[1,2,3]' ### bin2hexstr(Data: binary) -> string -バイナリデータを対応する16進文字列に変換します。例: +バイナリデータを対応する16進数文字列に変換します。例: ```bash bin2hexstr(zip('hello')) = 'CB48CDC9C90700' @@ -1366,7 +1370,7 @@ bin2hexstr(zip('hello')) = 'CB48CDC9C90700' ### hexstr2bin(Data: string) -> binary -16進文字列を対応するバイナリデータに変換します。例: +16進数文字列を対応するバイナリデータに変換します。例: ```bash unzip(hexstr2bin('CB48CDC9C90700')) = 'hello' @@ -1374,11 +1378,11 @@ unzip(hexstr2bin('CB48CDC9C90700')) = 'hello' ### sqlserver_bin2hexstr(Data: binary | string) -> string -任意のバイナリデータをMicrosoft SQL Serverのバイナリ型に変換します。`0x` プレフィックス付きのHEXエンコード文字列になります。 +任意のバイナリデータをMicrosoft SQL Serverのバイナリ型に変換します。`0x` プレフィックス付きのHEXエンコード文字列となります。 ::: tip -この関数はMicrosoft SQL Serverの `CONVERT` 関数と組み合わせて、UTF-8非対応のSQL ServerバージョンにUTF-16リトルエンディアンエンコードのUnicode文字列を書き込む際に利用できます。 +この関数はMicrosoft SQL Serverの `CONVERT` 関数と組み合わせて、UTF-8非対応のSQL ServerにUTF-16リトルエンディアンエンコードされたUnicode文字列を書き込む際に利用できます。 ::: @@ -1390,7 +1394,7 @@ sqlserver_bin2hexstr(str_utf16_le('你好')) = '0x604F7D59' ### スキーマレジストリ関数 -EMQXは `schema_encode` と `schema_decode` 関数を使い、指定したスキーマに基づいて [Protobuf (Protocol Buffers)](https://developers.google.com/protocol-buffers) や [Avro](https://avro.apache.org/) のデータをデコード・エンコードできます。詳細は [Schema Registry](./schema-registry.md) を参照してください。 +EMQXは `schema_encode` と `schema_decode` 関数で、指定したスキーマに従い [Protobuf (Protocol Buffers)](https://developers.google.com/protocol-buffers) や [Avro](https://avro.apache.org/) のデコード・エンコードをサポートしています。詳細は[スキーマレジストリ](./schema-registry.md)をご覧ください。 ### schema_encode(SchemaID: string, Data: map) -> binary @@ -1410,7 +1414,7 @@ EMQXは `schema_encode` と `schema_decode` 関数を使い、指定したスキ ### **Sparkplug B関数** -EMQXはSparkplug Bメッセージのデコード・エンコード用の特殊関数(`sparkplug_decode` と `sparkplug_encode`)も備えています。詳細は [Sparkplug B](./sparkplug.md) を参照してください。 +EMQXはSparkplug Bメッセージのデコード・エンコード用に特別な関数(`sparkplug_decode` と `sparkplug_encode`)も備えています。詳細は[Sparkplug B](./sparkplug.md)をご覧ください。 ## 日時変換関数 @@ -1423,19 +1427,19 @@ EMQXはSparkplug Bメッセージのデコード・エンコード用の特殊 `FormatString` で使えるプレースホルダーは以下の通りです: | プレースホルダー | 意味 | 値の範囲 | -| ------ | ---------------------------------- | ----- ---------------- | +| ----------- | ------- | ------------| | `%Y` | 4桁の年 | 0000 - 9999 | | `%m` | 2桁の月 | 01 - 12 | | `%d` | 2桁の日 | 01 - 31 | -| `%H` | 24時間表記の2桁の時 | 00 - 24 | +| `%H` | 24時間制の2桁の時 | 00 - 24 | | `%M` | 2桁の分 | 00 - 59 | | `%S` | 2桁の秒 | 00 - 59 | | `%N` | ナノ秒 | 000000000 - 999999999 | -| `%6N` | マイクロ秒(ナノ秒の最初の6桁) | 000000 - 999999 | -| `%3N` | ミリ秒(ナノ秒の最初の3桁) | 000 - 999 | -| `%z` | タイムゾーンオフセット(±hhmm形式) | -1159 - +1159 | -| `%:z` | タイムゾーンオフセット(±hh:mm形式) | -11:59 - +11:59 | -| `%::z` | タイムゾーンオフセット(±hh:mm:ss形式) | -11:59:59 - +11:59:59 | +| `%6N` | マイクロ秒(ナノ秒の先頭6桁) | 000000 - 999999 | +| `%3N` | ミリ秒(ナノ秒の先頭3桁) | 000 - 999 | +| `%z` | タイムゾーンオフセット(±hhmm) | -1159 - +1159 | +| `%:z` | タイムゾーンオフセット(±hh:mm) | -11:59 - +11:59 | +| `%::z` | タイムゾーンオフセット(±hh:mm:ss) | -11:59:59 - +11:59:59 | 例: @@ -1445,13 +1449,13 @@ date_to_unix_ts('second', '%Y-%m-%d %H:%M:%S%:z', '2024-02-23 15:00:00+08:00') = ### date_to_unix_ts(Unit: string, Offset: string | integer, FormatString: string, DateTimeString: string) -> integer -`DateTimeString` にタイムゾーンオフセットが含まれない場合、`Offset` で手動指定できます。その他の動作は `date_to_unix_ts/3` と同様です。`Offset` は文字列または秒数の整数で指定可能です。 +`DateTimeString` にタイムゾーンオフセットが含まれない場合、`Offset` で手動指定できます。その他の挙動は `date_to_unix_ts/3` と同じです。`Offset` は文字列または秒数を表す整数です。 文字列の場合、以下の形式をサポートします: - `Z` または `z`:UTCオフセット00:00 -- `±hh[:mm][:ss]` または `±hh[mm][ss]`:UTCからの正負の時間オフセット -- `local`:システムのローカルタイムゾーンに対応するオフセット +- `±hh[:mm][:ss]` または `±hh[mm][ss]`:UTCからの正負の時刻オフセット +- `local`:システムのローカルタイムゾーンのオフセット 例: @@ -1465,7 +1469,7 @@ date_to_unix_ts('second', 14400, '%Y-%m-%d %H:%M:%S%:z', '2024-02-23 15:00:00') Unix時間 `Time` を指定フォーマットの日時文字列に変換します。`Unit` はUnix時間の単位、`Offset` は出力日時のタイムゾーンオフセット、`FormatString` は出力フォーマットを表します。 -`date_to_unix_ts/3, 4` を参照し、`Unit`, `Offset`, `FormatString` の値を指定してください。 +`date_to_unix_ts/3,4` と同様の値を指定可能です。 例: @@ -1479,7 +1483,7 @@ format_date('millisecond', 28800, '%Y-%m-%d %H:%M:%S.%3N%:z', 1708933353472) = ' ### now_rfc3339() -> string -現在のシステム時刻を秒単位のRFC3339形式日時文字列で返します。例: +現在時刻を秒単位のRFC3339形式の日時文字列で返します。例: ```bash now_rfc3339() = '2024-02-23T10:26:20+08:00' @@ -1487,7 +1491,7 @@ now_rfc3339() = '2024-02-23T10:26:20+08:00' ### now_rfc3339(Unit: string) -> string -`now_rfc3339/0` と同様ですが、`Unit` で時間単位を指定できます。`second`, `millisecond`, `microsecond`, `nanosecond` をサポートします。例: +`now_rfc3339/0` と同様ですが、`Unit` で時間単位を指定できます。`second`, `millisecond`, `microsecond`, `nanosecond` をサポート。例: ```bash now_rfc3339('microsecond') = '2024-02-23T10:26:38.009706+08:00' @@ -1495,7 +1499,7 @@ now_rfc3339('microsecond') = '2024-02-23T10:26:38.009706+08:00' ### now_timestamp() -> integer -現在のシステム時刻を秒単位のUnixタイムスタンプで返します。例: +現在時刻を秒単位のUnixタイムスタンプで返します。例: ```bash now_timestamp() = 1708913853 @@ -1503,7 +1507,7 @@ now_timestamp() = 1708913853 ### now_timestamp(Unit: string) -> integer -`now_timestamp/0` と同様ですが、`Unit` で時間単位を指定できます。`second`, `millisecond`, `microsecond`, `nanosecond` をサポートします。例: +`now_timestamp/0` と同様ですが、`Unit` で時間単位を指定できます。例: ```bash now_timestamp('microsecond') = 1708913828814315 @@ -1520,7 +1524,7 @@ rfc3339_to_unix_ts('2024-02-23T15:56:30+08:00') = 1708674990 ### rfc3339_to_unix_ts(DateTimeString: string, Unit: string) -> integer -`rfc3339_to_unix_ts/1` と同様ですが、`Unit` で返すUnixタイムスタンプの単位を指定できます。`second`, `millisecond`, `microsecond`, `nanosecond` をサポートします。例: +`rfc3339_to_unix_ts/1` と同様ですが、返却するUnixタイムスタンプの単位を `Unit` で指定できます。例: ```bash rfc3339_to_unix_ts('2024-02-23T15:56:30.87Z', 'second') = 1708703790 @@ -1531,11 +1535,11 @@ rfc3339_to_unix_ts('2024-02-23T15:56:30.535904509Z', 'nanosecond') = 17087037905 ### timezone_to_offset_seconds(Offset: string) -> integer -タイムゾーンオフセット文字列を秒数の整数に変換します。以下の形式をサポートします: +タイムゾーンオフセット文字列を秒数の整数に変換します。サポートされる形式: - `Z` または `z`:UTCオフセット00:00 -- `±hh[:mm][:ss]` または `±hh[mm][ss]`:UTCからの正負の時間オフセット -- `local`:システムのローカルタイムゾーンに対応するオフセット +- `±hh[:mm][:ss]` または `±hh[mm][ss]`:UTCからの正負の時刻オフセット +- `local`:システムのローカルタイムゾーンのオフセット 例: @@ -1547,7 +1551,7 @@ timezone_to_offset_seconds('local') = 28800 ### unix_ts_to_rfc3339(Time: integer) -> string -秒単位のUnixタイムスタンプをシステムのローカルタイムゾーンでRFC3339準拠の日時文字列に変換します。例: +秒単位のUnixタイムスタンプをシステムのローカルタイムゾーンのRFC3339準拠日時文字列に変換します。例: ```bash unix_ts_to_rfc3339(1708671600) = '2024-02-23T15:00:00+08:00' @@ -1555,7 +1559,7 @@ unix_ts_to_rfc3339(1708671600) = '2024-02-23T15:00:00+08:00' ### unix_ts_to_rfc3339(Time: integer, Unit: string) -> string -`unix_ts_to_rfc3339/0` と同様ですが、`Unit` で時間単位を指定できます。`second`, `millisecond`, `microsecond`, `nanosecond` をサポートします。例: +`unix_ts_to_rfc3339/0` と同様ですが、`Unit` で時間単位を指定できます。例: ```bash unix_ts_to_rfc3339(1708671600766, 'millisecond') = '2024-02-23T15:00:00.766+08:00' @@ -1565,7 +1569,7 @@ unix_ts_to_rfc3339(1708671600766, 'millisecond') = '2024-02-23T15:00:00.766+08:0 ### mongo_date() -> [MongoDB ISODate](https://www.mongodb.com/docs/manual/reference/method/Date/) | string -現在時刻をMongoDBのISODate型または文字列で返します。MongoDB関連のアクションやSQLテストでのみサポートされ、SQLテストでは文字列(例:`ISODate("2024-02-23T15:00:00.123Z")`)を返します。文字列以外の戻り値は他の関数の入力としては現在サポートされていません。 +現在時刻をMongoDBのISODate型または文字列で返します。MongoDB関連アクションとSQLテストでのみサポートされ、SQLテストでは文字列(例:`ISODate("2024-02-23T15:00:00.123Z")`)を返します。その他の関数の入力としては文字列以外は現在サポートされていません。 例: @@ -1575,7 +1579,7 @@ mongo_date() = 'ISODate("2024-02-23T15:00:00.123Z")' ### mongo_date(Timestamp: integer) -> [MongoDB ISODate](https://www.mongodb.com/docs/manual/reference/method/Date/) | string -指定したミリ秒単位のUnixタイムスタンプをMongoDBのISODate型または文字列に変換します。その他の動作は `mongo_date/0` と同様です。 +指定したミリ秒単位UnixタイムスタンプをMongoDBのISODate型または文字列に変換します。その他は `mongo_date/0` と同様です。 例: @@ -1585,13 +1589,13 @@ mongo_date(now_timestamp('millisecond')) = 'ISODate(2024-02-23T15:48:57.871Z)' ### mongo_date(Timestamp: integer, Unit: string) -> [MongoDB ISODate](https://www.mongodb.com/docs/manual/reference/method/Date/) | string -指定したUnixタイムスタンプをMongoDBのISODate型または文字列に変換します。`Unit` で入力タイムスタンプの単位を指定できます。その他の動作は `mongo_date/0` と同様です。 +指定したUnixタイムスタンプをMongoDBのISODate型または文字列に変換します。`Unit` でタイムスタンプの単位を指定可能です。その他は `mongo_date/0` と同様です。 -利用可能な `Unit` は: +`Unit` の値: -- `second` -- `millisecond` -- `microsecond` +- `second` +- `millisecond` +- `microsecond` - `nanosecond` 例: @@ -1624,20 +1628,20 @@ uuid_v4_no_hyphen() = 'd7a39aa4195a42068b962eb9a665503e' 環境変数 `Name` の値を返します。以下の制約があります: -- OS環境変数を読み取る際、`EMQXVAR_` プレフィックスが付加されます。例えば、`getenv('FOO_BAR')` は `EMQXVAR_FOO_BAR` を読み取ります。 -- OS環境変数から読み込んだ値は不変です。 +- OS環境変数から読み取る際に `EMQXVAR_` プレフィックスが付加されます。例えば `getenv('FOO_BAR')` は `EMQXVAR_FOO_BAR` を読み取ります。 +- OS環境から読み込んだ値は不変です。 ## 条件関数 ### coalesce(Value1: any, Value2: any) -> any -`Value1` がnullの場合に `Value2` を返します。データフィールドがnullかどうかをチェックし、デフォルト値に置き換えたい場合に便利です。 +`Value1` がnullの場合に `Value2` を返します。データフィールドがnullかどうかをチェックしてデフォルト値に置き換えたい場合に便利です。 例えば、`coalesce(payload.value, 0)` は `payload.value` がnullでなければその値を返し、nullなら0を返します。SQL式の `CASE WHEN is_null(payload.value) THEN 0 ELSE payload.value END` と同等ですが簡潔です。 ::: tip 注意 -EMQXルールSQLでは、null値の文字列表現はデフォルトで `'undefined'` です。 +EMQXルールSQLではnull値の文字列表現はデフォルトで `'undefined'` です。 ::: @@ -1647,6 +1651,6 @@ EMQXルールSQLでは、null値の文字列表現はデフォルトで `'undefi ::: tip 注意 -EMQXルールSQLでは、null値の文字列表現はデフォルトで `'undefined'` です。 +EMQXルールSQLではnull値の文字列表現はデフォルトで `'undefined'` です。 ::: diff --git a/ja_JP/data-integration/snowflake.md b/ja_JP/data-integration/snowflake.md index 1d7858735..2d645582a 100644 --- a/ja_JP/data-integration/snowflake.md +++ b/ja_JP/data-integration/snowflake.md @@ -1,93 +1,146 @@ -# Snowflake への MQTT データ取り込み +# SnowflakeへのMQTTデータ取り込み -[Snowflake](https://www.snowflake.com/en/) は、クラウドベースのデータプラットフォームであり、高いスケーラビリティと柔軟性を備えたデータウェアハウジング、分析、および安全なデータ共有のソリューションを提供します。構造化データおよび半構造化データの処理に優れ、大量のデータを高速なクエリ性能で保存し、さまざまなツールやサービスとシームレスに統合できるよう設計されています。 +[Snowflake](https://www.snowflake.com/en/) は、クラウドベースのデータプラットフォームであり、高いスケーラビリティと柔軟性を備えたデータウェアハウジング、分析、セキュアなデータ共有のソリューションを提供します。構造化データおよび半構造化データの処理に優れており、大量のデータを高速なクエリ性能で保存し、さまざまなツールやサービスとシームレスに統合できるよう設計されています。 -本ページでは、EMQX と Snowflake 間のデータ統合について詳しく紹介し、ルールおよび Sink の作成方法について実践的なガイドを提供します。 +本ページでは、EMQXとSnowflake間のデータ統合について詳しく解説し、ルールおよびSinkの作成方法について実践的なガイダンスを提供します。 ## 動作概要 -EMQX における Snowflake データ統合はすぐに使える機能であり、複雑なビジネス開発にも簡単に設定可能です。典型的な IoT アプリケーションでは、EMQX がデバイス接続とメッセージ送受信を担う IoT プラットフォームとして機能し、Snowflake はメッセージデータの取り込み、保存、分析を担当するデータストレージおよび処理プラットフォームとして利用されます。 +EMQXにおけるSnowflakeデータ統合はすぐに利用可能な機能であり、複雑なビジネス開発にも簡単に設定できます。典型的なIoTアプリケーションでは、EMQXがデバイス接続とメッセージ送受信のIoTプラットフォームとして機能し、Snowflakeはメッセージデータの取り込み、保存、分析を担当するデータストレージおよび処理プラットフォームとして利用されます。 ![snowflake-architecture](./assets/snowflake-architecture.png) -EMQX はルールエンジンと Sink を利用してデバイスイベントやデータを Snowflake に転送します。エンドユーザーやアプリケーションは Snowflake のテーブル内のデータにアクセスできます。具体的なワークフローは以下の通りです: +EMQXはルールエンジンとSinkを利用してデバイスのイベントやデータをSnowflakeに転送します。エンドユーザーやアプリケーションはSnowflakeのテーブル内のデータにアクセスできます。具体的なワークフローは以下の通りです。 -1. **デバイスの EMQX への接続**:IoT デバイスは MQTT プロトコルで正常に接続するとオンラインイベントをトリガーします。イベントにはデバイスID、送信元IPアドレスなどの情報が含まれます。 -2. **デバイスメッセージのパブリッシュと受信**:デバイスは特定のトピックを通じてテレメトリや状態データをパブリッシュします。EMQX はメッセージを受信し、ルールエンジン内で比較処理を行います。 -3. **ルールエンジンによるメッセージ処理**:組み込みのルールエンジンはトピックマッチングに基づき特定のソースからのメッセージやイベントを処理します。対応するルールをマッチングし、データ形式変換、特定情報のフィルタリング、コンテキスト情報の付加などの処理を行います。 -4. **Snowflake への書き込み**:ルールはメッセージを Snowflake Stage に書き込み、そこから Snowflake テーブルにロードするアクションをトリガーします。 +1. **デバイスのEMQX接続**:IoTデバイスはMQTTプロトコルで正常に接続されるとオンラインイベントをトリガーします。このイベントにはデバイスID、送信元IPアドレスなどのプロパティ情報が含まれます。 +2. **デバイスのメッセージパブリッシュと受信**:デバイスは特定のトピックを通じてテレメトリやステータスデータをパブリッシュします。EMQXはメッセージを受信し、ルールエンジン内で比較処理を行います。 +3. **ルールエンジンによるメッセージ処理**:組み込みのルールエンジンは、トピックマッチングに基づき特定のソースからのメッセージやイベントを処理します。対応するルールにマッチしたメッセージやイベントに対し、データフォーマット変換、特定情報のフィルタリング、コンテキスト情報の付加などの処理を行います。 +4. **Snowflakeへの書き込み**:ルールはメッセージをSnowflakeのStageに書き込み、そこからSnowflakeテーブルにロードするアクションをトリガーします。 -イベントやメッセージデータが Snowflake に書き込まれた後は、以下のようなビジネスや技術的な目的で利用可能です: +イベントやメッセージデータがSnowflakeに書き込まれた後は、以下のようなビジネスおよび技術的な目的で活用できます。 -- **データアーカイブ**:IoT データを Snowflake に安全に長期保存し、コンプライアンスや過去データの利用を保証します。 -- **データ分析**:Snowflake のデータウェアハウジングおよび分析機能を活用し、リアルタイムまたはバッチ分析を行い、予知保全、運用インサイト、デバイス性能評価を可能にします。 +- **データアーカイブ**:IoTデータをSnowflakeに安全に長期保存し、コンプライアンスや履歴データの利用を保証します。 +- **データ分析**:Snowflakeのデータウェアハウジングおよび分析機能を活用し、リアルタイムまたはバッチ分析を実施。予知保全、運用インサイト、デバイス性能評価などを可能にします。 ## 特長と利点 -EMQX の Snowflake データ統合を利用することで、以下の特長と利点が得られます: +EMQXのSnowflakeデータ統合を利用することで、以下の特長と利点をビジネスにもたらします。 -- **メッセージ変換**:メッセージは EMQX のルール内で高度な処理や変換を経てから Snowflake に書き込まれるため、後続の保存や利用が容易になります。 -- **柔軟なデータ操作**:Snowflake Sink は、書き込むフィールドを選択可能であり、ビジネスニーズに応じた効率的かつ動的なストレージ構成が可能です。 -- **統合されたビジネスプロセス**:Snowflake Sink によりデバイスデータを Snowflake の豊富なエコシステムアプリケーションと組み合わせ、データ分析やアーカイブなど多様なビジネスシナリオを実現します。 -- **低コストの長期保存**:Snowflake のスケーラブルなストレージ基盤は、従来のデータベースに比べて低コストで長期データ保持に最適なソリューションです。大量の IoT データ保存に適しています。 +- **メッセージ変換**:EMQXのルール内でメッセージに対して高度な処理や変換を行い、その後Snowflakeに書き込むことで、後続の保存や利用を容易にします。 +- **柔軟なデータ操作**:Snowflake Sinkは、Snowflakeに書き込む特定のフィールドを選択可能であり、ビジネスニーズに応じた効率的かつ動的なストレージ構成を実現します。 +- **統合されたビジネスプロセス**:Snowflake Sinkを通じてデバイスデータをSnowflakeの豊富なエコシステムアプリケーションと組み合わせ、データ分析やアーカイブなど多様なビジネスシナリオを実現します。 +- **低コストの長期保存**:Snowflakeのスケーラブルなストレージ基盤は、従来のデータベースに比べて低コストでの長期データ保持に最適であり、大量のIoTデータ保存に適しています。 -これらの特長により、効率的で信頼性が高くスケーラブルな IoT アプリケーションを構築し、ビジネスの意思決定や最適化に役立てることができます。 +これらの特長により、効率的で信頼性の高いスケーラブルなIoTアプリケーションを構築し、ビジネスの意思決定や最適化に役立てることができます。 ## はじめる前に -このセクションでは、EMQX で Snowflake Sink を作成する前に必要な準備について説明します。 +ここでは、EMQXでSnowflake Sinkを作成する前の準備について説明します。 ### 前提条件 -- [ルール](./rules.md) の理解 -- [データ統合](./data-bridges.md) の理解 +- [ルール](./rules.md)の理解 +- [データ統合](./data-bridges.md)の理解 -### Snowflake ODBC ドライバーの初期化 +### Snowflake ODBCドライバーの初期化 -EMQX が Snowflake と通信し効率的にデータ転送を行うために、Snowflake Open Database Connectivity (ODBC) ドライバーのインストールと設定が必要です。これは通信の橋渡し役となり、データの適切なフォーマット、認証、転送を保証します。 +EMQXがSnowflakeと通信し、効率的にデータ転送を行うためには、SnowflakeのOpen Database Connectivity(ODBC)ドライバーをインストールおよび設定する必要があります。これは通信の橋渡し役を担い、データの適切なフォーマット、認証、転送を保証します。 -詳細は公式の [ODBC Driver](https://docs.snowflake.com/en/developer-guide/odbc/odbc) ページおよび [ライセンス契約](https://sfc-repo.snowflakecomputing.com/odbc/Snowflake_ODBC_Driver_License_Agreement.pdf) を参照してください。 +詳細は公式の[ODBC Driver](https://docs.snowflake.com/en/developer-guide/odbc/odbc)ページおよび[ライセンス契約](https://sfc-repo.snowflakecomputing.com/odbc/Snowflake_ODBC_Driver_License_Agreement.pdf)を参照してください。 #### Linux -以下のスクリプトを実行して Snowflake ODBC ドライバーをインストールし、`odbc.ini` ファイルを設定します: +EMQXはDebian系システム(Ubuntuなど)向けにSnowflake ODBCドライバーの迅速な導入と必要なシステム設定を行う[インストールスクリプト](https://github.com/emqx/emqx/blob/master/scripts/install-snowflake-driver.sh)を提供しています。 +::: tip 注意 + +このスクリプトはテスト用であり、本番環境でのODBCドライバー設定方法の推奨ではありません。公式の[Linux向けインストール手順](https://docs.snowflake.com/en/developer-guide/odbc/odbc-linux)を参照してください。 + +::: + +**インストールスクリプトの実行** + +`scripts/install-snowflake-driver.sh`をローカルマシンにコピーし、`chmod a+x`で実行権限を付与後、`sudo`で実行します。 + +```bash +chmod a+x scripts/install-snowflake-driver.sh +sudo ./scripts/install-snowflake-driver.sh ``` -scripts/install-snowflake-driver.sh + +スクリプトはSnowflake ODBCの`.deb`インストールパッケージ(例:`snowflake-odbc-3.4.1.x86_64.deb`)をカレントディレクトリにダウンロードし、ドライバーをインストール、以下のシステム設定ファイルを更新します。 + +- `/etc/odbc.ini`:Snowflakeデータソース設定を追加 +- `/etc/odbcinst.ini`:Snowflakeドライバーパスを登録 + +**設定例** + +`/etc/odbc.ini`の内容確認: + ``` +emqx@emqx-0:~$ cat /etc/odbc.ini -::: tip 注意 +[snowflake] +Description=SnowflakeDB +Driver=SnowflakeDSIIDriver +Locale=en-US +PORT=443 +SSL=on + +[ODBC Data Sources] +snowflake = SnowflakeDSIIDriver +``` -このスクリプトはテスト用であり、本番環境での ODBC ドライバー設定方法の推奨ではありません。公式の [Linux 向けインストール手順](https://docs.snowflake.com/en/developer-guide/odbc/odbc-linux) を参照してください。 +`/etc/odbcinst.ini`の内容確認: -::: +``` +emqx@emqx-0:~$ cat /etc/odbcinst.ini + +[ODBC Driver 18 for SQL Server] +Description=Microsoft ODBC Driver 18 for SQL Server +Driver=/opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.5.so.1.1 +UsageCount=1 + +[ODBC Driver 17 for SQL Server] +Description=Microsoft ODBC Driver 17 for SQL Server +Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.so.6.1 +UsageCount=1 + +[SnowflakeDSIIDriver] +APILevel=1 +ConnectFunctions=YYY +Description=Snowflake DSII +Driver=/usr/lib/snowflake/odbc/lib/libSnowflake.so +DriverODBCVer=03.52 +SQLLevel=1 +UsageCount=1 +``` #### macOS -macOS で Snowflake ODBC ドライバーをインストールおよび設定する手順は以下の通りです: +macOSでSnowflake ODBCドライバーをインストールおよび設定する手順は以下の通りです。 -1. unixODBC をインストール(例): +1. unixODBCをインストール(例): ``` brew install unixodbc ``` -2. [iODBC をダウンロードしてインストール](https://github.com/openlink/iODBC/releases/download/v3.52.16/iODBC-SDK-3.52.16-macOS11.dmg)。 +2. [iODBCのダウンロードとインストール](https://github.com/openlink/iODBC/releases/download/v3.52.16/iODBC-SDK-3.52.16-macOS11.dmg)。 -3. [Snowflake ODBC ドライバーをダウンロードしてインストール](https://sfc-repo.snowflakecomputing.com/odbc/macuniversal/3.3.2/snowflake_odbc_mac_64universal-3.3.2.dmg)。 +3. [Snowflake ODBCドライバーのダウンロードとインストール](https://sfc-repo.snowflakecomputing.com/odbc/macuniversal/3.3.2/snowflake_odbc_mac_64universal-3.3.2.dmg)。 -4. 詳細なインストールおよび設定手順は [macOS 向け ODBC ドライバーのインストールと設定](https://docs.snowflake.com/en/developer-guide/odbc/odbc-mac) を参照してください。 +4. 詳細なインストールおよび設定手順は[macOS向けODBCドライバーのインストールと設定](https://docs.snowflake.com/en/developer-guide/odbc/odbc-mac)を参照してください。 -5. インストール後、以下の設定ファイルを更新します: +5. インストール後、以下の設定ファイルを更新します。 - - Snowflake ODBC ドライバーの権限と設定を更新: + - Snowflake ODBCドライバーの権限と設定を更新: ```bash chown $(id -u):$(id -g) /opt/snowflake/snowflakeodbc/lib/universal/simba.snowflake.ini echo 'ODBCInstLib=libiodbcinst.dylib' >> /opt/snowflake/snowflakeodbc/lib/universal/simba.snowflake.ini ``` - - `~/.odbc.ini` ファイルを作成または更新して ODBC 接続を設定: + - `~/.odbc.ini`ファイルを作成または更新し、ODBC接続を設定: ``` cat << EOF > ~/.odbc.ini @@ -108,36 +161,36 @@ macOS で Snowflake ODBC ドライバーをインストールおよび設定す ### ユーザーアカウントとデータベースの作成 -Snowflake ODBC ドライバーをインストールしたら、データ取り込み用のユーザーアカウント、データベース、および関連リソースを設定します。これらの認証情報は後で EMQX のコネクターおよび Sink 設定時に使用します。 +Snowflake ODBCドライバーのインストール後、データ取り込み用のユーザーアカウント、データベース、関連リソースをセットアップする必要があります。これらの認証情報は後でEMQXのコネクターおよびSink設定時に使用します。 -| フィールド名 | 値 | -| -------------------------- | ------------------------------------------------ | -| Data Source Name (DSN) | `snowflake` | -| ユーザー名 | `snowpipeuser` | -| パスワード | `Snowpipeuser99` | -| データベース名 | `testdatabase` | -| スキーマ | `public` | -| ステージ | `emqx` | -| パイプ | `emqx` | -| パイプユーザー | `snowpipeuser` | -| プライベートキー | `file://` | +| 項目 | 値 | +| ------------------------ | ------------------------------------------------ | +| Data Source Name (DSN) | `snowflake` | +| ユーザー名 | `snowpipeuser` | +| パスワード | `Snowpipeuser99` | +| データベース名 | `testdatabase` | +| スキーマ | `public` | +| ステージ | `emqx` | +| パイプ | `emqx` | +| パイプユーザー | `snowpipeuser` | +| プライベートキー | `file://` | -#### RSA キーペアの生成 +#### RSA鍵ペアの生成 -Snowflake への安全な接続のため、以下のコマンドで認証用の RSA キーペアを生成します: +Snowflakeへの安全な接続のため、以下のコマンドでRSA鍵ペアを生成します。 ```bash openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out snowflake_rsa_key.private.pem -nocrypt openssl rsa -in snowflake_rsa_key.private.pem -pubout -out snowflake_rsa_key.public.pem ``` -詳細は [キーペア認証とキーペアローテーション](https://docs.snowflake.com/en/user-guide/key-pair-auth) を参照してください。 +詳細は[鍵ペア認証と鍵ペアローテーション](https://docs.snowflake.com/en/user-guide/key-pair-auth)を参照してください。 -#### SQL を使った Snowflake リソースのセットアップ +#### SQLによるSnowflakeリソースのセットアップ -ODBC ドライバーのセットアップと RSA キーペア生成後、Snowflake のリソースを設定します。SQL コマンドを使ってデータベース、テーブル、ステージ、パイプを作成します。 +ODBCドライバーのセットアップとRSA鍵ペアの生成が完了したら、Snowflakeのデータベース、テーブル、ステージ、パイプをSQLコマンドで作成します。 -1. Snowflake コンソールの SQL ワークシートを開き、以下の SQL を実行してデータベース、テーブル、ステージ、パイプを作成します: +1. SnowflakeコンソールのSQLワークシートを開き、以下のSQLを実行してデータベース、テーブル、ステージ、パイプを作成します。 ```sql USE ROLE accountadmin; @@ -161,7 +214,7 @@ ODBC ドライバーのセットアップと RSA キーペア生成後、Snowfla MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE; ``` -2. 新しいユーザーを作成し、そのユーザーに RSA 公開鍵を設定します: +2. 新規ユーザーを作成し、そのユーザーにRSA公開鍵を設定します。 ```sql CREATE USER IF NOT EXISTS snowpipeuser @@ -178,11 +231,11 @@ ODBC ドライバーのセットアップと RSA キーペア生成後、Snowfla ::: tip - PEM ファイルの `-----BEGIN PUBLIC KEY-----` および `-----END PUBLIC KEY-----` 行は削除し、残りの内容を改行を保持したまま含めてください。 + PEMファイルの`-----BEGIN PUBLIC KEY-----`および`-----END PUBLIC KEY-----`の行は削除し、残りの内容を改行を保持したまま設定してください。 ::: -3. ユーザーが Snowflake リソースを管理できるように必要なロールを作成し割り当てます: +3. Snowflakeリソース管理用のロールを作成し、ユーザーに割り当てます。 ```sql CREATE OR REPLACE ROLE snowpipe; @@ -198,34 +251,61 @@ ODBC ドライバーのセットアップと RSA キーペア生成後、Snowfla ## コネクターの作成 -Snowflake Sink を追加する前に、EMQX で Snowflake への接続を確立するためのコネクターを作成します。 +Snowflake Sinkを追加する前に、EMQXでSnowflakeとの接続を確立するためのコネクターを作成します。 1. ダッシュボードの **Integration** -> **Connector** ページに移動します。 + 2. 右上の **Create** ボタンをクリックします。 + 3. コネクタータイプとして **Snowflake** を選択し、次へ進みます。 + 4. コネクター名を入力します。英数字の組み合わせで、ここでは `my-snowflake` と入力します。 + 5. 接続情報を入力します。 - - **Account**:Snowflake の組織IDとアカウント名をハイフン(`-`)で区切って入力します。これは Snowflake プラットフォームの URL の一部で、Snowflake コンソールで確認可能です。 - - **Server Host**:Snowflake のエンドポイント URL で、通常 `-.snowflakecomputing.com` の形式です。`-` はご自身の Snowflake インスタンス固有のサブドメインに置き換えてください。 - - **Data Source Name(DSN)**:ODBC ドライバー設定時に `.odbc.ini` ファイルで設定した `snowflake` を入力します。 - - **Username**:前述の設定で作成した `snowpipeuser` を入力します。 - - **Password**:前述の設定で定義した `Snowpipeuser99` を入力します。 -6. 暗号化接続を確立したい場合は、**Enable TLS** のトグルスイッチをオンにします。TLS 接続の詳細は [TLS for External Resource Access](../network/overview.md/#tls-for-external-resource-access) を参照してください。 -7. 詳細設定(任意):[Advanced Settings](#advanced-settings) を参照してください。 -8. **Create** をクリックする前に、**Test Connectivity** ボタンでコネクターが Snowflake に接続できるかテストできます。 -9. 最後に、ページ下部の **Create** ボタンをクリックしてコネクター作成を完了します。 + - **Server Host**:SnowflakeのエンドポイントURLで、通常 `-.snowflakecomputing.com` の形式です。`-` はご自身のSnowflakeインスタンス固有のサブドメインに置き換えてください。 + + - **Data Source Name(DSN)**:ODBCドライバー設定時に`.odbc.ini`ファイルで設定した`snowflake`を入力します。 + + - **Account**:Snowflakeの組織IDとアカウント名をハイフン(`-`)で区切って入力します。SnowflakeプラットフォームのURLの一部であり、Snowflakeコンソールで確認できます。 + + - **Username**:前述のセットアップで作成した`snowpipeuser`を入力します。 + + - **Password**:ODBCのユーザー名/パスワード認証でSnowflakeに接続するためのパスワードです。任意入力です。 + - ここにパスワード(例:`Snowpipeuser99`)を入力するか、 + - `/etc/odbc.ini`に設定するか、 + - キーペア認証を使用する場合は空欄のままにします。 + + ::: tip + + 認証にはPasswordかPrivate Keyのいずれかを使用してください。両方設定しないでください。どちらも設定しない場合は、適切な認証情報が`/etc/odbc.ini`に設定されていることを確認してください。 + + ::: + + - **Proxy**:HTTPプロキシ経由でSnowflakeに接続する場合の設定です。HTTPSプロキシはサポートされていません。デフォルトはプロキシなしです。プロキシを有効にする場合は`Enable Proxy`を選択し、以下を入力します。 + - **Proxy Host**:プロキシサーバーのホスト名またはIPアドレス + - **Proxy Port**:プロキシサーバーのポート番号 + - **Private Key Path**:SnowflakeへのODBC接続認証に使用するRSA秘密鍵の絶対ファイルパスです。クラスターのすべてのノードで同じパスである必要があります。パスは`file://`で始まる必要があります(例:`file:///etc/emqx/certs/snowflake_rsa_key.private.pem`)。 + - **Private Key Password**:秘密鍵ファイルが暗号化されている場合の復号パスワードです。OpenSSLの`-nocrypt`オプションで生成した鍵は暗号化されていないため空欄にします。 + +6. 暗号化接続を確立したい場合は、**Enable TLS**のトグルスイッチをオンにします。TLS接続の詳細は[外部リソースアクセスのTLS](../network/overview.md/#tls-for-external-resource-access)を参照してください。 + +7. 詳細設定(任意):[Advanced Settings](#advanced-settings)を参照してください。 + +8. **Create**をクリックする前に、**Test Connectivity**を押してコネクターがSnowflakeに接続できるかテストできます。 + +9. 最後に、画面下部の **Create** ボタンをクリックしてコネクター作成を完了します。 -これでコネクターの作成が完了し、次にルールと Sink を作成してデータの書き込み方法を指定できます。 +これでコネクターの作成が完了し、次にルールとSinkを作成してSnowflakeへのデータ書き込み方法を指定できます。 -## Snowflake Sink を使ったルールの作成 +## Snowflake Sinkを用いたルールの作成 -このセクションでは、EMQX でソース MQTT トピック `t/#` からのメッセージを処理し、処理結果を設定済みの Snowflake Sink を通じて Snowflake に書き込むルールの作成方法を示します。 +ここでは、EMQXでMQTTトピック `t/#` からのメッセージを処理し、処理結果を設定したSnowflake Sinkに書き込むルールの作成方法を示します。 1. ダッシュボードの **Integration** -> **Rules** ページに移動します。 2. 右上の **Create** ボタンをクリックします。 -3. ルールID に `my_rule` と入力し、SQL エディターに以下のルール SQL を入力します: +3. ルールIDに `my_rule` を入力し、SQLエディターに以下のルールSQLを入力します。 ```sql SELECT @@ -239,97 +319,96 @@ Snowflake Sink を追加する前に、EMQX で Snowflake への接続を確立 ::: tip - SQL に不慣れな場合は、**SQL Examples** をクリックし、**Enable Debug** を有効にしてルール SQL の結果を学習・テストできます。 + SQLに不慣れな場合は、**SQL Examples** と **Enable Debug** をクリックしてルールSQLの学習やテストが可能です。 ::: - ::: tip - - Snowflake 連携では、選択するフィールドが Snowflake 側で定義したテーブルのカラム数および名前と完全に一致していることが重要です。余分なフィールドを追加したり、`*` で全選択することは避けてください。 - + + Snowflake連携では、選択するフィールドがSnowflake側のテーブルのカラム数および名前と完全に一致していることが重要です。余分なフィールドを追加したり、`*`で全選択することは避けてください。 + ::: -4. アクションを追加し、**Action Type** ドロップダウンリストから `Snowflake` を選択します。アクションのドロップダウンはデフォルトの `create action` のままにするか、既存の Snowflake アクションを選択します。ここでは新しい Sink を作成してルールに追加します。 +4. アクションを追加し、**Action Type**ドロップダウンから`Snowflake`を選択します。アクションドロップダウンはデフォルトの`create action`のままか、既存のSnowflakeアクションを選択します。ここでは新規Sinkを作成してルールに追加します。 -5. Sink の名前(例:`snowflake_sink`)と簡単な説明を入力します。 +5. Sinkの名前(例:`snowflake_sink`)と簡単な説明を入力します。 -6. 先に作成した `my-snowflake` コネクターをコネクタードロップダウンから選択します。ドロップダウン横の作成ボタンをクリックしてポップアップで新規コネクターを素早く作成することも可能です。必要な設定パラメータは [Create a Connector](#create-a-connector) を参照してください。 +6. コネクターのドロップダウンから先ほど作成した`my-snowflake`を選択します。隣の作成ボタンを押すとポップアップで新規コネクターを素早く作成できます。必要な設定パラメータは[コネクターの作成](#コネクターの作成)を参照してください。 -7. 以下の設定を行います: +7. 以下の設定を行います。 - - **Database Name**:`testdatabase` を入力。EMQX データ保存用に作成した Snowflake データベースです。 - - **Schema**:`public` を入力。`testdatabase` 内のデータテーブルがあるスキーマです。 - - **Stage**:`emqx` を入力。Snowflake でデータをテーブルにロードする前に保持するステージです。 - - **Pipe**:`emqx` を入力。ステージからテーブルへのロード処理を自動化するパイプです。 - - **Pipe User**:`snowpipeuser` を入力。パイプ管理権限を持つ Snowflake ユーザーです。 - - **Private Key**:RSA プライベートキーのパス(例:`file://`)または RSA プライベートキーファイルの内容を入力します。これは安全な認証に使用され、Snowflake パイプへの安全なアクセスに必要です。ファイルパスを使用する場合は、クラスタ内のすべてのノードでパスが一貫しており、EMQX アプリケーションユーザーがアクセス可能である必要があります。 + - **Database Name**:`testdatabase`。EMQXデータ保存用に作成したSnowflakeデータベース名です。 + - **Schema**:`public`。`testdatabase`内のデータテーブルがあるスキーマ名です。 + - **Stage**:`emqx`。Snowflakeでデータをテーブルにロードする前に保持するステージ名です。 + - **Pipe**:`emqx`。ステージからテーブルへのロード処理を自動化するパイプ名です。 + - **Pipe User**:`snowpipeuser`。パイプ管理権限を持つSnowflakeユーザー名です。 + - **Private Key**:RSA秘密鍵のパス(例:`file://`)またはRSA秘密鍵ファイルの内容を入力します。安全な認証に使用し、パイプへのアクセスに必要です。ファイルパスを使用する場合はクラスター内すべてのノードで同一かつEMQXアプリケーションユーザーがアクセス可能である必要があります。 -8. **Upload Mode** を選択します。現在は `Aggregated Upload` のみサポートしています。この方法は複数のルールトリガー結果を単一ファイル(例:CSV ファイル)にまとめて Snowflake にアップロードし、ファイル数を減らして書き込み効率を向上させます。 +8. **Upload Mode**を選択します。現在は`Aggregated Upload`のみサポートしています。この方式は複数のルールトリガー結果を1つのファイル(例:CSVファイル)にまとめてSnowflakeにアップロードし、ファイル数を減らして書き込み効率を向上させます。 -9. **Aggregation Type** を選択します。現在は `csv` のみサポートしています。データはカンマ区切りの CSV 形式で Snowflake にステージングされます。 +9. **Aggregation Type**を選択します。現在は`csv`のみサポートしており、データはカンマ区切りのCSV形式でSnowflakeにステージされます。 - - **Column Order**:ドロップダウンリストから列の順序を選択します。生成される CSV ファイルは、選択した列の順序でソートされ、未選択の列はアルファベット順にソートされます。 + - **Column Order**:ドロップダウンからカラムの並び順を選択します。生成されるCSVファイルは選択したカラム順にソートされ、未選択カラムはアルファベット順に並びます。 - - **Max Records**:集約がトリガーされる最大レコード数を設定します。例えば `1000` に設定すると、1000 レコード収集後にアップロードされます。最大レコード数に達すると単一ファイルの集約が完了しアップロードされ、時間間隔がリセットされます。 + - **Max Records**:集約をトリガーする最大レコード数を設定します。例えば`1000`に設定すると、1000件のレコード収集後にアップロードされ、時間間隔がリセットされます。 - - **Time Interval**:集約が行われる時間間隔(秒)を設定します。例えば `60` に設定すると、最大レコード数に達していなくても 60 秒ごとにデータがアップロードされ、最大レコード数がリセットされます。 + - **Time Interval**:集約を行う時間間隔(秒)を設定します。例えば`60`に設定すると、最大レコード数に達していなくても60秒ごとにアップロードされ、最大レコード数がリセットされます。 -10. **フォールバックアクション(任意)**:メッセージ配信失敗時の信頼性向上のため、1つ以上のフォールバックアクションを定義できます。これらはプライマリ Sink がメッセージ処理に失敗した場合にトリガーされます。詳細は [Fallback Actions](./data-bridges.md#fallback-actions) を参照してください。 +10. **フォールバックアクション(任意)**:メッセージ配信失敗時の信頼性向上のため、1つ以上のフォールバックアクションを定義できます。詳細は[フォールバックアクション](./data-bridges.md#fallback-actions)を参照してください。 -11. **Advanced Settings** を展開し、必要に応じて詳細設定を行います(任意)。詳細は [Advanced Settings](#advanced-settings) を参照してください。 +11. **詳細設定**を展開し、必要に応じて高度な設定を行います(任意)。詳細は[Advanced Settings](#advanced-settings)を参照してください。 -12. 残りの設定はデフォルト値のままにし、**Create** ボタンをクリックして Sink 作成を完了します。作成成功後、ルール作成画面に戻り、新しい Sink がルールアクションに追加されます。 +12. 残りの設定はデフォルト値を使用し、**Create**ボタンをクリックしてSink作成を完了します。作成成功後はルール作成画面に戻り、新規Sinkがルールアクションに追加されます。 -13. ルール作成画面で **Create** ボタンをクリックし、ルール作成全体を完了します。 +13. ルール作成画面で**Create**ボタンをクリックし、ルール作成全体を完了します。 -これでルールの作成が完了しました。**Rules** ページで新規作成したルールを確認でき、**Actions (Sink)** タブで新しい Snowflake Sink を確認できます。 +これでルールの作成が完了し、**Rules**ページで新規ルールを、**Actions (Sink)**タブで新規Snowflake Sinkを確認できます。 -また、**Integration** -> **Flow Designer** をクリックするとトポロジーを視覚的に確認できます。トポロジーは、トピック `t/#` のメッセージがルール `my_rule` によって解析され、Snowflake に書き込まれる流れを示します。 +また、**Integration** -> **Flow Designer**をクリックするとトポロジーが表示され、トピック`t/#`のメッセージが`my_rule`ルールで解析され、Snowflakeに書き込まれる流れを視覚的に確認できます。 ## ルールのテスト -このセクションでは、設定したルールのテスト方法を示します。 +ここでは設定したルールのテスト方法を示します。 ### テストメッセージのパブリッシュ -MQTTX を使ってトピック `t/1` にメッセージをパブリッシュします: +MQTTクライアントMQTTXを使い、トピック`t/1`にメッセージをパブリッシュします。 ```bash mqttx pub -i emqx_c -t t/1 -m '{ "msg": "Hello Snowflake" }' ``` -この操作を数回繰り返して複数のテストメッセージを生成してください。 +複数回繰り返して複数のテストメッセージを生成してください。 -### Snowflake 内のデータ確認 +### Snowflake内のデータ確認 -テストメッセージ送信後、Snowflake にデータが正常に書き込まれたかを確認します。 +テストメッセージ送信後、Snowflakeにデータが正常に書き込まれたかを確認します。 -1. Snowflake のウェブインターフェースを開き、認証情報で Snowflake コンソールにログインします。 +1. SnowflakeのWebインターフェースにログインします。 -2. Snowflake コンソールで以下の SQL クエリを実行し、ルールによって書き込まれた `emqx` テーブルのデータを表示します: +2. Snowflakeコンソールで以下のSQLクエリを実行し、`emqx`テーブルに書き込まれたデータを確認します。 ``` SELECT * FROM testdatabase.public.emqx; ``` - これにより、`emqx` テーブルにアップロードされたすべてのレコードが表示され、`clientid`、`topic`、`payload`、`publish_received_at` フィールドを確認できます。 + これにより、`clientid`、`topic`、`payload`、`publish_received_at`などのフィールドを含むすべてのレコードが表示されます。 -3. 送信したテストメッセージ(例:`{ "msg": "Hello Snowflake" }`)や、トピック、タイムスタンプなどのメタデータが確認できるはずです。 +3. 送信したテストメッセージ(例:`{ "msg": "Hello Snowflake" }`)や、トピック、タイムスタンプなどのメタデータが確認できます。 ## 詳細設定 -このセクションでは、Snowflake Sink の詳細設定オプションについて説明します。ダッシュボードで Sink を設定する際、**Advanced Settings** を展開して以下のパラメータをニーズに応じて調整できます。 - -| フィールド名 | 説明 | デフォルト値 | -| -------------------------- | ------------------------------------------------------------------------------------------------ | -------------- | -| **Max Retries** | アップロード失敗時の最大リトライ回数を設定します。例えば `3` を入力すると3回までリトライします。 | `3` | -| **Buffer Pool Size** | バッファワーカープロセスの数を指定します。これらのワーカーは EMQX と Snowflake 間のデータフローを管理し、一時的にデータを保持・処理します。パフォーマンス最適化とスムーズなデータ送信に重要です。 | `16` | -| **Request TTL** | リクエストの有効期間(秒)を設定します。リクエストがバッファに入ってからの最大有効時間を指定し、この期間を超えたリクエストは期限切れとみなされます。レスポンスやアックがタイムリーに返らない場合も期限切れとなります。 | | -| **Health Check Interval** | Snowflake との接続の自動ヘルスチェックを行う間隔(秒)を指定します。 | `15` | -| **Max Buffer Queue Size** | Snowflake Sink の各バッファワーカーが保持可能な最大バイト数を指定します。バッファワーカーはデータを一時保管し、効率的にデータストリームを処理します。システム性能やデータ送信要件に応じて調整してください。 | `256` | -| **Query Mode** | リクエストモードを `synchronous` または `asynchronous` から選択し、メッセージ送信を最適化します。非同期モードでは Snowflake への書き込みが MQTT メッセージのパブリッシュをブロックしませんが、クライアントがメッセージ到達前に受信する可能性があります。 | `Asynchronous` | -| **Batch Size** | EMQX から Snowflake へ一度に送信するデータバッチの最大サイズを指定します。サイズ調整によりデータ転送の効率と性能を微調整できます。
`1` に設定すると、データレコードを個別に送信し、バッチ化しません。 | `1` | -| **Inflight Window** | "インフライトキューリクエスト" は開始済みでまだレスポンスやアックを受け取っていないリクエストを指します。この設定は Snowflake との通信中に同時に存在可能なインフライトリクエストの最大数を制御します。
**Request Mode** が `asynchronous` の場合、同一 MQTT クライアントからのメッセージを厳密に順序処理したい場合はこの値を `1` に設定してください。 | `100` | -| **Connect Timeout** | Snowflake への接続試行時のタイムアウト時間(秒)を指定します。例えば `30` 秒に設定すると、その時間内に接続できなければリトライ(**Max Retries** に基づく)またはエラーを発生させます。ネットワークレイテンシや接続信頼性管理に役立ちます。 | `15` | -| **HTTP Pipelining** | レスポンス待ちをせずに送信可能な HTTP リクエストの最大数を指定します。 | `100` | -| **Connection Pool Size** | EMQX が Snowflake に同時に維持可能な接続数を定義します。大きいほど同時リクエスト数が増え高負荷に対応可能ですが、システムリソース消費も増加します。 | `8` | +ここではSnowflake Sinkの詳細設定オプションについて説明します。ダッシュボードのSink設定画面で**Advanced Settings**を展開し、用途に応じて以下のパラメータを調整できます。 + +| 項目名 | 説明 | デフォルト値 | +| ------------------------ | ------------------------------------------------------------------------------------------------ | ------------ | +| **Max Retries** | アップロード失敗時の最大リトライ回数を設定します。例:`3`で3回までリトライ可能。 | `3` | +| **Buffer Pool Size** | EMQXとSnowflake間のデータフロー管理に割り当てるバッファワーカー数を指定します。これらのワーカーはデータを一時的に保持・処理し、性能最適化とスムーズなデータ送信を支えます。 | `16` | +| **Request TTL** | バッファに入ったリクエストの有効期限(秒)を指定します。TTLを超えるか、Snowflakeからの応答やアックが遅延した場合、リクエストは期限切れとみなされます。 | | +| **Health Check Interval** | Snowflakeとの接続状態を自動チェックする間隔(秒)を指定します。 | `15` | +| **Max Buffer Queue Size** | Snowflake Sinkの各バッファワーカーが保持可能な最大バイト数を指定します。バッファワーカーはデータを一時保管し、効率的なデータストリーム処理を実現します。システム性能やデータ転送要件に応じて調整してください。 | `256` | +| **Query Mode** | リクエストモードを`synchronous`または`asynchronous`から選択し、メッセージ送信の最適化を行います。非同期モードではSnowflakeへの書き込みがMQTTメッセージのパブリッシュをブロックしませんが、クライアントがSnowflake到達前にメッセージを受信する可能性があります。 | `Asynchronous` | +| **Batch Size** | EMQXからSnowflakeへ一度に送信するデータバッチの最大サイズを指定します。サイズを調整することで転送効率や性能を最適化可能です。
`1`に設定すると、データレコードを個別に送信し、バッチ化しません。 | `1` | +| **Inflight Window** | 送信済みだが応答やアックが未着の「インフライト」リクエストの最大数を制御します。
`Request Mode`が`asynchronous`の場合、同一MQTTクライアントのメッセージを厳密に順序処理したい場合は`1`に設定してください。 | `100` | +| **Connect Timeout** | Snowflakeへの接続確立を待つ最大時間(秒)を指定します。例:`30`秒。タイムアウト時はリトライ(Max Retriesに基づく)やエラー処理が行われます。ネットワーク遅延や接続信頼性管理に有効です。 | `15` | +| **HTTP Pipelining** | 応答待ち前に送信可能なHTTPリクエストの最大数を指定します。 | `100` | +| **Connection Pool Size** | EMQXがSnowflakeに同時に維持可能な接続数を定義します。大きいほど高負荷時に多くの同時リクエストを処理可能ですが、システムリソース消費も増加します。 | `8` | diff --git a/ja_JP/last_translation_commit b/ja_JP/last_translation_commit index f7b95ede3..2dd13dba9 100644 --- a/ja_JP/last_translation_commit +++ b/ja_JP/last_translation_commit @@ -1 +1 @@ -c55404f5618e14f7e22283490c620bc71fe5cb6c +e90a4a802ec0ece4850a05d8c5e5cc12a3ee8883 diff --git a/ja_JP/observability/opentelemetry/assets/e2e-dashboard-conf-en.png b/ja_JP/observability/opentelemetry/assets/e2e-dashboard-conf-en.png new file mode 100644 index 0000000000000000000000000000000000000000..119d9bdbdf47794a68f353a4c4a93c2888d325ad GIT binary patch literal 308451 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

G8)_$4gj^$-Usb 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

2$iB{dQQQk!4 zq;r>RD6u4QK8P((VkXSqXSKOizPwpdQ+9z$psJkO*1{`X>FPs@Z|il`wY? zPTH1otgt$=O zHH8V~{2CBgVQz%0Mbv1gNkz&bho{4d6)Nx63Upj*f{wo%&4;;W(b}JD*3k)XcwJOv zKk9sfQG&`-H=`IEy&5#J5Ib4BtO{q|<8H~)3sO|-xOb77 z0FZ@D6V4Mi+LZufUAYhMLNT7>VYOv?y73fGBn(SaCE|v3Om+6QkwS5t3KEg7*$O+W zk=vcQx~BZA7qhjuP6iV;ns&+v--WJ&xjw3fGrF!xCL??0)~w6l5oTVqSY3x}wcm5( zYQiVco>{r%-c#OkV7T5uP&wGcOoooE#48<5Yn76>S?nA5hOLv40F}^Kx!Fa9%-ZBQ?Wo;Jruj z>^|Q<>U?;izaI0^W}7|a4Q1$t9>X5s+P?||E5oU(ngAWK%-@Y1kM;ca22xcS5l^!s8x@kjL9)R( z8YqW#e33-$yI0c&R*LJrUJ(b>DYY*3Fn6yc+7CtPpv(H=b`L9*MxL+B^ItM-HV1m(FL%ztb;1OkoA}S4xhngvl;rWgUng5u19E))v6Rf?epbI)#TkZVwm&h?Wi~n| z7LGYy^Q=Rb)tO2#>(;?S&VhNZB?NxpvY>0mJgC)0`+=XNP(KPFQ$ z1ipr_Ie2f~M$dNfa-KbBM~kW5@@P9|yX4ke&k~N)hBsSy56rn9f_c06cu%Z;C~jG> z%41?c{&$m8qTFM#X*~T8G_NX(6Q2$Y7B*A6nLtK*H`^v-+ie59LwGa&vFA2vYYnVa zjfh0*f#7_8p~gDP4=IQ~RP8uec*M_tuUdMx_I2cJW}}k}`RiqmbMP0(p;oiI;=K&; z?=8!t3zlN|*TR59B~CHu(`$VoSV$q;+kCPQzLuKFLQLn_34@exv1_yO?~_@%f<3&M*V_$ z(vRZy-=?XMk<0x|{Z;87K^}L@HDx`ft}l`78%`(dD{Kc-N|JF-7em(EtQ(>xun;O^ zaD7L7UuTt=+^Frx5ZP1{B%=_&Bv9JQx50FtXlxT*$XX?FRx=I6hmO+qJf92_Xq+E$ z;H}frv{%Ff5)&;T%Q|4!sgK8c$);lZ9X>x*;th*pM{2FOQ#-%qr7-ng8*Ot4TzkD4 z@|>;2b6DGCq<-a2YN-~%{y;}i+NbmBk|C`Yga4tDcuTobafI=^r{a0wdR>$vjCHW; z!P2dGK@{T~xy8@)ysfK;{CD%=g*9GN*I6s~D1)ZbEX!H4wz5u&E=LD#NOg0~?pO3En%E&-@Lt>(Fi}Sbfg4ui|Uz6ov%&JeC)lE$^ zmM?aHbw@aYdd?1gCMMa+zx(cMR@oxzWWjGzOLLDR?&CpQT;xazhv&H2}WG+#nwlhT$6S9ERIR!H&R#V zru2F&&-~WoL)QnOw3kSi=a{yX3b5Mnia3M(K#!J9bcK{h4crlI(%c`Hv+un>6RXaC zLvCZ0$(S%1&V_`OBfyTScywP5YcCt!`^fKBn)nQ_Kmr6Gc5ZOCO4?5 z>>sjsIv68-OKH=OiqUg#zcR&AFpXpGj>-fbm%EOw;f+-+*%m!WAG#CKg#rr6fY@DvIcB2)`JO~Ngsx#~%cV|<%f?kp_)466(;L$&JnoT=-IH-h zxgvxrHNZ*Za3Zh+VTj3nFRQg0m5T7&bM@5C_Y0+dUmu3tJ(dJ+OU*BQ)EMw900p68 z$0xo73w}620IyE-nu_wpdG1yLYJrB|7vmrBEqHqhHNXw;;_2+UnF!J1fwu<*IVeh$ zC06FQXcP<_##FWn59g-E_hF4X-WEZpCEcLZUzW_le^m!#GKM?F#(Vj+LS_z(tH&yB zyw!8Bc{*3+x-=%AHklmE7m&xydi5soG4BB8nbLrJZ#4Mp9LC@347LI8<^Hi$R&kLD z=3Y&G=s?OVLOSWDa+jSDrO&_2CwrO<)iTc2R!)=>99|@O4?vYK)6R%EvfcCSEu1st zPE@q2ANT)kPaeeS-ObgL+jg&UBZJ2oG0%14Y-Foph+DvFvS7M_3(&JA4X{3zl7aouM!HenEJ>?}s#N(@2_|}4{qA2b}=92;2ZXBH4WGG3vG?8_~2dL_Zrw_x+Mw)a|&k z0|_paTW;wiF663&?10n{Hay@MT9`mSPU7W899&ywtpT@pc!GBHmF^SP>z zJ|*>4^^I}1@RiqB>g|NMXQ+THTqFXqNrLZjFe9#$W?3af8AO{}#xauRupIT;DCG&! zk(h6&D*JAE-|aM6ha)?FWfot z-d0)Cmu5mG!B}5cQ9`MM>|XXZp7>ZX{s^)vXz`nF_H&M({`$taSi;+W1L2u0-q+mE z$6W6{ptmF@YUP{aQth!kG~ip6qz(NVdQ41Th_GD5)W*1VK7#&8XDoX?V5276Ct=)< zQ~WjAF`_T1S+pPzbme|BTU>4{O9oOpVZVc_wRlDEvR}tG`*R;-9g(Tv+o{T= z!A2(%`TZoW#bPNzqUitz0pM|-H3c_1*aPYeGPkiSP8A~x&%3!SJ%HR-QA;V=uc_z) zJ>KU5Erc7Ugy$8$1u3DeGZlKqnPh+275CA{FKL-MIhF0@BRS-jS6niLG*nbh?!Z}1 za0gbDA#?MY&s!9$kZ@fk9#Xw}58o9J){5bmy#2dv;hf0O{`NUSZM=Y8!+qqvz) z`seCup}~_J#D*Hy3WJw^gZ1581}iL|G#xx9D+I~K!JNlwT z@`co97{E$E-=n`k-dfS&}(hL>-Xdzp7{emUQ_u? z&W9aJT4^o`3qSt;PFIU{?c$D<6^{V~q@f+_v%yGu0F7y#Nvv4VimS>330#-0PGheR z;)2Rv&zcfTi&Xy&VlvM91H~L(lP;&imi_yQO@K<9C5$?c-Q6n0aZbehB8Wx9p;Bi} z784iiud~w!1JXKd5jq?vA#&t9oTAvQCBgBh>xj}y%MZg1 z)r!1nY3sSbM`k%-LkYRY<$WxTK?E#Bglgrf^W%=(jTD~Lc+e8fFnqmo@3qkH^ub|2Ma z)_Wb^MMh@KwO^5)oxK{j~@O=K} zv>s)*FH3MKSMXvYZ3jjdS{aSFgG{bXuSjAtC;7@H_wybzhlV0oDb`O20VO>ihevMu zhj2-=M78P$Q@g3+L#vm^qlVlA13Yr^pw^u4M#}J;SZz(^hA`yn-b{P6DD>+-Jk#E@ z1wV1pKXGaI6YJ7Ai45(kjEeo|#Lx@Zq@5BDb|}cwJhNWLc$%1^-oZv2?x!X3k3>az zrrB09s-a1KkU4i!RdVHEwDhF^Ldj(Fdh=qh&i)=IHK}i46bBm5TwB z+Vy^+D@4g5oh%3#z#uRrEa;`B%6)D?L(N@6G{mylJUgjtx8Y~zI8xToOJ7YdEwGbA_I-8R(ZXIY7z1d+XVE{3ff51A0ZN>G!+SO^%6cYg@kKo{g=Kok>1ctNC!H z^(L8W!w)Icc}oYM(m+;pj;1%n%=tw{IqN;Pq%wBM$sDH-)f$~XxKyTL?L|!L3@tbU zb*2xcJaF%T(=itgO(W(cF+=r>foz{X-8Nd=|FSz}&ESVf!ln~cqodLQo+6Gv&N}~? z>Um&k+zkN>h#ih=@a7e9sP^(N%umWThiv(S6eB**eVV&(m+dW zoDqBPhrPDq@_QB6sZjEqWlPn=${p&Q0fX2k5XzKyQQSPpqSgh?Q^3AlHcv31c=)wi ziPJsU!2+)!GYa0AvVdg^{T6S6Ou9b(S$CORqVs7$Zs7fYdO;}`!r_9L=jvroQAH9q2! zU!iHOshIW$6A*@z=c>Rj7Ov)^bA3|^;J5*J)^C>{E6y+N z>+2Jmaz9RizY%6TRPvehTY0u-WFT2n?XJ6p6%*lKgN#c8CXx6kHc> zj(X&(1uj~hKb!t;2x9Y`JDcx|ZDFh@gXv_k^OW(rXqfDVEKZ(r{O8TqA2zWjC}-OnYLLfE{nZa}f{$MfN$;od47nMZFo^_BJ*ri9OFB*Xh< z>-__kV|rjJ2Y9HnG#yb*38PK{qo>j=JSW-!$J=;P0=oK>2wB?#wJWP)AEMnOec(yD z)nhg>x-3Ndl2S{!8Z`rZzj1AyL!Sg#w!C3mul_LgTIts0F+S))%PyPUhb-zOyMz9b zbHS0w$GivG{6^HxGmJYS-sl;3vs%4t`V_ek7vB}HTL(&c!1 z+TMeEI?bKrV-=o9@jdtd@sXyBzr6W*m%{EQGc0|RIR|fwz#ltpC_E7V=3_&D*J%#f zI<0Tcy@|^T<;^)sn8keJ^PWx-J2mRPy0B>+VzK07p)G?1>e*K&3@l#1*XdLlRuoOFGlZj8<9O*Wd^l*7@Iw)4P6zExe2eOFhTEFZ)G*xAs_V^Rd&drt$ z*&9K;x=-e6(J?4s!yt+GtbMFX_~vG&)6u$kd9K1Dxixdk!hRW2RuAt+GBxoO6|vQf zR*8OAQ1aKypVukCtxncDbANsjP22m}9bKYdAtCr2b0w{@3J}AIdm;PKYox-tCF6Gf zyjP@E;6b!xd#2wy+odLv34?VVc>3PPWS`8)P+@$=9Kg7r9#T;g7dH|R@EZ+wwUQC% zKB{L{RTeEB?MW8rv#q&CV=UxQ=L915#uvF7m7hMH3V+qq)by5OcHYyqrqq&y5Fo`Aiin)#tJcX9!Z^R@A`cid|E^lLmqr6m`K zhyl_A07fm?e5P5|jy=jR6ja+d`*R1-lQJ-}_gVAUUdDz&7A=gr=!MkAyb_#bTay`N zB0a#XCrd(=%=yB9t-BwN$azThfFC3|YCHq&aohq%&ZkvETcE2p`8>JMgVLZWudHKz z(Y^qlwI%ZE>ctz30Z&VVOx#on6iF%wkya zH>}qYG%DO#?{BkF^k(WouP=}u0XWiPl^xHjSUo5xnjI^*{}$jh?_9>_ux?$CN@G(r z45O&-SCjl~1~TN%?zT*(kI@c5NqVhovd}mTqOaAs(9qQkc<0W$sv&}ujDknw@{zgN zjrWb~wV|MV^RC z*HF2}iHZ*P>thb$6$9XE!+kOQxAs&$C?4llyw@;t@$+QQktL|-*U(|+Kp-hzVFc?r zUZLLLWh28#PDMp587!1_cX6pOxF|LLTz9X8lE&0 z_xeVRqyO=&vXwUM=a8pOx^`#7&$7|`7BBSeDd zSXt;EVjPfkmU3F+)f2$sk|JBrWudPossy1FmS5a@6r+}YAGglH-?Y0q7vEv2IN|df zidfqIMiINhy*%#q<2Fi`hC{XQ@tCj@%{->m?`y~-iw5eNa!b~X437`@h|XO(t>Zh} zXP@GVh)Q+N)m#!f^<0jR{0<`x=K4acKzl}-H|+e zkG~X10yep!7A#GLcp)$4d_OT{a_P&={qCajfHz3fXuG1mr5 zyL2V_u_QD3191@XXos9nSX{{;D&;%WnLQI3lo;DXDZPm1E zNROB);{W6PKzZ(a`5{V0r?{1}mf;4L;w_~~|Fko3fNw?hbUkHYsMA;8uENuRxHII1 zceBZ?QwIdR#ytnYN6(h(_B>(fbKd+r#%i?_JjOiND&q9OdjjfU` zW`wtPSIE82C#b7Mz4MRi#1KnII3=C;uOp1M9|i8Z^-G^jwAes^x{1U1+=Nf zWsFThKUUT{DjUwQ5qu!>I*rS+GQaw5N`(<+>oAjJ9mTDCyx!_zgd{bnXukp@vVxYL zO`>&lx*9X-o}|iR>9fXQn@A0L1L1K{8n-VjDw0wmRZ=&SAOn$XrS9#AeL;#Ja&k83 ztoH)tfy?V7$w}o=`PzkYOo9VNP=@NYO3hz>`|sr(Y#lL!(K`#mpOfNC0cARO6W3`I z4GemTQ|UWG64*cLc$Bff69ffX6pU5H><@nd9>#DOAiCtddNetrR9g!t;<6 zX!t`4bPfu(ccfI5Uh>RW$4frJF|nH-xHN#g$(zo3RwR`x&cJbfwe_gC`HsG<=Q%}b z1&n_0xz%zNH($$A+-^sR)dJ0YU=q~N({r<=W=vFjm*1R#x_neHI@aJxr|69G_S%MO z3mg3y$E5d;a!}}r-0=>a?(IUXX9?4gKk~%!TfA|)d?cDe&2H&$0Au$4#JUAS(Kq$t zY%16ht&e#*HrxXb<}h>h3s#<)jVytgCz0bPt+~B-QNHN$8vI0~oNCkd^0n>!;-*~0 z$EK$H$G%Gju01XV-9K+@t_`CCd-~I!SeP|=M<7x@t1Dn`zL$Mk^&qw8cToCPhh(Wk zPUEf2_xXZ)XR@i|_UO8_Bs?0G`=LP_BrqX*@-$b?IA6(wCpBUzf;Wrt?xbzsW>=6r zKVdECQ#@^_W!7Rx2nDqdnO(Ys6vT<9|K6kbGZb#N`z8<`-5n|{61f8(|}rBXS(`F!v2 zRarkIX!b(*y<)DQoMVU|8iv~LfeV`k?6S8zDvT^~p}xGLomuu63tUd{U2*?D>$pNQ ztetvK(P7fNtfz;5JU$tNW5IQ3=KI|TslC}<9Kbd3+AR&dEYCn z0vAYe)xFK1{{mGThjU)|#gQKS=N`tUx6W%T4xC|&pT*h-DGKZF6IDy?px-}!MdSd< z*XXUV*Cjev@(YRq8^pm<0ZY@Q?e&hzIigoFFt+Q=NNKn_*`i)V-G ziH92XD;MHj#wd5~q)PoVJCm4B^abgHiW8fOO=5x9%IUApG99x5#omI|3VqzjL-dbX zF(*N#OWQxi4St8n1YKH@UzfD$BUH4XYZ`RBDk_WW)&OOh)r;2698Q@=;Bkh0cm;4} zP}*_o_f<|eC$5wOK{Gx6Fls*_ellM!UnMd!z;(xqsvfkawnufCNnLp6S)tj02#O}+qQNO4Dr_*refuQ=9UfBhL8y97~7 zqh7&@2>O&kR2LFg$9&y4cu1D$OFoO!9i@d69(W2d$O!vrAc2qPd|}KbmgLSJ=wt+S zFiGUkypMC#dQ&oAqlob9vg%dDb^Y`p`P|L&DZC`+&ZAM0%3;_ElHQt8B3qs+WA5E% zmFi~dSE8ht^NPFXB>|n;S7hEWR+4Nd72;nLlajie=~$pU z2j2moP3PHF#oyw*i3S(h08{RE0G0BO)X}4D_E-fykqD=;Q9u@4Gh=xtf_a4|ck$4> zru_)rv)8if%+lFakO|bDspu%UR%xK$v zxMm;VTu-w)*;2kE+tLB3mRn>Zq@9@+aIr0L!`s%ogplk~r3B>fcmWT^of5j)Dy58D z@jM4%1-s3#a{fk~8@`kWX+C>6Y@6j)k?#FPRLrx-PCv|C%cP5SyNI7K3NFaBwhTJP z-|_2t6vLb4-}F0=1?3l1czLL?eLRd&-r8yjTV1?|9U;U{Bv&m#6mQM_DR;i0Clz4EGvzM)>ZX3jcoIdMmDiJgaJ z`j-x1mjfldqFeRAkNTD4P<~4eki=%seJn&;f7#1#$*%1CxQ`MQRnB_jhUL0Neg(ni ziESqL`7mV%ueht!F#f+<-d|54>9~{Pva8JJMc}!#VrEL}{=@V71_6c*-HG_o+`n%D z_|68MURyUd`*De`>sI2W782QZn@`I3fH5Ccq&&Hk6!*n}l12jJ{Mu+ouW{q+$y&&Z z+C%Zr-;8cB?I{`Fk#;sPvUrhGXYTk_HcNi*Wn$t(t&ZXBd<4F{rJQpn)9h|8$(S8} z(q}fT=U5q$VJDWb^n*=V+GR{)1-WjcWUs`)h~^ge;>Z4s4_`03#L$3NzQr+vry0)5 zqL#4mbRrUQHn)9E%KL(j4Fn17Q(4aM`3~w9n)ens!Ir{W(wI4kpy13*JXg%yz{y88 z4H)SK$%2_C{D%F&U@>-AvbKd5Ftk5xD_IFjJgEkkzTIpwD=Yf|mIgtYj1)#zY!(y- zAGD040&&EB%^8*Gb)xZmftTBlJ01rHW{$h>a2WD3Gz^r#bnH{`iWk>XHr1>q!C0-N z6zgK?l}beg!nkIR)yK8pzT}<09hz&eogm9Q#C_Zt?RlT02vU^aZ)aG#*E&?2qjDmU zP5F1W!?2lidB2{!k(Gx@ScstKe0hNGXe*lt zJlMY6tMHwXoStL4h+jCdUF={9zfHmPhV(L`pkpmA=OnCB=-|Nh>z+|JFxkq63Ob6B zcegbC@@o~YLuY|obYpnuPLpB(QeU;rId$s^=?QnVb(IPQjWIIfXp$6W2y6`|=RdDs zx`xjkb3#mXb*8-a`(hKLFuVxP^6fs6WV80{Y@_Ke8ive5Z7n~SRWx^uZn&*ekSNl5 z_v4CX0WuoLrApXg53!@Xal)!8;fJRA7l8ZY>iYACn~|IiP?HGQPvM>@@!#?m*DhR9 zakx1rkg$|C7Nsf(D1qme^z@FJIHp_aU zo_Tz|d^yK0sye{B{di1fuF^NZYnK(|Wr5#1v7goLNazwSi;G*Iv1_m1(dAE0M6UGd z62MY$FpI&X={FykrN_oG?E$FqnMT5^B#gVWoA4L`)6mN|exN`!PL$tLHb6vKE|=Vv zz>Ut{$79Y2;gsAFoPKa0?QtI)Zf)bm@$tT!8D4HyZghb~)nap_S3br#UBmmY2C@Zv zjnK|*BlrSXm)N=La>Z6xdKE15cHHo^h_Zcl>`HFn)#IUfCX!upZ7Lzr&CKotDvW6y z48)#G*6y&_?pt9PkCgZ@jzQ*+OXaTh|g&f^D-Es8o~&_SW*Mf3W_FD;Z* z=kxQa+6Q~2rc?b8jV(BQ68=$451@v17miXzx=+3-H@tB9*~y zbOL+6gudVCb+1;xIaSJKtcrUy-w=wEH1! z_B+e*b+)%GSc#kQAavtK=Gd*;*eKQY034yEH|NKvaX^uE$&;?p5Q->SvxUwRtfE>XL0fqe&CH@}R$ZQiAaP*2}l(4X5<--vH&>fK|! zj3QP{=#(gDUm)uv$z+2QE4Ap=1c5YZmPE+@qxcv7S?6R;=D*9I`X{mv$RQ(_O~Xi! z;8Y)kNs5H(o?L<^RgrTN^?`qq(Ul|5-daXfKjayUQn3sg@E>%x(JB2!B$c{o|fv3VFi_9XU-?0fO{Ut-5ZE!9+!# zv6iw)bOO{hwn9olI3tUCT=3|-ZRNu}QY|fu9uE$%MpT*foN$mNS&;8o(=tq8ATAk8 zvJheYU!ROVEHAKRK`lxJS(aA0w?1>TbgR!m`9yD-vd&*g)v{sx@FM}{_QO5_BP%Vq z!6sz=nQw*%t=M;j9{Q~P1vWP-<#4B}`@+5$YsGlm#jSLwe4p!(gH8$NJSl7C6CN6) z2Xg8G8)!E{f$=-_uslm=eW6|s$_s1vb|I_8&zITbmB@W6Y%U-^!j%(n?kBh%E zp`))!o3`C#lVC=z*ze2>R{EmYx@E)% z=YOg*re?g_UxY#2?k$k98A>4)A43{xKp$I;m6{nXfx6$QbvGwz;3*Z#^N~rKKw!Ry zjwz$$pwDPv#W>emz|XxOS2k$2DmCU^W{$>20E!;-|IUE?7dp9BAIz)WG#VT9JcCr) z*Y^(ydCZd?BKcao^UAy;0|UKTMNgt75>XLLdPWrjT>7adE9tT$%WPilN_~;5gXt@*(N9Qw$hJF@uug?1tB_w_S8N9X z?!m}uDA=dK+NlFGX(_8yL;~u!vJ!ZlvXp9LO^f+FkG1|CDMGsXE((*n|A~^h@qg)^ zyZ=@QDbyK0xxu87Og#Ruo)9qP`hf=;hyI=FtM%~q-{Rb+N zfaSY$b%9H%Ikx?t1*mFpBPL1w^tpz=SFv4Xt68}L(h);N-XW1)LQ37*1JWcP_}?g3 zw0a2cLc^>0cpIhFi8#Um~*M&2j# zhpJ1}r@6Wxn#d^&dGXbcCq_lZ|53M1HLQ1dvYPhntM`WWY{VE(S63CKta1|QN~}hk zf<*qtAb z{(6-E()Uj`;9HYm-DfsDHZ-Riznwn0Wgxo-cBQNOF;?^Iw?B=Z1!rB4!+W%nCJXu6 zbN-P~$a{`>h+@z0EWgv7LeeKY2>I}^bZ3=eMVabj?^<9CTr5=ur3!f*K$UA+EI2|5;WJ%jTx|gI!~n)j}oJ#cI;? zBcw`-XSLFM$~$bPa{jBLc0OMD;lun($-gLieD@aF(9P~Tie$%B8UM+I{IuSKgD9H# zQumjPkWn+t8M=SgsHaVOOmd{8AC2 zq>%Y@DR|*>+GhpT?}LGTedkNV`kr2R6c7@?ICY$HXcQ~{Z$2XZ8o+#qPcWImGnjQ0 z8Mn4A0ahfr#Ur9KPPaT8b?%-D$o~=aGbGCA%O{!hzlp6ZPqiG{b2jNcuj}Ryd+nDd zpK1HfD|3TFLRBmeh$@uO@AMsi=lTy*DN~U18p=bKfw(a~;!4uDCzAL(_9Y`j z(#~bK2seX+FWj5Yqi2_R`3EyqvQSBSTJ1u-+Bz`Q!0OU8;}Iy%)ZjI4wct`tq8hEy9owgw4jHDo^J8u zJK6ckgM;7WW5HsnP;~|=w8xQ)-!6-0sRVyIb>gr|5uXV%hc}P+53TQ>TkNA_vjd5F z*eh2jx9b&aW@uXoJL0|~ep8OLB{Sqy6bRS0ITK2#q|QU8zvt@D+_E#3 zAA{?Uw#UTy>$Jp^8E)5=WIin_?>8m?o3ub;1Ut$SEfCM6yQ$5)znyh|_Me@M;YqpQ z3nkex<3E&rbS30MF2eOYgUNO$F0s+6tDLLnEuNipepZ`^{`nXBo_2lZ!l$yb z*mvD``2_isb8__fg!nw#*M{N6BuG5$(|dpHB6n+vqlIqof0dU1!4%n0@{aU`>v9{J zJSPW6)&9GI+T!XqUZmA>H1@24kQe~N0gF{0Fa5ZqdMss0HnoresB zq6GZ@?O*czmro%zyiY_r`3o{L_&U;O<2PCg6SD$KVsFzyfNN}72?IO+$Vf!Fw0$ngIk$GCF-x6qJVPXYy0x4xtgA#v0<6>DSmcEF?m zXhTju(RxGkR9O6#>i^5Xlq7LUXZ-oqe~O|1r3v>GiQYZ0+y1ZM<-ZTFtV~*DFxCIJ z*$I*EA@i#O|B9>s-zN5Z(ElG6bSowpGjk%EPkO8^^RX!NKNQw`)*7f(J!z%CE0L4x zsrIJD4EXRFZt4F>xc=X-X+@u@_=}cI)wu;xHXL=Z2ABs=>(hT+=ys~)`-DQ`G4_p4 z=|rLX>Y|l_`GXI>3hajefV%%q#WUpEq+Ej%TD#T1LS>8Pk*;nnqn?QY$4QtA7o5X`(vYEp8%;-bOc)9Gmou2N-R}L-PXg>Y5wyn{`btQ%19(AUFjS6XR*rM zp~{|yZ>sYvD>dxx?QibBkUVWC!IQm_dl*=R3Jh{|$a*$0QIMq+Hrg<($cK&Vw*4}G z+Wx1kLsNyt&H;-3as4dXF26B4w` zt!>9UM~*7mW=a;lO#g40^ryGCjikxD@Xnt(WxD=nA&fGkBW1w3%X$U|xS{7i{%INF z$)CNEb*M<1ypY9uBrgCfXN}eZUEOX9=$(O zlR1@mJYkLn{|GvNXU-*%9ufeI#ia?~U zQ=D>>auZcmo>8DBcW24V84$_+{2u?DmFv%hLK2w!@#+CtRit5vaD~KndW5x)4<{+x zOZmg7`iZ3CO29{)_xt}gz`y?O4<_vc!_?B8 zr>~zT9}nO;rC3~WGuJX9r&$RL6fMPT?;MX#nALJ}j{4{_mslDJxwX?sijfqZOOD_T zv2>;X`Dk#T&p6Wpe%~8$>W}9BKuMk&k`GCi=esMEI9Tb*$6x-rSxj8~7J8_qTY@X6 z0IFyi!%GW7UiydLZ?lw3`*wzUNjkrF{d5D-BShLT1aM3hjZJER#( zx>Ha=q+@8LbAX{c1Ox_#?yiyUuJ7e2o_p@S=YIDOxW5iC?7i|?&)$2jRyr9Tcan^j z)+`~R65N;+@c8i@#7S*zV#khYD*h1Edgou|FU~8G>jh~kbv2#-BW7^ zWv905TW00wb3I~rlUu>Mpn8d#-c0p#hc7+?Aw8m)Bj^^bR1|htGdmwhj9-8AbGsnR z6m?j7YTF=zxKiF`+i^)rkyFZRNy%@g{C5WMY(@XAg8_aS0a(r2vb9aoFQX7ZIb#)| z*NV;ks@yJl$0YZ4 z`C3oD4P{O#*C{3P55jHk2iHjl#n8l*R_kAC@IU+^wbYZlBm=SfF9Q0T)&3!a*+&59 zP_2LOFGR%O>i?J6-T_W7cZ$m9_V0t(zYA=_543>Zn$1#?z;^%Bdj9gSz3vhNp}d*p zLEm3t^rXrcG~`4e!?yhyfbt@AdD%28YwKkml{s?*Wdlusu$^6Cc#L*Jc!V-dM|kwFQu`J`x6bmY zX$ZrPd*+6(y8kolB3P==QL`&B&#G~;!Rw!J6Fyy%m%cAq+4poA@x>{hMM_`#Q4YNP zuU~tQN97bAg5gg3(Lzb>2t-7_=2LYqBYJ03X|kWz!UY0gV{A=v9LdimnJXt{miGf! zg%GTLr)lcxZIhuU=gUl;u9@qPd;(;e{y?k3WIzkMd;DN&E7i0ktUbxFW>~N5_araF z<1`V&iuk9+J?zN8)*fE_bh7gDpqwF#U>x7rvDG$k{dnabSsv6vb0^gSVL@wCR@Rxo zLih8KQaJna49HaZ^U+UksQb$e4)93i*S8?`05;=vBANIu7ShqJ0B`wAI60c-i7xLV zqf-)jcj@s+`ZL=+W2d_~tbN#tYELU|Ea-|LC4ECTGXj6tgaGYgE}_%6_*S*n+Ppoy z&g_;GPU@I(QSsi!nEdw6(~@t&pD#JMOEBJf7a(LHo~u^{=BGQEZ1>c5qv+M}8JqO! zJJ$Mpj%5X&NFX2oG$NWZPjq#Mt~KKu+QfuWDh)#%ArCUAwB87MjyT;M5RV7!EBMnx#9czjMZcxO8X8A*E>MAv zRHv!5gBbD-5X?sv`fOl&otEFs@E>-CPg7ufM7m>H`PEsXqpK@?U2~_i?(FH%m?5-V z7#3H|xDph+>V9c%$Bi;_T3RL!QlBK4VzWG4`I9`L;n6H%KkK)oJWM>DK_w_7()Z_L z$?&_2qJjCv(?wjiZ+HnWoyw~m6OfUeh#|nRh#39JTmLl9e!P!&H3l;r9F}^R>R!?% z0|r)N(L}3S;_MdIVw@MhD$M5%S6jif()j71&#E8%A{4HnwlT^oXqZME^%g|~T=gQT zdHj#fg~|v|aqpeM+VxQf4&?uO#tNK0Vi~JS^Ch(>622`bKXU z`U0D-9tD0cS^%XQOPy_ld%9C0!uvpL*`RcA?1sF&Jhjjnhqh9_8q>;PUR1tj)r&uS z)0ZCYypA9^U5J{JhSV@D^)%^wvT2VF=4;Ze3=Q2@Y5UIc2&2j&;|D@4{EjjqO_Rv6RRId=S7Z7 z4D|F&;4Ixa!7rmf#&>p}HlL~7zcO9#8;7^JhkcBGn%slnXQ;q!q4VAc)IOBzp+9G5MICSmQ;8>q+$pAJ|Ti+YPpcrF|het0N z_BF}dGxI^F4vP4jZ~mDdGgVkHC2xvk_2v|GFpq(qY1?+^-8Y0>UUf;+wx!Z_oVbMX zo}D5gZAA`1r#;Z%^qtoETe(vOZ(a%QxUzd8H0?v;?3Z5}9+lOdq?|4x9B`f%>IL!2 zz2Z4n8F50Aqw}wqj=6&cZ}Loow9miZcUXOMouY&MF3F1r@#`U+D_jO^&m#&8aidhZ zfssQ)TBUCTzrDQ$-U;{ceN&$5D1F^Q{ydpi1XI=%^=?xAUA*b3{#RbyUh+xTZafx7 z!IVv^6SlO39(7o)Hq`abU45#fk9xTA7}fBwk+P9k&P!L{VOI6-)eom@sPP8;SB5lP zYWUAL=+NDMjCt(1RGcK7%sbSb`SvR)<2W-q;4*DCQC?^ag44<$o=w?Jok}*;mDOCF ze^?EmbRVYLx2D3ns6IexAQm-DtUG#zY}P{u&L+b;v%tbk^lO-m&=CBiv-u@ zd+dF$wH*_(M0tApCJVAu@igqdjNsVKk*11%#|HX&jF=+LGj`cN>kP?nBI|)MI;_LWvfOhQK2MXt4*WLc0T|RUswyBP} zv8f7rkOq3I+ksOZqXv)mQ$D_h2xaZ4jj3G%6LWJ;ZS9levV{*q^A$^u-^KMOMQUDBO16vAqKE^xd_&Yw&joeL%xr@U)N_`2#D8XU$`06=ThG0{`L2hFjO04 zSJ%m^OlRl*{_*iWpHlSV+pf2n_;*%qW^+I8`NYvKSB*H~;Vc^GBe~`p$@NxfYHBdhR5GVwAbKXP>9kg!IeA~U zA}xG*MdhCLS3&CP+rRXT!tRd#%NXuPhoWXFw8J})3zo|1^JL#%{$Wt{#rOs1E~aM( zc4{&SVQIe{NJkRu*~2?|p)ssBx%t`QlapGi`|FtU2AC+N;$vnLmgi(#W}yy|%$#FJ zgF_v;s_e}h2M2u2Q+_~~u8zvRm9(lHb;GXQC|(;wEL2Ugz=Q;?Ji!tTAj(1`dMApk z8u%ekQu3#X0=iZ%&b#V{bCBR}jEIiyK!1Phic=fnHtyOZa@a{5T_QQF4tg1Ib!!=B z&U*1!r{UD8<%SKpF$Z_qi=YJLP-I|QnywAWD0}VRK0eN;Z~FP8@PvtO=qM4cZLOu! zN>_BLf_9}X#B990ZMZ9*TS7JjoOvf`#i=8*13liQLU0GQB=0c`BT3)L$Rm(aF2@1m z;K3c6mXq1sT|fKOcuh@1(ofG8VSW+m>9q8{{#Gb;uN!CJJIGkjsQOz41%>Z|E*p@I zV39I%+isL?Sfv{8NgP(^ySl@LwRFjm&-Y69oeBbs7oL9h-!7_N947u`+YU7Lm5zPQ z58XSWTy<-4A_k-@9C5MmB(hEf)44~Y!3OgXLMg?B?-N4F z=UmOl!&MIlsXIuvbgOjX9B9BS`c$;6HJ~@x z(cvu-(Zm@)%|ZXxrllE-r~J3yDBO9G;nJxvxx&Pq-hR^H^fM0c68*9yXCWM;*H=EK zfM0$LnhG{bbeoi3A}%|BQR~>OEF<*-xEq+cG2s|L^5H=%i-+BZ)0rR-&WI#?U@Mz{wQxJgvZx zX`XTX#}oIt73ElfCHHeS2ZOl>zUR)pI{$ua@a^P~+x}$7UhZBXRFjEs zy}ZUQ#>uYMGU#GO>u3;XD(WVsE5{1Sq3ii}zyi<}6+XJI(QtCKqwX=WAuwT@<7+*^ zUH5PY*=a{%!9rJDwEo)t80)Bs^0?7?@YQ>CX!R`Hh~9x_XZqCH`D<@k<#nEYv5aUL zm({}9)7{pojtTQYJ`N7si|e;z7v_Q}4|gIC^jlljO4Vs7`FC}k=6hP~^HUEY+y7NmAJ^mW^ZFMOl# zNw!wnGgyu_>c+H>(!i_c2>!kAo^{M4Hv_GcbNCqAIxmKaqO7Ylh6m@^1(ip62blX zJJ)VJr_(t*=s(_A`H|lOqrXH4mw8m!-RrgM_N==X?){PMfzN_ATgV0FvWXs+kMGZn z1rE(|c#`*YY6~6P_^cZ;n3sqXioTqk#d~lKq*=v}Z?)$@JB(P4L?<_izSN!W02a59 zz}bkzovJg+XPaSMK zc|<(IL{Z4(P`y7IYrUwN2w#EOuRSH$H!(5k6zJ3vTA3r>$BNRWbFDoOB-{22E1G`VBF}{S_E836khYCWU`Ol ziezy{g3XKdz6<<~gi6NeAA7m%uVDz6`Hvju2Jyi=n+ zM!Kf;2;t?|9?;{^xvPv7)WUW(a}5JqT4*b#8>Mc#UL-hfoA55pv)`b~X=r&NL|IPj z&b75OG&*{*^Pzr$xb~1xevkFwJmsjO8M&xFb*?q(GFwxAu09n8HR+JYb|uPa{ITk9 zAd|vzzg;cydqi9H!HWd;Aq$$JY2GVbc9*su)6kc9>+zL3ud>+{Zu<#}{O~gK@n2LAx7+C2wOrO|!GpPB66bs6r@*yo_7ho@<$~K3 zjKFMr90kkc)kn%IIo9oMl#z2^_~fh-n**ZS1E)@sZ_!YN+s+-h(`cVbP8AwwI4v0{ zk0Q0K+cFlWuOD!m6H>aY3T^wudYJAfqYeQLB2Cq9j^4aoFpX{68ON*VnNq~GLP=fJ2N@~Vx|Wk7axQ=1Y(T_>I74l!;+nirZQP8sC$DH#bg668+NBl}sewGBV4oo{FGeM^f- z@E)~(m$Y?IwZU0sKk3w(ivZdf-7aDJ=*nfcQ4X*$tvJ?b(<> zls*-K1#ct(&9rOPW4Zt?dg|$mWd9Ag?C|s9V-(;^8+P z_9_mwZ>%5smL|fBW13H_dW=rIH8Yj$2URIKBf6B9PXbN7S*kZfZ{5_&LY}YXPmSd< zcHSVLdcJ*B@T$z)AR}R0mv`FJt#i?12{EbZFrgQDaWFUrykJEbxYa)2u?Y~S7UUkR zHv(@QY*3+??;XS05fDkMLnjf%DuKPB2dCo~Q`#OzxEFxU=qXp7jFu=vvOV%24wWmj zGgzKpeVTh~j`3qwGG~6q5j;28= z<~r?!TDF-ge)8A6sOBa}5^<@dy!i2)p1w^1DFUtrmaZDfq;7GuTgzjvGxtIFYoOr_ zd8lal;-? z0oBGC{G%4`I=#{f`!UOf80fxl&+2s>A~iL&RVH@B{*jI*P2n7PN3k`8GrxM)W_yMp z2&N>niRqOGLsWFX|8%~Sm?2%l{{HPYPH~~F--`XXE+5X;8gpXxCcaHMY+G&pXa|W1 zQ+Ia`JF7LXG6wT*e-v9NpL@;jjv+y{I=^RlE_o}Wu-0~OXtiVfd?oSanIV>f*~zw| zHft;OGrwhx+x&+gCkzQ17~jXT;z?J{?I!|v^nKm(5U$4ri#uNX5R%)1yP3BXeVcS) z6qqxxKI2FuM8W`cB6Fnhh>T%MwIQG2^$(aG1$&%Z}%i*IzLvvpQ+O;%mUDIkl-^g*J^ybfq-w(-kQxWN23=exu~O0H3grz1V&210Q%%Xu?N__Mzd~ktipc-wt2244m9lSx6a&@m zSROexcHulUv0r4eRIE0LLr;z$AhRY&KlpqZZyu z;nAq|{09OvYJ|*gCN3z^0xEdX*s;H@9y>*8#xu7oU({$YD3Xz29a{33rRFrdhJW1m zWZh#}aADf#q|tZ3vU8oi0NUA;;e943#VP{zb@ z4|a656^I2Le>A89Kb`{Y$$}|H(r>UGz(hmPDV>{=J+(wL1LIx@4tIfiPvYG4MyvBm z@1w)&$(ON%`jaj+x8uRwq2SH?SIG{O;QRT6u`Y7+|4Dz3gC9-jJ~LRes?e}kd}Ow= zwidC!k85IP8o6I;zqGVg2nyHrkOU>Drj+D$;_8xT<}n47bZXYVYusvWe>Ez3M{gyM zC}v1m%W0x|cFcm5vop^06tw>9l!jQtqSRPm0@aFgq z%jj6ylzUZmDF!eRYHyiy@N0F=A-T)Z^_#0kEPTY96sOyRl;93{H2Rcmq1hpI{uxlc2sg){L>#;mbyS+dqV0g(`vNb63lzCY`Q(4u5FZ%>29$%x8<$QL?cKNJ7ip>4;$Ay3PM-o;L{FB5l66Y%H{}shNW)=0K#R&&SI=Reu37rn) zvvKsN5wWaeeV)$=HHZ(A)IPMvMSGF!75Q07{W(~@R#{=mS}C*L;WNxsRZ2>|Rt$4= za5&mz=c5l9*G-@8_>b9&nO1&89}gwdaU3^BUKG)YMO;5sJ3+j1veF1t|C*!gh3!(ZdDe}inpE6?Gd);>XVeBM| z^x2QXI94@RE$d~Sr@HAO3^eBxu3}2JBS$;Vb>ZaLRpf;2t3xq}zAmKNJg7FoDZWE) z28RfYp~0=-qjoDh=x}sCk5nMyTQ`+lCSj%6L6TJ%r^n>D`{baL>lG0JWJwYgo$ZI4 z*Absw{zhuQFg?J7;hi3Sr#FHGN5Sxw#G0gm!JK3b;M$(v-nW(%nf{?}!d;>g5;R5~ z-8q_?6Jit`Hip{6Mky)g^TBkB_ou6s%Q@m;+%5x0t9fdB=0&YK1Kr!5oks~!&8kU3 z8WQZ`4!s(y1EF>HsAoKu8S&f77o_U~>S}6h^4&$8+5{nRanKBag-&O1ufn*GXR*DA)YY&`~7<2{;E1;U1ZiEezB?C)3P4_~<*6-PF z@)_|T1TG>=3$s`hmQNw~5Jz7IN^C$R>3t)Foh{3Pz8Xes8=Buwt%KT1IwlZySFxhy zl_w#*r7KkV>%Winzdo&}3LcD%O1zkjS~Hc)T(muwcpU;H>rshh&3QVO!`vDRCZ4gq z661x88Ehk~#oeIzhgBQ3E5RAJ6>G4Gjjhn&O8Lv+GoIn*x(lDgXru#S#r#f`cCPu6 zD_cr!mtga~`XcV9L|kUW#!z1=$<>86waonNBK0Wu9Ww1Z@AJ^fx*}a*M%=?|PpeXT zo`5x%sxO@PM8_nsi(Bt!szvU^iAGL2gA3h;_s1;3EW|~gtfMy)`6ar9HW-~$#|&yu zx53-}@`(0}N$0V+%X&VduTRqn^{N*Df?s>R{0!+W41qn=meR8|L5E@H=y zkdb3``Rj_^AScfV9GeBg^2&X}tJ%^d$&$ud#^P`k*1|3Ft#O4apvqm$P6(9 zyy7p3l7M+8%?G(#=eT`J`Er_6!yk8}Y>dgpc=(QXBF}}HYN=U;22kTI3bY{FGPV8(to(w$^0yd6NI;nhB`ui68`X@Ty;s_}|Ix+KovYRDe`0 zN^~lvRxq&a_gzdsC5$ob-&1_+yxAb}2)}J=e>=$ISZD;i;nO)3KziI5&1V$p)Ld3K zFXz-V3?D^bhoYRwa-s4s^={VbKw0iItgYeCB*7Kqin?(V}WN zf8BV!n9j_NZ9^dR1H6Q+jnfhLithKl#j2weO%U{-V}njKYL}A7!MIK0Jo?i~#~r4l z-T`eGbQ#;*iJyXZFZ}k{iM!pHWm;L;kX9?I+RWMdfd|_d-sxqX*tu;##uS=Y+Ky(6 zhh4cgbcSg5s;fOau8m z9z4{1K3XemwJ>x81~PBQ@~syisA7R_tJuSBSD#3zRMGD36*S?NZUkA4!!Fz!w91G! z1+}-*!1H=WaV%X7YL`W--AAXX&CeCrb(wR_jV*$)*2MD)-|1loA@1VJlJGSD(#Mpi9-lVqcOvQGIg{@Y{obiD}?*}1$ z?PH^|Q%P%|V2r+rbRmMlVaqx<_}7kwP%IXnp;5C%iXfw#Syp+m9*68FBr3_3qxwNT zr{nA8P4@eUQ_!g2?v{tp$i_Ro!xMx@0^8Uf;b%Jiq*`ZtEu_HtWEm0Ndc~mEh#|Hr8bN2 zR``EIIs}Y0c{J4rVO;6|icZl-E7dG6k@4#89zkk6zMK>q9v=Q3=*&u+DZO}~oSeK% zk@sMneSz}AwI1yY-u!5$Ia(0k{)?=Bdv|~x4^Nyr2J^|<&faSEcd!w@sSC-;KaGoX zIX8mu;q|LkJ7!HsZ~I%@Frz+J8lE>Q8>c;4t15dC$KIcrmEU^};bh%`@G!tVYv>e; z0Klf^{)iEaiE$?J`%o>%nMWdr?W9I=?_ySK$4+t;cbrGk5<~hBJP5|A?VU0Gw918Sc#la$}6C61L{#vkcUP3=7?17gG-)R z#FsOul3K-K!|is~0Y2>FqJL%^p=lPmQp_-M1Q0UbHi!Ii?-uFiFDYkrCXJ+h@omHj zMR?VEyTXH}TV1jggKyH>E7x!Dodbk42?4(I6f>W0nY+?DHxz>mcWC9w8NXR~X*|Z0 zS-V2P)-g+#!l~;ThbcgvJ(bcprbl$sM{RBO8V;X;?x<$MyFohm5%6X=BWvAHc$~cM z%m>0=>o)CqwrcQx1t3x+MktgA%?* zjGybebICTZdSkIfup@XB4UGeo-)F2Ju2Gt|*6fdpjoG=6YZw*P0XTvPspZ_3G5<9{ z$dY0%K-pEiYk>8~$=;Exdty>r-X5eGr2^&K@$u7>Esv8bp-)pA#0ssWV8leLfGaTr zE+(o)TW17O-x7t1$y#u`znse}fq?WeV(1R@t`ia8E^(90*+sH5VYpG+q5Qy%@Ki8`S z)UsMyw949hH!9YTH)6=X#ze!iiMbwP>nrA}73r%Eeq(6wSU6s(Wl+{Uv$KJx1PL-9 zwv!vHI{`Eqq{OL}yetY->zFmZ8BZC#mMIqrmAfa(&+WEx>%y1YCU*4ii_&{}*7}2tA6S$m zF_5=xY@EW5+T-Ww={!{MQf+YGuK@#A4JIY3HzJdFNQ%vXaT1nTjjmnqzBf=7OnI!p zJgo-e>rT>4lASLp{ifHz`Ghy7W7ECsN9sd|0J-!Dh8kPqmN~?teRgB%%X6UVoEEDW z3tD?zGTX{2Fn~n^cUVZ?7kkX#-+w*^szsl8(HJG;(v>C^WuSNh>uN$CRB^jDsc}Lx z;dXNl&@dKFyS%J~{kpQrE*Iw2TDP+jdsg<9hhfERF^TH$8{%eOD=>dkUO!w`&X-+r zgK=$CAx_rpRJ5}Q4_PVPH!bKvWEV-wPEIPMv1)6)93{mvj`i3Faj&i${;B`C`b~ES zfpNBT(;dkv`BqxX8w8}#W8`MzK z$M7XuCx?Pxy((MCNL24yuR0B(T{Awm%RN>ypM$`te}q^7kY$CSb}?wJQ!zO6jxAS= zALV!?%gOpG;Z!Z%6ndgdyfT8vD8`Dd*pB;@r>_eSrT9gvygFW_%7~WF2*J~`hJR^4;HEu@C*5)>dC?JoQ5bpFC^E@}< zw*}^fMY=%_N!deX`Bl%?-7hGtfukJwvGg?L&BRLIvY)9@#q}XqF@f{o45lSujEN!8 zb+zZiScebOykOMMFmUqP0RV^Hdk0ZsyS32=!qh89v`A!9F^5^BbzN^#A3%hSATSR^ zJU0Oje4J&T2cW`$9ymRp+!%h^WuEix%lsE4fwW#^}b;Q!cCP!(lQXFW2 zrhO)u2s9P@8h5hAUL2$I{b{qiT_yIx&YSr|&Zf0@V?(yg`c4bHhCua<;jvzLlAq4` z*xRnli^0Vxe(TMM-B5gdY^QaNl7raC%@{Crqs;OlSCSfpU56;(QEFj@jA?c|-R%CN zRyop^lt6RF{OO2Q{?BmZwT1V%axn&6tkk@FpFAWQ;%LHC#eKBvO4=3ki~d5%sBdW@ zf~hIXFO9<&Tv1~^xQ7m6pKA7Abi8k88~7fo_6}S7lZx8xam42g8ZT(H-*=A3kss4& zvc?LT?hR$@lajI%c5=A-tr(t@j2$^(mXqL9wUUd>y$A5898<0pfq(o% zT5-<{^Z2{=li@(MdL5;hA@;`;r31J_yz7{CqGhJu_8NK%p0PA9i|?2#mjdQwG&xY*rJ{6QiJyHOVj2aiGGyh{BAv`V)L{gbVI`#7(S zA0c*=k$Yb0&1ZOK`>U!x=zjOh7#-h*m2Q07NxosEX)aS&&@D?`v^bQ;#MMz^tu7-o zP+qo3X8Ou^{WVQkkt8UlLem2H`oV(5z-2A)P(Jq>hLOohtLXEp(vRZ>?@~$$cbAcw zldia3{3ob=`*#QnEKU|)V^+XZ?-K+x8+4AA0E3P?qu=D{wm0UmmXwyZJvX0H%|Iqs zPFbP5ug8$aN+)5@2ms7TTp!(<$_nx=jZhiAId6reI${=)hk2$kd!|}rn0H>GrnYPZ z$3sJ-GtJe6*7+3|8%;3UCgt(2=kg{UaSz?R5Nm3}5zQ>PfOcQQ<{qG5Tfe8LMWAJgK&r{GtQNdXoa+M+C~)9p%@Y-~srQD-GF2%P?ISb< zyO^xgocC$yiu5ioaDpaGSbGC&5eMAv=;3$bbbk;Bo!9ZXc|>uk_%34Y73-f$BX+zB%t$T%~QRk1$h$}z*$5MG1HCeXM73l{ZThU0Wx4kR;(QFW|rdnd? zBj8q?r%`BH1CNy#TBKq>9ihq>m{8MeG_FQ<;NmB~N-00+>OED3@GbsK1}Ox>AF*CC z6D&67py%f@=o-eN*RT!Fo+^fiz zHrkIhD*m+St=>NR&Vvy!#Hgc;31&1u#g4*TJos%Ouj2EmGk@5>+XrBD8;`uUi|{|S zFce2v<(v&`PP|bCuBgE+GRa`}5aWPP?FM~J8cOn-RIIaCi`ALELBbmAXfqk|>pQ)e z6zVa9sH6?ObxBF3OjsF{lb;mla^x{`@O+!}8A+ zz?I7+q3+o!9vk`6n}CCcDKNZiU}hzyUU`u**&!t_OPB|T$7xr%IaG7{7E7ub&CJp} z-}Aotsm*#KTELEo_WicsU1^3y9fe?36x`McY$4&m^ z@}OjJl<8BM8$fGH@ygIE<`jAyH*;KX$R_cqvLWhQC1cEnCkmwOc_0A7ti7Bt+}9&VVSkS(z!~cP zrbx>Z8S))1e^Y>uA+m<6)U-UdLmoggR9U&8$li9(@(FP{1qJsM%fINjGhF024qi$gY$wuFP%_jRD4#FEytLY2K5t+KDSxCt+Hb-5o! z*3>Lr4u8}TEV0O#9X#q+;ONGT6K*H|d?qv+T8oY@K>bRD&P>)Aun#N=n7yQ8p)$MXS~o`asag(^4u* zbQwjrLqgeWjVg)sHIs zq>DZpinV5n7t|7bC&>sF<}K6mTsa0)@7desGS?VMWuzR8%5=2F%?sfZ>2jxnK|ofH|$OjP%865Kl8 zD^shahI9)nyNnm7epB_;U^!Vn8?vfv$oDxDi5DCA91M?^&sK!H(hB0fLFz9GNeU#!Ew*NtQ?jY7{2XXEKO9C zr1TIb%-;-9-w2aV*FW3VS~3p6At{HkL>eXEB!q{W^gU!pSXlfm9rpaO=QQD{;Vf`W z$Plmjvo+5XkQRvqo>l`4VHapHNMe7b`@J$t${QD z=N7H(S5agb6%DU^+qn4&6#bjrr`38TkszZ+17`X>Oi4SpLItpR!S-@6dKVsMhXx8& zK~c76uI3;uXwsA`tu?Npz-!&7Ugg1$kWhb5r3X7NQpIzUn&r~nGL)fH10ft#F!&L~ z@m`|^MV(YOnJ61L$2!a8y8tQ#$uFmtvX10Pb|EwaLg&}0JI#-(;mDHyX9Tk&+nd|4F;ZB{DQ zI^Xm$6GVK=_416?RyX_FN&5u{yij!PlvcUQ{vkEgZKg;|=3|7(00&y7)$L-$GnKB4 zyeIDjQOz^EBKZn#9JJcd>6w^J4yTC}dzK!+`GrcOOn8{Gb*lztCVI(x7)+dlL~p9= z6EQT;U9I$Qz56k%02&ZBDK-dPFh=_NLTR#hvkn@V;Wu5w-`~$&Hw;c95jvX zjPZQmaa}C}ZlEl-v-o~GcN$^`b%kas4Ca`Fp4@hYEzS+dk~f+Mu2dGkRn0;xR*NBg zf#p}7j;a<>dLrHOl#Qy?l^6kInh5JECT$Mn{r~qQ>}A3N=&INQ>*(5*4S!auU$Zl* zXRL~t7an@{3QL61qdSGF;O#ACi+l|~awqgJOt?pBFs8StnuI0da>-OhvjqqR!4>0A zFBxO*CL*ZQB2fAU@n<;Uw<21eb8^i2+D91oEcL8V4f_R?F5d0WHqOi@>NzPhTkR?y zWb9CoY!WD}vv`%2Wfl1`Lt3g+bnz|VWWBT;Mxo9ruJ1+H+w}gMooo>R$>G$@$>0i| zq<`{kO<`gy`AXcPV^_{a!PEcM>EE*RX5-0%xF07J^NEN5-V1 z?R}D{$~%=Y71L=D$+n40N3jwEs2A)c^8;M4vRBviK;5=c-1$ja#*6C~@0NZ9LXN(c z7-sgOZ$T2g zxb2yzS*F(}Nv+&yXi?20(=M?e@HtQ~v^HB;Ow)+wCtueAH&L4|Cl3*=)O`J8syn3=mW1gERFwy5vC#c)>gLaM8U&-&A!F#QJ$KzZ7 zb&>z78$Bjj6_(7xS`bv?H)KftS8_w8^aZN!X;4E25Ak-KtK@{mN* znG?FfW)8|*n>+L8{mNvRr=)=eZZ7I7jb?PR3(GS0<4P3FQ}dfvpBsIpdiE;kTcte2 zD*9FK3y%yEAay~@3p~O+{S7c8(>QeobD%27zxU)nV^(^Zu&#$XPfcP7?APUOV1GWC zN#g0splB-DM*`P}p4h||MEVt-`jj=p9bh`cba(R52Fq*ZXA8s8{AxVppDPBc;IZtVN z@rO+HNHN5?r6!05>PK2Q@7PorJIMJ}&*hb)L7;FgC-atMR_W*6A6rf2Jgq5I zTs?1fjOA737UMTP?=60I>Nl=}b7X&h#IZ{B()c?gQ)PBT0mYIV?$6t0V%54tr~Q1!%1(%yw~45*428F>J{z+QG=lt6i0C7jsy&z%lhg5kWwG% z4CmCxX^J)0hMxP72K+?7Z_oF~=*F9JW|%#?spHq47{a!SUY_5<-^s z^T?|96x9uu&$fIQA_Fyh2T39*WD=4qRr6bQvskMTC%>Dc=x18?tBoo!J*C@ynZ>ldpdu1(}C@O1k&E(7F0& z|Hji?Zq4gTASiwJM^z9)mr!k0VRc3J6m& zf+9r6WYFQ5Vsmf)!-9T!a&+V6Q>7X15As(PhR!S+9^;NlfOJ%85uDq(uV$33NWF4& zE_5(5g!&$Hl$0w`)}uAJ|;E&Z!Y=!~QB&)FMjMgJC-G_}`5oXBL~ zN23OdWEe(vb~LF5@@3)SCu!NW&w@G~=Ih6-sypQM)!uxaFnpLj(9M7@=$?D9Yy2Xg zFEp6YvgC!rm~CZ=jA7v`a&k7edKGg>s8JM{#q0{dda3CzyY*&K$T!2Gy1BAh+NUB2PbSVC87wAhc{P#T zva%QIFHGyD)eU0s4R6p4SXn%bjMRUaw(}jW4DVypeg08rSg`JT;tMGw7l4)twhgd< z^lf7ZIVc4X6}=OX(1$o*18GSOQ4Q%!zcbDY%slxoRJ?qt;ys6tJHJ&diq>7*3q@gf zyJu@_8X$cz`iedWQ_?{5g*TODLj=5+v~qb}`h_K_E~mNjCkAcjvIflL>q_yv`iKUeQBty6|vD8b5WjC)n-#c7}5(tC2vwZQ{XNQbbC$Xq-rK2>S`93$z z6wIg@t#rZ+^dDAkzu!yzC+$09vFdQuObPvV7OyAxRwfHa;xlE#VqA7vCdq3`mZBe|W z*6|C#k$&1gXCrhK>;8k>S=%lJzD-s?CjZNfSUE3!>SSVe8(XUp+bPSIjVWZXJXftZ zTO=>Mzmq<~)2~mK+$`yiNq|XOfyF0|R+_X3I4kc^wVu9@**cseV!_3Uby|6y-B)|Uj1hR0<5 zuejnx{}3RGwCW_rGj;qV^^G@pzSnChTm!2O(NBstVA=?!j1$ z92_fpfg;OkUa4Yn!=^@Sz}qm@tY+Vy2M;MoH@Q9!V`-|!E0oMWKI1 zxOymPIs6t;CIm}^LzBg&LHB1VhAl<))n1w{sCTB1s+jmry@z*yDN+YTm2iru$&Z<| zltdV&YwCyG{op32CC``^(cmSf>umKJlZkc*(b$jHXDR-@X{iQ&jJIRAj_Z3yYPGX$ zW0;>f=x=PUMvpVpM56dz8X5QMz}Nr)$SXbd6ZH|JYz}h{|BWuPF##u6oVwQ)aHWh} zgu;6)Q5i2>M`wFepjpp!%ebl7aZH-O(l0FqO0p${ekm=_nvLjhe_OczUI|?aY?bpJ ztx{A?AlF{$lL9zaGEwOXnQ=MCJQ23bnyGQuHC4lW=35cRY0v7ajZ2pJb&>*}mZlJ9 zc1$>2P~b#U9V)Sd7-hguWehl4XPUIW?R8fYk+(XjY@bd-*jX&o=T&&ra}wfbA8GUzwO1O-A!!}fkK~yyX-14<%4g-GFZ_Sr%n6Gc(l0V z*^Q#py*~7q61^&=CsJv>p-MOZtLS=sDR{RjzOG*nk%hgU5D6QwzAxiX2)R+}J!)^g zSS@EVoGn_(*G(jUT}f>MjvO-8f24H_t!DQ256imX=VWio?QmzdJ^MRvfenhamMmVs z5I2{t6O~g+YhbS-ZZyR3BebrevM{or8!>{@_f^n6N*)+e2XvnV2A2WYRB&!NOuw3^N+mT@CIXP`qP z{UM2*PSY)A18=QN9ir~#w^}vmjRrNOxHc(85cHPuO3QNH0)Rcv(vS2%_$V}gClQg- zz!r6@A$e_4<@Wnk(_&wvhaqfKyl9=>>((^X@ync4u#h;ud&uIF5-B#wssk801Om>N zYBMI?PfGi7E}U0|@B^B^t!%ZA7X#o6N9Z8!Mx>0e{MZ@?*Fn)V_pEHJm#L4KWmX=Bc1xO3e~L~P zShO__IqGf-dMP1s;+g3sEKI~SszziED+!M@os$1A45IobK+m|`u5NSv9YQgQH;osb zlx68~jlYOcTIu!I%u=Y_j3so`4~ZlMSra>MzPN3}&&-hL3qobHafjHJHWz0r2kn}2 zmd*q|Bw&`xYKvr(?O7R6*5=keS+6QHtDE@x&Z*d8Qk6DG3HoGc5_pK3mYZvR+>q9i;(;h1k`f1{mhBed?(-r}PB4FuF0k&?zFQXoj6#7X-d>8vFAZd3xB zL5l>#>7$-SnDz4)?ce~JdPdTh*j4`b)ZXu7^F=Flhqs<3H3>R?OnQ6oxsh@P@XGsp z3@11(Ep5Qe<#@>`Ehk3`7_!C<6O5dS+10vycoH?P`(X`mb}0?5t9bRhM8DGG)zWo_ z0R`j4ex|#s1PanH?=Ja3h#=|SBby2MBe@C>nYJ7ybE5Y!7?P8>hZV>$T$?N9@z*4O zfaUOeifL>oU&cGoVk^-M?2$6&-128h0s>*QU1{?T6xhs{VkN=YS4?d22xWD3>INNJ z9VI$W;H|qW0jn#$Iif|H;07w-^9*8FZ55zo4o;+Z2rcQj?(Wc z8o#+^OaY&>i6w%FGxua`HC3reURT^QmVDcjdbi4Tc3(QrQ#BVvf5+Tuqz6B$Yd_l7 z;h|1s=(GC~L%p=vezF?SNVc7u(GNs`tvA{@3 z@oI{o(}N0PxSqgKKfCoZJtf8Now=>|O2Xj5OJ}m0~1W6G>ZNKKKu4aR0bq)ML?3KH>>roRC)0;(POpmFKF<4`}-L`>B})Nw5M_0 zr%+edm+dD{I*?NC2}o0V5?T^^6QqXTLlvY*SE}^i@@(W{{BlI@;uD7=A2`^ z;~nMQNVT5kNv5EwyfF@l$>q zAJ7qLensG1?9Ya*WxmHFNX6XMQkk3Rrd-2--c0B~Uikcl7i~bPI#5Ho74Z2vFO~CS z6Ak02z5&f`(VNy>DISL`j>;{2-ZO=dGU?}bV1mR2oSI(D|6 z^GVa20|vElhN!4)@eb6z7j~RJ@K}~G^iVlff74_CEUd~s#QB}uW1TLbi;oFt{fJ4Y z>`6XYT`zj^L-fEUE-sD;)E;vKZN~>&Fh-v3z*}yZ6cq?0=DK^c@7i3=D1y4d@w)fW zrvdXnnVEl|vg7-39DSbh%~>x=j{5$+lI4%lY^IU21RCe-#qORDWFatI^V5CH3N1s+ z*E?iG2l{Uc#k4-d{qAa^j7oB)v7D3w4o>tKR-h``A%!{jA`&m}ON~mVC%9X5nS)1Jl{>RK1FW!opa+=WQT`#fYids-4Ht2&=}!yA-<&5Y-@Eqsuio0j$yAAs_84@lK@s${^*kmfbOwN0CDre$g z^%>GdQf7I){?WP=!j#O z9-#-00*!a}m735b+$IFa7ryNCA z7?yKQ&+%0okHoz@3u1DE9IgPn$n+S9nv5>YJcl&9eR}DuQXR{di{;k}q82=ep<|d6oiOY&VtsdJCc^iT>o{O|NAxjw$NRZ=6u(ZB4GM&-ndceg!BU;xQzQ4>S-U3ZQrZn z@E`ckAD(DbS;l9DElz$4*IJl;jTjkQG}#)MQHRoW&Gik$C9tgT>Zz;G4=&SOX4_13 zW6}&zw7T~ovs3VWFny>>J^7qvGe^>jpft|jtM+W=!#d4@Hw|A0KDdq91Cs~d+?6n^ zwy@m$)v*bp<0_!d$RM=qb2+6MA*;L&9tRcAyAB7_^D|#p{3{dwuTP8fTmTqB~{U7L$*YtkxZ4ubO1MuS9$K7^Psnu z!`h(;m!vDaw!CWyty=#S2>G%y0fPrLzNmb;dTbTq;p8^fQS<%hkf=3d|E65Nv|N3x zCvBVx`c9@g zpr`AhW_297(q$$xBf1t+R;4HB@InpKNm@emtpEttwDcFi-%eV&o7AD{UGI36262=a zGWrz8hlp08Q)3;o}J^#h0<)hQu;JUjwZ;q;Vn zSGaLCl$|J~tMfFY!n3o<`u~Gd`4_QU4m6j5$HsX(;*KGTJ%Cdw_*2x_<3pIn`q9fw zR|@e0*wtu(*stR15V~l?W>XnGf7P4TEK%^YoR`$hzYsaeuo3|;hs@;fnauWp3bchkW#I|pc~7}UXEw| zcZWS`9VBwoU>_?hbtS`2`YMpb#Y|yvw?ajYbrRJ6ZrlSulwfw$~*S?ggul! zK3n&+PjK>8G4L=-SGVCK9{s%E!w_fY+Ecle&X$gZMwp8WE8M%k$m*dE1j_8U+ZQVY zb!Q_M=vgvz6LMAr?DFm}GRR_?m|mMUq}%J6mY$#6GNS;}N3WU7`5}b?<;jGJgqwM` z$#)~W!0#X5;|O#?H4ccpNT?Q(HD+P)TIT!luuxkU&>;SV83-Q=EspV(x){_mI%=ga zzeW}F`BxABXHwqfL1{B|=|eNNTq>snGdwpl?HLnz8m&m+Yv^-az=Y(_GVfb#*$6o; ztv-&2XaZHAU$01D{y!Xvm*g7qKp|Dmy1w1Lb3la3v0OCdOdcp2U{tVwz6F#gj4*!{80h3qKy~D{%m4J{jDh}XEokHo1 znAf$;4GtviE^H!X5E4|eJLKi<%aL2L*%;VBrZn#6ldnqo*6JQx4GyN@%|TJois{Y4 ziGuqgK8Io+^jKbO>vR1utx$;t9xCsUW!tg|{rym{n!D7Jnidwh%bRJmb&~~NXOfK{ z0=($6$24GknU%SDf2VTiOKYx?5z(c+Q-s_E!7exsi*47vi=C?=-Ru4EkJ;t;B68!s z5B}6$Oh{cgw=A_qI;736=_XYmP|jx#zrst#uWLW+*%?m8|32uu zwwp?!IrrN|jLvvo|L4e_v54>&vTz-nUFM4$7NtZ4xxquzg0#4<;yCfkz2CJzc9B2F@BeU+(DlzvP^&{pw%Q(1eI4&bta;W<>^v4 zcmB^;H-9Yhdh0c@lOtd1loaWK^FkGLN31ge99F0@=euBhwW+=N*_vGpl3ESzOYINipJ%i-|$Kqz7~OxcXZW`pG>~ z2;s`q`7CJXn+C@~_rJlzpV+$b*9HG!KLa`bWqc!fX4OaNw1YVXFgRD>+?x=KFHZQh zV0@#=@)|fNmm4gNkwJ&W0LJuG%l%S$cADU>+xbOeCpI(@gFFt#k zdg#98oem4V?7n^=CIy10E#7WzWnd4p|L%qZdxrZJH{p8pNlj#0_KHVA-pKu%z7;$+7$miA@6_mWL7d)QwQnHh|NPB1Lj z(nP++JIPP=WY9GGF$~L46!-`6`+tp4I`S zd2$ebDj(QwmQ$f!2}L+gE^C!%=A=Fr>k!_z&MZI+(VK~UBVH_cRuIxO>J`&mkOyh; zgx{c|=@}iqdC6Bap6TUWUEFNy#Yc>0+P4Kybx%EJ#TsT>KNK_*y3we^P`&0>l}W|y zhcG)ke?E4So*L+T0g^>@$#vlT;`&F~ts+~#r*Cz$>45-QBwYr^#9y-|U4EWxlD|RI zSr9sT-l{4S`_L#1oQPvUGOVH)S}m-s1e!i1z#Wx>`UVG;Oii-_N}#B+grvk8mMaXj zy{hPI4a0d3SxGK<9nW!Kx<%2R&1&xsBq7%n4aG+GTMi(pJJzeJt5s>+Qtq!VIHp2o zCsq%$mVnk&U^H1C&G)HH@oyDypupzhndY>>nGTm|ziyh;^v{5^-7Uvw1M-?54xuvxYHZ-=&!WgcnTtnU< zapjzBEyz*60IM{j=YqE=#c~3fH@BGR9cJB2;o;T0C-r|=yreSlrm8|AQUW@hys|IC zR&?Ue;t?xvpI)C0c1b{TF*qr)te5DwRdtx;*QECoC>gSu0_;#YKGgcqN$Mf3mE93> z%%m4Pgyw_LZ0wkD+oi0TgGx74Px#NZGHO~mN>(&Dybr?iaIeGu*ulQn#~M;U)U+J8dnNs(5Y}q zI!hGaneIJMZ8`{(Son@9cn{3Wx;3Qs=53zR@hkuU``mWqlCe;ejBpj+{HpA=R4{1m0{B-ffJqYbtf&vBLBj+K+Rlv`A6gjmb5R-%B2dCKkx$PFWE2k zzl2#>kt4G={aqq&WBCH|4d2=}n<|+}a*BP;9(Eqx@Y9s9;el|i$Y&BQ#3QO1N< zJo6(98#b{#!_Bw^4_;WL)D&KfRpF78^h@!{<7p=!Ff>Ef0@| zn6jlBsb-r6yu9J(@(S{RDCDO3AjtVX%Lkg?i(N|QrC11iR)dJf)Q<{*q1m|B@+l(& zp^2(S_mL?UCFLRZ?ea595KYbabI(0i$|{y{+xnN!S#zC@^(e?Y{Yn}IXh-5*oy=mm ztnKHo0mDvX?uLqKiVWXHO1iXTQqp3&6qi5ld#6Ol#V=@a+IiLL8 z7_KTO(7x|5etKi+dp&i8UFqjjwFUW);u!Hj;A?jX1*np|nD$}#h)N9D@>XvC4Y$vy zRRr;&p>Im{Y}`^Pd*0VCZpN=a!(wGqE?9FW8F#!FcKG7EXPHr?IEVD0mjIQ(nU<}W z86ty*MhZ`)9Bhxs>-Yd8NT1!d0Y<*Sn(X|6_N%hm>BAD|>GfIEzknx?H~G)gcfJaT ziY#RRs1(ar`QyO;7|_~NXRqoxwhMmU%R2M*Clk<7R_1OFpt<^o`a(|dwx-C)m9+uTVuqVn+>JJdW${ZqvWYDL{s=zP#dA3*nwx8p)+%E~TVp^0 z`iC(f1=r65%XdM2HaIo8>Zg2Bc?6PqMLhD2X)YG^^je*fyYo7oocnuWsE%H&8Dl$1 zCq~Ix_H95F`LN;@`H-=1W+CRyoNQxBXHmj6eQk?lM}kkjE^wWFU8!D^s#)x2fIXWZ zGNzZc5_6ehN@h{9@;(4Jo?gzYjZn-GeA#a_ULP5G`9PlL;N;tRr{UK_z`z=2T?R0x z2&l4B_5N%Ht%~dv z&vY35X@mQDpj|y#IUq%RcwrC2y(rT0)wX&EY03Y8T~7d1a2yDROo*xe$qfIvBDKkd zZuqJ_!4lIK8#laF6z=Z< z5cIe=vge$Y8T#$|r911Er66lw;>P~F;nY*I)w~ztZe#j#un!Xl_ic}^>b_$1c4G@ZtJ>oD(1rnvBd&_xEo%CKlZl|Xk3bL&Oa z0Br*59pzUZGJcSEVk>!}w(`vvUoL694F$oiQX}5?gH)&CK+goPYy4z>D_w=8` z;}#mgy*V7X{YgP*W}jg5*&)aby*Sl&aYbe(TPA>xjPt-D?Q(oTd)>^h-0GGn&7P7M z87tNfPhIjZo#sWpH{Fd!N=@z{d;`k|pfJczwn5-j%TqlnYq1}d;y{&{#Yodl?D%ZY zSCHVfMu8XKuF@&o)7Uz1;I-`hX>bWf#SpupsHBt#Bn?S>+awR}vzC_szt(-;mA3FTn6*7GDBSuC1i|a(+r;w-hT4pt{W+{KZd`hAi{0Ts6C|;(ibw4Mp5%#IC z$z}KCc&V1GaXVv$a`Smk9*wuj%Hiij;pSB93g$s=={7>^C3UtZ^&>=!ANksqK2jB% z)JBPW#2&mr4`O0mC-fp{xJDd1#}IqVC4{g^@;}S?8+=|neYU`lG)-FX_!E8`{k7gx z?Tr?x33Psd9-j2ss~(_o%-M4D+BWQMtfm+M33^ejhF_De_nwG{_*!MZ{jiB})lwhE z3nE>ajXLVZp5>g6`SSFW^2Sj?C@qThfDh8%xJMt5@Nir0-7j^J`U|3uz}6O#jg4|% z*3k;4anW%xif)g~IN~L>>L$OZw}lA(kI7E|_u{_+L<-F3ip_Cb!AtUc*JcKJ;z#(w zK*&ZhS!4%!+KN6&ak@=eN=e6LSHN%}?KanIoO{pkbBADd^i1{46RI~r+HO`NzC>Qu z<|F~HZ1x@NtWjbfhI*5s+%NP#%uPhcdY{esBfTgTTMMzWjh|o%r6GExq)!){9cb zD08!@w=PLlA{3`ezRz@bkxHqm)Z`tNp`7NtG@};Czzlb}w`culDoiUySrehI3U^{V zmY`@888p^hN%_>`DE!lTY5p_6xQ(91I{pdW(!bh||9Gj6HADs9t-^X4Au5vUg%VF7d1{^ z!(JcjjU+HUuH{IZ~DZmNreg-l;Xi)b954fT%HI-@{~L=d&4n+ z+V|O7IjNeLyMOc(SHVBx;jVV(wSM}ORi+!K011RUDyKBxIY~eJe*fG%^+!@1+S!V8 z`An&=LpQ=t^+dJb8`-nkk?cfOxtiX?wOCD{cCPD3p~^PjZ&%?M!4qDgc!5BZ(PA2up1I2i++Q#scC&NWq6ueVNy~#f;>f1!IlRDJFqibo^gnfR{-^rR zzr;2!UUMfSN6Ol^(f{>T3Xqz|_@Vqia9oecpef~Z+HHEX-$yBL(%;B&F*cDd{0YC3 z$r|P|D}7YSr-Lc$i)R2DHtA09Ztu7a8Ez%#!B=asmk3%)%iekR!926@h5nEg1uzmF z53MLBi7({BO^QNI{h-Fg_6y&NXsOZ#7dMi?6v)@%&N)B{%;OR>M%%y645>M3;NGeQ$EOzVd^8k{X}{d#+#jQ&E>SJT zrq!n;8$#K3rw(D`aZvAPp63Tst@Z!PCunE7D$5X#GyN}tlK&}T^VhP2y@5CU@ra>Y z_V->~yG@3EKAYLnH_v*-x>yYg&5Txg5Po*7_xUW{teGHxgerCc(ax4g@&E<1^b|QI zbXZ{xk%@s$!%sZUyWqaSHN4OmxcdEeXKWQ^Eyf-0WsSxc=G@mf{L$*AJ|+2diAmIsg$ zjEt6xP3+a^>1ItVa7`7{u3kl0HgI7@GW#nzKGRS`5oV9MlX%r%nd!geBxZ&$Ww-%_ zxpi%!y?ITHO9MSadA-lUO8vQVRKbL8_ZL?R?D0b%dGY!Yp`of{#Y$}rji?MV{_ecM za`wbc_sf4P!hHM~wb_?|em@H?iW|ShTztD9e4(fX_X!0BQWWuLn0QuORnBO$cF*%- z7vfb+Vfh*gU?IFEfgAg?ziXCU7kq$J)t7olTu;|UC(Y1N3fj?1njod|OYfCSsx`s} z)5x%&YzUC{B6V~e>{_0ZhRI@BkM)bH7}Lc*MN3*aoZ)-_X)8}?Lwn{_x*y5VKsq$= ze;*@L4kH?Ud;Pr2~BHx0><)HX^?@-h8F60=w}h z{`$G!KT%h!rD!9ERZ+M369p;-z2Onc?_qb0@eC-HsChw9Agq+=r5&noWK4Vo>bZ|?rwTGY4p~M(H zTioeh^E)^}JLH8C@6l)(*hUK+R+TPI3xU3!%{N(Vd(JxGOxs+9+#@Z%AAPBcBi*}= zJw!-j&x=F1(+)Js=-khP?6I)!2TBsy$jtI^P#n$GIfZAi&}cIskdh;_7CMi#!xlTB z*UA5OuYUi5@(Ex-nWP=A z{eDCR6*7<7m@{djt*#cn?F-}&=!6@yE)M*Wz_lpn7 zv=MxX)ee}O^)iO+66pR`W2(!2hC1HQia{@7Lv0805zbYxC%WMZv)?NAUtz~tpk@&V@8r8_r{^pHbr zFil##M0GELkUTGcx zLc&Mg#>x%Qb5YYex5j3=z$$WE#5oFRNgT4XGtC%3?QDW9JW)`WcJ5)s-sU#JpExY| z2+2ugi+2v3P=v?F{eo)ze%eo!E z$Uj%Z&2Nx8?F}z`Hvldj8kCj>Wuw|G`ibbbh?%P3VGAkMQra zEtTp+9?Ob*s`a#94;+J#_t>`Qc#-MLqa&o<&X!ICg8+q+g$3G}Suab*d z0S2HS@9;8@S1wu4|TC#>#BXxg2S5?Rwucx~mi!3Rx|>Rd{_1w#0P3dhHnEVn(3^GgW^( z!%|NHDtQo8Dkv0SGN08CU&b_0lCC#x@H_B6fGQLvFNW` zbta@TX*wp{cNF9~KU-oQf4cO;#3G!Hbr2q0QZbV^1+So-5#W%QJznd7oFU(8kN{Xv zN!B<>KxnaZY*^;w%%q+aAC2de^mt?M%&=X%(J@X5RH~H@P%oZ=M-V)w%SH{AT zpYotokks zlAI5aG%bE*3=euu(NeJ=!mN?hp4tik8nfH^Y-L6HRbkZQfjR>4!0%A~m$ zXx>rBvNT1-8SC93l-Prll|>$J(I4~q*ZWXVuJtp4^gF9-XmF=(ZGCoO@YjJ|%p(xm z#TOPBGi3Izoj;Y1$1AiF-|2m~y6Te1^_L+CA0R)~*0a0D|Kj(dRd~dtFFC#h;N0tp5cu6x>c+adh@;-`W38}NDe%AYY$JXe>ori z0$32K6Qmk3pV?{^Cr4!?Xzt9P=+a|J%e=n3AcLU2)7xrFdk$yLiSwJB=j8m1^yLF} zQQ(~6N=f5AjYhsjx>T{G@|TpI9J;0&dM-}i`eKLU!jo%+`(}5M(tMy2SOEqSrvnjM zHS&Ep(wQ3z^U*cfAjQgW4K50G{@+*hB4^k5_-&dPNKtVv*!}UjDqOAZOoGMsH4Xhc zR~lm$JNas>H&^CwFh=uLJ`P@;;Su_WMivAVR)-Au6UA*+{q3FmN3 z+Ch}f35>((Ib6)`D%L$8G#tQ!--;TcbZj_l5$AH^_nms5gmC)J0TIFTgK2wz;|o$< z$S^>{D$=` za>i!3jU@%D)DS5`$A>e&hwX`n+#>cF%o6(~F;m)koV{PP^8%(EFqcu3y&ON0G2K>d zoys@D{D($g;Q3%#P-fg0?Gbp=fV!+BRs|k`VM*7}4FG1ttGbag`+Ee=59FosfFjER zV+%{pnTRN5fj+nu@_}Ogbpi~qZJd?iTuR@+7TOLF$VETV5W zOMxc>kq;p*&3QCDrce)0x$ovC9C_n>dCCsyj1{e4arj}8nIjsoHbE+~=ETSxl0X6x ziiw?#g`)V(b@`l=s(-6WMgliVeXWS^!Lb`qCQF3(WQI6tXu=g+iBCyNDhmDrCQuy` z2il3DT^V~7jDS9QSlJ&{zToJJIR}%<0?MjcIj=!AlkZYI-hI$ve;eQtd>+11!1 zVnW-a=p9=D%Rv=wev7=^%cU5~(aVEUu{BTQV>d=hMi;gkaWdQinLorUw}B&NVP*+?;>B9J&mnwYZav#G66OIAiD5j19{0|qok78pV9uGiQTCWUW}a`mYlaq# z`+_2dk#;a!@%~?zS{idC!ySy5y=^B;&bMPod;k(C)TSiS9|; z-Roy8Bn9`88ZL0e!@t4pk3bu=T#4x#a-obG3|01itG`U}5XQke1k=YV6qN&`0Q28A ziB;AL`Rf3sC!8R|X;yp)KK=WQQtH)`>-%z0sm%a@#w`KU^CeE@m3gm5`TT=T;U+9d z!3aR{#$_)DPPk98g_xgdV+$nNUWadTD|u1~;A6)0A}}iGU=lut1Qk{(G0(MiBrA%g zW^ZGh?7uTkhN%3vtJ;MpmQ0c}`F2GsG zj23NH>10mwZexh$gF5~~bgvzI4a-+7;wrLQ@pcJrk19(_{+EA}tEgR@VV_xl9Hb{y zGUTbj%FWHVtasDysK>tTq#UE~NzeTsVo4H(!%1#~dM-UFw_!AUeKzwv$VA#+atLr} zV}U{NpCHUZy5lK>v`^VNnxis^?2)+%C{#REFJfyh7kA+=({+*#2+i$eLytK$RxZO! ztmrmDN1TJXC6$^FJ%0Y?rcoN3)}+!&eP{%+Y7ha1VQShlbF2m|%m62w=Z^BPSi0`g z_T3Gq>tFOP!&%*63`69{8%(ltkBkU%WTpXJ0bxWSes{F{5|@8$&PdtC_$|@w{*EF{ zWITki_Ye-@)iLeNBS%q^tn{E#vPhfYVp~^1eo(miiFOqqbDB1*Dv63#BzT1^xT*&E zU(p3~P;I5!9B?)ds8YT0Q<2Y6A_xabpczGvjeW2g$UZm7Jmuu%ESi5Gg6POhRPfdx z4?n+=auYF0{5zF|lzS-PA#eZc_=p z&PwsrZVYBso1OgWRnoejUv-$N3C)Y~+9t^YGj#Wzb3~A~FTo)hDrf0Q=hoJBXSnuQ z`aW5JooAO&8hVg|#?0AIB1_@7nyl_*9b8|#;s8u@`j>n8PH`rF=W692JmY?;t2Wv{ zzfqOViLsO?2Bf)JbZ~-BXR|OM0V))OkhTv+Uz}CBKTmEXqLNA2&80Q(TgL2a$3gEp z_G(*5E|);`6qMP60rZ!LwBTtYNBE}tf97~NaOIBUZGO6ky$1qMX$z!K{=^L< zBNw!m*7In7qoQESU-8K#Ti5Ah$8zz0&(5XS2fa@ZFI1)#WcSh)z_sOI~!9ce0e zf1)4Eu5Eno8~#1CyNxZ8Lhw9N!xcHVAe)7D($Iz@_`GaKDrNuzZ@EZ78Qe!!mPRx6 z?Y~^a{DbeGPT$&*{xIHXYxHqd*C9jKo7CU{45QyHrYBZVz(y&#JAeIUqQ>IORFEo<97ZTDj5VGr9&ym?*gnc~>|Wvv#xc^%nLI z4iYKo^cOC8{VH+8)% z%W!mv*I^S9*8(WI-93G?bRwJDy6XEB`{4;{$tA-hL2h*o!;&$V?#`d{MefcS@9p+^ zbA+4YpAm}ZJ5L#BHoh0I$0SnoA$z5LEHzYz%b<;#YK$9KsHVu;EtcZdTUu6j%I2AF zCd>Zj2c)h8hsFM>_Uq$d_k6%h$X!d@#qi94;uXc`zNL^ZtBT@S7xQfEn113yM(&4a z+l$ff_g_W>_@wfKRgEa^J>uXtG=oD)7J*7&cC67=wrdlbqWBFn|9X8q2^7V{4(p|3 zi4TqZYCNMtgdzb^%pRYV6>k0gZT9Ch7>sq{4svaA#5Q7SDfvh%S=hK-HN-8}s;ptw z0niYvSoU5|+?yf7=UX#1(l@#6rY{A)5tsAu*eLWV<+3TCzh2mRnv+1Ww&pMc=ryV= zOE(7R<(6|fN#H@2zIpiDo0tQ%4#%=B*@@q_!La$1 zfbc-~c!q}laP$>D5w8qYTi8XXm_}x?uNhABU|Jc=Y-`6)Mg2sE^bA&J>9Jx@nQDMH zjnT!zX9dv`NDXJ|Ca0uvVK=$|3}vs0liv^tF@iXUEI#$tPriC}ItcR9-5@L6sy|n+ z!qfhKp`Dxw&MTG!b}z-NTH)QhbBLbww|s~-=4~aVh>-@5vGH*(kmQ~&8ynkLpEZA` zS`@3s{rj5BxdZ})mSbNRiq&PwKx7nk%kgJm@Tw_8B?;8|q?#UpUWF$;45)#GCBb6bYkG8DM%%UF$(Jm6S zm$wL(y!KPCO9#7G&Z4J~)=TjY+v|b;DV&j=n>XWmjT5XyOs|yKEW?u`)qKE(5_BbL zhussrBZuJe2KNi_r(NW}y;*9Ix#Ser7jtj6D_{IjcU7?-iwlzw8^3o_pLVCLs59ED z7z3-B^D3`}v?fYezuQ~VZuq%LsMa;!^Mtsnk-@Z|7Ic^ncJ$`ZtPVmUWg4^Q4b^pZ zew#`978@_t=eVOYXOY-7p^;6uDp98to~=2m9mXWb1{5=9 z^z;oeM{QaXovMV|dG*&<%2M@@dU`G&l=rixv?Z>tEG`$1!5hPF-LKLMd(nhL9MI#I zO^Z{!4$BxzyeLf<2OsPyTYqC1seUzPVX^R$TDZ7!)qwpYbyt{>O9z4-x^3JUL276_ z6CV;RZu+nEgo2vy=fkb!WNw*deywSj`rt*4&7H90R8Hjiit8QmvQscw%sC~ zVG>)fN8JXi)b;dk5IS=G^gO%W;5!RlrIYtYetwdaWOg0%N-=P26RmAz?2Kjfc@Y9K zaU+5^uAjems77D0y!)7HRIpUG*uRd99VB_(W~FLQ%U*3~##qhafRmj) z$~48Bc?C=xu=7KusF@H1v zYqH1Ey^{S6xwHPmGvW22&Li50f{CLQF5B(wxx-Kr^>d?g9dDP4{q6q2525C^fGWK5 z&aSz^;^xgYmltdErd4qcU&!`;=AT}FJUzGI2lSjc&RTH{dL7AEqg=TvYVyk0F4GIy zU`m>ORyqZ}*RifMbwPE#HOX#`ISw79ti7gneGdJiN2(8hEUqly4!q7hXyEE!!nQ#2 z3yd?cPrB8(4jn$&k4m%+w-)rI2M}7Lj>Dq0YqK8(Xb|Q#9TC_nECNAP{upkgJ=`Z@ zYa-p&CG<=uqN-ggp|?e?lTuNxog~w43GRuS!=}S(Ky|m;Qzfg|Yujg)=r-pw!YR2K zo!?3^AvQ8`Z|$*9lT}mv-f-fY<8p;R*WE-fuf0!HT5r8n1JHs1C8tmypigXVjb1C7 zOu0?p=Im}cAIx?sg%Uld$Yv0b|PYc);Jv?+kFz_ zYVty2EuZ`+s`Kr>_r2ou;Z+*0prsTFq^igargV~Tq(g>=&U5jy+j_g}9oKaO$;0g| z-EcOrE|O83Cim9CPujA>fW-afy9U~CTKyQu@v#w$9G{;X(Sux>hdK7A2@~SqQ~UZK zYwi9RAg$A9rEvJTeV5oS;OR0H0^Mi;#gW{+*L+G^J8kziMY03}*SSlXZA#m~`qiHP zy3U(aYgrG;_|Tr-U&Fi^gmjU6T(Ba|j-y%E&v{z5%Z#QzmPx6awj+%?<0-r&_PM#a zGh)j+m3Am>&3fKMt3RE=N-l)7_oAK6Q~dD73oF_@Hnw*LUR>kV2YOpgk_Y|%)l*}8 z;8-Q@iblxmAhAQKyh7LO6$AD<+(E`A2fOrh*ehH(Ypd%n7xvc;jzY&CTkXR3L@sgz zkAI}MitgQy^Vtz>Ct^;Sg9zIzwl_t;vj*;a0C^nhLwqvsR) zN#gg8hsR4z)oeu#{TMn z#z&tyI1krq8F=Y=Z>^8$o%uR%nj8nTrtAMgVm>Wn+s8bc4x^BquAeFE`I zO#U>U1{n;=B@o;@uBeGGh7ogvZ#aDSEh1%3vOZYe@HrUy=zXSXOME?8!$c?PTvx7# z_|ZOSEq%pyx!7RzHXsH3xNsg^wUy|x5|@?Y-BCrzIk^lUa<=MLw4gmK3{MlR&>yj? z%4kdI$K~sE9|SH}G~KLNhn!`dmattPBlZ~P-+EJ(j=@y(k(j`8AGgf`I>J>!aP%)z36+;oKe z;flV`#*h1J3!{T9e6`RrwoOvW-8r4(^)0^b^fjZw`)9hvI#vmUp@?D;7!ad@wjhuV^FD`!@*~43L14KXSW|i<1;Yd`I_F51Aw$7~i8+l(h~* zYY%i^QjI5F_-MleyXoJG}$T^f;7po(=D^FE(sDC5Y#bIX78zDa=$!0%}htyBj$U zTf%hZkHf@vFGw0fVP$f8r3>!18f8b-q9#3`&#oK{6&g=3uyZ^2^1%&T{hoJwLZ)S61cjiYI!-noOR z;*>{j)+J+LhWBi-l1^$q=4tu2CWefEP6g%v{8+?#Vtd@ub=!NmkCiJu`lIhH?#hj1 z$`e&DNgo=NrjsWE&<|kRtG;`y4wJW54JX8o7}d44zhrje5wv|G+wb`+`wwv{AI&wg zXs=H15qH-=wJ#QL;)3AFJWHwyR+HyKRWhgF37)|L-;$~X;h zFqIr^jqEmETcD$T^X|Orux8QMrVvNS;L>P{=bE`@Ev9Dh1y569!)#&;RgKq~E4`p0Y6itv+sEIOyHEhPoF6D^=UuCl^v&N2$b1iv2%; zTZo{*6CY`*dlMtXTzvwrSq`Qc7yJ%h&M@B#M-3sZ{Ex#oCLTkw1DH3INmj9Ox}}u$ zF`vDAp+|5EoH@gIUC@x0Nf&HrLVe7f{biEV!)hfwR?AdN+vIGG@O_igKj~tP(`guT7Q#_vF&K73i-DIINnd z2Ja6yqxMT|H~7S}YNS60iMvcZ_CBf|doFz~A7(gP*py<||Aty}?M2yur zLUN7Q5225Bi18hIdRqiQ2cePSD6t z^6dHXY?9A*2T&tgtcos~*hx7OS@ZWF+XZ~r*A3@3unYG!Iv?5m5}Ns#d}xIh^FJ6~gXf_(8%r1=DO zW8N{E`g08ay~8|W|%6WgV?B#Ml+A^hmqh_IntOE2N3fMUXe+>Zp*YFU%b+8X{pYwDiVn2f+mmVs;Y-ty&fHNqqz$S!b9A zNH)Q$*J3`7ZREjVFq{6j_cu;mtFlI0TI}bjZ4X#D?T9$rRJv?D3nUJRSfdFlcl^@E zi(L$6rq5&4wG5i}S1MLLvIZAyMm|?@>-h+wIKf_MFTKJOSRrh7%{o)fx8R@dR)HO@ z49Pr*N~2#pyJ;#*e7+3Ei!c7(+0-Mzt?b%1CI9`t2E%=KKoU`>Z|x@zU3Gp7PTcLZ ztfCmQs)D4hWjbsW=Vxbc=mW@6Z=q&oxxqArbHN&tPqaQK32GbqSXlVva2;@~OSq$r zS9--?h3E8`OAhxlvsur3h<{n(TC@RTRfs`&9Vfa{BrYioCQ-VHKzT5 z*sLoz$>*qQun=!td2|@KH9fqW*8m=QEh{!&T)%VOwhijmW@%er)>##+u@}085fthY7{ZYWzd!Mi zlZPE0unNyl^8>aCoHPc6zKC9xxzdYIDs3Qn^Jfi#-mcFh>4ON`ShI_I4@7*2eICU~mZ93EZb?bT`A6#OHrV{h_8-n`)F*&BBwa)vO&k#uiby2FG0r>6wbJR3ej zM^e?9Y2|>`E@fq)gZb`~cqTr2u!&Wd{_Ej+i>`-}IBadj$h`+w}c zXINA1)-5a@MZg9KNE1Pk5~UX@7C@ybNUuuo9R!4cC^mWzEhrFr3%!JZNbfb&Aku5- zfrOB6`KbHZd%ycV-}!ZZ?SDb9D{JLmbIm%&n1JWi00bLqb_Uv@)eS%E^!ZG!-e{^# zWEWC>2&U$$wKq+9R^=LF zWDmwFs-~}Tmt}|FGbasFOy2Cb4`x$c=@UD^2@m&0p>nHpmT+S}RfD<0&cqgCO<$3k zJH9m;(~cw(KFas3jG&Gi3uTTnFB(a-g|p3hSLH=~)&#dbe|g@yTRg51rH-4}hBwoh zZlMowcdm?dy>1FDudF=sx1o7^4P^QvBE z!n%ly&4#nsm9|OrN~0(ave#YMmi&$08lqY4RUik;Ffk$oz2e zxCi}e*Kxf6l6S>6dz>JjS~wS903 zWNxN%2iLIGOI7qQ^9f7iW!4=lrt%$NB1|V@XJT(f3y~mgIg2EqqCf(%XzZAY^FD_=O?_D98Z-gDU{^UD7 z1(QwzhJ;}MdBQ4az3o$w(HtC}W^2Q*QylJh@Ze_IczB%sXzMhwg~{(u;mtHuQO)MN z69lu2Y`z-Erxm4f;OK~(@fdfqFCT6&I+@I0blmU^HT6M1?o4~72!)4!!eM9;qaM}kp*XK(0aXBpFx?edewOCQrR*i z-5>{$&@CoAuY&#Y$GeI^cVO*cy4FgIn!|0Z^aV-Btj$}Bny1;h`4J8DUv%iUf7L>a z|5gi~JDD_lF$rh*-$N92s9TU@)y8ReJ%t}%KY@mFzk4yz+(SrX_j7Kli^t+ZD8UaH z>1q$Z?9RV-HvSR+vmfCG)OPJm-sq=rcld&1;e)-dNz6`_{NwCfdr8_wxKWCw!!=O- zvZh2KdQ)2Qg+c_rqyA`TUaPO8-UnK1%szT-Bd;2lar^_r$LoW-_!9k1O@0P(kvf^a~b51Nq&1aMJlvd{TwP^q4axi8}S1R&1`^8aW7Jn-7#n~9`BdKNj{ z@#F63?vA{k=BvZ*GmklGz+;dRMBftAJ|&SlHPN$m@x;-_4DE4vutjGh z0C3Q(>!QGa3hclB?d+$+EN95i=1wm5aTicZZYDwmZl+h z^x){#z=hPSyNbZdS*H{IVP8LU|JscuiH_=0^HF_?%QQF?bKuD1HoE0_%L@oMolUH6UXeizRKTly|9K<1$!JG+pmj{c&WCOOlWab>0O+4o4 zi{sS9(K)Dng8uDDdxxOjvOYw6>On??e3Xh%ScCV)jR=bN?s1wh#Z7A{cCEN>u(-f_ zO?=#a{*8FFcVLA%OM}qP!J1&r=Ck6(YLn%6b&X#K0 zJtb7#>nR<>-Tz<-HebJ09)+J}rLw;FFX8K-@hhCR6mU}gfEkf8U*dqj(gU8$s0a4Lh1goTF{8d2*VodbD0IqeR6n~#_T7ekP&J^}>A-d|KYV|VwfJIP8YAq3 z!zdL^maGdg^=GPjRacSXgKr&FSlHLA<70KP!-@jXODnNI=r;vlSLX0Ml*WDzTPV4Y zyoN+9dC9L^4(S0C&X;+uAb(phAK#;T-y!iyhm}qG{6j`R#{v*z2|QPYBVd{S0;oE^ zed#9rqxQPBGZ6ObHY%fJFx8%^YxaanKSGl{+8$(Vh?RbebQ(Kk2SjUbSB+V<5ea18 zpO{<3%Ss6AB93jqOEkVV@Q!#*yu!j^(h&vfG$p=5=Jzwz6~8Sjs{c{vHlD?#JpC!E zt;FsHqN3fk)oBTV!ThupDZ;0N>6@op#qqvoO}&%gZLJR}4dPyPO#vK+g#}qzYBy1I zrr*1IEtgbbjP~)W{@KO9{J^ygg;r0LF_Y|V-wR=1iW*w>E30q#I_+FzAvONZatksc zzlj=t2xvr~95_NOluo{tC2Z)2{%#f_Xgs_;Yi2_Fy4!~_g;@yab`~IiGP`ufV+B<* z>lEzS`?Bprm4MeP)(KuT?m>cLTE15H!6($!h>=PA$-Yq^dW>Y$h);va>a5RZUt)Q>jwn~am;jrqKrmX=ogJ~J=dJ{eUS zWG@)jRX+as=~K&V_YdmL)(ri?X7~j<%OT;##l;8g;I=+3F!xm`da9i^Ydwwoca17Db;->Pur<>nt3Q2ix-J&uleC95_x+P z)xH1#@E$t=1t$ZIXZSP222CVPdqgQUAZC2%S~1i#;|pDRnnVvy%ocz(t&P9fD`Ww1 z>RP;Etp02n%D*0NW(g1nE;Ur2rTweq2(nVMf z#l6p7xp}!U={ib$Ab#dfEmw!1&#|B4Dw#@fz?KP}q~21fcgoAI7j>nd9e)&Rc<9g9 zP$w$dZ2|BCC4=ukPAvE{&!g!x_TIpb<}Qj466TJn&sHeZoe1p39DU;1!Mg*<-|jTq zCN!GgkS^1djV%@KG62uaGqD;WmzcB&q2%-{el2nC;varx&>`su!s^{)fBiocQR=gh zKtf0+Mfb!W$G3|F+Ig-gM?2mI%*9l5N?{UeD}xNzo*>mk<*dKS`^ zn`S||9T(d=;SBlyq{)?T1JQB9?zP(GtW%Ky)Ng&PLtG5Td|qhR`TTF-)-4CpV7x@s z^EL77zg=n2GbU=vV5j%uag@JK6~F=Ve)pH(Z$Q$m+pLHEYY+9-CDH}UmKQ_vN|miJ zD_zTO82n0sRU5q1(rX>45zUqU0AVlxKi^>uUfJB9mo6S zN$_$Luo;a)pBYoU_qBt6bMKe!g7{)uAGtogJ8WCfId=S3CCklGZFuLTzSMlIG`i63 zCm8n6T`MU8Y@YUNcb(tm&RC#=l2QnO#jY-l-jG-kza^^ki`sCjfE0~=if^!+F}3}D zBY*lf8HSCpZ=tjh{RrJ618%60(N%z4;?EwqVUC};9bE`{3+exZi<&1V<@UDg{o^*M z3rsoXLAnJ-b+YRmEx~tBR^b7+M}KwG&Iz77Q&ES>s2px6{&zB1^!-Ls?JixN&WXH< z96G~=QULqX)%j6O=#9=l!1#}KbgC=g=UcFydF1Y%56~xz8gAQKe<-oNoomGCNwf8< zClz%5{C87ZxG)mktw+j4q+yJP~f2JG*y$f(&uv&kT zygyaz&S|~IPT2c`oC1UFB>kN*-cokM5%}r3&LhR#Z`HrYUSGY0G^z(l>)yRMTLDP__&)iW{1+ZH?V-2O?Uv@hI zd}A6D6GQbGLBT?<)3*EZ2M1m&%gfQdMZM*&X6b+Z;1#||NEDyGJ~In1&BG`8FBccd zd4kWRt@w!Cvip~#`}=xk?*X_s?d@Cde&0yYXND56YF}56SHx%8i^~7o?fsqK4r*|U z5JI}&|MsSTfAjz8(*@uiiGP1#^4~DK|HnUVZvgmDT9EYpe}ilO1E~J@J^lUZzZd#> zrvE*M$SyL|Sslll{3VPQ>|%w~ye1UF9p1n-Wd zkyK5?X`ZmKFQ(ifnB$bwL1^+lZXpVat2~y>!d|ans!7qGp?GwqmCseuV_DAgJe4bI zftV&lN6D4{klAvM{LG~%7%cDn%B49YBNc#U8lqxV58YMl?@gASC(Y1qB#lblUCQwFdc>7Dn0uLqpAtkHYM~Q`xa}1^@d1 zHO+_B%9@JDP^Hm=iYz)SC`C0--beJ#^&o|8o!Pa17k$GVV-7A`dzzYb$lD$P3!P_) zQ1Xn+M?wumr)+^llorBe>f2d}B-j1UHYs%GuCa5bx*O1mfen$M=X=meC^$SDMt_0lfV$vM?S9{Q)+ zj3DTaUOi8sd03RY9J}G&0chpsL0almfd`*ygIT?&#Zd)DT4z$rJW-xlL=IFMRjgdIG4E{D;ydD2g%NsO_OCN$;<^9#H)eGGkDw zchPrJuLR^d&y_Q~d8*$UBn60)o1S$`f_k=461+hFS5lptZkhx&NIVz*N~Vc48!v5; z#ibHI)aLWL1i@Rj*vjd-@{&_v`tRzOok$v}=&K}`{+)~Sv#_~r2UOel1-rL@pOM)& z3I_vKnlZh8SZ1}$H~f97bC=ag>Xs0Z5PwFS=Oh4k`n4ou`?yb)fZn->r%CD(fdBdX zQhdOrB4Y0>{U^1v%MQS$f(1Lbf18!rv(v*8qBVS^js~h;n zsH>|d%IsF;1KI3+>az`j{*>!wW<7X^vnTpW#Pdu6EOZGyNvT{5<|0bqcPm_^gmWc+ zlbf#gXxW*F=4%8YG)nq}J#sHWc!dhE^-ScOv;UzWedq_Atu2`5)UThfV0XsD)ANzL zNfZr~2{fAep5eN9xLXCHxe_U!gsbJwOSgo&@?y(Ldc;V3m&7(Fd z?M6A814zlDzY^s>dB(9Bf5N+F%Q;@FhflX}U<9V`n+1}3MNA@`dg`!LFWWOGrtvIo zGi1@L@GKAOA%dUFV^br_Ke`S7^mH?WP7x=PD48H!zq)Xd;iR88-2}&*ToQTNXfKP9 zZj;ydy}>ens8Y)lGAxt6BfI$Rv}zb650&Vu2t3bPZ;W!W+J-k8C5f>&v5SZw;Q18j zE$@r9{u^fhFIGg&sn8he_vh3#HPaD@=`eno%MUxYZ{Hxt@qhQ{t?zpXj))1xkLbMP zPmGJ;F^dmHMaW@|8|zRAKO{!^AzHS+*cFYcpJzKQtHDEp3E120d&a_Q{-5wY4;_DY z!2JE0*?t|pEr0*OdAeu|3i#k?U=a5?jYhocOK8-~$;?%FYwK3~nNL7~TNSf18X!d@ zHmC6e_FDKD$FKrCcSj+-F&uBP!jhZ($|{c@JwhH>W`AbTL)2=T_z?ti zb8_DMU8SLN0@M-4ee(;cAGa_VcmvqV0DIbJ|#Q^I*qK~=Q}PMj}#5FIqtO=T%A?{5tJ7}dY2Jb7mdx$W9s)u z>x984OF!9y5B2qJyBSyZ#iRVJdXg&SI#);XvogxG;KCvV%fB@f{>Qoh{bTrV3d{YV0$)oBFw@x{SB7 zI?vzi0ptuGA=DFU9LC-Ji@Yy+dRFXom-Tf$Rc7ZsI$Dugu)T`y28MV3h9W#h@vBhY ze<-;8M-%?bm_tp1zD2WTR1x>il8{I1nIZkL@dGSZR9=ieU-5NxEPQo1t9(+^8pe8^ zY8@Fd=8+gxsKxJ$Af71iv?e>(wCMD#he^ytA+Qs&ZXzaa)ZIy9TIzDPUjS^Ru$V(A zt@HmyYcS-e;Mtb1yZBG@<{_8EJ3Jkhr0dTG(foME(=}|%25{;5bMy0Ke4xGF_--ij zFIsCyS67%crSlgGH+T0TyUvm2fnB}J`1tu5l3}-_Mq$J`ZEbBHV3$A~z*XiG5QzQp zQ=gA^Kg^f7{L(|j_`4+d^XY7OAR(pZ3;gk@&InyEiSq1I zfm^yYO5h`X4)f0agtWFe70yUKuArxqS89I=RVZ|xextIHIaPA`94U1sJdj}3^@$ju zAAHZbmG$)d+;$e;tDe>8dxc-{}M|5a@q!aHCz{*^i6#$#DQI zVOfmXsRP(Ma>(gdzf9I<_qmhBJneF2UE$$o{uT6C_8Y*8#oM7eq5MG?JYwbMqUX&Gg@JuHTNQNgNLn zcq8t<=uuevY@S2nikx3B{UABnT}Z{iS%{o}QZk)O&qT#etxgSmqX1FVmMG_#7jGrx zI^-0vl1>n_xF|Q}-bWNUzDGR%%2dgaEHs#;UCL4)mOx{Rp}WuYtBFjPEL%M z^XFn*faD_v2k=5|sX89_+kT$kKD^V2@nmPh3ZQ^8`}T+k3w!zwi|s5L&YtnmIgeS; zUF>ubmqp`vgvYR| z!RRGM;ZO%d$BL{2%hz?vg&?9ImJA6hZonm-wCX~Vy~Nz0?I=Ls+6o#65wTvboXe`I zY0;j^FD~|8D|mqhXhaEN*3R?j-FNQ^i)O*idgU?>P~oyY;Oq7E6M9lvu=p>nI8n?4Q>*90TpHuJ7{1cHwM%r)Fnn&LA>xA5MKTej_( zfJqtOd2@dEmPx0Q_>IgVZzsfld^CjFIMnS{sQ7T(j~`dZfz28V3kk$IXS<=mfW6u4 zLIo0j8T!4qDxFVS&x1lTkkDRJP6h^s6Me^|LBOBkFxl#<>qYt6c=)2W<)p>j_=z~? z1S2c&VM8M*%IE`9O}wQZA$6bKe~;tDi!o)=4_KR${Ew$F@xqfTJ@zZ$kCX5cdOA+2Xx{Y z%fQb}3}wrCRs^d@Cv^DDJ0DX+d?ar6QHQ=Dp-Dh&8MQ?o^uM;x*YRp^pt3wK%&KWi z7v6}YIP`18`Rjf9dy2UnTaevrR~o~XoS`QD@|txMZ%|=SVQ1**SYhW_Sg~rIP@F#^G@(;C zqO)PW)?mmqMe*#31%u_x{lGVGBHuX7$a=e(qE)S;AMu`sbP!i>Iimx>&b%VKi}miA zU}VGHCQGl(qw8h5AZA(L%mh9)5hG6+4DS`#!N^!t@%Cx;en>d0gjab7`k7!7TbCH^ z6ae9lJAgrEl^}!^$>+$DRwqdK*oMjV^Yi2bCglFY5+FUeWWD5wP(@u0T_A`zOq?auugLKv+^gB=f-OCuSNC< zOi9;HNcI@P3YD>&(W!9*Len$an!F5gapEcl>R$JGTlK_YcT=?&R}~!%8Y;7xnJT8% z({K%I(xM6yBX=~U4JS*@vmFG-c#{^M2EVYS_IML$CA5|Un@sYt7=mUbO(sMed%~;Y zmSV*k5Z-AY>a)4}6)Apfy9Zj$Pgn4tyD~FmA=%z;1MLGD@A2KO`lmG3Ml0xHlO-9| zUQ~k*EmL=uMFvYGtm-RU3*6Fv3D=WR6JSFrF2>bfAjJp!6;1mCNK-MW#)CC}d!b&Ve!aZVY)9cPBoKQk*SXknKb;;=)TM~kN%kWs+l2CM#y}mxJF0p!Dtw(U^=@6Dx zLg)u<;_Hnco%eZdw#Fix$P`69{Y%}n`=8N@HBYxJtS3wlcwEUR@&&9UKUa>8zV;D&k;hS0o9ZuTdfhOr?X@fD zTm+O%+!-xU+!xR_5g`HnKrgcwSuIcJ@ppZ7D(Jzbet06wlLhCb3Ww$IC*s@?@GJWe zF@-{1rCNuvXXkXsyN4e*-bffv%IFpT6#>2pHG)V>S>crA=ic8{C^Hfpsm&5oMe%PE zf=rSWt@l?e&NHDr>ogPVyfFu)-S?QroL&Q)iPIs%7vI209L2H@ba_sd%>`dJZ*c6Fe%=*T+B1TonQ4$mh;b3l`?}@)rOA&30;%pvxo}HDVa4;am@ z$%=f>r{qa3q4CwEEc3ZM-Wj%8S#`m$yT0hdcy^yb3f^PtFWx}pLq=fgwugQL(fiL( z&-}{P)@nyBxKsyN+Wvsz{?5VQKT-fm^E+CG;4itKUj)$IFD3%&h3c((r1?PfMyiEN ztZj*%Y=XAFBo4Ec_nf1SkIzS^u~)Z`uy!ciqqbpI5j?%(%*;zxYPC5CPjDP5_gKt1 zf8Rl;q@RW`X~()z%3iUZKyZj~EK&cRMp1(rL9MgKmjNHn#_7_bi+s_guT+=2v-3UF zx+`9g386Uj_&(`J)q)^CrfMZdK?9c9>6=NOo{K&cgE?7*;ho5s>uTi^JuH=08`3d| zb$32N#~Znl;FIfvB8cozu?4XT&u=H2e8tqOos-T;roHN1DxuwJc2izNK|yu|I65{3weJD``%VO5>Deb#!RJ4fHR zg+(*Zypy=y-3SVB^^3%tp1jIdm3OgAlwxM+BQ>BkcYnC@xW{O8w8^sfA=#+MbpEJQ zXuhhIU2Gg=02X&YP1DTYwf3C_=#ldHY-nhj z_^Hle&9b1UC!soFR-13QCkAiCZ`wX;A>+k>Vh*63(89xei`|f=LZ{hmmHJamb8V0a`qbT6+U#$-&%i13NKuPQlJj5N)%R`gj`Tc9| z9Ta~W*z?}ClgbZ@u=^}%SV>8dpjdHEq$Nw??yUNNyUPj8^7f>#I|Mu}U9dLl_^LFI z>y)rZTJM2g*ziY9Na{v=iTq#Z@{@w>rXaW0Xnd z&6ysDH zVSc`G9!pEV2f;_uFTg{7H1p7o@YANnwpFZ3@T4uOP6uGJEUNY*sfXX5lD=u zqC*p2OFJzusP%bmh@hgO;aq87n-WhxfKRhJ>F!qDO^Y2^ck2#RP@&k%cyzy7S0%xT zcqB%a^l1)bYeJgDQ(2v(?gcT_@rvHtoWr|lBW2LQujJlqq_^P-3IOE zOt5P$)LQ7K9{D}Jz9Jj5F0Se}oMW)vD}6f-&NIHQsgAi;wvoelaoWoEQEF^*V;%cS z5TWP&Cbx|TtC5Bp6cDlt;@f%xNwF;w5M(d3VAT1#7fx8pm3X+VK1MHkUh9@)OoZd zo}{c|F$nO-We>`Yw!^x*m(mx(Fu#));@43M@|!(1CH;emK%6gK;GC?(8@Op!Rq$N% zGw^ekh~LlGhSpzMK?@4TkCX`fZa|bPq#tP%3F54 zjZXCMQ>Hz?|E|-utyeh6G7Nm|u>CPZFTJwTAAHq`KLb|#g~YdP=4Ds%0$c?o9K@l9 zObum^VqUYS*4=e3zo|~>i91d>fS32>k@ud9Qul}v zCTjxj59x~8^^ey3aCC-*B~QIT6M|rGnq$d$eTp-P4Z?;%7O<#>3i|r>p3mMu+lFK+ zcr~`e>k#Pv#fPykU+}6SA){*N;ytW!o{{_fY5Q`J&S_N{ z$(DL`#l;4#A=}_?v|qk~7XwwT_gKLt2;M2ohnA9kX_2?%>2=ZLz;Z9oLID#!eqPrX z8R8Bvqg9iVF5K=f=&n!gf$Ex*4c%kv?O=e&ako(By;UD-OBNsQ$fmKoCYqZYfRpJL zkQjE5F`Bd_9cK)9#_E;Kk|MsJerd)0@%zDZ%a2Kc2A?n{IKtv>hvtk{~bgDgBA0o=iEcU43Rshm<=N=&Bq0oIhNNu%<%ZW~ zf@YiFg-jnFu*uYKll5TdI%2N-Mljn5q%)N^;L%s47MHnMHTJ>=&d>mDrxfS2!5?mx zl(ie3U$8e|DJwpmz6zwWH*X4k$k&9}iI;%qF&u1`ZC<~k%JNN8HDz)S1_~U2I(6kr zCy_0cDQV#PUWVdJJo=Jr@MQoow>a;mb{+hU`N&K@BGwePmT<#V~Y zML#=PU3m9JgK&U2$w#FIWsFxM<2O!EJYm~JAvI!1tdeNgvl2{8$Imnux&(F5)p*(m zrFi^sJx`>h0x_LnwrOA~5A2hyjE^w<#gpG_UApWm#S#81>muv;@ML9?ELrT7N?5=p z@1d%sXa+!ze)j8nHIbW4wH4sl&#Zo}Jr z(e}bIN0XI>o;$NC)Obs)v*d+5T_i)%giqrF4$cS`sS@X^58DCQFczufoJ)`2Q+8}~ zMp5jQWtrIgAVu8A=iOZcB%fZ>4yH-EzFM|8vY5?=n>Bq^n)CbyB$Vrd>kmYtvELsG zhyDgW%Teszxvyx+DFWt*`CtTEG^+3|EYL605e;+%glfa2VM~pBQ*W*Av00Fgg`8!! zDElChbi4aKPzzWPaJ2B|l(ykrb6=9Yv>BVCm6or-e$LxWi;lM~$+awEYs|bF15ci& zb=f#=T-A^zyecEH!t@g5xW>E zOhchd9m2(|zcC2brv}B3EbJL|h0rE<*PsLsQs%!m1zWtY$;zhEP3ZS&t|&CD>R6?hPr+n=2fXS zo1Z=fgLpU1g$Z6BLyk^US6-dBQO4X?sm!(_Ppo(l>hr63d#?thK4ZsvK<`;v&#W1uxMdN$YhR-_D$`#??n3#Hdh{hNIuT7n zXLYMXLynlI?G*=TQ&}GX?(Rrh>NT#`E5iI~Z$2dL(ixQK{bVb`1eo{%O+V#(^?``+ za)i|cqkruK%0z)jvq=Zq8X>kSDr)w^)dGX=twL93Ib=U)tQF>I5O-F-wER?T3rRH; zd0-=@iQ4ITbc=;lT>*MON$?v*qM#uTqM9tuvu=O13(~1+u{b^?s7e)t4CbTX;7I&U zkhoP=w7c{A*nn_HeHt+4wbD=rgvyPQT~*6qg+>(yt)c8ZZAq%pxT?}G^_pqmS)Mvx zS-zLU1IlBw{hC!Lj&?Q1J(BS#nZDSZ^%dwPFFlPr4RUxv%zlA>8%!hl=D3tT>@1oc z-(1zzdw^T7Qi~j4L9gkFR92(X(w2u+`F-!zrl&uNPd@8RK|$e_3`k{$7Ci z9}B-F{F&mo$bf+kmS_uVsF{amgw zxBluOoP&}|%;4N(_K&&icENQRp`+O_;vB`(6`vxR04z+NA$k&}=>rS*;O0^?T68IyhqkM{2m%esbmfpno_puk#93}LnzE`y1e za+kLeos65og&0}YM+45pxXLN`cwF*b*&sj|HX;ZDV=$!B+OR^Abx+GnEE=2ceU>0% zyr0THe++_N6mL{XKoBwX9T~)cuasYp610}=8~m~W)g8X`eRB=C3D%u1)9C@5abUQj z(|enVHek2Ye&c2_5k2D8bhLD+>-=tV?XtwglS|y4-8Gdr-JQBCVq+~Wh>$dfO7OFM#0l8GZR#f&xeOA z>pa(ZsS*dhifozdP(2Agw97P(tF>O!zCM8HZ2cpaD+}~z9593tT8@Cjv(9*2b6nah z>I5~X(rcW?u79)ur0A03X35;$mc+EY`ew>iBkWmT?F=Y$OfG!_{1>nw;X5-*DS~-{ z65&VOF^0{dhh>jZ6sVl>3+<+-pM`Sb&Y4y6;CZqp*9QgO&uTP~~I` zhaS1=CZG5lIIHu9h|{+3P&J0LK%CWu#mF7r^b!Y-BYH-Pf{$DYjtaZGaXNH}4In~-$)S%eeB+7_1zg~T}!{;Ju-zW80 zZ5W;8h?2DNlMY3&5!l@q*(o0Nhzq*GW1@ivhjS67bDp)7Fguu-V^Zpq;2%aq0kjf? z0o2~|0QW+ymU>B0jx^%Sm#-#IHx?JzgW{>bxw}9bo&f@X+E!Q6u9{!J)^+aU1DNA} zUdY8Ek%)&;r()iECtgU3$>vo#Nen5@qTroNMA|k&DAR0*6hJ*LFcJsZ?wUEY zKPiu-XMH7Nan7JAK4f7AT*md#VWO!+c)&qoCPnOy=}`1KoV%xi-S0)-=_K0jLJ}7q-pH^Jg)cM(Ml}-_vDD-#Yj}*lb(&R~*|J|X zWi*@ba+BNET`J$R?y4|au;HO?vv>M!bERZewla(U^dRvkhBM6?vI`Gb9TrVnX?NMz zuT}p}1a4Cl9WHt|Q}V9VyaSY+RGey$vhU8c5zYWJFz1?W7<9~?=44yCVChsb0Uh?7 z4CaBuWBOu1sqRrnp=AaflofBGLh<%Rh|f=5AibGOmym$+$pVJ{&ZTnIa{8P6{A!IO z3H9Spu$-Hhmn?Xev_&bIW{+3xj1bpmVP=2=Kll|sZw+C2FMGxvGqaGi=H%dEVqMX} z?!AI43bonaZlhU%7lS8LkWR1e9zZu6bOQ*r(bpTb>BX7g3eruF2-%r z7noP?mP@On@ZaT67$#`(he1>v@rJ7DFRCp~eJm@Pj2OM1i@;?gTr(ZT#R9zb75nE4 zxn;B}<)qX{ zT~V~G;@u}DpDoA59nq_n`GXKmt(f4~7nPE}Q|qp(k=+zE3@@sRsKGUu**||`23b2u z+X)eP;*^56Pmiq|GzlITZPut=P9nagu(UFCT?2QpVNW`HX8-dmJM||H;`lLC zra4HAZ+g06?1ST$hT&zgDpsxRD`sSPqsWkhyUqmMz6h`Ws1|a{d9spwS#Q}F@G#5i z1#)bq$Ru%7GKIZ&w;fro?HtbawQrrj&ja)ku2dOYO);`wdSQKwn3;_tx*5seBYV1M zch9?C)O{=@jMXyz(Rk5aX&GWVvumSJ*OJ-p238Y zS5TtdiQroYvbD`U7&|0;?jftp?xPp!m+2|eV1L>sa4lf2wbPmxA78luEd(}b%-*Fo z05)#I%585Y$<5?*lPB7ij4kml4^#xhG(3aRhz3eg_oR5Ce&j4pV%QWnl6?DP(46XG znW!oAj~k4)!3ivb#~R7fSp(X221%H}j+pwhf|K1dPX2`JJYwWu-b{vDx!xHg2iu)K z?by-N&EdordY>~bxNC2@=Z>)A;MZ@#;WP63<=t80v~)C%+{)KGR&nxdSzJv9ZyN^F zV_>jEl*95MubzYE$8LX#bBDEv5_L*?wdhot)%xfpmM7wOklU{_T6wz$6)P6s(VgzR zfST%(7`Lz;@*g*`VH6dVs&R#~V0g^Wy>}*IGJ+xc&kiI(M9bBZL(_tO7dvc-l_>ft|gbBj@madg3G{(@KjysA2CTP^)yXt7~gl(B5&^ zrW7SZ0g<*=5Sh#L9_>9NU$1H=K{&h)i2s3ig&k~pi`N>k+|I@*6Fi%g@91o_MMG%) z(W1=GJNc6q^`TJX>nSb;vZl*DS6TwoL}Z(creIB46Tl?Ww&r+8CCe~zmlafhXzCoc zl+rHYEJO-l}wGRcdQe;O_@ww(sI`$`BdVC5=;rw=g49DLnc0+l__pJ zr_p(vqL2xr^wCgestzer=^=|04nAlS%@=6EB89#lxM`180(}#NJbdFVq)65a%o1Il zW$m(<*q%Z1!RT8$^s>h}sW5$1ImkK%?Gnm1|*sswJcb^LeFwN34}X|jx|@+$yG~MvlX8iv1Pe4+li?5JPiISN_{UF zH8`YJd)74BjMQIrquL(VqU|iJ>Jn{L>8e&{S_5~MRuAqmYJ?;!ch#?WO?+vw8=jKO zgu%u@2L>mLyM4fZv^DxiC*NtE?-3dW+=Z1y7~WI@rNcD(Id5~6mB!F17DpDNWiZ`X z)IKq^n}h2en{=~$Cmo0XUex0JkP&88kuad@{J9WJJZW9ZDbc_D#lQDW(GXFx24&e6@W(q^lJiHiJhlqR)4y2Dh^l{tdy zqlb=B!ig&**|>>8Sl0D@ss%)n=8eoFvQ96IkiBOhgfgeH+;NhT`qYr+KDk%*Xfaq` zYTQD6Xq3M!0f9pL1*`cOd%xD~vR1!6er4Y|NqtD%VeE-t8T}y@2~+_Z@QC+GnYtIs z`p1si4&|I|wWt@D_%h&Z9__A{Z>_Lj7yu0PXtm}))$;xWXN=D?9KF-eWzX# zaMwGy-cgvmV^M|mKsySGA)BOAq*|;eBS&I}5GURIsLUkic3%+`%}aftc~mw*SxS33 z)*^dl@cz5&5JR(MT6=Tqpl_G@vF_NDY}vE4O5TXkz8riQD|b@Qv*Z9+KgPVSt8+@= zU^j>|=B@qgW3iQ2K$CIk#g$*_;|K2anJnVbciAsXN`#H91e1Ms^hq+b3xE|O+PIa& zOO~#PwyR8DhYFlIbIWgKLH7Y!U%74La4Hg?b)A`#QCM6@z0R#~#Tn_j8OTyCE;uLG4n;Sgx#F?21SNc0!B~u6T@;fkP znRMv8hP^D2`P}TZvdKZs`8IYDew%H(U5bT{Y?e-QyT}oF4jeMw=a~M)t&gzydbn@> zMo%PcLEc!VGbM&i?p00-7#JcCo1XY0Y2CCg%5oImwJsv`2}(@3E8_I}d~CKxbwNik zSq_6|&#w7$eX+_x!I%)W2Mp%!Q8hKN1=0PKVk_pMgMniTlR!wCuJ3G%?)po?w?0^7 z8DvGxzrhyT4VsKj!uU z&xro?`NO%B{+n|r_DcP1Z#aL-FE_o~n_F|F;_GK=hsaGJyiCi)=*44Hax;_E^3@6= z0(3CbdVHuB78TVhc?=ifrC8jV4kE4T60_GK=Me4EC;t|o!r=RpMrah@=vq97U?YyX zbkL>nz{^PtJIrHx4MM#DaO62REV^E^9{t%VQs9DRS6pA_>hwTLB)-bNOeEV~t-IyE z;b;Myu$cFB4!ElPhvAv(m&GqtA&>6jyR{dQY zLt5U~KYdbtlS{06v)G$-)zz0lYlwyNn1+6>v}ZR=5~@cvS?vUTA>+|GCg!_x(Fs73 z$6D7ER;zV1XDwY`SZGAfLTU#et1AR~WTP%s0(*0m&If<|blI?=WtK+?E9Fg=Rr3SmD<}k33zDy*N zouXoG{sSgyZ^|+w?sr>k|6i292D$BRt^vNjVuO95bLm^MnP~cgn>6YJD+4Q614l{M z+)rj$4YJ;S9|YhIblD3iuIimTbjF!8F>(6>4Yn-{MsCzG)M#~=Yy$GSX zP6zKMIxwC`_hatIgInPVEh@Rfmc2R^P7C%lwZmQ3leNnbLDB??A*b2`tIUeb(JMiW z_l-_QwbwZCh%kHRgFTUw*p5(@Fys8ig{D^vTmp9!NqO|3=85HbqqRqq!!>Q%UNgMh z6FSf3D%hSI+5lo}GR7w`x$Ca>K(js=~h{{KvJgpwe3k02|EpLh7 z;C7`tnR4M%SmNPuYPjtSaoGh55NLhPAXj@hed92tOaFR(^>I*elDOx{)*BVOC-u$N zoi4RYn!2?;F{@OPVpI_Z1TVU-N2vnzyK5$x@V(^!_vT+iI zto7VusU94!&4TNLK>pN4KI^YlxJN8i0H-Wq&2gqj;YDoOig?AzpQYS0O=Ul6&wbSI z8r8prm!Ou9J$7XR`RXaunN^rBKJJP~!Yf^f)r|?o z$yh3foc5eSo0>cu+8f$>dX(VFpv$CY3R^?br7Ga=Y>Wd z6WR`6RbVF8BuaL=_xVs!GXu&t1&kj4c`+>Hb_tb3pb&(WN0JtFk}Bb9N_AJ|kS?X$ ze87scN2%~cfgSr8no#y|Suw}s?h289YgO+iy-SF6Icn^s>*sEGY{b>$pCF-H@%6pA zGCf4$f7&LCv$!-gH1mq(8yQ*&C>ND_hJ=9HO5mhyV;oK>EQ_de3HF(=9HL$mE4m>I z1uSZBh?EM5;G?;?J&+JGdZ>n`;h2R5=Y4l#=-R^7NF5mM%N+AWZ7;m_dA|_ zu$M?1Z&e)kmN4Gs?G&%L2dPBXW&n&=c`LO85z^wv#LWXcin-MzHbmj~^K*ry^b1+{ zrcil%4~@O!8*wI?UqC1R@Z>K&-6WSxSF9v-86?3nh@VEcq>adS^E(+oEXf_9_kN|ydJfc6U?nTG>rTr(=88FwCQ z+eKd~Nbj>Ja)Bp%{csQF00denArlv@j#QXm@~(+)Hw=ul0t=dEP)>vnVZ_vhS4rZ*QXeo+48=_ffSN!$|j z$71MS;&nN5!c>rYx@!0&6g%bl_-@!6HNVTpb!K;w-6(TTp`*m$JMx!}sEC_$gK~P#N2V z3QIk2LLTx-k@@E5dI>@abqOQd+tP1Fc%$p$qAjVSSM{L+lov8N#qTP-i@OCK65Mu- zo!;-5r+U%!&c%h-*Kq3M!OuJ4040xw-EL)gaujPSj4z@nH7U6pa1%~j>|_z{t}-Nd z6#jJbL|>_}=hA9Dg{Afzj$8KemT33OpXENd|MpDpeQ~h*n`^lRLNv|V1TJ!cvHX1T zf^Yyp`uLHyZe70fGgVcHXPzdP?&uDmx)Q|P7y<5j0G)Mp9RmgCp2mHZKR?236*{Sn z4hqWw-BNJ`T|st_%=)J+MoYNQ`h>xJz8o}Ld~0J8&=xO3|Hwh|qT7@lLLx$Cgg&go#Ub8&i+AP(~-p{40=pZ}V<( zgZ;#Hfr}i7{Zf(lTAjV5hmRqI^i@;^AKyc$mg)qw@`YQ&%NVU{2&eb?UJnio(5`Iw zyN3_;Y0bExHV5ty@U&_$j%fd$^`Ejpj>}D0eUtPc?1(* zzT93=$qpKyd9oKD&m!>5Td&?Ekh6_~E%$2->?4aMJijm>EwGZ3lro@f2Z0Y(>DCFC z*a>MLOKf*-gLnKh$9@cC6PwlKwp&ElxW8w!AEB$W?>_bBfL{aG zX`}a@%hHjw%JEMqBdNW?wlbZQ-igfH|hHQ6lx}9(cWQg35fE;1f4cm0V-m zKgD>Ya$P6gjXsNQy>j2mZV)DcH~RoRS7r4lR5pCe5+2Ol+TU_Fa*Vt)5!%Jbz@J~3 z9kPKy*+G+REyim4TksrY zvMRH$%+ZT_J9?cY%FKaZgYvG(!407z_D7NZ{pu?3s@`4A(#@0*2U=EY2Ws7D!W##R z36!2I+)K3)Zxo;&blVdAVRwN)i#xcKtg9A)(UCX6@REzb;P4ODlL9O8F)jLKVifOp zkH5G(jupuZU1UO4yoPeV{@SRgk*N%{8Fj{E>tLGze^iO@z*x?}H7n51u8XzbU)(f3qDqs{lIw%zmnz=>Lf zjZ=U#6RWkJ_F3e|L;;XzV`;Z7@H!z9Lgm*v;CA!d9QJ;l<{Jv75%1T3&!f)u@Z{!< z5y#14FlugmZ+--n?2eY@Zcq+v%J?=a&FPtNy;&^cnI3o$M zY9P`sIojA8?aHLW1~QSONuI~d@zw!j{D_34hSS&wK9#xBr%vmw+{$N%*F~aS?%=@- z)Vvr*T$%42^~XC<%4S1-f8E5gZwit|er^mTM9%#p@_*{DOG&Z21s#l#6x7kmwyCukkmU>nUsT`bNj*ydy2+^pDBZFUr&E1P9mF zVoXazlA~-5p}MWZQ9B0ecQbac@AIc{6sp~7P@a+e21$7^o>T^$kkj4dKZWq(*vzYa zWQ){eg(zpk5=HT@*eOvZU}>p{nO1~uDL8YA$SN7v9e9=g!nx5+5ZK05@3Wqt$Z$6B#jM==X^x&O?(li$S3;U*A53fjD_lb76HCFS)#;9s%} z=w(;A_N|Vnz_50xKn?bc(R1|~-~ym0$1}ATpe`#z9l_kS_i1;qr-$F|J z#Mc`?J-OlkN5mragVc7iFU(yT@8b^wowW^+;bnq8$B@%pvw3^Jvc8AEp5>u!3$Rab92{C_F$4~{7q@{pRU1s%Pjk@ z(zVxH57Igm@u^9+(Air{^{7;2;us{v`vCbf`{%vhi$0Q=Ux=;6`sDB1N4;j;5aAhP z0A#!A1~4f`d%#eOdQh9MEmtSv0w3Jb<(MEA`5FL$VkEKC<-lF0QL`IvkFx_eT0ZI1 zqY?p7SKOPz0|vpi4sMs+_#ikZvSf^qm(_h{PY}Tuq#^bAS-zun4_lAdHhUMuwOL;BeVRl+otwmP?}<5eZGJCU_hyyc&s z%`0jTOX&Q{uG!hjE&lOk#||cFGh{OV#_Se5#9TQZ+ls;jZJkEUK%(Q3C2O*CK)DXQ zIQ0+`-iP?iK2~QSabW3B{?rrb%oz{>14sm!I|J`&X>qUM^S9@*|dM;7OdbUZJyb(l``FQ;q zE54EBV0nENG8RgA%_crMRX1#+FvE|`HieX=Pp5q`{o(~6Oo z7W;bq994HA`9&_sLnMA4!7)b#{8gxwKJnt=NX=yl>n%aoiJ;6?ko2w9uK1w#sRPD! ze#DaJe47&afY00@@{~9Neh5@;(t?B##+zxO68%uNd-uYC_7=lFg1w9y*v7R9ymZv;}=h!;SSzknLMt0mh2+FEfL2J{Vbt#eB2;CU;SdrDal@%uXaTx5I*L10>*-v z4TOIHy&?O{9T=;>#59w+ZU#the5*cGx6oSUewjnPu|(i|TxPc9Sh+Nx?2(p}OIK`Y z(~HW8)n8OOL?olbb8_A-iA)D`Yjv#EAEpU~`WhPnNRY%EI&}1vhoSSC`@k<%e6E^| zMcJz`O0VfcFU6eqabLs_=xLBICv!TJ{RB36bGDSVwebZVTBev!=B zTD|La$F20neHj@6Y=wC`o|I(aBKI;cV^w`?LCTZR)&w?XzHsG4+IH*tnAdwm3=doI zGos!64ee{H_Z+y{DmRa-_s6^)<0PzGOQ1a>aQye)9PHZpWyqniBOM(iuW9pBPZwxX z%C3-jqcm9Qixc0zbAFn2uS)0l1Avr#6AZn!L@D~E`#8rUx`j+|{qsLw_23lv*PziQ>< z)D(X8D&i&&9RJPReXywg<6<%(xlmrqp1xIJ&bwlxXvM%I-eSi5%JW*qu(!nYz;m4q zlTVy0I+Rb|%)`x&pSP#8v85urEs2|h{Z7RBN4+ui1-nE)B2~pyskjaA!z2&K*y-1X z1Z+om;?0X=4ty!Vh#jAScCRJS9g)dozG1V=WKrJzo3v4ajb@6l#X*hvu6-$ag$Oy1 z1KRaQ2{OXp%hJy{N`q4xXs$A3(J#ZarcG9y|tbCiEY1|;Kh)X{z>p-(vv>yV1JY+W_2@W zhbYngF62fphb=()%5>@TD=bV{wbj=5$tI)WeQ{AmSP?#pNp4FjwsHFve$r0DdXrrm zUV^853xX<(X*fC%D&VDonImo2f%&~|5X-KeL(1s5;q1VDniSNjcopvLwJRXh{<@7G z)ale6MTUsYn8$6hP}zvHVNG=YLbp@n@&>ctUua+z>QHD{3$QGMXQQ>vJ-3(rl32IO z3-wTFYdARn0HF>v(fxo8k^Xp#KH|}93T+fyHjFfYi z1DAFlhbGE0(gu!=%S`Ni z4~r$|uS0RqPVVnL{R4g^mR-gk5-Q#-a|s&t#M=9cT8r9yuDvc~CEbg=CIw(g&tgM+ z)d>^mW%*Kfm!q$2cZ_BpWN7o+?01tv6L$`}Y*gUunVMSYQptjEnHi&uU8P;xH6=1` zhNZ0sODFgR))I$DVV0>wc^qB5_E-~^QdkydS-yJJ7OS|Ia5WB8y`tPvD>e1v37Nuk z$Pk%@XO{@C2eU#b)ff4pX1ok$m(+z7XmLbybBWCOeYmz7XJ|HT5iE_@pK91A5!WZq zJ+rxgl~mjFB++Jlx4O=C06d1#b*y)Fi1ub2@N*!)iBKQzE4#0uZl$e|-Jv?7!VACr zVN@dFq{!=F$yC(q$7WkQ0JpBassMuCOWz_!00cGEYMr5cP_QYVb*!TIm|sY(VyW-* zwgbCzlZVUhD2b9FXIiM+OC3VFn*#GJJ;jdxr6s@NR4ESlRr7b{;1FH zQKRc4zBr=F%1TEdaTfWYj%>>sTf5@Rgi^kxtFe~JNPt^8CMGbi_(k$$*T+5Gr+)lb z?;(IhJ5GxGUh`$)Czm*E;dZ#3IOw@5Syy%B%i!G$$;2zH!@L`FTgxVbIK?~eN{hS3oPq<=oyaQR59dvoDh6s0U>JIT(hL2{3KRH zT?wy;?JOZq>l2yBqpQ^Y{a8yAM#a zcE?xHU+Xx9U#JHlJ!l+nulu$G42a5S6IcMumc?5{A0yUNFL5E>?&69JA8FZ-0j+Rnc9hrQyOt-v^>z-#c`{leNCZIzNsmcOP2cn(p!OfGWrHA|*R6t?Z{b7`ay- zVI5qFfT3*W>v<^a<9f(lb9L3;#6T_-uEZ@dEr-0-*xx@s@shrm^eVc3-M%nA8_66M; z;PmEVSR=>tH*IJ2W?>Y#Yl)j_Zra(;6T0Zdy9U#dIy7shWx35}n>l$==y{^CFRP0M z@9kpgO)^MWdnXD*yDtt+#D4+GJ?`q2J1Yk);^0M^&4+*TeY%*3SskvUv|L}n)~)Cu z^z7H`oxCntj!HT&m;G4V8gt?v?E{kDN?Y6VBPQ5yRaJ8H-W%awS|@4WW17TJQR$f2 zm0fdHKYxsmJBV50rFW)A9rI#x^Hz{0ynv`HNb06||SEN#)7cFD9IrT_w{RRPR z)Fo@k*`sLi{5b~!0V@5(&nE(c2wTdllvtVUP=S<>sDB2|30F8LX}DFCf|m1reGwK$ z;PQD)eY07@xb4AMlYW>`im&fd-`$6iy6JNQX~+X|I#8j4LEJl=yn;l7m%KKpHw#~>l^g>@gcAVvwkpZ3m~ zFKeunzOIf`vRfLph0t2_qUBx50;p^o1GhdZ?wbz2qv9x9w}7uCat0C!UV1;a=h@2e zThA)20+;jTT2ckosRqy)j;foYEvH6lTm~cb)4Zl7SF3MhK48~JA(gUCdU`0u?Xngz zlXuYr9NUO1E-(r4SVIl1(Nd&Cjh#>WkrW~MO=EexiQ>VS7BIqs-rX(O_qj97@m#O( z16zttH9`$aKNrWyqFMo0)`4 zj8-!o9(aY+b-SuGE!GBn|R zeah1YVGpDP3;NRJJEk7t1AsHLkcv8=^Zj248Gsa zu*2FKd;i{U{M=H6(D_esc<1v-%$~x^d(VI-=3O|kvkngVQK~a2R{Y4hCYWSHI0Zzc z&!_CQq-61=amY^n#fy8Wvg?Y`Y-#DtIsB0K=FAF8N;XKvc)Ig%lS+Y+Sav)gKIN50 z99Bzq_#-k$o{>rz-jkJ;wJ!#UC_)LmiJQ?jX|DD$mK}<|*frTKfE=yzff+A?sdS6`33)b`1}ouN-|W}(6&)gyw7Hx59!(^Xo zS%}_WJ!?4sfj#U?g+ZFde_OkMT`=&dh?v5dDwqLw)~4k@-P*r=hJ*tc5?n_8s^7a) zN}KA5>P4@v?EKu7PO=?(e>q&Vz_j7rPv%diu2@<5cdz9uPpS3`;CtbsE73`ZbqXYs zi^r{%_3k8-CL%YeanbvWNy)E^5UWi8IK*;(7xUl(<#el)-1NEb-u*sYtwbXBscoiBqFld0e0bcce$M9oB=gwh!#yExAI~32tPy^m z5>*QpcXmJ3{iW>q*CVDfU=BWbdo7)5N*ZY05)c@~csppi#0sR$5Wk^(RYmG@ zam>Yt&i2Bs+XVf~EB{Eu6Xo3FG-R2ob?*oFmV_Qyur^*n@csS;W zv#0OcgN-S??GyXTcV=v|=GPjDXVR13Dc%=Ebm@{A5Br!dYX&Sf=4JC zJPE@@wSgE%tnf#58)~U`O1~C{7Yy+iO>Z1Y)oXhjA_l9}e5>R9JU_2E)k$Pq#9p0p zl8O}>d)P4pr0_tE5Ex5@i^z$%rYWjUK!sT$H9<#m(lr-skiG&Kh|C+IPZ z{&Dy_0x5+AcIeV8h>J7M)6ZVw8Tk+8%Sk1p4sH(5CvC$yBElla zCq*QPm}aLx<*IHn+|&*VPW&eUUt++I=-jv_cLt3~nGyp`UpIgLjB41`G>sixf31rZ z!+wPNi#BPwWvgG9XvDcT1T6d7%pR=d^aRSRmwVc;I2j~w8 zbN7In&P2bM_RbD_VqTO^iBe8Zj_9~gu{3c>hMz>+ZY4SZwj%TYt%GRuTOpUyAk@0&eQ8ejx;zrHzguFkr60f+qi zQX+&iqk6ABY3m}LU)rOG<5d|7LK&RS7}I?epo!=?5{vaQ(a-wyS*g%JNx;K zAT!S3V`EF>?(bI=Sm>VT=jl-rk8KjI%ha>X%cQ&{c(-6PRBP7Jefyz^uDb-0410@L z{*|e}(cJz%ia`1W3Hmq}UX9KE;Im+|j0KH8>CpU7mY7~rQ zVV6x2$B&4NP>COAqEwE#Z^c4s6pFTrkfEy6dS>I-T@t8a*8e=56S8b}Sf-2Ae9j62 znI6lPSVwcbk%C-|i>)v-dvCVDqLA#xm1Ir_NKsdpt*mX z^C!TZt2*Yu)o1c)iVi>JN(r`P`Da}P*>n1Yg#^lZBR`J4ak(;wIY8}^ey&*N_q|9|~p zGZXM3WiO6D``-QK#sA|Yrh-%V?rFP3^N%ddHHT{Jsu2H@z?=<$9g@!FuB&c)j_;t0KJ zk(l#y#3c#<55WsV;{Vr>k|NlTFk+44e)!Ly>e)F3pFx_3&N}38a`VP)9GEje>c$ur zP616vN8Stoe?j4%ARivFDc<)>JwK1{{0EsL#q89UtN5I3v?h*e_Ejd zUL6}G*(y31pwpiR*Xrrs zYI?F~Zv}py;I4c&Jvcyl%~Q?m_cYQnZ1|;@4Yyz5!FMtrna9_9l$n>FRYaYgPYj+K zBVvBM*MX_4M=-PVonpGb@pj&OD-Qvo*wXpxC(%){+KR{|N2h6}czSBJH@b38GxK(s z>VYYL?-{FMkfW> zHU_-_3|M*RRkFSI_v*Z{x?Bt0L`1SzH8UbATTYl0acbr6&K$`wxii3I8d`zxKYL z@oa1?nNs3mfJ#)QuzxOw7T!*LzBp470eYgcgKP_PnQf+zUwoUOlG)owH8oBd6%Zc$mQ1$x4cq8qgx!v*6WK{E^vO4;>FGMg?zZr9h(Xmjdjikow> zu|*deZmCo+kB#ZO@3*j4$+QaP|M)JP?wn!Hg(wcQqtT!L91kQ;YpvH>D>}_G<#gg{ z%mTqg5ofxxB2QA*9*>J!1|iALO)*8jUs4oO!_dTHm>p|*zJ;VLt}I4hA-<33xqlG< z_Ai{``#M1k=ZUiYuW8P$d

|Pe6QgPjoz73K-06JDzIOb~*i_O?$VZ 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

Cx&(lX~a$ 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 z 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 P#_y!TnG>({5aIs?;P=P$ literal 0 HcmV?d00001 diff --git a/ja_JP/observability/opentelemetry/e2e-traces.md b/ja_JP/observability/opentelemetry/e2e-traces.md index 0f8030741..64c652e5a 100644 --- a/ja_JP/observability/opentelemetry/e2e-traces.md +++ b/ja_JP/observability/opentelemetry/e2e-traces.md @@ -1,100 +1,122 @@ # OpenTelemetryベースのエンドツーエンドMQTTトレーシング -現代の分散システムにおいて、リクエストの流れを追跡しパフォーマンスを分析することは、信頼性と可観測性を確保するために不可欠です。エンドツーエンドトレーシングは、リクエストの開始から終了までの全経路をキャプチャすることを目的とした概念であり、システムの挙動やパフォーマンスに関する深い洞察を得ることができます。 +現代の分散システムにおいて、リクエストの流れを追跡し、パフォーマンスを分析することは、信頼性と可観測性を確保するために不可欠です。エンドツーエンドトレーシングは、リクエストの開始から終了までの全経路をキャプチャすることを目的とした概念であり、システムの挙動やパフォーマンスに関する深い洞察を得ることが可能です。 -EMQXはバージョン5.8.3以降、MQTTプロトコルに特化したOpenTelemetryベースのエンドツーエンドトレーシング機能を統合しています。この機能により、特にマルチノードクラスター環境において、メッセージのパブリッシュ、ルーティング、配信を明確にトレースできます。これにより、システムパフォーマンスの最適化だけでなく、迅速な障害箇所の特定やシステム信頼性の向上にも役立ちます。 +EMQXはバージョン5.8.3以降、MQTTプロトコルに特化したOpenTelemetryベースのエンドツーエンドトレーシング機能を統合しています。この機能により、特にマルチノードのクラスター環境において、メッセージのパブリッシュ、ルーティング、配信を明確にトレースできます。これにより、システムパフォーマンスの最適化だけでなく、迅速な障害箇所の特定やシステムの信頼性向上にも寄与します。 -本ページでは、MQTTメッセージのフローを包括的に可視化するために、EMQXでエンドツーエンドトレーシング機能を有効化する方法を詳しく解説します。 +本ページでは、EMQXでエンドツーエンドトレーシング機能を有効化し、MQTTメッセージフローの包括的な可視化を実現するための詳細な手順を解説します。 -## OpenTelemetry Collectorのセットアップ +## OpenTelemetryコレクターのセットアップ -設定の詳細については、[OpenTelemetry Collectorのセットアップ](./traces.md#setting-up-opentelemetry-collector)を参照してください。 +設定の詳細については、[OpenTelemetryコレクターのセットアップ](./traces.md#setting-up-opentelemetry-collector)を参照してください。 ## EMQXでエンドツーエンドトレーシングを有効化する ::: tip -エンドツーエンドトレーシングはシステムパフォーマンスに影響を与える可能性があるため、必要な場合のみ有効化してください。 +エンドツーエンドトレーシングはシステムパフォーマンスに影響を与える可能性があるため、必要な場合にのみ有効化してください。 ::: -このセクションでは、EMQXでOpenTelemetryベースのエンドツーエンドトレーシングを有効化する手順と、マルチノード環境でのMQTT分散トレーシング機能のデモを紹介します。 +このセクションでは、EMQXでOpenTelemetryベースのエンドツーエンドトレーシングを有効にする方法を案内し、マルチノード構成におけるMQTT分散トレーシング機能を紹介します。 ### ダッシュボードからエンドツーエンドトレーシングを設定する -1. ダッシュボードの左メニューから **Management** -> **Monitoring** をクリックします。 -2. Monitoringページで **Integration** タブを選択します。 -3. 以下の設定を行います: - - **Monitoring platform**: `OpenTelemetry` を選択します。 - - **Feature Selection**: `Traces` を選択します。 - - **Endpoint**: トレースデータのエクスポート先アドレスを設定します。デフォルトは `http://localhost:4317` です。 - - **Enable TLS**: 必要に応じてTLS暗号化を有効にします。通常、本番環境のセキュリティ要件に合わせて設定します。 - - **Trace Mode**: `End-to-End` を選択し、エンドツーエンドトレーシング機能を有効化します。 - - **Cluster Identifier**: span属性に追加するプロパティ値を設定し、どのEMQXクラスターからのデータかを識別できるようにします。プロパティキーは `cluster.id` です。通常はシンプルで識別しやすい名前やクラスター名を設定します。デフォルトは `emqxcl` です。 - - **Traces Export Interval**: トレースデータのエクスポート間隔を秒単位で設定します。デフォルトは `5` 秒です。 - - **Max Queue Size**: トレースデータキューの最大サイズを設定します。デフォルトは `2048` エントリです。 +1. ダッシュボードの左メニューから **Management** -> **Monitoring** をクリックします。 -4. 必要に応じて **Trace Advanced Configuration** をクリックし、詳細設定を行います。 +2. Monitoringページの **Integration** タブを選択します。 - - **Trace Configuration**: クライアント接続やメッセージ送受信、ルールエンジンの実行など、特定イベントのトレース有無を設定できます。 - - **Follow Traceparent**: `traceparent` を追跡するかどうかを設定します。`true` に設定すると、EMQXはクライアントから送信された `User-Property` 内の `traceparent` 識別子を取得し、エンドツーエンドトレーシングに紐付けます。`false` の場合は新規トレースを生成します。デフォルトは `true` です。 - - **Client ID White List**: トレース対象とするクライアント接続やメッセージを制限するホワイトリストを設定できます。不要なトレースを避け、システムリソースの消費を抑制できます。 - - **Topic White List**: トピックのホワイトリストを設定し、マッチするトピックのみをトレース対象とします。クライアントホワイトリストと同様にトレース範囲の制御に役立ちます。 +3. 以下の設定を行います: + - **Monitoring platform**:`OpenTelemetry` を選択します。 - 設定後、**Confirm** をクリックして設定を保存しウィンドウを閉じます。 + - **Feature Selection**:`Traces` を選択します。 -5. **Save Changes** をクリックして設定を保存します。 + - **Endpoint**:トレースデータのエクスポート先アドレスを設定します。デフォルトは `http://localhost:4317` です。 -OpenTelemetryエンドツーエンドトレーシング ダッシュボード設定画面 + - **Headers**:トレースエクスポートリクエストにカスタムHTTPヘッダーを追加します。OpenTelemetryコレクターが認証やAPIキー、トークンなどのカスタムヘッダーを必要とする場合に使用します。各ヘッダーはキーと値のペアで指定してください。 + + OpenTelemetryコレクターがBasic認証を使用する場合は、`authorization` ヘッダーを以下の形式で追加する必要があります: + + ``` + Key: authorization + Value: Basic dXNlcjpwYXNzd29yZA== + ``` + + この設定により、HTTPベースの認証を要求するコレクターとの互換性が向上します。 + + - **Enable TLS**:必要に応じてTLS暗号化を有効にします。通常は本番環境のセキュリティ要件に応じて設定します。 + + - **Trace Mode**:`End-to-End` を選択し、エンドツーエンドトレーシング機能を有効化します。 + + - **Cluster Identifier**:スパン属性に付加するプロパティ値を設定し、どのEMQXクラスターからのデータか識別しやすくします。プロパティキーは `cluster.id` です。通常はシンプルで識別しやすい名前やクラスター名を設定します。デフォルトは `emqxcl` です。 + + - **Traces Export Interval**:トレースデータのエクスポート間隔を秒単位で設定します。デフォルトは `5` 秒です。 + + - **Max Queue Size**:トレースデータのキュー最大サイズを設定します。デフォルトは `2048` エントリです。 + +4. 必要に応じて **Trace Advanced Configuration** をクリックし、高度な設定を行います。 + + - **Trace Configuration**:クライアント接続やメッセージ送受信、ルールエンジン実行など、特定のイベントをトレースするかどうかの追加オプションを設定します。 + - **Follow Traceparent**:`traceparent` を追従するかどうかを設定します。`true` に設定すると、EMQXはクライアントが送信する `User-Property` から `traceparent` 識別子を取得し、それに関連付けてエンドツーエンドトレーシングを行います。`false` の場合は新規にトレースを生成します。デフォルトは `true` です。 + - **Client ID White List**:トレース対象とするクライアント接続やメッセージを制限するホワイトリストを設定します。不要なトレースを避け、システムリソースの消費を抑制できます。 + - **Topic White List**:トピックのホワイトリストを設定し、マッチするトピックのみをトレース対象とします。クライアントホワイトリストと同様にトレース範囲を制御します。 + + 設定保存後、**Confirm** をクリックしてウィンドウを閉じます。 + +5. 最後に **Save Changes** をクリックして設定を保存します。 + +Otel-E2E-Trace-dashboard-page ### 設定ファイルからエンドツーエンドトレーシングを設定する -EMQXがローカルで稼働している前提で、`cluster.hocon` ファイルに以下の設定を追加します。 +EMQXがローカルで稼働している場合、`cluster.hocon` ファイルに以下の設定を追加してください。 -設定オプションの詳細は、[EMQXダッシュボード監視統合のOpenTelemetry項目](http://localhost:18083/#/monitoring/integration)を参照してください。 +設定オプションの詳細は、[EMQXダッシュボード監視統合](http://localhost:18083/#/monitoring/integration) のOpenTelemetryセクションを参照してください。 ```bash opentelemetry { - exporter { endpoint = "http://localhost:4317" } + exporter { + endpoint = "http://localhost:4317" + headers { + authorization = ""Basic dXNlcjpwYXNzd29yZA==" + } + } traces { - enable = true - # エンドツーエンドトレーシングモード - trace_mode = e2e - # エンドツーエンドトレーシングオプション - e2e_tracing_options { - ## クライアント接続/切断イベントをトレース - client_connect_disconnect = true - ## クライアントのサブスクライブ/アンインサブスクライブイベントをトレース - client_subscribe_unsubscribe = true - ## クライアントのメッセージングイベントをトレース - client_messaging = true - ## ルールエンジンの実行をトレース - trace_rule_engine = true - ## クライアントIDホワイトリストの最大長 - clientid_match_rules_max = 30 - ## トピックフィルターホワイトリストの最大長 - topic_match_rules_max = 30 - ## クラスター識別子 - cluster_identifier = emqxcl - ## メッセージトレースレベル(QoS) - msg_trace_level = 2 - ## ホワイトリスト外イベントのサンプリング率 - ## 注:トレースが有効な場合のみサンプリングが適用されます - sample_ratio = "100%" - ## traceparentの追跡 - ## クライアントから渡された`traceparent`をエンドツーエンドトレーシングで追跡するか - follow_traceparent + enable = true + # エンドツーエンドトレーシングモード + trace_mode = e2e + # エンドツーエンドトレーシングオプション + e2e_tracing_options { + ## クライアント接続/切断イベントをトレース + client_connect_disconnect = true + ## クライアントのメッセージングイベントをトレース + client_messaging = true + ## クライアントのサブスクライブ/アンザブスクライブイベントをトレース + client_subscribe_unsubscribe = true + ## クライアントIDホワイトリストの最大長 + clientid_match_rules_max = 30 + ## トピックフィルターホワイトリストの最大長 + topic_match_rules_max = 30 + ## クラスター識別子 + cluster_identifier = emqxcl + ## メッセージトレースレベル(QoS) + msg_trace_level = 2 + ## ホワイトリスト外のイベントのサンプリング率 + ## 注意:トレースが有効な場合のみ適用 + sample_ratio = "100%" + ## traceparentを追従するか + ## クライアントから渡された`traceparent`をエンドツーエンドトレーシングで追従するかどうか + follow_traceparent } } max_queue_size = 50000 scheduled_delay = 1000 - } } ``` ## EMQXでのエンドツーエンドトレーシングのデモ -1. EMQXノードを起動します。例として、`emqx@172.19.0.2` と `emqx@172.19.0.3` の2ノードクラスターを起動し、分散トレーシング機能をデモします。 +1. EMQXノードを起動します。例えば、`emqx@172.19.0.2` と `emqx@172.19.0.3` の2ノードクラスターを起動し、分散トレーシング機能を検証します。 2. MQTTX CLIをクライアントとして使用し、異なるノードで同じトピックをサブスクライブします。 @@ -112,7 +134,7 @@ opentelemetry { 3. 約5秒後(EMQXのトレースデータエクスポートのデフォルト間隔)、[http://localhost:16686](http://localhost:16686/) のJaeger WEB UIにアクセスし、トレースデータを確認します。 - `emqx` サービスを選択し、**Find Traces** をクリックします。`emqx` サービスがすぐに表示されない場合は、少し待ってページを更新してください。クライアント接続およびサブスクライブイベントのトレースが確認できます: + `emqx` サービスを選択し、**Find Traces** をクリックします。`emqx` サービスがすぐに表示されない場合は、少し待ってページを更新してください。クライアントの接続やサブスクライブイベントのトレースが表示されます: ![Jaeger-WEB-UI-e2e-Client-Events](./assets/e2e-client-events.png) @@ -122,36 +144,36 @@ opentelemetry { mqttx pub -t t/1 -h 172.19.0.2 -p 1883 ``` -5. 少し待つと、Jaeger WEB UIでMQTTメッセージの詳細なトレースが確認できます。 +5. 少し待つと、Jaeger WEB UIでMQTTメッセージの詳細なトレースを確認できます。 - トレースをクリックすると、詳細なspan情報とトレースタイムラインが表示されます。サブスクライバー数、ノード間のメッセージルーティング、QoSレベル、`msg_trace_level` 設定により、MQTTメッセージのトレースに含まれるspan数は異なります。 + トレースをクリックすると、詳細なスパン情報とトレースタイムラインが表示されます。サブスクライバー数、ノード間のメッセージルーティング、QoSレベル、`msg_trace_level` の設定に応じて、MQTTメッセージトレースに含まれるスパン数は異なります。 - 以下は、2クライアントがQoS 2でサブスクライブし、パブリッシャーがQoS 2のメッセージを送信、`msg_trace_level` が2に設定されている場合のトレースタイムラインとspan情報の例です。 + 以下は、2人のクライアントがQoS 2でサブスクライブし、パブリッシャーがQoS 2のメッセージを送信し、`msg_trace_level` が2に設定されている場合の例です。 - 特に、クライアント `mqttx_9137a6bb` がパブリッシャーとは異なるEMQXノードに接続しているため、ノード間の送信を表す2つの追加span(`message.forward` と `message.handle_forward`)が表示されています。 + 特に、クライアント `mqttx_9137a6bb` はパブリッシャーとは異なるEMQXノードに接続しているため、ノード間の送信を表す2つの追加スパン(`message.forward` と `message.handle_forward`)が表示されます。 ![Jaeger-WEB-UI-e2e-Message](./assets/e2e-message.png) - また、メッセージやイベントがルールエンジンの実行をトリガーする場合、ルールエンジンのトラッキングオプションが有効であれば、ルールおよびアクションの実行トラッキング情報も取得可能です。 + また、メッセージやイベントがルールエンジンの実行をトリガーする場合、ルールエンジンのトラッキングオプションを有効にすると、ルールおよびアクションの実行トラッキング情報も取得可能です。 ![Jaeger-WEB-UI-e2e-With-Rule-Engine](./assets/e2e-with-rule-engine.png) ::: tip - ルールエンジンの実行を含むエンドツーエンドトレーシング機能は、EMQXバージョン5.9.0以降でサポートされています。 + ルールエンジン実行を含むエンドツーエンドトレーシング機能は、EMQXバージョン5.9.0以降でサポートされています。 ::: ::: warning 重要なお知らせ - この機能は慎重に有効化してください。メッセージやイベントが複数のルールやアクションをトリガーすると、単一のトレースで大量のspanが生成され、システム負荷が増加します。 + この機能は慎重に有効化してください。メッセージやイベントが複数のルールやアクションをトリガーすると、1つのトレースで大量のスパンが生成され、システム負荷が増大します。 メッセージ量やルール・アクション数に応じて適切なサンプリング率を見積もってください。 ::: -## トレースspanのオーバーロード管理 +## トレーススパンの過負荷管理 -EMQXはトレースspanを蓄積し、定期的にバッチでエクスポートします。エクスポート間隔は `opentelemetry.trace.scheduled_delay` パラメータで制御され、デフォルトは5秒です。バッチトレースspanプロセッサにはオーバーロード保護機能があり、最大蓄積数(デフォルト2048span)を超えると新規spanは破棄されます。以下の設定でこの制限を調整可能です。 +EMQXはトレーススパンを蓄積し、定期的にバッチでエクスポートします。エクスポート間隔は `opentelemetry.trace.scheduled_delay` パラメータで制御され、デフォルトは5秒です。バッチトレーススパンプロセッサには過負荷保護機能があり、スパンの蓄積は上限まで許容されます。デフォルトの上限は2048スパンです。以下の設定でこの上限を調整できます: ```yaml opentelemetry { @@ -162,14 +184,14 @@ opentelemetry { } ``` -`max_queue_size` の上限に達すると、現在のキューがエクスポートされるまで新規トレースspanは破棄されます。 +`max_queue_size` の上限に達すると、新規のトレーススパンは現在のキューがエクスポートされるまで破棄されます。 ::: tip 補足 -トレース対象メッセージが多数のサブスクライバーに配信される場合や、メッセージ量が多くサンプリング率が高い場合、オーバーロード保護により多くのspanが破棄され、エクスポートされるspanはごく一部になる可能性があります。 +トレース対象のメッセージが多数のサブスクライバーに配信される場合や、メッセージ量が多くサンプリング率が高い場合、過負荷保護により多くのスパンが破棄され、エクスポートされるスパンはごく一部になる可能性があります。 -エンドツーエンドトレーシングモードでは、メッセージ量やサンプリング率に応じて `max_queue_size` を増やし、`scheduled_delay` を短縮してspanのエクスポート頻度を上げることを検討してください。これによりオーバーロード保護によるspanの損失を抑制できます。 +エンドツーエンドトレーシングモードでは、メッセージ量やサンプリング率に応じて `max_queue_size` を増加させ、`scheduled_delay` を短縮してスパンのエクスポート頻度を上げることを検討してください。これにより過負荷保護によるスパンの損失を防げます。 -**ただし、エクスポート頻度の増加やキューサイズの拡大はシステムリソース消費を増加させるため、メッセージTPSや利用可能なシステムリソースを十分に見積もった上で適切に設定してください。** +**ただし、エクスポート頻度の増加やキューサイズの拡大はシステムリソースの消費増加を招きます。メッセージTPSや利用可能なシステムリソースを十分に見積もった上で、本機能を有効化し、適切な設定を適用してください。** ::: diff --git a/ja_JP/observability/opentelemetry/logs.md b/ja_JP/observability/opentelemetry/logs.md index c38f0624c..d57c8e0a2 100644 --- a/ja_JP/observability/opentelemetry/logs.md +++ b/ja_JP/observability/opentelemetry/logs.md @@ -1,11 +1,12 @@ -# OpenTelemetryを使ったログ管理の統合 -ファイルログと同様に、OpenTelemetryログは重要なイベント、ステータス情報、エラーメッセージを記録し、開発者や運用チームがアプリケーションの動作を理解しトラブルシューティングを行うのに役立ちます。ただし、OpenTelemetryログは標準化されたログフォーマットを採用しているため、ログの解析や分析、処理が容易です。さらに、Trace ID、タグ、属性などの豊富なコンテキスト情報をログに付加できる点も特徴です。 +# OpenTelemetryによるログ管理の統合 -本ページでは、EMQXとOpenTelemetryログハンドラーを統合して高度なログ管理を実現する方法を詳しく解説します。OpenTelemetry Collectorのセットアップ、EMQXでのOpenTelemetryログハンドラーの設定およびログのエクスポート方法、ログ過負荷の管理について説明します。この統合により、EMQXのログイベントを[OpenTelemetryログデータモデル](https://opentelemetry.io/docs/specs/otel/logs/data-model/)に準拠した形式で出力し、設定したOpenTelemetry Collectorやバックエンドにエクスポートできるため、監視やデバッグの効率が向上します。 +ファイルログと同様に、OpenTelemetryログは重要なイベント、状態情報、エラーメッセージを記録し、開発者や運用チームがアプリケーションの動作を理解しトラブルシューティングを行うのに役立ちます。ただし、OpenTelemetryログは標準化されたログフォーマットを採用しているため、ログの解析、分析、処理が容易です。さらに、OpenTelemetryログはTrace ID、タグ、属性などの豊富なコンテキスト情報をレコードに追加することをサポートしています。 + +本ページでは、EMQXとOpenTelemetryログハンドラーを統合して高度なログ管理を実現するための包括的なガイドを提供します。OpenTelemetry Collectorのセットアップ、EMQXでのOpenTelemetryログハンドラーの設定によるログのエクスポート、ログの過負荷管理について解説します。この統合により、EMQXのログイベントを[OpenTelemetryログデータモデル](https://opentelemetry.io/docs/specs/otel/logs/data-model/)に準拠した形式でフォーマットし、設定済みのOpenTelemetry Collectorやバックエンドシステムにエクスポートできるようになり、監視やデバッグ機能が向上します。 ## OpenTelemetry Collectorのセットアップ -EMQXのOpenTelemetryログを有効にする前に、OpenTelemetry CollectorおよびOpenTelemetry対応のログ収集システムをデプロイし設定する必要があります。本ガイドでは、[OpenTelemetry Collector](https://opentelemetry.io/docs/collector/getting-started)のデプロイ方法と、debugエクスポーターを使ってログを`stdout`にリダイレクトする設定手順を説明します。 +EMQXのOpenTelemetryログを有効化する前に、OpenTelemetry CollectorおよびOpenTelemetry対応のログ収集システムをデプロイし設定する必要があります。本ガイドでは、[OpenTelemetry Collector](https://opentelemetry.io/docs/collector/getting-started)のデプロイ方法と、ログを`stdout`にリダイレクトするためのdebugエクスポーターの設定手順を説明します。 1. `otel-logs-collector-config.yaml`という名前でOpenTelemetry Collectorの設定ファイルを作成します。 @@ -48,8 +49,8 @@ EMQXのOpenTelemetryログを有効にする前に、OpenTelemetry Collectorお volumes: - ./otel-logs-collector-config.yaml:/etc/otel-collector-config.yaml ports: - - "13133:13133" # ヘルスチェック拡張 - - "4317:4317" # OTLP gRPCレシーバー + - "13133:13133" # Health check extension + - "4317:4317" # OTLP gRPC receiver ``` 3. Docker Composeを使ってCollectorを起動します。 @@ -61,40 +62,43 @@ EMQXのOpenTelemetryログを有効にする前に、OpenTelemetry Collectorお 4. 起動後、OpenTelemetry Collectorは[http://localhost:4317](http://localhost:4317/)でアクセス可能になります。 -## EMQXでOpenTelemetryログハンドラーを有効化 +## EMQXでOpenTelemetryログハンドラーを有効化する -1. EMQXの`cluster.hocon`ファイルに以下の設定を追加します(EMQXがローカルで動作している想定です)。 +1. EMQXがローカルで動作している前提で、`cluster.hocon`ファイルに以下の設定を追加します。 ```bash opentelemetry { - exporter {endpoint = "http://localhost:4317"} + exporter { + endpoint = "http://localhost:4317" + headers { + authorization = ""Basic dXNlcjpwYXNzd29yZA==" + } + } logs {enable = true, level = warning} } ``` - または、ダッシュボードの **Management** -> **Monitoring** にある **Integration** タブからOpenTelemetryログ統合を設定することも可能です。 + また、ダッシュボードの **Management** -> **Monitoring** から、ページの **Integration** タブでOpenTelemetryログ統合を設定することも可能です。 - ::: tip 補足 + ::: tip 注意事項 - `opentelemetry.logs.level`の設定は、[EMQXログハンドラー](../../observability/log.md)で設定されたデフォルトのログレベルにより上書きされます。例えば、OpenTelemetryのログレベルが`info`でも、EMQXのコンソールログレベルが`error`の場合は、`error`以上のレベルのイベントのみがエクスポートされます。 + `opentelemetry.logs.level`の設定は、[EMQXログハンドラー](../../observability/log.md)で設定されたデフォルトのログレベルによって上書きされます。例えば、OpenTelemetryのログレベルが`info`でも、EMQXのコンソールログレベルが`error`の場合は、`error`以上のレベルのイベントのみがエクスポートされます。 ::: 2. EMQXノードを起動します。 -3. ダッシュボードからアクセスできないHTTPサービスへのブリッジ作成など、EMQXのログイベントを発生させます。 +3. ダッシュボードからアクセスできないHTTPサービスへのブリッジを作成するなどして、EMQXのログイベントを発生させます。 - Otel-logs-HTTP-bridge-example + Otel-logs-HTTP-ブリッジの例 -4. 数秒以内(デフォルトは約1秒)に、Otel CollectorがHTTPブリッジ接続失敗などのEMQXログイベントを受信していることを確認できます。 +4. 数秒以内(デフォルトは約1秒)に、Otel CollectorがHTTPブリッジ接続失敗を示すEMQXログイベントを受信し、表示します。 ![Otel-collector-logs-debug-output](./assets/otel-collector-logs-debug-output.png) ## ログ過負荷の管理 -EMQXはログイベントを蓄積し、一定間隔でバッチ処理としてエクスポートします。 -このエクスポートの頻度は`opentelemetry.logs.scheduled_delay`パラメータで制御され、デフォルトは1秒です。 -バッチ処理のログハンドラーは過負荷保護機構を備えており、蓄積できるイベント数に上限を設けています。デフォルトの上限は2048件です。以下の設定でこの上限を変更できます。 +EMQXはログイベントを蓄積し、定期的にバッチでエクスポートします。エクスポートの頻度は`opentelemetry.logs.scheduled_delay`パラメーターで制御され、デフォルトは1秒です。バッチ処理ログハンドラーには過負荷保護機能が組み込まれており、蓄積できるイベント数の上限(デフォルトは2048)を超えると新しいログイベントは破棄されます。この上限は以下の設定で変更可能です。 ```bash opentelemetry { @@ -102,11 +106,10 @@ opentelemetry { } ``` -`max_queue_size`の上限に達すると、新しいログイベントは現在のキューがエクスポートされるまで破棄されます。 +`max_queue_size`の上限に達すると、現在のキューがエクスポートされるまで新しいログイベントは破棄されます。 -::: tip 補足 +::: tip 注意事項 -OpenTelemetryログの過負荷保護は、デフォルトの[EMQXログハンドラー](../log.md)の過負荷保護とは独立して動作します。 -そのため、設定によっては同じログイベントがOpenTelemetryハンドラーで破棄される一方、EMQXのデフォルトログハンドラーでは記録される場合や、その逆もあり得ます。 +OpenTelemetryログの過負荷保護は、デフォルトの[EMQXログハンドラー](../log.md)の過負荷保護とは独立して動作します。そのため、設定によっては同じログイベントがOpenTelemetryハンドラーで破棄されつつ、デフォルトのEMQXログハンドラーでは記録される場合や、その逆もあり得ます。 ::: diff --git a/ja_JP/observability/opentelemetry/metrics.md b/ja_JP/observability/opentelemetry/metrics.md index 233044f34..e15f9cf2a 100644 --- a/ja_JP/observability/opentelemetry/metrics.md +++ b/ja_JP/observability/opentelemetry/metrics.md @@ -1,14 +1,14 @@ # OpenTelemetryを統合してメトリクスを表示する -EMQXは、gRPC OTELプロトコルを介してメトリクスを直接OpenTelemetry Collectorにプッシュする機能を標準でサポートしています。Collectorはデータを任意のバックエンドにルーティング、フィルタリング、変換し、保存および可視化が可能です。 +EMQXは、gRPC OTELプロトコルを介してメトリクスを直接OpenTelemetry Collectorにプッシュする機能を標準でサポートしています。Collectorはその後、データを任意のバックエンドにルーティング、フィルタリング、変換して保存および可視化が可能です。 -本ページでは、EMQXとOpenTelemetryの統合方法をダッシュボードを通じて紹介し、[Prometheus](../../observability/prometheus.md)でEMQXのメトリクスを表示する方法を説明します。 +本ページでは、Dashboardを通じてEMQXとOpenTelemetryを統合し、[Prometheus](../../observability/prometheus.md)でEMQXのメトリクスを表示する方法を紹介します。 ## 前提条件 -OpenTelemetryとの統合を行う前に、OpenTelemetryとPrometheusをデプロイおよび設定しておく必要があります。 +OpenTelemetryとの統合を行う前に、OpenTelemetryおよびPrometheusをデプロイし、設定しておく必要があります。 - [OpenTelemetry Collector](https://opentelemetry.io/docs/collector/getting-started)をデプロイします。 -- CollectorのgRPC受信ポート(デフォルトは4317)とPrometheusメトリクスエクスポートポート(8889)を設定します。 +- CollectorのgRPC受信ポート(デフォルト4317)およびPrometheusメトリクスエクスポートポート(8889)を設定します。 ```yaml # otel-collector-config.yaml @@ -47,13 +47,18 @@ scrape_configs: ## EMQXでOpenTelemetryメトリクスを有効化する -EMQXのOpenTelemetryメトリクス機能との統合は、EMQXダッシュボードまたは設定ファイルで行えます。ダッシュボードでは、左側のナビゲーションメニューから **Management** -> **Monitoring** をクリックし、**Integration** タブでメトリクスの設定を行います。 +EMQXのOpenTelemetryメトリクス機能との統合は、EMQX Dashboardまたは設定ファイルで行えます。Dashboardでは、左のナビゲーションメニューから **Management** -> **Monitoring** をクリックし、**Integration** タブでメトリクスの設定を行います。 EMQXがローカルで動作している場合、以下の設定をEMQXの `cluster.hocon` ファイルに追加してください。 ```bash opentelemetry { - exporter { endpoint = "http://localhost:4317" } + exporter { + endpoint = "http://localhost:4317" + headers { + authorization = "Basic dXNlcjpwYXNzd29yZA==" + } + } metrics { interval = "10s" } diff --git a/ja_JP/observability/opentelemetry/opentelemetry.md b/ja_JP/observability/opentelemetry/opentelemetry.md index e3c32ffb7..604fa682d 100644 --- a/ja_JP/observability/opentelemetry/opentelemetry.md +++ b/ja_JP/observability/opentelemetry/opentelemetry.md @@ -1,13 +1,17 @@ # OpenTelemetryとの統合 -[OpenTelemetry](https://opentelemetry.io/docs/what-is-opentelemetry/)は、トレース、メトリクス、ログなどのテレメトリーデータを生成・管理するためのオブザーバビリティフレームワークおよびツールキットです。重要な点として、OpenTelemetryはベンダーやツールに依存しないため、JaegerやPrometheusなどのオープンソースツールから商用製品まで、幅広いオブザーバビリティバックエンドと連携可能です。 +[OpenTelemetry](https://opentelemetry.io/docs/what-is-opentelemetry/)は、トレース、メトリクス、ログなどのテレメトリデータを生成および管理するためのオブザーバビリティフレームワークおよびツールキットです。重要な点として、OpenTelemetryはベンダーやツールに依存しないため、JaegerやPrometheusなどのオープンソースツールから商用製品まで、幅広いオブザーバビリティバックエンドと連携可能です。 -EMQXはgRPC OTELプロトコルを介してOpenTelemetry Collectorへテレメトリーデータを直接プッシュすることをサポートしており、Collectorを通じてデータの転送、フィルタリング、変換を行い、Jaegerや[Prometheus](../../observability/prometheus.md)などの任意のバックエンドに統合して保存・可視化できます。OpenTelemetryとの統合により、EMQXのメトリクス収集、メッセージパブリッシュの分散トレーシング、ログの統合収集およびコンテキスト関連付けが最適化されます。この統合は、EMQXの可視化監視やアラート通知の実現、異なるシステムやサービス間のメッセージフローの追跡に役立ちます。これにより、継続的なパフォーマンス最適化、迅速な問題特定、システム監視が可能となります。 +EMQXはgRPC OTELプロトコルを介してOpenTelemetry Collectorへテレメトリデータを直接プッシュすることをサポートしており、その後Collectorを通じてデータの転送、フィルタリング、変換を行い、Jaegerや[Prometheus](../../observability/prometheus.md)などの任意のバックエンドに統合して保存・可視化できます。OpenTelemetryとの統合により、EMQXのメトリクス収集、メッセージパブリッシュの分散トレーシング、ログの統一的な収集とコンテキスト関連付けが最適化されます。この統合は、EMQXの可視化監視やアラート通知の実現、異なるシステムやサービス間のメッセージフローの追跡に役立ちます。これにより、継続的なパフォーマンス最適化、迅速な問題特定、システム監視が可能となります。 emqx-opentelemetry -本セクションでは、EMQXがOpenTelemetry Collectorとテレメトリーデータを統合し、以下のオブザーバビリティ情報に対して完全な組み込みOpenTelemetryサポートを実現する方法を紹介します。 +本セクションでは、EMQXがOpenTelemetry Collectorとテレメトリデータを統合する方法を紹介し、以下のオブザーバビリティ情報に対する完全な組み込みOpenTelemetryサポートを実現します。 - [メトリクス](./metrics.md) - [トレース](./traces.md) - [ログ](./logs.md) + +さらに、EMQXバージョン5.8.3以降では、OpenTelemetryに基づくエンドツーエンドトレーシングもサポートしています。 + +- [エンドツーエンドトレース](./e2e-traces.md) diff --git a/ja_JP/support/technical-support.md b/ja_JP/support/technical-support.md index b48183941..2b34a1102 100644 --- a/ja_JP/support/technical-support.md +++ b/ja_JP/support/technical-support.md @@ -1,17 +1,17 @@ --- title: EMQX テクニカルサポート -description: EMQX Enterprise向けの専門的なテクニカルサポートを提供し、堅牢なソリューションとプロフェッショナルな支援でIoTミドルウェアプラットフォームの最適化を支援します。 +description: EMQX Enterprise向けの専門的なテクニカルサポートをご提供し、IoTミドルウェアプラットフォームの最適化を支援します。 --- # EMQX テクニカルサポート -EMQは、世界をリードするオープンソースIoTデータインフラストラクチャのソフトウェアプロバイダーです。エッジからクラウド、マルチクラウドまでのリアルタイムIoTデータを接続、移動、処理、分析するワンストップのクラウドネイティブ製品を通じて、将来にわたって活用できるIoTアプリケーションの実現を支援しています。 +EMQは、世界をリードするオープンソースIoTデータインフラのソフトウェアプロバイダーです。エッジからクラウド、マルチクラウドまで、リアルタイムのIoTデータを接続・移動・処理・分析するクラウドネイティブ製品をワンストップで提供し、将来を見据えたIoTアプリケーションの実現を支援しています。 -当社のコア製品であるEMQXは、世界で最もスケーラブルかつ信頼性の高いオープンソースのMQTTメッセージングプラットフォームであり、1クラスターあたり1億台の同時IoTデバイス接続をサポートし、毎秒100万メッセージのスループットとサブミリ秒のレイテンシを維持します。2万社以上の企業ユーザー、1億台以上のIoTデバイスを接続し、HPE、VMware、Verifone、上汽フォルクスワーゲン、エリクソンなどの著名ブランドを含む400社以上のミッションクリティカルなIoTシナリオで信頼されています。 +当社のコア製品であるEMQXは、世界で最もスケーラブルかつ信頼性の高いオープンソースのMQTTメッセージングプラットフォームであり、1クラスターあたり1億台のIoTデバイス同時接続をサポートし、毎秒100万メッセージのスループットとサブミリ秒のレイテンシを実現しています。20,000以上の企業ユーザー、1億台以上のIoTデバイスを接続し、HPE、VMware、Verifone、SAIC Volkswagen、Ericssonなどの著名ブランドを含む400以上のミッションクリティカルなIoTシナリオで信頼されています。 -EMQのグローバルR&Dセンターはストックホルムにあり、アメリカ大陸、ヨーロッパ、アジア太平洋地域に10以上のオフィスを展開しています。 +EMQのグローバルR&Dセンターはストックホルムに位置し、アメリカ大陸、ヨーロッパ、アジア太平洋地域に10以上のオフィスを展開しています。 -EMQX製品や当社のIoTソリューションについてご質問がある場合は、以下までお気軽にお問い合わせください。 +EMQX製品や当社のIoTソリューションに関するご質問がございましたら、以下までお気軽にお問い合わせください。 **EMQ** @@ -27,7 +27,7 @@ EMQX製品や当社のIoTソリューションについてご質問がある場 **所在地:** -- 本社:中国 浙江省 杭州市 餘杭区 龍源路88号 3号館 A301 +- 本社:中国 浙江省 杭州市 餘杭区 龍源路88号 3号棟 A301 - グローバルR&Dセンター:スウェーデン ストックホルム Mazarinvägen 36 Sköndal - ヨーロッパオフィス:ドイツ フランクフルト Eschborner Landstraße 42-50 Haus B, 60489 Frankfurt(M) - 米国オフィス:1300 El Camino Real, Suite 100, Menlo Park, CA 94025 @@ -35,13 +35,13 @@ EMQX製品や当社のIoTソリューションについてご質問がある場 EMQXサービスチームは、専門的なサポートを提供いたします。 - IoTソリューションの設計、デプロイメント、カスタマイズに関する専門的なサポートは、[EMQXサービスチーム](https://www.emqx.com/en/contact?product=emqx)までご連絡ください。 -- 提供している商用サポート内容については、[EMQXサポートポータル](https://www.emqx.com/en/support)をご覧ください。 +- [EMQXサポートポータル](https://www.emqx.com/en/support)では、当社が提供する商用サポート内容をご確認いただけます。 **商用サポートレベル** | 機能 | スタンダード | プロフェッショナル | | -------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------- | -| サポート時間 | 平日5日8時間 | 24時間365日 | +| サポート時間 | 5*8 | 7*24 | | メールサポート | support | support | | オンラインチャットサポート | support | support | | 電話ホットラインサポート | no support | support | @@ -49,15 +49,14 @@ EMQXサービスチームは、専門的なサポートを提供いたします | 緊急バグ修正 | no support | support | | サードパーティプラグインサポート | no support | support | -EMQXの開発者やユーザーの皆様は、EMQXフォーラム、Slackチャンネル、GitHubページにぜひご参加ください。質問の投稿、回答の検索、アイデアやベストプラクティスの共有が可能です。 +EMQXの開発者やユーザーの皆様は、EMQXフォーラムやSlackチャンネル、GitHubページに参加して質問したり、回答を見つけたり、アイデアやベストプラクティスを共有したりできます。 -- [EMQXフォーラム](https://www.emqx.io/forum/):EMQXに関する質問を投稿できます。 -- [Slack](https://slack-invite.emqx.io/):世界中のEMQX開発者やユーザーとつながれます。 -- [GitHub](https://github.com/emqx/emqx):EMQXのコード取得、問題報告、新機能リクエストが可能です。 +- [Slack](https://slack-invite.emqx.io/): 世界中のEMQX開発者やユーザーとつながれます。 +- [GitHub](https://github.com/emqx/emqx): EMQXのソースコードにアクセスし、問題報告や機能リクエストが可能です。 -また、以下のSNSでも情報発信を行っています。 +また、以下のSNSでもご連絡いただけます。 -- [Twitter](https://twitter.com/EMQTech) +- [X](https://x.com/EMQTech) - [YouTube](https://www.youtube.com/channel/UC5FjR77ErAxvZENEWzQaO5Q) - [LinkedIn](https://www.linkedin.com/company/emqtech) - [Discord](https://discord.com/invite/xYGf3fQnES)