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

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(); // これを忘れないでください。

 
 

mysqlのzabbixのDBパスワード変更

mysqlのzabbixのDBパスワード変更

MySQLのパスワード

MySQLにログインします
mysql -u root

パスワードをリセットします(例: 新しいパスワードRootPassword)
ALTER USER ‘zabbix’@’localhost’ IDENTIFIED BY ‘NewPassword’;

zabbix設定

2ファイルを変更
/etc/zabbix/zabbix_server.confの下記の部分を変更
DBPassword=NewPassword

/etc/zabbix/web/zabbix.conf.php の下記の部分を変更
$DB [‘PASSWORD ‘]= ‘NewPassword’;

zabbix再起動

sudo systemctl restart zabbix-server

エラー

下記のエラーが出た場合は設定が不足している可能性があります。
Database error
Access denied for user ‘zabbix’@’localhost’ (using password: YES)

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

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

WordPressで400万ページ投稿するには

会社情報のサイト https://awb.jp/
当初はまじめに記事をガンガンアップでしていた。
数万ページくらいでカップラーメンができるくらい遅いページ表示。
ページ投稿もどんどん重くなり、投稿にもカップラーメンできそうでした。
あきらめて、全部消して、ページ投稿の見直し。

■ページ投稿
いろいろなCSVアップツールでやってみたが、タイムアウト等でほぼ無理。
直接投稿のプログラムをたたきます。
データも最小限にします。

wp_insert_postで投稿ページ登録。
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wp_insert_post

-プログラム例:実際はもう少し複雑—————————————————-

        $post_id = wp_insert_post(array(
            'post_type' => 'post',
            'post_title' => $item[0],
            'post_content' => $item[2],
            'post_status' => 'publish',
            'post_category'  => $item[3],
            'tags_input' =>  $item[4],
            'comment_status' => 'closed',
            'ping_status' => 'closed',
            ));

——————————————————
他のデータとリンクしたい部分をカスタムフィールドに入れておきます。
add post meta
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_post_meta
——————————————————

add_post_meta($post_id, 'hogehoge_number', $item[7])

——————————————————
ひたすら、1ページごとにサーバに投げます。

ページは最小限のデータにして、カスタムフィールド(上記の例だとhogehoge_number)にキーをいれておき、
wpの標準のテーブルと付加価値的データのテーブルを作り、カスタムフィールドで連携して、ページを生成します。

■不具合がでる。
プラグインによってはエラーになります。
サイトマップを作るプラグイン等は特に注意です。

WP「GDPR Cookie Consent」 で「設定を更新できません。」の対応方法

WordPressのコンテンツでの「GDPR(General Data Protection Regulation:一般データ保護規則)」用プラグイン
CookieYes | GDPR Cookie Consent & Compliance Notice (CCPA Ready)

このプラグインは設定が簡単ですが、「「設定を更新できません。」と出て、更新されないことがある。
WAF(Web Application Firewall)でブロックされている可能性があるので、
WAFのログを確認してください。
「*****/edit.php?post_type=cookielawinfo&page=cookie-law-info」というエラーログが出ていたら、
設定の時だけ、WAFをオフにしてください。設定が終わったら、オンにしてください。