GPT4AllをNode.jsから使ってみる

料金を気にしながら、遊び目的でChatGPTを使うのが微妙にストレスだったので、無料&ローカルでも動くGPT4Allを使ってみた。

グラボ非搭載の低スペックPCでも使える軽量チャットAI「GPT4ALL」の使い方まとめ

基本的にこの記事の通りやればサクッと動いた。2017年のインテルiMacでやり取りに数十秒かかるけど、とりあえず遊ぶ分には十分使えそう。

…ならば、Node.jsでも使いたい。

本サイトにTypeScriptから叩くやり方は書いてあったので、それを参考にやってみたら、簡単にできた!

作業環境

macOS Monterey(12.6.5)
Node.js v18.2

Node.jsの設定

  1. npmでGPT4Allをインストール
    npm install gpt4all
  2. とりあえず、簡単なサンプルスクリプトを実行。
    import { GPT4All } from 'gpt4all';
    
    let gpt4all = null;
    const _model = 'gpt4all-lora-quantized';
    
    /*GPT4ALL初期化*/
    const initGPT = async () => {
        gpt4all = new GPT4All(_model, true);
        await gpt4all.init();
        await gpt4all.open();
        console.log(">> GPT Opened");
        askGPT("Hello GPT!")
    }
    
    /*問い合せ実行*/
    const askGPT = async(xQstr) =>{
      console.log(xQstr);
      const xResponse = await gpt4all.prompt(xQstr);
      console.log(">>" + xResponse);
    }
    
    initGPT();

    初回はgpt4allの本体と学習済みモデル(gpt4all-lora-quantized)データがダウンロードされる。4G位あるので恐ろしく時間がかかけど、のんびり待つ。

  3. スクリプトがエラーになる場合、モジュールのimportが機能してない場合が多い。その場合は「package.json」に以下の一行を追加。
    "type":"module"
  4. こんな感じになれば、成功!
     % node sample.js
    >> GPT Opened
    Hello GPT!
    >>Thank you for your input, GPT!
  5. 別の学習済みモデルを利用したければ、ダウンロードして下記ディレクトリに入れ、newする時にモデル名を指定すれば使える。
    /Users/<ユーザー名>/.nomic/

これで、心置きなく、遊べる!!

Nexus5 をルート化してUbuntuを動かす

昔使ってたNexus5が出てきた。今は簡単にRoot化できるっぽいので遊んでみる。

Nexus5をルート化

下記のページ通りにやったら、簡単にできた。
Nexus5で遊ぶ その3: ルート化の準備 | メモ置場のブログ

もし失敗した場合は下記を参照して復旧。
【Nexus5】Nexus Root Toolkitを使ったプレ文鎮からの復旧方法-Gintoki Note

Linuxマシン化

1.必要のアプリをインストール

Linux Deplay で Ubuntuを入れる

下記サイトを参考にイントール。インストールされるUbuntuのヴァージョンは「18.04」。
Linux Deploy を使用して Android フォンに Ubuntu をインストールする方法 – Moyens I/O
LinuxDeployを使用してAndroidにLinuxをインストールする| Linux中毒者

Ubuntu の設定

Shellをzshに変更

下記サイトを参考にシェルをshからzshに変更
Ubuntuのシェルをzshに変更する – Qiita

必須ツールを設定

「nano」と「curl」をインストール

$sudo apt-get install nano

$sudo apt-get install curl

日本語化

下記サイトを参考にUbuntuで日本語を使える様にする。
Ubuntu 18.04 LTSを日本語化する(日本語環境にする) | 突撃なんでもチートシート

Sambaのインストール

下記サイトを参考にSambaをインストール。面倒くさいのでユーザーディレクトリを共有させる。
Sambaサーバーの設定手順(Ubuntu20.04)とWindowsからのアクセス方法 – 水瓶座列車

再起動コマンドはsudoでやらないと失敗する。

$ sudo service smbd restart
$ sudo service nmbd restart

Node.jsの設定

下記サイトを参考にNode.js環境を作成。管理ツールは「n」を利用。
Ubuntu18.04で任意のバージョンのNode.jsをインストールする方法 | トライフィールズ
Ubuntu18.04に最新のNode.jsをインストールする(アップデート方法も) – Pythonと!

「`GLIBC_2.28′ not found」となる場合は「17.9.1」以前のNode.jsを入れる。
nodeのv18を使ったらエラーになった(CentOS7) – ITのプロへ

Pythonの設定

Pythonは2と3が入ってるので、とりあえず、そのまま使ってみる。

M5Stack GRAYでUIFlowのBLE UARTを使う

M5Stack GRAY + UIFLowでも「BLE UART」パネルを使いたい!

前提

  • M5Stack GRAYはBluetooth対応
  • M5Stack GRAY用の最新ファームウェアはUIFlow v.1.9.6
  • UIFlow IDEではDeviceが「Fire」か「Core2」じゃないと「BLE UART」のパネルが出てこない!

手順

  1. M5Stack GRAYのファームウェアをUIFlow_Fire v1.7.5にする。
    ※v1.9.xだと、実行時にエラーが出る
  2. UIFlow IDEのDeviceはFireを選択

M5Stack用ジェスチャーユニットの値

M5Stack用ジェスチャーユニットを購入したが、各ジェスチャーに対応する値がどこにも書いてなかったので、自分で調べた結果のメモ。
販売サイトにはデフォルトジェスチャーとして9つ紹介されているが、その他にも4パターンが検知できる模様。

■無検知
None: 0

■基本動作
Up: 4
Down: 8
Right: 1
Left: 2
Forward: 32
Backward: 16

■回転動作
Clockwise: 64
Anti-Clockwise: 128

■連続動作
Wave: 256
Wave-Slowly-Left-Right: 3
Wave-Slowly-Up-Down: 12
Wave-Slowly-Forward-Backward: 48
Wave-Slowly-Disorder*: 512

*このモーションは検知できなかった。どういう動作を想定しているのか…

ラズパイ4 + Node.jsで OLEDディプレイを使う

OLEDモジュールをラズパイ4+Node.js環境で使うための覚え書。

作業環境

作業手順

1.OLEDディプレイを繋ぐ
2.Config画面を開いて、I2Cデバイスとの通信を有効化
$ sudo raspi-config

Interfacing Options -> P5 I2C -> YES

3.ラズパイをリブート
$ sudo reboot
4.I2Cデバイスのアドレスを確認
$ i2cdetect -y 1

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
5.モジュールをインストール

$ npm install raspi-io
$ npm install johnny-five
$ npm install oled-js
$ npm install pngparse png-to-lcd oled-font-5x7
6.スクリプトを作成
const five = require('johnny-five');
const raspi = require('raspi-io').RaspiIO;
const board = new five.Board({
	io: new raspi()
});

const Oled = require('oled-js');
const font = require('oled-font-5x7');

board.on('ready',() => {
	console.log('Connected to OLED, ready.');
	const opts = {
		width: 128,
	    height: 64, 
	    address: 0x3C
	};
	oled = new Oled(board, five, opts);
	oled.clearDisplay();
	oled.setCursor(1, 1);
	oled.writeString(font, 1,"Hello World!", 1, true, 2);
	oled.update();
});
7.スクリプトを実行
$ node ./index.js

おしまい!

参考サイト

ESP32-CAMのStream動画をA-FrameのVR空間に表示する

M5Camera Xの動画をA-FrameのVR空間内に表示させたいと思ったが、Motion JPEG stream形式だと、デフォルトの機能(image、video)では対応できなかった。

で、調べたところドンピシャのページを発見。仕組みはよく分からんけど、サンプル通りのコンポーネント作ったらすんなり表示できた!!

>> Use Motion JPEG stream as a source of 360 deg image

AFRAME.registerComponent('box', {
    schema: {
        width: { type: 'number', default: 1 },
        height: { type: 'number', default: 1 },
        depth: { type: 'number', default: 1 },
        color: { type: 'color', default: '#AAA' }
    },

    init: function () {
        var data = this.data;
        var el = this.el;

        this.loader = new THREE.TextureLoader();

        this.geometry = new THREE.BoxBufferGeometry(data.width, data.height, data.depth);
        this.material = new THREE.MeshPhongMaterial({
            map: this.getImage()
        });
        this.material.needsUpdate = true;
        this.mesh = new THREE.Mesh(this.geometry, this.material);
        el.setObject3D('mesh', this.mesh);
    },

    tick: function (time, timeDelta) {
        this.mesh.material.map.img = this.getImage();
        this.mesh.material.map.needsUpdate = true;
    },

    getImage: function() {
        return this.loader.load("ストリーム動画のパス");
    }

サンプルでは立方体だが、下記の部分をいじれば、他のプリミティブでもいける。

this.geometry = new THREE.BoxBufferGeometry(data.width, data.height, data.depth);

synology NAS Web Stationのhtml内でphpを実行する。

完全に自分めも

1.sshでNASにログインする

2. /var/packages/Webstation/target/misc/VirtualHost-apache24.mustache を編集
<FileMatch “\.(php[345]? | phtml|html)$”>

htmlを追加

3.php72_fpm_mustache を編集
security.limit_extension = .php .php3 .php4 .php5 .phtml .html

.htmlを追加

4. 管理画面のパッケージセンターでApacheとphpを再起動

Apache PHPともに複数バージョン入れている場合はすべて対応が必要。
新しいパッケージを追加して処置を忘れていると access denied.のエラーになる。
DSMのバージョンアップした際も同じく処理が必要。

M5CameraXをカメラサーバにする

M5CameraXを買ってみたが、Wifi接続しなきゃならんってのが不便極まりない。ググったらステーションモードにできるらしいと分かったので、早速、先人の方々の情報を参考に、ArdinoIDE(1.8.13)のCameraWebSerberのスケッチを書き込んでみた。

書き込み自体はあっさり成功したが、シリアルモニタが文字化けしてて、アクセス先が分からない…通信速度を「115200bps」にしないとアカンのね。

参考サイト

バランスwiiボードをNode.jsで使ってみる

中古のバランスwiiボードを貰ったので、なんかに活用できないかと色々調べてみたが、微妙に情報が古かったり環境の設定が結構面倒なものばかりだった。
…が、「wii-balance-board-pi」って気になるNode.jsのモジュールがあったのでラズパイ4入れてみたところサクッと使えた。

【検証環境】

  • Raspberry Pi 4
  • raspbian 10.4
  • Node.js 8.15

【設定方法】
基本的には、Githubのページに書いてある通りにするだけ。
サンプルスクリプトもシンプルだが、これだけで十分な内容。

  1. モジュールをインストール
    npm i -s wii-balance-board-pi
  2. 通信用のPythonプログラムを入れる
    sudo apt-get --assume-yes install bluez python-bluez python-gobject python-dbus
  3. ラズパイを再起動
    sudo reboot
  4. サンプルスクリプトを実行
    const BalanceBoard = require("wii-balance-board-pi");
    
    var balanceBoard = new BalanceBoard();
    
    balanceBoard.connect();
    
    balanceBoard.on("data", data => {
      console.log(data);
    });
  5. バランスWiiボードの電池カバー開け、シンクロボタン(赤いやつ)を押す。
  6. ちょっと待ってると自動的にラズパイと繋がって、各センサ直がコンソールに表示される。
    {
        connected: boolean,
        topLeft: float,
        topRight: float,
        bottomLeft: float,
        bottomRight: float,
        totalWeight: float,
        buttonPressed: boolean,
        buttonReleased: boolean
    }

4角にあるセンサ値と全体の重さ(kg)、前面にあるボタンの状態がJSONで取得できるので、あとは好きに料理するだけ!
これはお手軽で便利だ。