2025年12月24日水曜日

OpenAIのwhisperで、処理した音声認識テキストを表示するアプリ(Qt版)

https://github.com/gh6141/QtMp3Srt.git 

OpenAIのwhisperで音声認識処理すると.srtというファイルができますが。これと音声ファイル(mp3)を一緒のフォルダに置いて使えるようにしてみました。ちょうど、映画の字幕のような感じで表示できます。-smallのオプションで、処理したものだと、たまに認識が間違って、若干ずれることもありますが、日本語以外等でいろいろ使えそうです。

2025年12月22日月曜日

灯油残量 WIFI OLEDで表示

 ewp32-c3を表示用に使ってみた、センサーからのデータを蓄積しているraspiからWIFIで読み出すようにした。

 とりあえず、補正計算(最小二乗法で近似していますが、はたしてこの式が正しいかどうかはまだ様子見る必要ありますが。)した残量に加えて、気温・気圧表示し、気圧変化のグラフも表示させてみた。スイッチオンで手軽に見ることができて便利。
 DC-DCコンバータが容量大きすぎて(今時は、小型の小容量のものもあるけれど、未使用でしまっていたので有効活用しようかと)、ケースの場所をふさいでしまった。たまたま、9V積層電池が余っていたので、コンバータを使うことにしたため、このようなアンバランスな組み合わせになってしまった。(OLEDの写真画像が一部かけて写っていた。たぶん、シャッター速度が速かったため?)


2025年12月21日日曜日

pic16f628AによるDFplayer改良

 EEPROMで、どの番号まで再生したか、不揮発メモリに記録できるようにした。フォルダは01のみとした。以前のフォルダ番号用スイッチを制御用(1回タッチで番号を進める、2回タッチで番号を減らす)とし、ファイル番号用スイッチは、1回目の連続タッチで10の位、2回目の連続タッチで1の位を指定して入力できるようにした。(ただし、10未満は、1回目のタッチを10回タッチすると0になるようにした。)

dfPlayer、しかもPIC利用だとやはり、かなり制限があって、コーディングも難しかった。

2025年12月19日金曜日

OpenAIのWhisperがローカル実行でかなりの認識率

 最近は、音声認識が、無料でしかもローカル実行で正確に認識できるのには驚きました。コマンドラインで実行できるので、アプリの中で活用できてとても便利だと思います。

バッチファイルです。途中のパスを通すところは、ffmpegのあるパスです。

radio2text.bat

.m4aなど、いったん.wavに変換してから処理しています。
LANGはenが英語、jaが日本語 --languageないとどちらも出します
--output_format srt で時間付き字幕

Qt使えば
if (line.contains(QRegularExpression("[ぁ-んァ-ン一-龯]"))) {
    // 日本語
} else {
    // 英語
}
のように分けたりもできそうです。

※なお、準備としては ffmpeg以外に、python3.9以上で
pip install -U openai-whisper
をインストールするだけで動くようです。

2025年12月17日水曜日

ESP32灯油残量センサー 実験

まだ、測定値が安定しないので、新たに容量カウント補正用のセンサ(タンク入口までの短い線)を追加して、しばらくデータをとってみることにした。追加PINはGPIO15。esp32から外に出ている線がぬれるだけで、測定値に影響するので、補正できないか試す予定。 

2025年12月15日月曜日

Qtで最下行へスクロールする方法について

 Qtでは、行数が多くなると最下行へのスクロールが難しい仕様?のようです。

 実際のWigetの行サイズとかもあり、すべてを反映して正確なスクロール量を割り出すのが難しいという問題もある?ちょうど、エクセルなどで印刷イメージと編集画面で微妙にずれたりするのと同じ困難さかもしれませんが。

 こういうときは、泥臭い方法で、実際に繰り返し試しながらスクロール量を割り出すしかないのかもしれません。その旨、ChatGPTに伝えたところ、以下のコードを作ってくれました。なんとか、うまくいきました。

void KakeiboTable::scrollDown(){
    QScrollBar* bar = view->verticalScrollBar();
    if (!bar) return;
    int lastMax = -1;
    QTimer* timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, [=]() mutable {
        int curMax = bar->maximum();
        bar->setValue(curMax);
        if (curMax == lastMax) {
            timer->stop();
            timer->deleteLater();
        }
        lastMax = curMax;
    });
    timer->start(0);
}

2025年12月11日木曜日

Unityで縦列駐車シミュレーションをつくってみた

 WebGLで縦列駐車のシミュレーションできるようにしてみた。実車の運転前に、シミュレーションでコツをつかんでおくと役立つかもしれません。

https://github.com/gh6141/Parking.git(source code)

https://gh6141.github.io/WebGL-Parking/(シミュレーション)

上下左右の矢印で操作し、Spaceでブレーキです

※Github PageでWebGLを使うには、zip圧縮はしないほうがいいようです。パフォーマンスレベルはできるだけLow側にするとうまく動作するようです。

2025年12月10日水曜日

釣り竿アンテナの接触不良対策

 釣り竿アンテナ(カーボン)に銅箔テープを貼ったものをアンテナとして使っていましたが、接続部がどうしても接触不良起こしやすく、SWRも安定しにくくなってきたので、試しに金属クリップを使ったら比較的調子がよくなり59+レポートもらえるようになりました。境目よりなるべくぎりぎり上のほうをはさむとうまくいくようです。

関数解析(宮寺功著)

 文庫本で関数解析が読めるということで購入してみました。早速、壁にぶつかりましたが。

P40 定理2.2で、(x,y)=||(x+y)/2||^2-||(x-y)/2||^2+i||(x+iy)/2||^2-i||(x-iy)/2||^2の定義で(x,y)=(y,x)の共役 が言えるのかどうか? ||x+y||^2+||x-y||^2=2||x||^2+2||y||^2を使うとうまくできるようです。

注意が必要なのは、(x,y)=||(x+y)/2||^2-||(x-y)/2||^2+i||(x+iy)/2||^2-i||(x-iy)/2||^2の共役をとるとき、|| ||のなかにあるiの符号は変えてはいけないということ?うっかりけてしまいそうですが、外側のiは符号変えてもいいですが、ここがたぶん注意点?

Unityを久しぶり少し使ってみました

基本的なことを忘れていて思い出すの時間はかかりましたが、以前作りかけていたものを少しだけ手を加えてみました。文字式の計算を動物キャラクタで、できないか、試しに作ってみたものです。導入等に使えないかと。 使う機会もないので、まだ中途半端の状態ですが。同類項=同じ種類の動物を重ねて計算します。+ーゼロだと爆発して消えるようにしています。

https://github.com/gh6141/WebGL_MathBoxSrc2.git(code)

https://gh6141.github.io/WebGL_mathBox/(WebGL)

こういうゲームでも誰か作ってくれれば、文字式や方程式の抽象概念も多少は理解促進の助けになるのでないかと思っていますが。

2025年12月6日土曜日

ESP32+BME280 bottleコードの調整

 ESP32からのデータをbottleで表示するコードを少し調整。スマホでの表示が見ずらいので少し調整してみたのがこちら


2025年12月3日水曜日

ESP32にBME280追加

 キャパシティのカウントに、温度影響などあれば、補正の可能性もあるかと思い、温度等もロギングすることにしてみた。ついでも、気圧、湿度も計測できるセンサが安く入手できたのでつないでみた。ロギングはbottleサーバで行い、PCから確認できるようにした。esp32のコードもそれに合わせて書き換えた。

補足:容量カウントのピンはGPIO4からノイズが少なめのGPIO12に変更した。また、容量カウントは、WIFIやBME280の起動前に行い、ノイズの影響を除くようにコードを修正。シリアル通信も同様の理由で削除(2025.12.5)(ChatGPTのよると、GPIO12,GPIO33,GPIO32,GPIO13,GPIO15の順でノイズが少ないらしい)

SparkFunBME280というライブラリを追加する必要があります。

BME280のI2C接続図

 アクリルだと、紫外線で脆くなるだろうと考え、塩ビパイプをヒートガンで平面にしたものを加工して作ってみた。

Web確認すると推移グラフもチェックできるようにした(2025.12.6)
(12/7)湿度が容量に影響しているような様子も見られ、もう少し分析が必要と思われる。
(12/8)湿度との相関もはっきりしないところもある。タンク内と外では湿度が同じでないことも影響しているかもしれないので、補正も難しさがありそう。


2025年11月28日金曜日

SMB1.0で古くなったNASをバージョンあげて使う方法

NASのファームウエアをアップデートはさすがに聞かないので、代替案として、raspi2をproxyとして利用してみた。

sudo pico /etc/samba/smb.confで設定追加
[oldnas_proxy]
   path = /mnt/oldnas
   read only = no
   guest ok = no
   valid users = pi
   force user = pi
   force group = pi
   create mask = 0664
   directory mask = 0775
   min protocol = SMB2_02
   max protocol = SMB3

sudo smbpasswd -a pi
sudo systemctl restart smbd

sudo mkdir -p /mnt/oldnas
sudo mount -t cifs -o username=NASのユーザー名,password=NASのパスワード,vers=1.0,uid=pi,gid=pi,file_mode=0664,dir_mode=0775 //192.168.1.アドレス/disk /mnt/oldnas

上記のマウントは、シャットダウンで消えるので、再起動で保持するには
sudo nano /etc/samba/nas.credentials
username=ユーザー名
password=パスワード
sudo chmod 600 /etc/samba/nas.credentials

/etc/fstab に追加
//adress/disk  /mnt/oldnas cifs  credentials=/etc/samba/nas.credentials,vers=3.0,uid=1000,gid=1000,file_mode=0664,dir_mode=0775  0  0

マウントテスト
sudo mount -a
ls /mnt/oldnas

2025年11月25日火曜日

Qt 他のOSからのコードの取り込み

 Windowsで作成したコードをLinuxで使う手順:
最初、NewProject>プロジェクトのインポート>既存プロジェクトのインポート
だと思って操作した。しかし、コンパイラのバージョンが一致しないためかうまくいかない。
ChatGPTによるとコマンドラインだけでもできるようだ。
必要なものそろえるには
sudo apt update
sudo apt install qt6-base-dev qt6-base-dev-tools qt6-tools-dev qt6-tools-dev-tools
sudo apt install cmake build-essential ninja-build gdb
cd ~/qtkjog
rm -rf build
mkdir build
cd build
cmake ..
make -j4
これで、IDEに頼らず実行ファイルが動作した。

IDEの設定も、プロジェクト>ビルドと実行の中のDesktop Qt6.10.1というのができていたので、そこのビルド設定>一般マネージャを/home/user/qtkjog/buildと変更
また、実行時の設定>実行ファイルのところを/home/user/qtkjog/build/kjogとして、作業ディレクトリは空欄にしてみた。すると、立ち上げることができた。

ところが、これが、ビルドを消すとうまくいかなので、この方法は不完全なよう。configureがエラーでうまくいかない。

いろいろ、試行錯誤をしながらも、結局、正しくは、
・CMakeLists.txt を開く
・/home/user/qtkjog/build等の名称自動でつくので 必要なものにチェック入れる
・右下にconfigure projectのボタンが出てくるので、これをクリックでOk
・あとは、実行ボタンでOk
じつは、シンプルな操作でした。(ChatGPTはcmakeのconfigureがどっかにあるはずだと教えてくれるのだけど、新しいIDEにはそれは見つけられず、結局このconfigure projectのボタンがそれに該当するものだったらしい。configure>makeの手順はいつの時代になっても変わらないようだ。)

Windowsでは動作したのに、Ubuntuでは動作しないものもあった。C++の派生クラスの扱いがOSで微妙に違いがあるらしく、そのためらしい。こういうものは、なかなかバグを発見しずらく、気づくまで時間がかかってしまった。

2025年11月24日月曜日

Linux Mint へのMultiWriter5300のプリンタ追加(覚書)

 LinuxMint標準のドライバだけではうまくいかなかったが、次の手順で設定できた。CUPS を使用。

 NECの公式ウェブサイトからMultiWriter 5300向けのLinuxドライバーをダウンロードします。通常はRPM形式で提供されます。DEBパッケージを使用
sudo apt update
sudo apt install cups alien
sudo systemctl enable cups.service
sudo systemctl start cups.service
sudo usermod -aG lpadmin your_username(your_usernameを実際のユーザー名に置き換え) 
保存したディレクトリに移動  cd ~/Downloads
↓注!:x.x.xのところはダウンロードしたものに合わせて適宜変更
sudo alien -d nclinuxprint-x.x.x-1.i386.rpm
sudo dpkg -i nclinuxprint-x.x.x-1.deb
エラーあれば sudo apt install -f 
ウェブブラウザを開き、CUPSの管理画面 (http://localhost:631/) にアクセス
「管理」タブをクリック>「プリンターの追加」>認証を求められたら、lpadminグループに追加したユーザー名とパスワードを入力
接続方法を選択:USB接続の場合は**「Local Printers」から、ネットワーク接続の場合は「Network Printers」**からプリンターを選択
ネットワーク接続の場合、自分の場合、ipp://*.*.*.*:631/ippでうまくいった。(*は各自環境に合わせて設定)
「続ける」>プリンターの製造元(NEC)とモデル(MultiWriter 5300)を選択、またはインストールしたPPDファイルをアップロード>画面の指示に従って名前や場所を設定し、インストールを完了>最後にテスト印刷で確認

2025年11月23日日曜日

Qt6 Linuxへのデプロイ

 配布の前段階として、試しにフォームのみのテストコードをデプロイ試してみた。
sudo apt install ninja-build
sudo apt install qt6-base-dev qt6-base-dev-tools
sudo apt install  qt6-tools-dev-tools qt6-l10n-tools
何度か失敗したらrm -rf CMakeCache.txt CMakeFiles/
cd ~/デスクトップ/test           rm -rf build           mkdir build            cd build   でいったん削除
cmake -DCMAKE_PREFIX_PATH="/usr/lib/x86_64-linux-gnu/cmake/Qt6" -DCMAKE_BUILD_TYPE=Release ..  (..はひとつ上にCMakeLists.txtがあることを示している)
make -j8
情況としては
test/
 ├ build/  ←ここで上記コマンド
 │   ├ Makefile
 │   ├ CMakeFiles/
 │   └ myapp (実行ファイル) →これが、このPC環境でなら実行可能になった
 └ CMakeLists.txt   となる

2025年11月20日木曜日

Qt レイアウトについて

    auto *labelLayout = new QHBoxLayout;
    labelLayout->addWidget(new QLabel("削除(左列)"));
    labelLayout->addWidget(new QLabel("適用(右列)"));

    auto *container = new QWidget;
    auto *containerLayout = new QVBoxLayout(container);
    containerLayout->addLayout(labelLayout);
    containerLayout->addWidget(grid);

    scrollArea->setWidget(container);

container:大きいレイアウトの中に入れる対象、containerLayout:その container 内での並べ方の定義 と 考える。

2025年11月18日火曜日

Qt ComboBoxの更新時シグナルを一時的に無視

一時的にシグナルを無効化するには 
QString oldText = cb->currentText();  // 現在の文字を保存
cb->blockSignals(true);  // イベントを一時的に無効化
cb->clear();
cb->addItems(items);
cb->setCurrentText(oldText);  // 元の文字に戻す
cb->blockSignals(false);  // イベント再開

これは、いろんな場面で必要になってくる定石?
QString oldText = cb->currentText();
{
    QSignalBlocker blocker(cb);  // ブロック開始
    cb->clear();
    cb->addItems(items);
    cb->setCurrentText(oldText);
} // ブロック終了と同時に自動復帰
という方法もあるとのこと。

2025年11月17日月曜日

Qtでボタンをグリッド内でDrag&Dropするコード

 よく使いそうな機能なので、ChatGPTといろいろやりとりしながら、BugFixして完成したものです。グリッド内のボタンをDrag&Dropで動かせるので、対応関係の設定などに利用すると便利そうです。


DraggableButton.h

DraggableGridWidget.h

DraggableGridWidget.cpp

mainwindow内のダイアログ起動コード

2025年11月14日金曜日

Qtで、同時に2つのmodelを扱う例

 ChatGPTに聞いてみたところ、modelを切り替えながら処理する場合どうするか、だいぶ複雑にはなる。あまり見慣れないコードだけど、これで動くようになる。(家計簿で、口座間移動処理データを同時に2つ削除するときのslotの部分)


モデルを使って「いったん読み込んで処理してから反映」としたのは、複数行選択
元テーブルの情報を参照先テーブルの削除条件に使う、という 2つのモデルを絡めた処理 を安全に実装するための手法、ということのようです。

C++の参照、ポインタ復習

 Qtで、最近ほとんど使ってなかったポインタや参照をC++で久しぶりに使うことになったが、ほとんど忘れていた。少し復習してみた。

#include <iostream>
using namespace std;
int func(int& x);
int func2(int* y);

int main(void){
    int a=10;

//  int& x=  では別名にしたい変数をもってくる   ①
// int x= ではコピーしたい変数をもってくる(関数型言語ではこちらの手法)

    int &b=a;  //参照渡し (1)
     printf("%d\n",b);     
     b=11;     
     int b2=a; //コピー渡し
     printf("%d\n",b2);     
     b2=12;    

// int* y= ではアドレスを代入 ②

    int *c=&a; //参照
    printf("%d\n",*c);           

    char* e="a";
    printf("%s\n",e);   
// 関数の引数でも同様
    int d=func(a);
    printf("%d",d);

    int g=func2(&a);
    printf("%d",g);
    
}

int func(int& x){  //参照 渡し ①
    return x;
}

int func2(int* y){  // ②
    return *y;
}
 
自分なりの覚え方として、次のように考えてみた。
・&xはxのアドレス *yはyがアドレスのときの値 なので、&と*は逆関数の関係ともいえそう。    *(&x) == x   &(*p) == p
・int &b=a    int *c=&a   これらをよくみると、b=a  c=&aは、どちらも同じ
   注意が必要なのは 値が入るのはbと*cであるということ
 →それと整合性とれるように、int &bのintは&bでなくbに適用され、int *cのintは *cに適用されるともいえそう。
 

2025年11月10日月曜日

Qtでいろいろ作成

 家計簿、スケジューラ、日記は、これまで.Net使った自作アプリを使ってきたが、今後Linuxでも使えるようにするため、すべてQtで作り変えることにした。スケジューラと日記はほぼ完成する。日記は、SQlite保存なので、暗号化したテキストで保存することにした。.NETに比べると復号が入っても検索処理も圧倒的に早くなっている。(.NETだと遅すぎて暗号処理を諦めていたけれど、Qtはその点心配はないようだ。)

  昨今は、C++に変わり、Rustあたりが速度を要求されるアプリに使われつつあるということだけれど、QtでC++も悪くないように思う。

2025年11月9日日曜日

QtでSqliteつかいたいとき

CMakeList.txtに以下3行追加必要

 find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets Sql)

find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Sql)


target_link_libraries(QtDiary PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Sql)

git pullのエラー解決 (覚書)

 error: Your local changes to the following files would be overwritten by merge: CMakeLists.txt.user Please commit your changes or stash them before you merge. Aborting

この場合、git stash > git pull > git stash pop を試してみる

CMakeLists.txt.user は通常 IDE のユーザー固有設定ファイルなので、プロジェクトによってはバージョン管理に含めないこともあるとか(.gitignore に追加したほうがいい)

コンフリクトしたら
<<<<<<< Updated upstream
(リモートの変更)
=======
(自分の stash の変更)
>>>>>>> Stashed changes     となっているので、===や<< >>を削除し、どちらかを残す


git add CMakeLists.txt.user
git commit -m "Resolve merge conflict in CMakeLists.txt.user"

.gitignoreにCMakeList.txt.user追加したら反映させるために
git rm --cached CMakeLists.txt.user
git rm -r --cached .
git add .
git push

2025年11月8日土曜日

Qtのandroidへのデプロイ(備忘録)

 android studioをインストール
環境変数 setxで永続保存
setx JAVA_HOME "C:\Program Files\Android\Android Studio\jbr"
setx ANDROID_SDK_ROOT  "C:\Users\<ユーザー名>\AppData\Local\Android\Sdk"
setx ANDROID_NDK_ROOT  "C:\Users\<ユーザー名>\AppData\Local\Android\Sdk\ndk\29.0.14206865" のように
NDKがないときインストール必要(CMAKEも)
Qtで プロジェクト>キットの管理...>デバイスでAndroidが追加できるが、他の項目をチェックしてまだ不十分なところ(SDKsの赤字のところSdkCommandLineToolなどあれば)をAndroidStudioのSDK Managerで設定していく
・OpenSSLダウンロードなども

スマホ側設定:「設定 → 開発者向けオプション」を有効化→ 「ビルド番号」を7回タップして出ます。「USBデバッグ」をオンにする システムの開発者向けオプションの設定で

PC側:Android Studio で「SDK Manager → SDK Tools → Android SDK Platform-Tools」
がインストールされていること(=adbコマンドが使える)。Qt Creator が SDK/NDK/JDK を認識している。(ツール → オプション → Devices / Android を確認) 

デプロイ手順(Qt Creatorから):スマホをUSBで接続>
adb devices→ device と表示されれば接続成功。
(C:\Users\<ユーザー名>\AppData\Local\Android\Sdk\platform-tools\adb.exeのパスも通しておく必要あり、コントロールパネルあたりから)
Qt Creator を開く>左下でデバイスとしてスマホ選択>▶ 実行ボタンをクリック
Qt が自動で.apk をビルドスマホへインストール>アプリを起動

ビルド、デプロイ環境構築に手間はかかるが、自作アプリがWin、Linuxだけでなくスマホでも使えるのは便利。

QtのWindowsでのデプロイ方法

 マルチプラットフォーム言語のため、デプロイ方法は少し手間がかかる。

mingwの形式でビルドした場合

Release ビルドの exe があるディレクトリに移動して、

cd C:\Users\****\kjog\build\Desktop_Qt_6_9_3_MinGW_64_bit-Release

windeployqt.exe のフルパスを指定して実行する必要がある。

"C:\Qt\6.9.3\mingw_64\bin\windeployqt.exe" kjog.exe

2025年11月1日土曜日

ESP32 DEVKIT_Cで容量をWIFIでロギング

間欠動作で12時間ごとにGPIO4を容量センサとして使い、ロギングしてみた。raspiにGETでデータを保存し、スマホ等で取り出すアプリを作れば完成の予定。 はたして、灯油タンク残量が容量センサで計測実用なるか、テスト予定。(PICのCPSも検討したが、かえって複雑になりそうなので、このパターンにしてみた。)
PICに比べると、至れり尽くせりでesp32は開発しやすい。それでも、ネットワークがからむとプロトコルやポートとかいろいろ調整が必要になってくる。

2025年10月30日木曜日

PIC12F1822で間欠ブザー

30秒ごとにブザーならすタイマーをPICで作ってみた。TTP223と2sc1815で電源オンオフ、電子ブザーはPICのRA2で出力してみた。電源はボタン電池で常時TTP223を待機状態にしておくけれど、ほとんど消費しないらしいので、これで試してみたい。なお省エネのため、TTP223のLEDは取り外した。かわりにブザーを1secごとに1msならして、電源状態確認できるようにした。
 
 最初、TTP223がオフの状態でもブザーがかすかに音するので、なぜかと思ったら、PICのアースはコレクタに、ブザーのアースは電源のアースにつないでいたためだった。内部抵抗による微妙な電位差が原因かと思われます。
 PICとブザーのアースをどちらもトランジスタのコレクタにつなぐことで解決した。


2025年10月29日水曜日

PIC12F675のタイマー修正

 以前つくったタイマーのコード修正してみた。すでにPICを基板に半田づけしてしまったが、PicKITに合わせてコネクタをつけてPICにエナメル線で配線しなんとか、書き込みできるようにしてみた。コードを少し変更して、時間ずれも調整してみた。1割ほど時間が短いので、11/10をかけてみた。だいぶ正確になる。


2025年10月28日火曜日

PIC12F1822のCPS 再挑戦

 静電気測定ということで、PICのCPSを内臓クロックで使ってみたが、温度の影響のためか、変動が大きい気がしたので、12MHzのXtalを使ってみた。ヤフオクで、10pfコンデンサと一緒に購入。


・配線は混乱してきたので、基板を新しくして配線しなおす。
・RA4とRA5をXtalにつなぐため、CPSはRA0に変更したり、周波数も変わるため、ANSELA、TRISA,CPSCON1,SSP1ADDなどの設定を慎重に変更する必要があった。
・XtalをRA4とRA5に接続したら、この2か所に2個10pFをつないでアース。
・TTP223は消費電力が少ないようなので、電池に常時つないで、トランジスタスイッチを動作させることにした。2sc1815使用。電源はエネループ3本。

 タッチしたときだけ、LCDが表示されるようになった。以前は、ボタンスイッチの接触不良があって使いにくかったが、これだとストレスなく使える。
・当初、灯油残量センサに使う予定だったが、ESP32だけで間に合いそうだったので、最終的には容量測定器にしてみた。pF=60000/cps-0.02*cpsという近似式を使ってみた。30pF~20000pFぐらいの範囲で、ある程度の目安としては使えることを確認した。本来反比例になるはずだけれど、容量が小さくなると誤差が出やすくなるようで、-0.02*cpsで補正。

2025年10月26日日曜日

Qtで、UIデザイナでMainWIndowにWidgetを配置する

 C#とは、コントロール(Widget)の配置の仕方が違うので少しとまどいました。

別ウインドウに表示はしやすいのですが、メインウインドウ内に配置するには、レイアウトの指定が必要なようです。

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    table = new KakeiboTable(); // 親は addWidget() で設定されるので不要
    ui->centralwidget->layout()->addWidget(table);
}

上記コードだけでは、エラーになります。centralwidgetにテーブルビューを配置したい場合は、cetnralwidgetをオブジェクトインスペクタで選択したら、メニュー>フォームエディタから、レイアウトの方法を指定する必要がありました。ここらへんは、Qt独特のところで慣れが必要なところかもしれません。

あとはmain.cppで
    MainWindow *w = new MainWindow();
    w->show(); 
とするだけで、Widgetが配置されたメインウインドウを表示できます。

2025年10月22日水曜日

Git復習

cloneせずに、zipから展開してwinPCでQtをビルドしたりしたので、gitの整合性がとれずとまどう。(こういうときはcloneするのが基本かも)

今回のようにしてしまったら、修正には、ちょっと手間がかかる。
stash → 作業中の変更を一時退避して安全にする
fetch → リモートの最新履歴を取得
reset --hard → ローカルの土台をリモートに合わせる
stash pop → 退避していた変更を土台の上に戻す
commit → 作業を正式にコミット
push → 安全にリモートに反映
まだ、gitよくわかってないところも多いけれど、失敗しながら慣れていくしかないようだ。

Qtのクロスプラットフォームでの開発 覚書

 github経由で、winでもlinuxでもコードを開発できるようにするには

安全なクロスOS運用の基本手順
git fetch                # 最新のリモート状態を確認
git pull                 # ローカルブランチに統合(最新化)
# ↓ コード修正(Linux/Windowsどちらでも同じ)
できたらpush

🔹 注意点
改行コードや文字コードの吸収
Git: .gitattributes に * text=auto
Qt: Qt::endl / QTextStream を使う
pull前にfetchで確認

2025年10月20日月曜日

QtCreatorをLinux Mintにいれてみた ~Flatpakについての覚書~

Flatpakでインストールした場合、サンドボックス化されているため、ショートカットを自分で作成することになるようです。 

Flatpak ショートカット作成の基本フロー:

①flatpak listでApplication ID を確認  例: io.qt.QtCreator

②#!/bin/bash

flatpak run io.qt.QtCreator を作成し、実行権限不可

③デスクトップショートカット作成ならば .desktop ファイルの Exec= にスクリプトや flatpak run <アプリID> を指定

Exec=flatpak run io.qt.QtCreator

2025年10月18日土曜日

IC-705のAMラジオ用アンテナ

 手軽にAMラジオをIC-705で聞けないか、フェライトバーアンテナを試してみた。今、入手が難しくなっているらしいけれど、ヤフオクでラジオから取り外したと思われるものをたまたま見つけて290円で落札させていただいた。1次側が670uHほどだったので、共振周波数から容量を計算すると中波なら40pF前後を並列につなぐ必要がある。たまたま半固定の小型バリコンがあったので、2個並列でつないで、2次側を無線機のアンテナ側につなぐ。窓のそばで位置やバリコンを調整すると、59+20dBと、十分な感度。意外とフェライトバーアンテナのゲインは高いようだ。 

アクリル板のケースに収めて小型アンテナにすることができた

 MLAと理屈は同じようで、調べてみると、高Qで帯域外ノイズを除去、電界ノイズに鈍感(磁界のみ検出) といった効果があるとか。

2025年10月15日水曜日

VY24G/D i5-520MにLinux Mint

 i5-520Mは第一世代で、Win11も23H2までは、SSD化や4GBメモリで騙しだましつかってきましたが、さすがに25H2は、かなり無理がありそうだったので、諦めてLinuxを試すことに。ところが、標準インストールだとなかなかうまくいきません。しばらくして、原因がつかめました。

・BIOSでUSBメモリ選択では、読み取れずUSB HDD選択で読み取れました。(DVDでは遅すぎて無理があります。USBメモリを使いましたが、なぜかUSB HDDを選択しないとだめでした。)

・標準インストールだと最近のLinuxはほとんどGPTのため、うまくいきません。事前にMBR(msdos)に変更が必要です。ここが一番のネックのようです。

 Linux Mint ,MX Linuxあたりに候補をしぼりましたが、最終的にMint xfceにしてみました。Windowsと配置が似ていて使いやすい感じがします。注意点としてはGPartedであらかじめ、MBRのパーティション(/,swap./home等)を作っておき、Mintのインストーラでは、新規インストールせずに、カスタマイズのほうを選択して、マウント処理とブート領域設定していきます。途中、警告らしきメッセージも出ますが、無視して進めたところ、うまくいきました。第一世代のCPUは想定していないようですが、しばらくは、PCを無駄にせず、動画視聴等に活用できそうです。

2025年10月14日火曜日

Win11の25H2を古いPC(第3~4世代)に入れる場合の覚書

ノートA573などの第3世代でも、工夫次第でぎりぎり25H2が入るようです。一回目起動しなくなったので、なんとかならないかとChatGPTの助けを借りて、うまくいきました。

 H97M-PLUS i5-4460 も使っていますが、こちらも同様な方法でうまくいきました。

 Bios(F2キー断続押しで起動するとOk)セキュアブートをoffとするといいようです。そのためには、A573のBIOSでは一時的に管理者パスワード入れないと編集できないようでした。

〇 BIOS 設定のポイント
CSM(互換モード) Enabled 古いOS/MBRディスクとの互換性を確保
Secure Boot / OS Type Disabled または Other OS Windows 11の署名チェックを回避
Fast Boot(高速モード) Disabled 起動チェックを省略せず、SSD/USBを確実に認識
Boot Priority / Legacy First Legacy First ON 古い形式(MBR/USB/SSD)を優先して起動
⚡ Fast Bootは速度優先、Legacy Firstは互換性優先の意味

〇インストールUSB作成  Rufusなどで作成
パーティション形式:MBR(UEFI + CSM対応)
ファイルシステム:NTFS(容量大きめの場合)
「TPM・Secure Boot回避オプション」を有効にするとより安全

〇インストール後の調整(任意)
GPT形式に変換してUEFI純正起動
CSMを無効、OS Typeを「Windows UEFI mode」に戻すと、Secure Boot利用可能
古いPCでも安定してWindows 11を使える

〇注意点
第3~4世代でギリギリライン
安定して使うなら、Windows 10延命 or  Linuxを検討

※Win11が最近のPCしか対応しなくなったことが、余力ある古いPC(SSD化やメモリ増設は必要ですが)にとっては、Linux流行のきっかけになる?
※2025/10/19 実際、今回のタイミングで世界の状況はLinuxへの移行が、これまでにないほど活発になっているようです。欧州では一部組織でLinux移行を成功させているところもあるらしいです。

2025年10月5日日曜日

Haskell入門 型以外の安全性の確保 P286

 actionIO :: IO a -> IO a
actionIO action = do
  mv <- newEmptyMVar    --スレッド間通信用の空のMVarの箱をつくる
  _tid <- forkIO $ do           --スレッドをたてて
    result <- try action         --actionを実行 成功ならRight 値  例外なら Left eを返す
    putMVar mv result         --結果(Either SomeException a)をMVarに入れる
  result <- takeMVar mv    --メインスレッドでMVarから結果を受ける。入るまで待つ動作。
  case result of                       つまり、actionが終わるまで待って結果を受け取る
    Left e  -> throwIO e
    Right r -> return r

 forkIOでスレッドをわけると、普通はその中で起きた例外が親スレッドに伝わらない。
でも、この関数では、例外をつかまえ MVarを通して親スレッドに返している。

久しぶりに室内MLAアンテナでDX

 18MHzバンドで久しぶりDXが開けていた。ゼヤ(Asiatic Russia)の局長さんとFT8で交信できた。5Wの室内アンテナで届いたので、コンディションがよかったようだ。

 FT8でオンエアしている局の密度をみると、やはり、欧州、日本、北米が目立っているのがわかる。

2025年9月30日火曜日

Haskell入門 モナドによるDSLの実現 ~operational~ P274

型の変換を細かく追って、整合性を確認はしてみましたが、けっこう込み入っていて、それに気を取られると全体の構造がわかりにくいので、おおまかにとらえることも大事かと思いました。runSalesTという関数が、再帰を使って、レシピを読み取っていく構造になっているようです。

 その際、ポイントが :>>=という関数のようです。 (ひとつの命令):>>= (それに続く残りの命令) この残りの命令である右辺がkとなっていて、 これが次のrunSalesTへ再帰で渡される構造になっているようです。そして、次のrunSalesTで、また先頭の(ひとつの命令)が取り出され、それに応じて枝分かれした処理が行われ、...これを繰り返していく。

  ちょうど、リストを順に処理していく再帰と同じ構造のようです。func( [a:k])=(何らかの処理   func(k)) の形。

 簡単なoperational使ったDSLのコードをChatGPTに頼んで作ってもらいました。

sample.hs

.yamlに- operationalを追加必要し stack runghc  sample.hsで7と表示します。
あるいはstack runghc --package operational sample.hsでもいいようです。