技術 のすべての投稿

次世代スマートメーター とは?

電力各社が供給している電気のメーターに対して、使用量をリアルタイムで収集してきている中で、その仕様が電力会社がバラバラなので、統一化します。

統一化されたデータは、エネルギー管理システムの改善に役立ちます。消費者は自宅やビジネスのエネルギー使用量をリアルタイムでモニタリングし、無駄な消費を削減するための措置を講じることができます。これにより、エネルギーコストの削減に繋がるだけでなく、ピーク時の電力需要を減らすことによって、電力網への負担を軽減することもできます。

地域全体でのエネルギー使用の最適化は、再生可能エネルギーの統合を促進し、電力網の安定性を高める助けとなります。統一化されたスマートメーターのデータを活用して、太陽光や風力などの変動するエネルギー源をより効率的に電力網に統合することが可能になります。これにより、化石燃料に依存する必要が減少し、地域の炭素足跡を削減することができます。

最終的に、このような取り組みは、電力供給の信頼性の向上、エネルギーコストの削減、環境への影響の軽減という、地域社会にとっての複数の利益に繋がります。次世代スマートメーターと統一化されたデータ分析ツールの導入により、地域全体のエネルギー効率と持続可能性が向上します。

高度な通信能力
次世代スマートメーターは複数の通信プロトコルをサポートし、電力使用データを電力会社や消費者にリアルタイムで送信できます。これにより、電力使用状況をより正確に、迅速に把握することが可能になります。

エネルギー管理と最適化
これらのメーターは消費者のエネルギー使用パターンを分析し、省エネルギーのヒントや効率的なエネルギー使用戦略を提供します。これにより、エネルギーの使用効率が向上し、コスト削減が実現されます。

リモート制御と診断
電力会社は遠隔からメーターを制御し、診断を行うことができます。これにより、物理的なメーターチェックの必要性が減少し、効率的なメンテナンスが可能になります。

拡張性
スマートメーターに人感センサーや温度センサーなどの環境センサーを搭載することにより、より高度なエネルギー管理と最適化が実現されます。これらのセンサーは、家庭やオフィスの室内環境をリアルタイムで監視し、エネルギー使用量に直接影響を与える要因を把握するのに役立ちます。

統合性
次世代スマートメーターは、スマートホームシステムや再生可能エネルギー源など、他の家庭内やオフィス、工場等のシステムと統合できます。これにより、家庭内のエネルギー管理が一元化され、より効果的な制御と最適化が実現されます。

検討されている技術資料
TR-1052 – EMS・アグリゲーションコントローラー-スマートメーター(Bルート)通信インタフェース実装詳細ガイドライン
スマートメーターとエネルギー管理システム(EMS)の開発に関しては、その実装ガイドラインと技術資料が非常に重要です。これらの資料は、電力各社、開発者、およびシステムインテグレータに対して、次世代スマートメーターシステムの設計、開発、および実装のための共通の枠組みと基準
https://www.ttc.or.jp/document_db/information/view_express_entity/1055

メールのパスワードの設定プログラム

メールのパスワード設定一覧を作るときに半角英数で、メールアドレスが有効で、メールアドレスとは別にアカウントがあります。

いろんなチェックをして、生成して、配らないといけません。結構面倒ですし、エラーも多いので、こちらでプログラムを書いてみました。

追加仕様:(2名様のニーズを反映)
1.必ず英字大文字小文字数字記号の組み合わせを入れる。
2.10桁から12桁までランダム

サンプルプログラムは下記になります。CSV形式等は自分で行なってください。

https://abundcore.net/program-library/email-password/

 

<?php

function generateRandomPassword() {
    // パスワードの長さを10から12桁の間でランダムに決定
    $length = rand(10, 12);
    // 各カテゴリの文字
    $lowercaseLetters = 'abcdefghijklmnopqrstuvwxyz';
    $uppercaseLetters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $numbers = '0123456789';
    $symbols = '#%=-+:?_<>[]{}()^!,.';

    // 各カテゴリから最低1文字を確実に含める
    $password = $lowercaseLetters[rand(0, strlen($lowercaseLetters) - 1)];
    $password .= $uppercaseLetters[rand(0, strlen($uppercaseLetters) - 1)];
    $password .= $numbers[rand(0, strlen($numbers) - 1)];
    $password .= $symbols[rand(0, strlen($symbols) - 1)];

    // 全ての文字を結合して残りの部分をランダムに選択
    $allCharacters = $lowercaseLetters . $uppercaseLetters . $numbers . $symbols;
    for ($i = strlen($password); $i < $length; $i++) {
        $password .= $allCharacters[rand(0, strlen($allCharacters) - 1)];
    }

    // パスワードをシャッフルして各カテゴリの文字が最初に来ないようにする
    $password = str_shuffle($password);

    return $password;
}

function isValidUsername($username) {
    // ユーザーネームが半角英数とピリオド、ハイフンのみを含むかチェック
    return $username !== '' && preg_match('/^[a-zA-Z0-9\.\-]+$/', $username);
}

function isValidEmail($email) {
    return $email !== '' && filter_var($email, FILTER_VALIDATE_EMAIL);
}

$userData = [];
$errors = [];

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    for ($i = 1; $i <= 5; $i++) {
        $username = $_POST["username$i"] ?? '';
        $email = $_POST["email$i"] ?? '';
        if ($username !== '' || $email !== '') {
            if (!isValidUsername($username)) {
                $errors[] = "ユーザーアカウント {$i} は無効です。半角英数とピリオド、ハイフンのみ使用可能です。";
                continue;
            }
            if (!isValidEmail($email)) {
                $errors[] = "メールアドレス {$i} は無効です。";
                continue;
            }
            $password = generateRandomPassword();
            $userData[] = [
                'username' => $username,
                'email' => $email,
                'password' => $password
            ];
        }
    }
}
?>

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>パスワードフォーム</title>
</head>
<body>
    <h1>パスワードフォーム</h1>
    <form method="post">
        <?php for ($i = 1; $i <= 5; $i++): ?>
            <div>
                <label for="username<?= $i ?>">ユーザーアカウント <?= $i ?>:</label>
                <input type="text" id="username<?= $i ?>" name="username<?= $i ?>">
                <label for="email<?= $i ?>">メールアドレス:</label>
                <input type="email" id="email<?= $i ?>" name="email<?= $i ?>">
            </div>
        <?php endfor; ?>
        <button type="submit">送信</button>
    </form>
    
    <?php if (!empty($errors)): ?>
        <div style="color: red;">
            <?php foreach ($errors as $error): ?>
                <p><?= $error ?></p>
            <?php endforeach; ?>
        </div>
    <?php endif; ?>

    <?php if (!empty($userData)): ?>
        <h2>生成されたパスワード一覧</h2>
        <table border="1">
            <tr>
                <th>ユーザーアカウント</th>
                <th>メールアドレス</th>
                <th>新しいパスワード</th>
            </tr>
            <?php foreach ($userData as $user): ?>
                <tr>
                    <td><?= htmlspecialchars($user['username'], ENT_QUOTES) ?></td>
                    <td><?= htmlspecialchars($user['email'], ENT_QUOTES) ?></td>
                    <td><?= $user['password'] ?></td>
                </tr>
            <?php endforeach; ?>
        </table>
    <?php endif; ?>
</body>
</html>

ns_binding_aborted とは

サイトスピードの調整をしている時に「ns_binding_aborted」という表示がブラウザの解析に出ました。
ns_binding_aborted とは

NS_BINDING_ABORTED は、ウェブブラウザにおけるエラーコードの一つで、通常、ユーザーがページの読み込みをキャンセルした場合に発生します。これは、ユーザーがページの読み込みを途中で止めるか、別のページに移動することによって引き起こされる可能性があります。このエラーは、特にページの読み込みが遅い場合や、ユーザーが素早く複数のリンクをクリックした場合によく見られます。

このエラーコードは、主にブラウザの内部で使用され、開発者がブラウザやウェブページの動作を分析する際に表示されるもので、一般のユーザーはこのエラーを見ることはほぼありません。

NS_BINDING_ABORTED は、ウェブページが正常に機能していないことを示すエラーではなく、ユーザーの行動によって発生する自然なプロセスの一部です。したがって、このエラーが発生しても特に心配する必要はありません。

気になる方はブラウザをリロードして、同じエラーができるか?を確認してください。

androidでFlutterで録音するには?

androidでFlutterで録音するには?

Flutterの開発環境が整っていることです。
詳細を知りたい方は別途ご連絡ください。

https://pub.dev/packages/record

permissionの設定

プロジェクト作成した後に、下記のファイルを探して、
/android/app/src/main/AndroidManifest.xml
に下記を1行追加。

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 録音許可を追加 -->

パッケージ追加

プロジェクト作成した後に、下記のファイルを探して、
/pubspec.yaml
flutter:の行を追加

dependencies:
  flutter:
    sdk: flutter
  record: ^5.0.1

ターミナルで下記のコマンド実行

flutter pub get

プログラム

パッケージ設定

import 'package:record/record.dart';

// AudioRecorderのインスタンスを作成
final record = AudioRecorder();

// 録音のための許可をチェックし、必要に応じてリクエスト
if (await record.hasPermission()) {
  // ファイルへの録音を開始 ここのパスを間違えると録音ができないです。ログ等を細かく確認してください。
  await record.start(const RecordConfig(), path: 'aFullPath/sample.m4a');
  // ... またはストリームへの録音を開始
  final stream = await record.startStream(const RecordConfig(AudioEncoder.pcm16bits));
}

// 録音を停止し、ファイルパスを取得
final path = await record.stop();
// ... または録音をキャンセル(これによりファイル/ブロブが暗黙的に削除される)
await record.cancel();

// リソースを解放
record.dispose(); // これを忘れないでください。

 
 

AI系の環境をDockerにして、複数環境を

Dockerにする理由

AI系の開発をしている中で、勢いあまって、複数の機能を同じ環境にいれてしまい、整理できない。
音声処理、画像処理、統計予想処理を同じ環境に入れてしまうと後で分離して、開発が不可能になる。
Dockerでわける。
https://www.docker.com/

ひとまず、jetson nanoから

https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-ml
l4t-ml:r35.2.1-py3を使ってみます。

環境

まずは、環境を最新にします。
sudo apt update
sudo apt upgrade -y
mkdir data
cd data
mkdir l4t-ml-r35
cd l4t-ml-r35

docker自体は事前にはいっていると思うので、コンテナ指定して環境取得するシェルを書く
vi rundocker.sh

xhost +

sudo docker run \
    -it \
    --rm \
    --net=host \
    --runtime nvidia \
    -e DISPLAY=$DISPLAY \
    -v /tmp/.X11-unix/:/tmp/.X11-unix \
    -v ${PWD}:/data \
    nvcr.io/nvidia/l4t-ml:r35.2.1-py3

実行権限に変更
chmod a+x rundocker.sh

実行
./rundocker.sh

Status: Downloaded newer image for nvcr.io/nvidia/l4t-ml:r35.2.1-py3
allow 10 sec for JupyterLab to start @ http://192.168.158.57:8888 (password nvidia)
JupterLab logging location: /var/log/jupyter.log (inside the container)

起動しているかを確認

ブラウザで
http://192.168.158.57:8888
パスワード:nvidia
でアクセス

コマンドで
# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
147cb497e537 nvcr.io/nvidia/l4t-ml:r35.2.1-py3 “/bin/sh -c ‘/bin/ba…” 40 minutes ago Up 39 minutes competent_saha

AI系のライブラリーのmakeで謎のエラーのとき

AI系のライブラリーのmakeで謎のエラーのとき・・・
ファイルがあるのに、ファイルがないとか、ライブラリのバージョンが違うとか・・・
実際にはあっているのに、エラーになることがあります。
リソース不足でのエラーが多いと思うので、makeする前に
やっておきましょう。

stack sizeを制限なしにしておく。
# ulimit -a

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 13907
max locked memory       (kbytes, -l) 65536
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 13907
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

# ulimit -s unlimited
aoki@ai-desktop:~$ ulimit -a

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 13907
max locked memory       (kbytes, -l) 65536
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) unlimited
cpu time               (seconds, -t) unlimited
max user processes              (-u) 13907
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

無限値の設定
https://www.ibm.com/docs/ja/wca/3.5.0?topic=tasks-setting-ulimit-values

linuxでCUDA変更12から10へupdate-alternatives

jetson_releaseでみると12シリーズになっている。
しかし、環境パスは10シリーズで統一したのに・・・
とおもっている方、多いと思います。

システムで使われるプログラムのバージョン管理を行うための
update-alternatives
を使います。

$ sudo update-alternatives –config cuda

alternative cuda (/usr/local/cuda を提供) には 2 個の選択肢があります。

  選択肢    パス                優先度  状態
------------------------------------------------------------
* 0            /usr/local/cuda-12.1   121       自動モード
  1            /usr/local/cuda-10.2   102       手動モード
  2            /usr/local/cuda-12.1   121       手動モード

現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してく ださい: 1
update-alternatives: /usr/local/cuda (cuda) を提供するためにマニュアルモードで /usr/local/cuda-10.2 を使います
aoki@ai-desktop:~$ sudo update-alternatives --config cuda
alternative cuda (/usr/local/cuda を提供) には 2 個の選択肢があります。

1を選びます。

  選択肢    パス                優先度  状態
------------------------------------------------------------
  0            /usr/local/cuda-12.1   121       自動モード
* 1            /usr/local/cuda-10.2   102       手動モード
  2            /usr/local/cuda-12.1   121       手動モード

現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してく ださい:

jetson_releaseを実行すると、
Libraries: – CUDA: 10.*.*
になっていると思います。

PHPでChatGPT3.5のAPIをつかって、一文字づつ表示するサンプル

PHPでChatGPTでAPIを叩いてみたいけど・・・・面白くしたい方へ。
ChatGPTのブラウザ画面のように一文字出てくるサンプルです。
ChatGPT3.5のAPIのキーを取得して、試してみてください。

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
 function send_prompt($prompt = '')
{
	$API_KEY = '*************************************************';//ここにキーを入れてね。

	if (!$prompt) {
		return;
	}

	$headers = array(
		'Content-Type: application/json',
		'Authorization: Bearer ' . $API_KEY
	);

	$data = array(
		'model' => 'text-davinci-003',
		'prompt' => $prompt,
		"max_tokens" => 500,
		"temperature" => 1,
		"top_p" => 1,
		"frequency_penalty" => 0.0,
		"presence_penalty" => 0.6,
		"stop" => array(".", "!", "?") // 終了文字を調整します
	);

	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, 'https://api.openai.com/v1/completions');
	curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	$response = curl_exec($ch);
	curl_close($ch);

	$response_data = json_decode($response, true);
	
	return trim($response_data['choices'][0]['text']);
}

$prompt = 'こんにちは、質問していいですか?';//ここに質問を書いてね
$chat_text = send_prompt($prompt);
echo '
   <script>
        document.addEventListener("DOMContentLoaded", function () {
            const text = \'こんにちは、私はChatGPTです。'.$chat_text.'\';//ここは回答です、アレンジしてね
            const outputElement = document.getElementById(\'output\');
            const typingDelay = 200; // ミリ秒単位でのタイピングの遅延

            function typeText(index) {
                if (index < text.length) {
                    outputElement.innerHTML += text.charAt(index);
                    setTimeout(() => typeText(index + 1), typingDelay);
                }
            }

            typeText(0);
        });
    </script>

    <div id="output"></div>
    ';

?>

mysqldumpでのエラー

一番単純に下記のコマンドを叩くとエラーになります。

コマンド:
mysqldump -h ホスト名 -u ユーザー名 -p テーブル名 >ファイル名
エラー:
mysqldump: Error: ‘Access denied; you need (at least one of) the PROCESS privilege(s) for this operation’ when trying to dump tablespaces

テーブルスペース情報をダンプしなくてもよい場合、–no-tablespacesを付けると、エラーがでなくなります。
mysqldump –no-tablespaces -h ホスト名 -u ユーザー名 -p テーブル名 >ファイル名

ちなみに下記のオプションでもエラーがでるようになったので、サーバによっては外した方がいい。
–single-transaction