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は開発しやすい。それでも、ネットワークがからむとプロトコルやポートとかいろいろ調整が必要になってくる。