「技術メモ」カテゴリーアーカイブ

AIの並列計算アーキテクチャの進化(SIMD → SIMT → Tensor → Dataflow)

AIや高性能計算(HPC)の分野では、計算性能を高めるために
並列計算アーキテクチャが重要な役割を果たしてきました。

2000年代まではCPUのクロック周波数向上によって性能が向上してきましたが、
消費電力や発熱の問題から単純なクロック向上は難しくなりました。

その結果、現在のコンピューティングでは
並列処理による性能向上が主流になっています。

特にAI計算の世界では、並列処理の方式は次のように進化してきました。

SIMD → SIMT → Tensor → Dataflow

それぞれの段階で、並列処理の対象や計算モデルが変化しています。


SIMD(Single Instruction Multiple Data)

SIMDはCPUで広く使われている並列計算方式です。

SIMDは1つの命令で複数のデータを同時に処理する仕組みです。

画像処理や信号処理など、
同じ演算を大量のデータに対して行う処理に適しています。

代表例

  • Intel SSE
  • Intel AVX
  • ARM NEON

SIMT(Single Instruction Multiple Thread)

SIMTは主にGPUで採用されている並列計算モデルです。

SIMTでは多数のスレッドが同じ命令を同時に実行します。

ただし重要な点として、
SIMTは内部的にSIMDの仕組みを利用しています。

例えばNVIDIA GPUでは
Warp(32スレッド)
という単位で命令が実行されます。

このWarpはハードウェア内部では
SIMDユニットとして一斉に動作
しています。

つまりSIMTは、
SIMDの考え方を拡張し、大量のスレッドを扱いやすくしたモデル
と言えます。


Tensor(Tensor Core / AIアクセラレータ)

AI計算ではさらに専用化された並列計算方式が使われています。

それがTensor演算です。

Tensor Coreは行列演算を高速化する専用回路です。

AIのニューラルネットワークでは、
膨大な行列計算が行われます。

C = A × B

Tensor Coreの最大の特徴は
積和演算(FMA)です。

D = A × B + C

この計算を1クロックで大量に実行できます。

さらに現在のAI計算では
混合精度演算が重要になっています。

  • FP16
  • BF16
  • INT8
  • INT4

精度を適切に調整することで、
消費電力と演算速度を大きく改善できます。


Google TPUとSystolic Array

GoogleのTPUは
Systolic Array(シストリック・アレイ)
という方式でTensor演算を実装しています。

これは行列計算を
データを流しながら処理するパイプライン構造
で実行する方式です。

この構造により、
非常に高い演算密度を実現しています。


TenstorrentとDataflow Architecture

AIチップ分野では
Tenstorrent(テンストレント)
という企業も注目されています。

Tenstorrentは
RISC-VベースのAIプロセッサ
を開発している企業です。

同社のチップでは
Dataflow Architecture
という設計思想が採用されています。

Tenstorrentの最大の特徴は、
Tensixコアと呼ばれる計算ユニットが
Mesh(網目状)に配置されている点です。

この構造では、
データが準備できた順に計算が進む非同期処理
が行われます。

これは従来のCPUやGPUのような
命令駆動型(Instruction-driven)
の計算モデルとは異なり、

データ駆動型(Data-driven)
の計算モデルと呼ばれます。

つまり、
計算の効率だけでなく
データ移動の効率
を最大化するアーキテクチャです。


並列アーキテクチャの比較

項目 SIMD SIMT Tensor Dataflow
主な処理対象 ベクトル スレッド 行列(Matrix) データフロー
計算の次元 1次元 多数の1次元 2次元(行列)〜多次元 多次元
代表例 AVX / NEON NVIDIA GPU Tensor Core / TPU Tenstorrent

まとめ

並列計算アーキテクチャは次のように進化してきました。

SIMD
(CPUのベクトル並列)

↓

SIMT
(GPUのスレッド並列)

↓

Tensor
(AI専用の行列並列)

↓

Dataflow
(データ駆動型AIプロセッサ)

現在のコンピューティングでは

  • CPU:SIMD
  • GPU:SIMT
  • AIチップ:Tensor
  • 次世代AIチップ:Dataflow

という役割分担が形成されています。

AIモデルが巨大化するにつれて、
演算だけでなくデータ移動の効率
も重要になっています。

そのため、
Tensor演算だけでなく
Dataflow型アーキテクチャ
も次世代AIチップの重要な方向性として注目されています。


参考URL

IoT設計のセキュリティキー:RISC-V と ARM、そしてデバイスキーの話

IoT機器を設計するとき、最初に出てくる話題の一つが「CPUをARMにするか、それともRISC-Vにするか」です。
もちろん重要な選択ですが、実際に製品を作ってみると IoTの安全性を決めるのはCPUよりも“鍵の扱い方”だったりします。

デバイスがネットワークにつながる以上、「その機器は本物か」「クローンではないか」「改ざんされていないか」を判断できなければなりません。
この記事では、ARMとRISC-Vの違いをざっくり整理しつつ、IoTで避けて通れない デバイスキー設計の話をまとめます。

この記事のポイント

  • IoTの安全性はCPUより「デバイスキー設計」で決まる
  • ARMはTrustZoneが強み
  • RISC-Vは自由度とコストが強み
  • IoTセキュリティの核心はRoot of Trust

IoT設計ではCPU選択よりも
「鍵管理」と「デバイス認証」が重要になります。


ARMとRISC-V、何が違うのか

IoT機器でよく使われるCPUアーキテクチャは、ほぼこの2つです。

  • ARM
  • RISC-V

それぞれ方向性が少し違います。ARMは成熟したエコシステムと実績、RISC-Vはオープン性と自由度が魅力です。

ARM

ARMは組み込みの世界では定番です。STM32やNXPなど、多くのMCUがARMベースです。
特徴をざっくり言うと、次のようになります。

  • ライセンス制のISA
  • ツールやSDKが豊富
  • 商用製品の実績が圧倒的に多い

IoT設計で重要になるのが TrustZone です。TrustZoneはCPU内部を「セキュア領域」と「通常領域」に分ける仕組みで、
鍵やセキュア処理を隔離できます。最近のIoT設計では、このTrustZoneを使った PSAセキュリティ設計 がよく使われています。

RISC-V

RISC-VはオープンなISAです。最大の特徴は ライセンス料が不要 という点です。
さらに、命令セットを拡張できる・ベンダー依存が少ない、といったメリットがあります。

最近はGoogleやWestern Digitalなども採用を進めており、IoT向けSoCでもRISC-V採用例が増えてきました。

セキュリティ機能(TrustZone vs PMP)

ARMではTrustZoneが標準的ですが、RISC-Vでは PMP(Physical Memory Protection) が基本になります。
PMPはメモリアクセス制御の仕組みで、read / write / execute の権限を領域ごとに設定できます。

近年はRISC-V側でも、TEE構築のための取り組み(例:Keystone)や、Root of Trustのオープン実装(例:OpenTitan)などが進んでいます。
一方で、どこまでが標準で、どこからがベンダー依存かはSoCごとに差が出やすいので、採用時は仕様確認が重要です。

どちらを選ぶべきか

まとめると、だいたいこんな感じです。

項目 ARM RISC-V
成熟度 高い 成長中
コスト ライセンスあり 無料
エコシステム 非常に豊富 発展中
自由度 低め 高い
ARMとRISC-Vのざっくり比較(IoT視点)

量産製品なら ARMが無難。独自設計やコスト重視なら RISC-Vも魅力的
そんな位置づけです。


IoTで重要なのは「デバイスキー」

CPUの話をしましたが、実際のIoTセキュリティで重要になるのは デバイスキー です。
これは簡単に言うと 機器ごとに持つ秘密鍵 のことです。

IoT機器はネットワークに接続するため、「この機器は正しいデバイスか」を判断できなければなりません。
そのために使われるのが公開鍵暗号(PKI)の仕組みです。

IoT認証の基本構造(PKI)

基本的な仕組みはシンプルです。
デバイスは 秘密鍵 を持ち、サーバは 公開鍵(またはCA証明書)を持ちます。
デバイスが秘密鍵で署名し、サーバが公開鍵で検証します。

IoTで主流の認証方式:mTLS

現在のIoTシステムでは mTLS(相互TLS) が主流です。
AWS IoTなどでもこの方式が一般的です。流れは次の通りです。

  1. TLS接続を開始
  2. デバイス証明書を提示
  3. サーバ側が証明書を検証
  4. 認証成功後、暗号化通信を継続

デバイスキーはいつ作るのか(プロビジョニング)

ここが実はIoT設計でかなり重要なポイントです。方法は大きく2つあります。

1) デバイス内生成(おすすめ)

デバイスが初回起動時に鍵ペアを生成する方法です。秘密鍵はデバイスの外に出ません。
セキュリティとしては これが一番安全 です。

2) 製造ライン注入(インジェクション)

工場で鍵を書き込む方法です。量産ではよく使われますが、鍵管理のために HSM を置いたり、
製造ラインのアクセス制御や監査ログなど「工場側のセキュリティ」が重要になります。

鍵はどこに保存するのか

秘密鍵は、安全な場所に保存する必要があります。よく使われるのは次のような方法です。

  • Secure Element(鍵管理専用チップ)
  • TPM(産業機器・PC系でよく採用)
  • MCUのOTP / eFuse(一度書き込むと変更できない領域)
  • TEE(TrustZone等の隔離領域)

逆に言うと、普通のFlashにそのまま保存するのは危険です。物理解析やサイドチャネルなど、
“ソフトウェアだけでは守りきれない攻撃”が現実にあります。


最近のIoTセキュリティの流れ(Supply Chain Security)

最近はさらに Supply Chain Security が重要になっています。
製造から運用まで、全体で信頼性を担保する流れが強くなってきました。

たとえば、次のような技術キーワードが登場しています。

  • DICE:TPMがなくてもデバイスIDを組み立てる考え方
  • IEEE 802.1AR:デバイス証明書(DevID)の標準
  • FDO:大量デバイスの自動オンボーディングを支える仕組み
  • SBOM:ソフトウェア構成の透明化(脆弱性対応と運用の前提)

IoT機器は「作って終わり」ではなく、長期間運用されるものが多いので、
このあたりの視点があるかどうかで、後々の運用コストも大きく変わってきます。


最後に:Root of Trustの話

IoT機器の設計では、どうしても「ARMにするかRISC-Vにするか」という話になりがちです。
もちろんそれも大事です。

ただ実際のところ、IoTの信頼性を決めるのはCPUそのものではありません
本当に効いてくるのは、信頼の起点(Root of Trust)をどう作るか、という設計です。

たとえば、次の要素がセットで回っているかどうか。

  • Secure Boot:改ざんされたファームが動かない仕組み
  • Device Identity:デバイス固有の身分証明
  • Key Protection:秘密鍵が外に出ない保護
  • Provisioning:鍵を安全に発行・登録する流れ
  • Supply Chain Security:製造〜運用までの信頼性

これらがしっかり設計されていれば、ARMでもRISC-Vでも、堅牢なIoTシステムは作れます。
逆に言えば、鍵の扱いを間違えると、どんなCPUでも簡単に破られます。

IoTセキュリティは難しく見えるかもしれませんが、
「信頼の出発点をどこに置くか」という視点で考えると整理しやすくなります。
その出発点こそが Root of Trust です。

PHPだけでPNGグラフを生成する最小サンプル:GD拡張

色々な言語でグラフを作っていますが、一番どこにでも入っている最低限のPHPで書く方法を説明します。
「JavaScriptを使わず、サーバ側だけでグラフ画像を生成したい」
という場面が意外と多くあります。

例えば、
管理画面の タグで使いたい
PDFにそのまま埋め込みたい
バッチ処理で画像を生成して保存したい
外部サービスに依存したくない
こうした用途では、PHPのGD拡張を使ったPNG生成がシンプルで堅牢です。

本記事では、
・外部ライブラリ不要
・1ファイルで動作
・棒グラフの最小構成
という条件で、実用に耐えるサンプルを紹介します。

事前条件
PHP 8.x 以上
gd 拡張が有効

確認方法:

php -m | grep gd

表示されれば準備OKです。
仕組みの概要

流れ

今回のグラフ生成は、以下の流れで行います。

PHPでキャンバス(画像)を作成

背景・枠線・色を定義
データ配列をスケール変換
棒(バー)を描画
HTTPレスポンスとしてPNGを返す
ポイントは、
「HTMLではなく画像を返すPHP」
という点です。

最小構成のサンプルコード
以下のファイルを graph.php として保存してください。

<?php
declare(strict_types=1);

/*
 * ==============================
 * Simple PNG Bar Chart with GD
 * ==============================
 */

// ====== サンプルデータ ここをDBを繋げたり、CSVを読み込んだりしてください。======
$labels = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun'];
$values = [12, 18, 9, 24, 20, 14, 28];

// ====== 画像サイズと余白 ======
$width  = 800;
$height = 420;

$padL = 60;   // 左余白(Y軸ラベル用)
$padR = 20;
$padT = 30;
$padB = 60;   // 下余白(X軸ラベル用)

// ====== 画像生成 ======
$image = imagecreatetruecolor($width, $height);
imageantialias($image, true);

// ====== 色定義 ======
$bgColor   = imagecolorallocate($image, 255, 255, 255);
$textColor = imagecolorallocate($image, 30, 30, 30);
$gridColor = imagecolorallocate($image, 230, 230, 230);
$barColor  = imagecolorallocate($image, 70, 120, 220);

// 背景塗りつぶし
imagefilledrectangle($image, 0, 0, $width, $height, $bgColor);

// ====== プロット領域 ======
$plotW = $width  - $padL - $padR;
$plotH = $height - $padT - $padB;

$x0 = $padL;
$y0 = $padT;
$x1 = $padL + $plotW;
$y1 = $padT + $plotH;

// 枠線
imagerectangle($image, $x0, $y0, $x1, $y1, $gridColor);

// ====== スケール計算 ======
$maxValue = max($values);
$maxValue = ($maxValue <= 0) ? 1 : $maxValue;

// ====== バー描画 ======
$count = count($values);
$gap   = 10;
$barW  = (int) floor(($plotW - ($gap * ($count + 1))) / $count);
$barW  = max(8, $barW);

for ($i = 0; $i < $count; $i++) {
    $value = $values[$i];

    // X座標
    $x = $x0 + $gap + $i * ($barW + $gap);

    // 高さ(最大値基準で正規化)
    $barH = (int) round(($value / $maxValue) * ($plotH - 10));
    $y    = $y1 - $barH;

    // 棒
    imagefilledrectangle(
        $image,
        $x,
        $y,
        $x + $barW,
        $y1,
        $barColor
    );

    // 数値表示(上)
    imagestring($image, 3, $x + 2, $y - 16, (string)$value, $textColor);

    // X軸ラベル(下)
    imagestring(
        $image,
        3,
        $x + 2,
        $y1 + 8,
        $labels[$i] ?? (string)$i,
        $textColor
    );
}

// タイトル
imagestring($image, 5, $padL, 8, 'Weekly Orders (sample)', $textColor);

// ====== 出力 ======
header('Content-Type: image/png');
header('Cache-Control: no-store');

imagepng($image);
imagedestroy($image);

表示方法
ブラウザで直接アクセス:
https://example.com/graph.php
HTMLに埋め込む場合:
weekly graph
HTML・CSS・JavaScriptは一切不要です。

EC-CUBEで複数選択処理を書いたらJSONでエラー

EC-CUBE 4.2以上・MYSQL方で
商品のカスタマイズや顧客の属性で複数選択のオプション作るとなるとJSON形式にすると思いますが・・・・
エラーになる。プログラムは合っている・・・・

JSONがバイナリー渡しになっているエラーに
「SQLSTATE[22032]: Cannot create a JSON value from a string with CHARACTER SET ‘binary’」

/app/config/eccube/packages/doctrine.yaml にDBとの接続が書いてある。
しかし、デフォルトは「pdo_sqlite」の設定で、セットも細かく書いていない。

こんな感じでしっかり設定を書かないと勝手にバイナリーに・・・

doctrine:
    dbal:
        # × driver: 'pdo_sqlite' これは削除 
        driver: 'pdo_mysql' #  MySQLを明示
        server_version: "%env(DATABASE_SERVER_VERSION)%"
        # charset: '%env(DATABASE_CHARSET)%'
        charset: utf8mb4

        # これが重要です!
        options:
            1002: "SET NAMES 'utf8mb4'"

        # for mysql only
        default_table_options:
            charset: 'utf8mb4'
            collation: 'utf8mb4_bin'

以上、他も変換処理してないか?を確認してね。

facebookexternalhit

facebookexternalhitとは

facebookexternalhit は、Metaファミリー(Facebook、Instagram、Messengerなど)のアプリで共有されたリンクに関する情報を収集するためのクローラーです。
このクローラーは、共有されたアプリやウェブサイトのコンテンツをクロールし、リンクプレビューを生成します。

主な目的

facebookexternalhit の主な目的は次の通りです:

  • Facebook、Instagram、Messenger などで共有されたリンクをクロール
  • アプリやウェブサイトの情報(タイトル、説明、サムネイル画像など)を収集
  • 収集したデータをキャッシュに保存し、プレビューとして表示

動作の仕組み

  1. ユーザーがリンクをFacebookやMetaのソーシャルプラグインを使って共有
  2. facebookexternalhitクローラーがリンク先のウェブページにアクセス
  3. ページ内のメタデータ(例: Open Graph タグ)を解析
  4. タイトル、説明、画像などを取得してプレビューを生成

収集する情報

以下の情報が主に収集されます:

  • タイトル(<title>タグやog:title
  • 説明文(og:description
  • 画像(og:image
  • URL(og:url

リンク共有の方法

facebookexternalhitクローラーが動作するリンク共有の主な方法は次の通りです:

  • リンクをコピー&ペーストして共有
  • Facebookのソーシャルプラグインを使用して共有

最適化のための設定

以下の設定を行うことで、リンクプレビューの表示を最適化できます:

  • Open Graph メタタグを使用して、プレビュー内容を明示的に指定する
  • メタデータに適切なタイトル、説明、画像を設定する
  • Facebookデバッガーツールを使ってプレビューを確認する

サーバのアクセスログ例

2024-01-22 18:31:23 - 69.171.250.250 - fwdproxy-ldc-000.fbsv.net - facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)
    

拒否したい場合、robots.txtの設定

facebookexternalhit

  • robots.txt ファイルに `facebookexternalhit` のアクセスを拒否する記述がないことを確認します。
  • デフォルトでは、`facebookexternalhit` はアクセスが許可されていますが、特定のディレクトリやページをブロックしていないか確認が必要です。

例: robots.txtで許可する設定

以下は、`facebookexternalhit`を許可する基本的な設定例です:

User-agent: *
Disallow:
    

この設定はすべてのクローラーのアクセスを許可します。

特定のクローラーのみ許可したい場合は、次のように指定します:

User-agent: facebookexternalhit
Disallow:
    

Facebookデバッガーの使用

Facebookはリンクプレビューを生成する際にキャッシュを使用します。そのため、ページ内容を更新した場合、新しい情報が正しく反映されないことがあります。

キャッシュをクリアし、最新のデータを反映するには、Facebook Debugger を使用してください。

Facebook Debuggerの使い方:

  1. 以下のリンクからデバッガーツールにアクセスします: Facebook Debugger
  2. 更新したいリンクを入力して「Debug」ボタンをクリックします。
  3. 「Scrape Again」を選択すると、キャッシュがクリアされ、新しいデータが取得されます。

公式ドキュメント

詳しい情報は、Meta公式のドキュメントをご参照ください:

Facebook Crawler – Developer Documentation

Google Mapsのマーカーとラインで経路情報

Google Maps(グーグルマップ)は、Googleが提供する地図サービスで、ウェブブラウザやスマートフォンのアプリで利用できます。場所の検索、経路案内、ストリートビュー、リアルタイム交通情報などの機能を通じて、ユーザーが目的地までのルートを確認したり、付近の施設を探したりする際に便利なツールです。

今回はGoogle Mapsをカスタマイズして、経路情報に応用できるJavaスクリプトのサンプルを書きました。


<!DOCTYPE html>
<html>
<head>
    <title>Google Maps マーカーとライン</title>
    <style>
        #map {
            height: 100%;
            width: 100%;
        }
        html, body {
            height: 100%;
            margin: 0;
            padding: 0;
        }
    </style>
</head>
<body>
    <div id="map"></div>

    <script>
        // Google Maps APIロード完了後に呼び出す初期化関数
        function initMap() {
            const map = new google.maps.Map(document.getElementById("map"), {
                zoom: 5,
                center: { lat: 35.0, lng: 137.0 } // 中心点の設定
            });

            // マーカーの緯度・経度と名前のリスト
            const locations = [
                { lat: 35.6895, lng: 139.6917, name: "東京" },
                { lat: 34.6937, lng: 135.5023, name: "大阪" },
                { lat: 35.0116, lng: 135.7681, name: "京都" },
                { lat: 33.5898, lng: 130.4017, name: "福岡" },
                { lat: 34.2257, lng: 129.7181, name: "長崎" },
                { lat: 26.2124, lng: 127.6792, name: "沖縄" }
            ];

            // 情報ウィンドウのインスタンスを作成
            const infoWindow = new google.maps.InfoWindow();

            // 各位置にマーカーを配置し、クリックイベントで地域名を表示
            for (let i = 0; i < locations.length; i++) {
                const marker = new google.maps.Marker({
                    position: { lat: locations[i].lat, lng: locations[i].lng },
                    map: map,
                    title: locations[i].name // ホバー時に表示される地域名
                });

                // クリックイベントで情報ウィンドウに地域名を表示
                marker.addListener("click", () => {
                    infoWindow.setContent(locations[i].name);
                    infoWindow.open(map, marker);
                });
            }

            // マーカーを結ぶポリラインを作成
            const linePath = new google.maps.Polyline({
                path: locations.map(location => ({ lat: location.lat, lng: location.lng })),
                geodesic: true,
                strokeColor: "#FF0000",
                strokeOpacity: 1.0,
                strokeWeight: 2
            });

            // ポリラインをマップに追加
            linePath.setMap(map);
        }
    </script>
    <script async defer src="https://maps.googleapis.com/maps/api/js?key=各ユーザーKEY"></script>
</body>


RSA暗号

今回はRSA暗号です。

RSA暗号の概要

発明
1977年にロナルド・リベスト、アディ・シャミア、レオナルド・エーデルマンによって発明されました。名前は発明者の頭文字から取られています。

背景
RSA暗号は、1976年に公開鍵暗号の概念を提唱したディフィーとヘルマンの研究を受けて、実用的なアルゴリズムとして具体化されました。

原理
RSAはフェルマーの小定理に基づいています。これは、特定の数学的性質を利用して、暗号化と復号化を行う方法です。

特許と公開
RSAは1983年に特許が取得され、RSA Security社が独占していましたが、特許が2000年に満了し、以降は誰でも自由に使用できるようになりました。

使い方

RSA暗号は以下の用途に使われます:

  • 秘匿: データを暗号化して第三者に解読できないようにします。
  • 認証: デジタル署名を用いてデータの信頼性を保証します。

RSAは公開鍵暗号の一つで、暗号化と復号化に異なる鍵を使用することが特徴です。公開鍵で暗号化したデータは、対応する秘密鍵でしか復号できません。

RSA暗号の基本的な仕組み

RSA暗号は、「大きな素数の積を素因数分解することが非常に難しい」という数学的な性質に基づいています。RSAは公開鍵(暗号化に使用)と秘密鍵(復号化に使用)の2つの鍵を使います。公開鍵は誰でも知ることができますが、秘密鍵は鍵の所有者だけが知っているべきものです。

1. 鍵の生成

RSA暗号で使用される公開鍵と秘密鍵は、以下の手順で生成されます。

  • 大きな素数を2つ選ぶ:
    非常に大きな素数 p と q を選びます(通常は数百桁の素数を使います)。
  • これらを掛け合わせる:
    n = p × q として、積 n を計算します。n は公開鍵の一部になります。
  • オイラーのトーシェント関数を計算:
    ϕ(n) = (p − 1) × (q − 1) を計算します。これは、公開鍵を生成するための中間計算に使います。
  • 公開鍵の指数 e を選ぶ:
    1 < e < ϕ(n) かつ e と ϕ(n) が互いに素であるような e を選びます。e は通常、公開鍵として広く使われる数値である65537が選ばれることが多いです。
  • 秘密鍵の指数 d を計算:
    e × d ≡ 1 (mod ϕ(n)) を満たすような d を計算します。この d が秘密鍵になります。

2. 暗号化

メッセージ M を暗号化するには、以下の手順を使います。

  • 公開鍵を取得:
    公開鍵 (n, e) は公開されているので、誰でも取得できます。
  • メッセージを暗号化:
    メッセージ M を次のように暗号化します:
    C = M^e mod n
    ここで、C は暗号文です。

3. 復号化

暗号文 C を復号化して元のメッセージ M を取得するには、以下の手順を使います。

  • 秘密鍵を使用:
    秘密鍵 (d) を使って暗号文 C を次のように復号化します:
    M = C^d mod n
    これにより、元のメッセージ M を得ることができます。

Python

このサンプルはわかりやすくする為にセキュリティ向上させる機能は省いています。

from Crypto.Cipher import PKCS1_OAEP
from Crypto.PublicKey import RSA

def generate_keys(keysize=2048):
    """RSA暗号の鍵ペアを生成する"""
    # 鍵ペアを生成
    key = RSA.generate(keysize)
    public_key = key.publickey()
    return public_key, key

def encrypt(plaintext, public_key):
    """平文を暗号化する"""
    # PKCS#1 OAEPパディングを用いて暗号化
    cipher = PKCS1_OAEP.new(public_key)
    ciphertext = cipher.encrypt(plaintext.encode('utf-8'))
    return ciphertext

def decrypt(ciphertext, private_key):
    """暗号文を復号する"""
    # PKCS#1 OAEPパディングを用いて復号
    cipher = PKCS1_OAEP.new(private_key)
    plaintext = cipher.decrypt(ciphertext)
    return plaintext.decode('utf-8')

if __name__ == "__main__":
    # 鍵の生成
    public_key, private_key = generate_keys()

    # 公開鍵と秘密鍵をPEM形式でエクスポート
    public_key_pem = public_key.export_key().decode('utf-8')
    private_key_pem = private_key.export_key().decode('utf-8')

    # 公開鍵と秘密鍵を表示
    print("公開鍵:")
    print(public_key_pem)
    print("秘密鍵:")
    print(private_key_pem)

    # 平文
    message = "Hello, RSA!"

    # 暗号化
    ciphertext = encrypt(message, public_key)
    print("暗号文:", ciphertext)

    # 復号化
    decrypted_message = decrypt(ciphertext, private_key)
    print("復号文:", decrypted_message)

実行の概要

暗号化:

  • encrypt 関数は公開鍵を使って平文を暗号化し、暗号文をリストとして返します。

復号化:

  • decrypt 関数は秘密鍵を使って暗号文を復号化し、元の平文を返します。

実行結果

公開鍵:
—–BEGIN PUBLIC KEY—–
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtL63nW412wf+oz+b1thN
2jQxjPwTSnigTcXMYrunUMUvYLgNNePtFgoD3YyPa356xlHucuIwESVhA8X6GqTq
IiAQUw4dL/IQzoshrTi0H1gfwVtDPeUworgUYLkBnXPOigtzYT2vu6teh3LUgAUx
oCbj2q22snI3NNdF04LRK6z3z/JYEZjAEasJuLlgn6+ZvqVDXO21SjrBQ8B2Qb4O
3P89qT1E+zayVH573p2JALkgZdW4xpEEJ0KYeVXU05mlwfeH+FLQ032CqPiQxaXX
Es9W3asT/RQhgtjyrtq4qHy0iCHQ+PXJl8pjD2B+pVy24w8xG+08qxQyZTxJjOHn
NQIDAQAB
—–END PUBLIC KEY—–

秘密鍵:
—–BEGIN RSA PRIVATE KEY—–
MIIEpQIBAAKCAQEAtL63nW412wf+oz+b1thN2jQxjPwTSnigTcXMYrunUMUvYLgN
NePtFgoD3YyPa356xlHucuIwESVhA8X6GqTqIiAQUw4dL/IQzoshrTi0H1gfwVtD
PeUworgUYLkBnXPOigtzYT2vu6teh3LUgAUxoCbj2q22snI3NNdF04LRK6z3z/JY
EZjAEasJuLlgn6+ZvqVDXO21SjrBQ8B2Qb4O3P89qT1E+zayVH573p2JALkgZdW4
xpEEJ0KYeVXU05mlwfeH+FLQ032CqPiQxaXXEs9W3asT/RQhgtjyrtq4qHy0iCHQ
+PXJl8pjD2B+pVy24w8xG+08qxQyZTxJjOHnNQIDAQABAoIBAAx54KtDhQCoOd2z
YZKwLhmKgkQYz00T6/7KUTwcd2VmIwnSUokegUpE6TTlA65YFen0FFlGPyqj0aFE
zGmD6ixuWaod/opFc38KUAoIsLg8KT77yXWviQ6mVbPCeXfQm1hgh3eWHjf+UYFY
fg4TLbSAErjQxlxlcWWamXWK4VzaDyNOqFtMuJ3wZL27grtJmDpbEfsYfUewd22F
PEKMluXobJ59DYkk/MCQOsazK+SiCOd95eY4GMH0xawrETRpZ0ill96GISrH8b66
EmKXxcTy89bha2jr3/x7yhG3yifuq/PXtyx7r4YIv3HuXbcXjfnOqm5whaTEKroQ
oPwu2YkCgYEAyWki7087YCUxhN7Q5Wf0OzFGReORuEzTmuBpv04sqGpuo8LhotoP
/cFEGqd8Ld9D8bOuDeOJnChBafU9HrUj9q7E6Bd+ktETaPlOtkqec3OQjLx4hJpj
ar4cTLqCs9nyrPVBAgYk8EujEZlnq/uT8VPCbEgD7yJFWoXiRkJvtWkCgYEA5bux
ZJouaNd+RsdcTzOyDzOPRVWRVODlU0sJw66p6771IdWgNIRovOQYtBiA+VqW81TO
ce+w86wDbIOS2rvqdfycbuSMyUhz45OFLThmK+HeIZ0LcJhkdr6jSvicN5V96WHO
D9xCJ/zl1JH7DMijku74xoT/uNdoiuzJKtgHre0CgYEAnoxa6dOPRAJDVvsnqk8I
3UfOr9mSrmgb80FRPT1GvlT6P4N7p3zNNc5b1Def82Rb0frFuz0w6HJv+/8HXBLv
+pJdgu5rvxtCklIe+jUHQo7obUE4Bfqa5D4/fM8dcILTG//8aqF3lomUFpiSGbpz
HXf4BtEx958cxUO7ed92nHECgYEAwwQGvWDIvsUXc9vud2lp4M+i8neFzGixI3jS
jCNsKSxMCPHAcnRoONjkQ5V9fq8w7tTx/vQ64U8HBQnYEwhsKsZKwTQQcxmnDuv+
pHl4+g1dtGkM+gLTXZ3NHmpWqjSj0wbslrgiDLH5I+7cD2kOuj9UPalPL0jkfPIu
fskuE60CgYEAjH35EyLtjamA0nYf87xk6YNLqrzfWK7SgCaubrMbNWw3G5r0j293
GNUAq/hlydJR6yOleOTRUOns3SFxH7ks1MEen+M0Tq60jMWw+HEmRQy9c1AxiwYL
VdcVhkzFoGwqWUXDiSbN6cmiNkgh8IVJL4Xss2Z6HtB+a/ws5qiIrRA=
—–END RSA PRIVATE KEY—–

暗号文:b”\\\nB}k\x0bQ\x95\x01\x8c\xa2\x02z\x1b\xaa\xd21\t\xac\xb9\xf4\xe0WK\xb4’P\tx\xaf\x81\x1f\xbd,F\t\xb2\x8b\xd9y\xff\x18\xc1\x80\x96\xa2\xb0\xcb\xaeAQpv\xcfW\x18\xd9\xbe4:\xe6\xd1y\xf3\xd4\xe0U\x8ft\x10\xcd\xf2’Jl\x97\xb5\xf7\x1dtE\x0c<\xa8\xbeB&G3\x92\x15\xfcD\xe7%\xc9\xaeEn\x01\x87\xc2\xad&Oy]:\xbe.\xb0\xb2\xdf\x1c+q6\x96\xeb\xea\x90\xcf\xd5\xfa\x8b\xa7\xd7\x9af!.\x1c4oX\xbbKU\x9f\xbb\xe9x^\x7f\x9e\x92\x86\xcd5\xf9\xe8\xb9D\x0eB3\xe6\xd8\rZLD\xed\xee\xe0\xc5\x13\xa9J8/\\\xf5\xf0\xb4\xddS\xbb\x12\xf7m(\x8b\xe8\xb0\x18@\x94w`\xb7\xd0\x8f[l\x0e\x8a\x10\x91\xc4\x8d\x1f\x98T\xc0\xc6\x8c\x01\xcd\xbc4\xbe\xd7{\xd2\x9f\xf6,E;\xdc\xe9\x1d\x14\xda3\x1fi\xef\xb9\x85\x93\x08\xf241/\xeeB\x9eY\xb3Qi/\xa4kp#F`f\xdc\xea^\x9c"
復号文: Hello, RSA!

R言語とPython言語

AIでよく出てくる、2言語。

R言語とPython言語

R言語

用途:主に統計解析やデータビジュアライゼーションに強みがあります。
AIへの適用:
統計モデル: 回帰分析や時系列予測などの統計モデルを構築するのに適しています。
データ探索: データの可視化や探索的データ分析(EDA)が簡単です。
機械学習: caret や randomForest などのパッケージがあり、基本的な機械学習には対応していますが、深層学習には限界があります。

Python言語

用途: 汎用プログラミング言語で、データサイエンスから機械学習、深層学習まで幅広く対応しています。
AIへの適用:
機械学習: scikit-learn で様々なアルゴリズムを試せます。
深層学習: TensorFlow や PyTorch などのライブラリがあり、高度な深層学習モデルを構築できます。
データ処理と可視化: pandas でデータ操作、matplotlib や seaborn でデータ可視化が可能です。

比較

機械学習:

R: 統計モデルの構築が得意で、機械学習も基本的には対応しているが、深層学習には限界がある。
Python: 幅広い機械学習および深層学習ライブラリが利用でき、最新の技術にも対応している。

データビジュアライゼーション:

R: 高度なデータビジュアライゼーションが可能で、特に ggplot2 が強力。
Python: matplotlib や plotly でインタラクティブな可視化ができる。

エコシステム:

R: 統計解析とデータサイエンスに特化したツールが豊富。
Python: 幅広い分野に対応するライブラリがあり、AI・ML・データサイエンス全般に強い。

AIプロジェクトにおいては、Pythonがより多機能で、機械学習や深層学習に対応できるため、一般的にはPythonが好まれることが多いです。ただし、統計解析やデータ可視化のためにRを利用することもあります。

RISC-Vとは?

RISC-V(リスク・ファイブ)とは、カリフォルニア大学バークレー校で開発されたオープンで拡張可能な命令セットアーキテクチャ(ISA)です。
ISAはプロセッサ間で共通化された、インターフェースとしての論理的な命令セットは命令セットアーキテクチャ(英: instruction set architecture, ISA)と呼ばれる。
RISC-Vは特にシンプルでモジュラー設計が特徴です。

以下に、RISC-Vの主な特徴を挙げます。

オープンでロイヤリティフリー
RISC-VはオープンなISAで、誰でも無料で使用することができ、ライセンス料がかかりません。そのため、商用や非商用を問わず、誰でもこのISAを利用して独自のプロセッサやソリューションを開発できます。

モジュラー設計
RISC-Vは基本命令セット(RV32IやRV64Iなど)と、それに追加可能なオプションの拡張(例えば、浮動小数点演算やベクトル処理など)から成り立っています。このモジュラー設計により、用途や必要に応じて柔軟にプロセッサをカスタマイズできます。

拡張性と柔軟性
RISC-Vの設計は、開発者が独自の拡張機能を追加できるように意図されています。これにより、特定のアプリケーションやニーズに合わせたカスタムプロセッサを容易に設計できます。

広範なコミュニティサポート
RISC-Vは世界中の企業、研究機関、開発者からの支持を受けており、オープンソースコミュニティによって積極的に開発と改善が進められています。

非営利組織による管理
RISC-Vの仕様は、RISC-V Internationalという非営利組織によって管理されており、この組織は特定の製品やサービスに商業的な利害関係を持たず、中立的な立場で活動しています。

RISC-Vは、従来のプロプライエタリなISAに代わるオープンな選択肢として注目されており、特に組み込みシステム、IoTデバイス、学術研究、さらには高性能コンピューティングの分野においても利用が広がっています。

Zabbix のサーバ設定エラー

Zabbix のサーバ設定エラー

Zabbix server is not running: the information displayed may not be current. というエラーが出た時の
対応。
DBがZabbixが動いているサーバである場合の設定。

2つのファイル変更

# vi /etc/zabbix/web/zabbix.conf.php
$DB[‘SERVER’] = ‘127.0.0.1’;

# vi /etc/zabbix/zabbix_server.conf
DBHost=127.0.0.1

zabbixのサーバ再起動

systemctl restart zabbix-server