IT教育訓練パパの研究日誌

育児や、データサイエンス系のノウハウや記事、学生へのかかわりで得たこと等、感動したことを書いていきたいです。よろしくお願いいたします。

LANDISKをubuntuやraspberrypiOSからマウントする方法

この記事を読んでわかること、またはできるようになること

BUFFALOのlinkstationの共有フォルダをubuntuやraspberrypiOSからマウントできるようになる。 読み込みだけでなく、書き込みもできるようになる。

目次

  1. 実行環境
  2. 環境構築手順
  3. 注意


データ分析等をしているとファイル容量が必要になったため
いただいたLANDISKを頑張ってlinux等から利用できるようにしたいと思いました
マウントする際に、スーパーユーザにならないと書き込めないという現象に遭遇し、
自分の理解を整理しようと思い、記事にまとめました

1実行環境

名前 バージョン 備考
OS Debian GNU/Linux 12 (bookworm) 2023年12月のバージョン、2024年の3月以降は変更が多いので見送り
カーネル Linux raspberrypi 6.6.31+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.6.31-1+rpt1 (2024-05-29) aarch64 GNU/Linux  
cifs-utils バージョン 2:7.0-2
LANDISK bafflo LS210DA64

2 環境構築手順

 2.1 raspberrypiの設定

まず、必要なライブラリをインストールします。

sudo apt-get install cifs-utils


 2.2 LANdisk側の設定

アクセスしたい共有フォルダを作成し、ユーザを作成し、書き込みと読み込み権限を設定しておく

 2.3 UbuntuやraspberrypiOS側のマシンの設定

マウント用フォルダを作成し、以下のコマンドでマウントする


sudo mount -t cifs -o rw,vers=1.0,dir_mode=0777,file_mode=0777,user=[username],pass=[password] [フォルダ(LANDISK)] [マウントするフォルダ]

私の環境だと,LANDISK上のhogeフォルダに、/mnt/diskをマウントした。

sudo mount -t cifs -o rw,vers=1.0,dir_mode=0777,file_mode=0777,user=ibakosen,pass=ibakosen //xxx.xxx.xxx.xxx/hoge /mnt/disk
vers:cifsのバージョン。古いLANDISKだと1.0を指定しなければならないことがある
file_mode:ファイルの書き込み読み込み、実行権限をマウント時に指定するオプション
dir_mode:ディレクトリの書き込み読み込み、実行権限をマウント時に指定するオプション

3 注意

注意:フォルダの書き込み、読み込み権限は、何も指定しないと、マウント元のフォルダ権限が引き継がれるようです
注意:chmod等を使って権限を後から、変更しようと思ってもできませんでした
注意:試しにマウントするフォルダのパーミッションを変えてからマウントしましたが、書き込み権限等がありませんでした。
コマンドで指定しないとダメなのかもしれません

bashrc等に書き込んでおけば、自動でマウントされそうです。

pythonで日の出、日の入り時刻を算出する際にはまった話

この記事を読んでわかること、またはできるようになること

pythonのephemライブラリを利用して、日の出、日の入り時刻が計算できるようになる

目次

  1. 実行環境
  2. 日の出、日の入り時刻を求め、現時刻から待機するプログラム
  3. 所感


日の出、日の入り時刻でカメラを起動しようと思ったので
ephemライブラリを用いて、現時刻から日の出時刻まで待つ
プログラムを作成しました
簡単なコードなんですが、はまったことがあるので
その知見をメモしておこうと思います
具体的には、緯度、経度を指定して
日の出日の入り時刻を計算するのではなく
ラジアンに直さないと、正確な時刻がでませんでした

1実行環境

名前 バージョン 備考
OS Debian GNU/Linux 12 (bookworm) 2023年12月のバージョン、2024年の3月以降は変更が多いので見送り
カーネル Linux raspberrypi 6.6.31+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.6.31-1+rpt1 (2024-05-29) aarch64 GNU/Linux  
python 3.11.2
ephem 4.1.5

2 環境構築手順

pipを使ってephemをインストールします

pip install ephem

3 日の出、日の入り時刻を求め、現時刻から待機するプログラム

import time
from datetime import datetime, timedelta
import ephem
import numpy as np # ラジアン計算に利用

def wait_until_sunrise(latitude, longitude):
    # 現在の日時を取得
    now = datetime.utcnow()

    # 観測地の設定
    observer = ephem.Observer()
 latitude=np.deg2rad(latitude)  #緯度をラジアンに変更
    longitude=np.deg2rad(longitude) #経度をラジアンに変更
    observer.lat = str(latitude)
    observer.lon = str(longitude)
    observer.date = now

    # 日の出時刻を計算
    sunrise = observer.next_rising(ephem.Sun()).datetime()

    # 日の出時刻を表示
    print(f"日の出時刻は: {sunrise} UTC")

    # 現在時刻を取得
    current_time = datetime.utcnow()

    # 日の出時刻が現在時刻より後か確認
    if sunrise <= current_time:
        print("日の出時刻は既に過ぎています。")
        return

    # 日の出時刻までの秒数を計算
    wait_seconds = (sunrise - current_time).total_seconds()

    # 日の出時刻まで待機
    print(f"日の出時刻まで {wait_seconds} 秒待ちます。")
    time.sleep(wait_seconds)
    print("日の出時刻になりました。")
    return

# 使用例
latitude = 35.6895  # 東京の緯度
longitude = 139.6917  # 東京の経度
wait_until_sunrise(latitude, longitude)

3 所感

緯度、経度をラジアンに変更しなくとも、内部的に計算はしてしまうので
気づきづらいエラーだと思いました。
また、これもchatgpt等の生成AIにコードを書くことを依頼すると、
書いてくれるのですが、緯度経度をラジアンに変更せず、
直接指定しているコードが出てきました(20240618現在)
間違ってるから直してというと、すっとんきょうな変更をしてきました。
これがハルシネーションかと体験しました

Xrdp接続の際に出る、authentication is required to refresh the system repositoriesのメッセージを消す方法

この記事を読んでわかること、またはできるようになること

xrdpを使ったリモートデスクトップ接続の際に出る、
”authentication is required to refresh the system repositories”のメッセージが
でなくなるようにできる

目次

  1. 実行環境
  2. 手順
  3. その他、はまったこと、手を出して後悔したこと


まず初めに、pkcationのバージョンによって対処方法が異なります。
pkcationのバージョンが比較的新しい場合の対処方法の日本語記事が
あまりなかったので、情報共有ができればと思います
pkcationのバージョンが0.105以下だった場合は、指定の場所に
.pklaファイルを作成すればよいです。
0.105以下であれば、以下の記事が参考になります
qiita.com

1実行環境

名前 バージョン 備考
OS Debian GNU/Linux 12 (bookworm) 2023年12月のバージョン、2024年の3月以降は変更が多いので見送り
カーネル Linux raspberrypi 6.6.31+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.6.31-1+rpt1 (2024-05-29) aarch64 GNU/Linux  
pkaction version 122

2 手順

 2.1 pkactionのバージョンの調べ方

以下のコマンドを打ち、バージョンを確認してください。

pkaction --version
 2.2 ルールの追加

xrdp接続の際に読み込まれるルールを変更します。
具体的には、/etc/polkit-1/rules.d以下の10-piwiz.rulesファイルにRuleを追加します。
具体的には、以下のように記載をしました。

polkit.addRule(function(action, subject) {
    if ((action.id.startsWith("org.freedesktop.packagekit.") ||
        action.id.startsWith("org.freedesktop.")) &&
        subject.isInGroup("xrdpusers"))
    {
        return polkit.Result.YES;
    }
});

ただし、この書き方は、Xrdpusersのグループに対して、ルールを適用しているため
グループを作成し、ユーザを追加していきます
試してはいませんが、ユーザの所属しているグループを調べ、
xrdpusersと置き換えても多分大丈夫です
参考にした記事は、以下です。

github.com

 2.3 ユーザが所属するグループの調べ方

以下のコマンドを打ちます

 id [username] #[username]をご利用環境のユーザ名と置き換えてください

私の場合は、上記のコマンドを打つと、

ibakosen@raspberrypi:~ $ id ibakosen
uid=1000(ibakosen) gid=1000(ibakosen) groups=1000(ibakosen),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),
44(video),46(plugdev),60(games),100(users),102(input),105(render),
106(netdev),995(spi),994(i2c),993(gpio),115(lpadmin)

のような出力がでます。
xrdpusersに所属していないので、グループを作成して、追加します。

 2.4 ユーザが所属するグループの作り方

以下のコマンドを打ち、グループを作成します。

groupadd xrdpusers

グループにユーザを追加します。
このとき、オプションを-aGとしてください。
あくまでグループの追加にした方が
上書きで消されないので良いと思います。

sudo usermod -aG xrdpusers [username] #[username]はお使いの環境に応じて置き換えてください

ユーザがグループに追加されたか確認します。

ibakosen@raspberrypi:~ $ id ibakosen
uid=1000(ibakosen) gid=1000(ibakosen) groups=1000(ibakosen),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),44(video),46(plugdev),60(games),100(users),102(input),105(render),106(netdev),995(spi),994(i2c),993(gpio),115(lpadmin),1001(xrdpusers)

xrdpusersが追加されていることがわかります。
ユーザのグループ追加や作成は、以下のサイトを参考にしました。

eng-entrance.com

 2.5 再起動して、再度xrdp接続してください

以上の手順で、メッセージのポップアップが出なくなりました。

3 その他、はまったこと、手を出して後悔したこと

英語ページは、新しい情報が載っていてよいと思いました。
私のgoogle力と英訳力がほしいこの頃です。
余談ですが、ChatGPTにメッセージの消し方を聞いたところ、
バージョンが0.105以下の対処方法を見事にこたえてくれました
chatGPT等の生成AIは、枯れた情報であれば、すごくよく使えるけれど、
皆があまり使わないような情報は答えられないのだなと再認識しました。
とはいえ、動作する環境もあるので、
学生が、chatgptの言うことを確認せず、うのみにしてしまいそうで怖いです。

参考文献やページ

qiita.com github.com tex2e.github.io eng-entrance.com

RealSenseD435とD457をRaspberryPI64bitOS(bookworm)で動かすまで

この記事を読んでわかること、またはできるようになること

raspberryPI4で、Intel社製のデプスカメラであるRealsenseD435とD457でデータが取得できるようになる。 pyrealsense2(pythonのrealsenseライブラリ)を、自力でコンパイルし、実行できるようになる。

目次

  1. 実行環境
  2. 環境構築手順
  3. 注意
  4. その他、はまったこと、手を出して後悔したこと


IoT機器として、Depthカメラを探していたら、よく利用されているのが
Realsenseだったため、RaspberryPiで動作させようと思い立ち、
いろいろとはまりました。
特に、公式の掲示板では、raspberryPIにubuntuを入れて、realsenseを
利用することが多く掲載されていたのでやってみたところ、
ランタイムエラーや電圧が足りない問題、パイプラインが無事終了しない等
私の環境では、散々でした。raspberrypiの処理性能の問題もあるかと考え、
OSをraspberrypiOSに変更したところ
快適に動作したので、その知見をメモしておこうと思います。

1実行環境

名前 バージョン 備考
OS Debian GNU/Linux 12 (bookworm) 2023年12月のバージョン、2024年の3月以降は変更が多いので見送り
カーネル Linux raspberrypi 6.6.31+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.6.31-1+rpt1 (2024-05-29) aarch64 GNU/Linux  
python 3.11.2
Realsense D435 firmware 5.15.1
Realsense D457 firmware 5.15.1
librealsense v2.54.2 Ros等を入れる場合は、現時点(2024年6月現在)では、これ以上は対応してないため

2 環境構築手順

前提として、~以下にlibrealsenseをgitでcloneしたとして、説明してます。

 2.1 raspberrypiの設定

まず、必要なライブラリをインストールします。

sudo apt-get update && sudo apt-get dist-upgrade
sudo apt-get install automake libtool vim cmake libusb-1.0-0-dev libx11-dev xorg-dev libglu1-mesa-dev

SwapFile領域を確認して、SWAPSIZEを2048程度にします。
CONF_SWAPSIZE=2048とします

sudo vi /etc/dphys-swapfile


 2.2 librealsenseのダウンロード

バージョン2.54.2が必要なため、gitでブランチを指定して、ローカル環境にクローン.

git clone https://github.com/IntelRealSense/librealsense.git -b v2.54.2 


 2.3 udevルールの更新

raspberryPIのハードウェア周りにパッチを当てます。2.2節で保存したファイルにスクリプトが
入っているので実行

cd librealsense
sudo cp config/99-realsense-libusb.rules /etc/udev/rules.d/ 
sudo su
udevadm control --reload-rules && udevadm trigger
exit
 2.3 librealsenseのコンパイルとインストール

まず、makeファイルの設定を作成します(cmakeを行う)

cd librealsense
mkdir build
cd build
cmake -DBUILD_EXAMPLES=true -DBUILD_GRAPHICAL_EXAMPLES=true -DBUILD_WITH_OPENMP=true -DFORCE_LIBUVC=true -DCMAKE_BUILD_TYPE=Release ..

DBUILD_GRAPHICAL_EXAMPLESをTrueにしなかったら、realsense-viewerが入らなかったので注意。
 次にmakeを行います

sudo make -j2

j4とコアを4つ並列に利用してコンパイルするオプションがあったが、
私の環境の場合はフリーズ(CPUに負荷がかかりすぎた)した
ため2としました
このとき、インターネット接続が必要となるので、proxy環境下の人は注意が必要
コンパイルが終わったら、

sudo make install

を行い。インストールします。 コンパイルオプションや途中で失敗した場合は、以下を行うことでリフレッシュできますので心配なさらずに行ってください

sudo make uninstall &&  make clean

コンパイルができると、realsense-viewerがコマンドラインから起動できるようになるので確認する。
コマンドラインからrealsense-viewerとコマンド打つと、Viewerが起動し、以下のような
結果になる

realsense-viewerの結果

 2.4 pyrealsense2のコンパイルとインストール

2.3節だけでは、pythonライブラリのpyrealsense2が利用できないため、コンパイルとインストールを行いました。 まず、makeファイルの設定を作成します(cmakeを行う)

cd librealsense
mkdir build
cd build
cmake .. -DBUILD_PYTHON_BINDINGS=bool:true -DPYTHON_EXECUTABLE=$(which python)

 次にmakeを行います

sudo make -j2

j4とコアを4つ並列に利用してコンパイルするオプションがあったが、
私の環境の場合はフリーズ(CPUに負荷がかかりすぎた)した
ので2としました
このとき、インターネット接続が必要となるので、proxy環境下の人は注意が必要
コンパイルが終わったら、

sudo make install

を行い。インストールする。
コンパイルのオプションでpythonパスが指定されるはずですが、指定されていないようだったので
次の節のように設定しました。

 2.5 pythonパスの設定

~/.bashrcの中に、pythonパスの設定を追記します。
コンパイルするとライブラリは、librealsense/build/Releaseの中に入っているのでパスを通します

export PYTHONPATH=$PYTHONPATH:/home/ibakosen/librealsense/build/Release:/usr/local/lib

その後

source ~/.bashrc

無事にパスが通ったか確認するため

pythonを起動

import pyrealsense2

とうち、エラーが出なければ、パスが通っています。

3 注意

bashrcにpythonパスを記載したが、そうするとシェルスクリプトやcron起動等で実行できません。
暫定的に、シェルの中に、pythonパスを書き込むなどするとうまくいきました。
例えば以下。

export PYTHONPATH=$PYTHONPATH:/home/ibakosen/librealsense/build/Release
/usr/bin/python /home/ibakosen/Data/saveData.py

4 その他、はまったこと、手を出して後悔したこと

ubuntu 20.04 64bit server版にデスクトップ環境を入れて、動作させる記事もありましたが、
私の環境では、遅く、うまく動きませんでした。改善するために、いろいろとパッチを入れたり、
コンパイルしなおしたりしましたが、無駄でした。
見切りをつけて、OSから変更する判断をもっと早くすればよかったと思いました。
また、アーキテクチャの違いを軽く見ていましたが、かなり重かったです。
手っ取り早く試したければ
windowsPCを用意して試した方が楽だと感じました.

参考文献やページ

github.com

ubuntuで導入したい方は、以下の記事が参考になりますが、
私の環境では、データが取れるのですが
途中でハングしたりしなかったりと、不安定でした。

導入方法(ubuntu20.04)

github.com

私が遭遇したエラー

github.com

Ubuntu22.04.4で機械学習環境をつくるまで

本記事を読んでわかること

Ubuntu22.04.4で機械学習環境(GPU使用)を作る方法と注意点がわかります。

環境

ソフトウェアや機器 バージョン
Ubuntu 22.04.4
Anaconda 24.1.2
Pytorch 2.3.0
Nvidia GeForce RTX 3060 12G
Nvidia Driver 555
CUDA 11.8
cuDNN 8.9.7.29
Tensor


手順

0 Proxy環境下の方は、Proxyを設定する

設定したのは、apt,pip,wget,anacondaである。 プロトコルとして指定したのは、http,https,ftpである。 以下の記事を参考にした。 qiita.com

1 PCI接続のグラフィックカードの型番等を調べる
lspci | grep -i nvidia

そうすると下記のような結果がでる

GPUの型番確認
lspciはpci接続のデバイスを表示してくれるコマンド。

2 フレームワークの推奨環境を調べる

今回は、pytorchとtensorflowを入れたいので、推奨となるCUDAのバージョンをpytorchの公式ページで調べる。私の環境では以下の通り。

pytorchに依存するライブラリのバージョン

3 Nvidia Driverのインストールする

以下のページのubuntuインストール手順をそのままなぞると、うまくいく。一部key登録のところだけ、proxy環境下だとうまくいかないので注意。 とてもよくまとまっていて、すごい www.kkaneko.jp


nouveau を無効にするため、以下のコマンドを打つ

sudo vi /etc/modprobe.d/blacklist-nouveau.conf

ファイルの中身を以下のように書く

blacklist nouveau
options nouveau modeset=0

保存したら以下を実行する

sudo update-initramfs -u

なお、以下のページを参考に導入した ubuntuにCUDA、nvidiaドライバをインストールするメモ #Ubuntu - Qiita

再起動を行う

sudo reboot

Cudaとドライバが導入されたか確認するため、以下のコマンドを打つ

nvidia-smi

~/.bashrcに以下を追加

export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"

cudnnとcudaのバージョンを確認する

nvcc --version
4 Anacondaを導入

Anacondaが必要だと考えて導入しています。理由は、以下です。

  • 機械学習や深層学習はライブラリの依存関係が激しい。Anacondaは仮想環境を構築できるため、先行研究の手法等を試す環境を作り、ダメだったら削除等が楽にできるので
  • Anacondaを入れておけば、機械学習に必要なライブラリの多くがデフォルトで入っているので構築が楽(ただし容量は多いので好みがあると思います)


Anaconda公式ページへ行き、Linux用のファイルをダウンロードし、ターミナルで展開

Anacondaのダウンロード

5 AnacondaでPytorchを入れる

Pytorchの導入方法 基本的に選んでいくとコマンドがでます

以下のコマンドで入れました。

conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
6 AnacondaでTensorFlowを入れる

後日導入予定

7 個人的に開発効率が上がる気がするツール
ソフトウェア 用途
TereTerm windowsからLinuxマシンへターミナルでアクセス
WinSCP windowsとLinuxPC間のファイルのやり取り
Xming windowsでLinuxのGUIを利用するためのXサーバ
pycharm デバッガー機能や補完機能が優秀な気がします
8 普段使いのwindowsから開発PCを使って開発する方法
  1. リモートデスクトップを利用
  2. Xウインドウを利用
  3. ブラウザを利用(notebookやLab)

1のリモートデスクトップは、ubuntuのバージョンが新しいと、特に苦労せずにできるのでオススメ。
2は、ネットワーク帯域等がないとき、リモートデスクトップがバグって使えなくなった時、
特定のソフトウェアしか必要ないときにオススメ
3は、機械学習の手順を含めてプログラミングしたいときにオススメ。勉強用ノートを作ったりするときに役立つ

平均情報量の平均って書いてあるけど、式を見ると期待値じゃない。。違いは?

この記事を読むとわかること

基本情報技術者試験の基礎理論の情報量で、

平均情報量がでてくるけど式を見ると期待値だった。

なぜ平均と呼ぶのか(呼んでいいのか)、自分なりの解釈をまとめた。

平均情報量

 \displaystyle
平均情報量H = \sum_{k=1}^n {P(J_k) \times I(J_k)} \tag{1}

 P(J_k) は事象 (J_k) の生起確率
 I(J_k) は事象 (J_k) の情報量

 (1) 式をみると、各事象の生起確率に情報量を乗算しているので、
期待値ではないかと疑問がでる。
平均値は、実は、ある状況下では、期待値に等しくなる。

期待値と平均値は?

ある標本サイズ Nの観測データ x_1, x_2, x_3,..... x_Nにおいて、
期待値と平均がどのように定義されるか見ていくと
母集団より、 X=x_i という値が観測される確率を p_iとする。
また、 N 回の観測において  X=X_i が観測される回数を N_iと置き、 期待値 m と平均 \bar{x} とする。

 \displaystyle
m = \sum_{i=1} {x_i p_i}\tag{2}

 \displaystyle
\bar{x} = \sum_{i=1} {\frac{x_i N_i}{N}}\tag{3}

ここで、大数の法則から標本サイズ Nが \inftyまで大きくなる時、

 p_i = \frac{N_i}{N}となる。つまり、標本数が \inftyの時、  mと \bar{x}が等しくなる。

結論

算術平均も期待値も、大数の法則にのっとって、式を変形すれば、等しい。

そのため各事象の情報量の期待値を求めている平均情報量 Hは、

平均っていう言葉を使っても何ら不思議ではない。

AWSで”Failed to execute operation: The name org.freedesktop.PolicyKit1 was not provided by” が出た時の対処法

 このページを見てわかること

AWSで、”Failed to execute operation: The name org.freedesktop.PolicyKit1 was not provided by any ~~” といったエラーが出た時に試すべきことがわかる

 直面した問題

sshを使いたかったので、下記コマンドを打って、サービスを有効にしようと思ったらエラーが出た

systemctl enable sshd.service


エラー

Failed to execute operation: The name org.freedesktop.PolicyKit1 was not provided by any .service files


対処法としては、 sudoつけると実行できました。 コマンドの実行権限がないから起きるエラーだそうです。

prograshi.com

ちょっとしたことで時間とられちゃうな( ゚Д゚)