2020年9月28日月曜日

pythonで子ども用の計算アプリを作成

 小学3年の娘の集中力が持続せず、ひき算やわり算の計算がはかどらない。

私がパソコンをいじっている姿をよく見ているためか、パソコンには興味を持ってくれているようなので、ラズベリーパイを使って、計算用のプログラムを作ってみた。

使用言語:python3

---わり算.py---

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

####設定用################################
問題数 = 2               #出題数
ファイル名 = 'わり算.py'   #このファイル名
記録ファイル = 'data.csv' #記録ファイルのパス
#######################################

import random
import time
import csv

def 問題(num): 
    global 得点
    a=random.randint(100,999)
    b=random.randint(10,99)
    c=a//b
    d=a%b
    正解 = "{}...{}".format(c,d)
    print("第{}問:{} ÷ {} =".format(num+1,a,b))
    解答 = input()
    if 正解 == 解答:
        得点 = 得点 + 1
        print("正解◯")
    else:
        print("間違い×。正解は" + str(正解))

#記録ファイル参照
print("名前を入力しなさい。(●/●)")
名前 = str(input())
lst = []
記録=1000
with open(記録ファイル ,'r') as file:
    reader = csv.reader(file)
    lst = [r for r in reader]
for row in lst:
    if row[0] == ファイル名:
        if row[1] == 名前:
            記録 = int(row[2])

#名前が違う場合に再入力を強制する。
while [str(ファイル名),str(名前),str(記録)] not in lst:
    print("名前が違うよ。もう一度名前を入力しなさい")
    名前=input()
    for row in lst:
        if row[0] == ファイル名:
            if row[1] == 名前:
                記録 = int(row[2])
else:
    print("記録は {} 秒です".format(記録))

#開始
得点 = 0
print("〇あまり〇 → 〇...〇 の形で答えなさい")
print("Enterキーで開始 全{}問".format(問題数))
input()
start=time.time()

#ループ開始
for num in range(問題数):
    問題(num)
    print("-------------------")

#ループ後の処理
finish=time.time()
経過時間=int(finish-start)
print("得点:{}/{} 点。記録は {} 秒です".format(得点,問題数,経過時間))

if 得点 == 問題数:
    if 記録 > 経過時間 :
        sec = 記録 - 経過時間
        print("新記録達成!!    {} 秒更新".format(sec))
        for row in lst:
            if row[0] == ファイル名:
                if row[1] == 名前:
                    row[2]=str(経過時間)

        with open(記録ファイル ,'w',encoding='utf-8') as file:
            writer = csv.writer(file)
            writer.writerows(lst)
    else:
        sec = 経過時間 - 記録
        print("残念!" + str(sec) + "秒とどかず")
else:
    print("{}点目指してがんばれ!!".format(問題数))

print("Enterキーで終了")
input()


# 使用方法
# ターミナルで保存したディレクトリへ移動し、”sudo chmod 755 か

わり算.py”を実行しファイルに実行権限を与える。
# 記録ファイルに「わり算.py,名前,999」を追記(なければ新規作成)する。
# ダブルクリックし、端末で実行を選択する。

#説明
#def 問題(num): ここだけ変えれば、いろいろな問題に対応可能。
#記録ファイル参照:csvファイルを参照し、ユーザーごとの記録を表示する。
#名前が違う場合に再入力を強制する。:
data.csvに[名前,ファイル名,*]がなければ、名前が違うとして再入力を促す。
#開始:
#ループ開始:
 for A in range Bを使用し、B(問題数)回ループさせる。
#ループ後の処理:
 time.time()を使用し、開始時と終了時の時間差を取得する。
 満点でかつ、記録を更新すれば、新たにcsvファイルに記録を上書きする。

ファイル名 = __file__とするとなぜかうまく行かない。

LXTerminalのフォントサイズが小さく、見えにくい場合には、ターミナルを起動して、「編集→設定(s)→スタイル→フォント」でデフォルトのサイズを変更可能。

5インチディスプレイだと下が表示されない問題があるので、
$ sudo nano /boot/config.txt
末尾に”display_rotate=1”を追記し保存。
$ sudo reboot
90度回転されて表示されるので、下まで確認できる。設定後は追記した一文を削除して再起動。

 

Failed to execute child process "xterm"(そのようなファイルやディレクトリはありません):と表示される場合は、/usr/bin/xtermがないので、シンボリックリンクを作成します。
$ cd /usr/bin
$ sudo ln -s lxterminal xterm

2020年7月7日火曜日

ラズベリーパイ 録画サーバー

以前購入していたKEIAN製地デジチューナーを使用して、ラズベリーパイ3B+を録画サーバーにしてみたい。
※録画した動画をアップロードするのは犯罪ですのでしてはいけません。
※私的複製であれば、放送波を正規の方法(B-casカード) で復調しているだけで、ダビング10などの暗号化を解除している訳ではないので、現行法上はグレーゾーンの話題です。今後の法改正次第では違法となる可能性があるので、ご注意ください。(法解釈が間違っていたらごめんなさい🙇)


用意するもの
・Raspberry Pi 3B+
KTV-FSUSB2
・recfsusb2n_http_patch2.zip(ダウンロード先:適当な何かの別館にあるダウンロードページ)パスワードは適当な何かの別館内に記載あり
・Mirakurun(使用verは3.1.0)
・Chinachu
・ffmpeg (最新verは4.1.4)


ktvfsusb2v3

◆導入


ターミナル
1$ sudo apt updateおまじない
2$ sudo apt upgrade
3$ sudo apt install libboost-all-devlibboost1.50-allでは上手くいかなかった。
4$ sudo apt install git最新バージョン (1:2.20.1-2+deb10u3)
5$ git clone https://github.com/sh0/recfsusb2nCloning into 'recfsusb2n'...
remote: Enumerating objects: 62, done.
remote: Total 62 (delta 0), reused 0 (delta 0), pack-reused 62
Unpacking objects: 100% (62/62), done.
6$ cd recfsusb2n
7$ mkdir patch
8$ cd patch
9$ mv /home/pi/Downloads/recfsusb2n_http_patch2.zip ./recfsusb2n_http_patch2.zipをDownloadsに保存した場合。
素直にsambaとかでカット&ペーストした方が早い
10$ unzip recfsusb2n_http_patch2.zipzipファイルを解凍
Archive: recfsusb2n_http_patch2.zip
inflating: decoder.h
inflating: tssplitter_lite.cpp
inflating: tssplitter_lite.h
inflating: readme_patch.txt
inflating: Makefile
inflating: fsusb2n.cpp
11$ mv Makefile ../src
$ mv fsusb2n.cpp ../src
$ mv tssplitter_lite.h ../src
$ mv decoder.h ../src
$ mv tssplitter_lite.cpp ../src
5つのファイルをsrcディレクトリに移動
素直にsambaを使おう。
12$ cd ../src
$ nano Makefile
srcディレクトリに移動して、Makefileを編集 4か所
13$ make/usr/bin/ld:-lboost_thread-mtが見つかりませんと出た時は、Makefil15行目の-mtを削除する。
14$ sudo cp recfsusb2n /usr/local/bin/recfsusb2nパスの通ったディレクトリにコピー


/home/pi/fsusb2n/src/Makefile
1# options
2B25 = -DB25
3
4ifdef B25
5B25_PATH = ./arib25
6B25_OBJS = B25Decoder.o
7B25_OBJS_EXT = $(B25_PATH)/arib_std_b25.o $(B25_PATH)/b_cas_card.o $(B25_PATH)/multi2.o $(B25_PATH)/ts_section_parser.o
8endif
9
10CXX = g++
11CXXFLAGS = -O2 -march=native -g -Wall -pthread -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 $(B25)  ”-march=native”を削除
12CC = gcc
13CFLAGS = -O2 -march=native -g -Wall -pthread -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 $(B25)  ※”-march=native”を削除
14OBJS = fsusb2n.o usbops.o em2874-core.o ktv.o IoThread.o tssplitter_lite.o $(B25_OBJS)
15#LIBS = -lpthread -lboost_system -lboost_thread-mt -lboost_filesystem ※"#"と"-mt"を削除
16#LIBS = -lpthread -lboost_thread-mt -lboost_filesystem ※#を追加してコメントアウト
17TARGET = recfsusb2n
18
19all: $(TARGET)
20
21clean:
22rm -f $(OBJS) $(B25_OBJS_EXT) $(TARGET)
23$(TARGET): $(OBJS) $(B25_OBJS_EXT)
24$(CXX) -o $(TARGET) $(OBJS) $(B25_OBJS_EXT) $(LIBS)
25
26depend:
27$(CXX) -MM $(OBJS:.o=.cpp) > Makefile.dep
28
29-include Makefile.dep

◆録画テスト

実際に録画できるか試してみる。

ターミナル
1$ sudo nano /lib/udev/rules.d/89-tuner.rules89-tuner.rulesファイルを新規作成して下の2行を書き込み保存。
2$poweroffシャットダウン

/lib/udev/rules.d/89-tuner.rules
1# FSUSB2N
2SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0511", ATTRS{idProduct}=="0029", MODE="0664", GROUP="video"

KTV-FSUSB2を接続し、Raspberry Pi 3B+を起動。

$ lsusb
>>ID 0511:0029 N'Able (DataBook) Technologies, Inc.
$ recfsusb2n --b25 --sid hd --wait 100 13 10 test.ts
>>チャンネル 録画時間(秒) ファイル名
/home/pi/test.ts(約18MiB)ができていれば成功。
recfsusb2n ver. 0.9.2
ISDB-T DTV Tuner FSUSB2N
device: "/dev/bus/usb/001/004"
pid = 4677
B25Decoder initialized.


 
チャンネル一覧
東北放送NHKEテレNHK総合宮城テレビ東日本放送仙台放送
191317242821

ハードウェアエンコード

ffmpegのセットアップ
$ sudo apt install ffmpeg インストール済みだった
$ ffmpeg -codecs | grep h264
>> DEV.LS h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_v4l2m2m h264_mmal ) (encoders: libx264 libx264rgb h264_omx h264_v4l2m2m h264_vaapi )

$ ffmpeg -i test.ts -codec:v h264_omx -b:v 3000k test.mp4
>>codecにh264_omxを指定することでハードウェアエンコーダを利用してh.264に変換する。-b:v 3000k は映像ビットレートを3000kB/sに指定。>>1.02倍速で変換。


実際に運用するには番組表から予約できないと使えない。
①Mirakurun + chinachu
②Mirakurun + EPGStation
あたりが有名らしい。ただ、チューナーにはPX-S1UDやPT3とかが一般的で、KTV-FSUSB2とかの情報は結構少ない。
今回は①のchinachuを導入してみる。比較的情報量が多いため。EPGStationだと録画後のエンコードまで可能らしい。

Mirakurunの導入

$ sudo apt install build-essential curl git-core vainfo
$ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
$ sudo apt install nodejs

PM2のインストール
$ sudo apt install npm
※npm(Node Package Manager)Node.jsのパッケージを管理する。
$ sudo npm install pm2 -g
Mirakurun のインストール
$ sudo npm install mirakurun -g --unsafe-perm --production

$ sudo EDITOR="nano" mirakurun config server
※EDITOR=nano といれるとnanoで編集できる。入れないとVim。
server
logLevel: 2
path: /var/run/mirakurun.sock
port: 40772

※コピー&ペーストするとインデントエラーでMirakurunが上手く起動しない。
$ sudo EDITOR="nano" mirakurun config tuners
tuners
- name: FSUSB2N
   types:
     - GR
   command: recfsusb2n -b <channel> - -
   isDisabled: false

$ sudo EDITOR="nano" mirakurun config channels  
channels
- name: NHKEテレ
  type: GR
  channel: '13'
- name: NHK総合
  type: GR
  channel: '17'
- name: TBCテレビ
  type: GR
  channel: '19'
- name: 仙台放送
  type: GR
  channel: '21'
- name: ミヤギテレビ
  type: GR
  channel: '24'
- name: 東日本放送CH
  type: GR
  channel: '28'


Chinachuのインストール

実行ユーザーのvideoグループへの登録

$ sudo gpasswd -a pi video


Gitリポジトリからクローン・インストール
$ git clone git://github.com/kanreisa/Chinachu.git ~/chinachu
$ cd ~/chinachu/
$ ./chinachu installer
1) Auto (full)   3)Node.js Environment   5)ffmpeg
2)submodule   4)Node.js Modules
what do you install? > 1

※結構時間がかかります。気長に待ちましょう。数時間?

$ cp config.sample.json config.json
$ sudo nano config.json
  "uid": "pi",  ※デフォルトのnullからpi(実行ユーザー名)へ変更。
  "recordedDir" : "./recorded/",録画用ディレクトリ
  "wuiOpenHost": "0.0.0.0" ,  ※wuiHostからwuiOpenHostへ名前変更。

空の設定ファイルを作成
$ echo [] > rules.json

サービスが実行可能か確認。
$ ./chinachu service wui execute
$ ./chinachu service operator execute

※pm2へchinachu-wuiとchinachu-operatorを登録する。
$ sudo pm2 start processes.json
$ sudo pm2 save

[PM2][ERROR] Error: Interpreter .nave/node is NOT AVAILABLE in PATH. (type 'which .nave/node' to double check.)
$ sudo pm2 start processes.jsonとすると、
[PM2][ERROR] Error: Interpreter .nave/node is NOT AVAILABLE in PATH. (type 'which .nave/node' to double check.)とエラーが出て、先に進めなかった。どうやら、chinachu-wuiとchinachu-operatorが起動していないよう。

シンボリックリンクがなかったため(又は無効なリンク)のようで、
$ sudo ln -s /usr/bin/node /home/pi/chinachu/.nave/node
$ sudo ln -s /usr/bin/npm /home/pi/chinachu/.nave/npm
とすることで、無事正常に起動した。

ブラウザで http://IPAddress:20772 と入力すると、chinachuで番組表からの予約が可能。

2020年7月6日月曜日

RaspberryOS 導入ガイド

何度もraspbianのセッティングをするのに、毎回いろいろなページを見ながら操作するのが面倒なので、自分が必要そうなものを、備忘録的に記載。

1.Raspberry Pi OS(32-bit)with desktop(https://www.raspberrypi.org/downloads/raspberry-pi-os/)をダウンロード。
2.SDカードをメインPCにつなげて、「SD Card Formatter」でフォーマットして、「Win32Diskimager」で書き込む。
3.SDカードのbootフォルダ内に "ssh" というからのファイルを作成。拡張子なし。
4.ラズベリーパイにSDカードをセットして電源ON。
5.SSH接続するため、メインPCで「teraterm」を起動。ショートカットのリンク先を
"C:\Program Files (x86)\teraterm\ttermpro.exe" raspberrypi /auto=password /user=pi /passwd=raspberry
としてとしておくと、毎回ユーザー名とパスワードを入力しないで良いので便利。ホスト名は"raspberrypi"でOK。

6.$ sudo raspi-configで設定変更。(必要最小限)

1 Change User Passwordでパスワードを変更。
新しいパスワード:●●(表示されない)
新しいパスワードを再入力してください:上と同じパスワード(表示されない)
passwd: パスワードは正しく更新されました

4 Localisation Optionsで以下の3点を変更。

I1 Change Locale          Set up language and regional settings to match your location
en_GB.UTF-8 UTF-8はデフォルトで選択されているので、ja_JP.UTF-8 UTF-8を追加で選択。カーソルを合わせてスペースキーで選択*となる。エンターキーを押すと、
”Debianの多くのパッケージは、ロケールを使用して、ユーザーに適切な言語でテキストを表示します。生成されたロケールからシステムのデフォルトロケールを選択できます。
 これにより、システム全体のデフォルト言語が選択されます。このシステムがマルチユーザーシステムであり、すべてのユーザーがデフォルトの言語を話すことができない場合、問題が発生します。
システム環境のデフォルトのロケール:None C.UTF-8 en_GB.UTF-8 ja_JP.UTF-8
ja_JP.UTF-8を選択。
I2 Change Time Zone       Set up time zone to match your location
Asia → Tokyo を選択。
I4 Change WLAN Country    Set the legal channels used in your country
JP Japanを選択。

5 Interfacing OptionsでVNCを有効化。
P3 VNC      Enable/Disable graphical remote access to your Pi using RealVNC
→Would you like the VNC Server to be enabled? →はい


7.日本語入力の有効化
$ sudo apt install fcitx-mozc


8.Sambaのインストール
$ sudo apt install samba
インストール途中でSamba サーバおよびユーティリティというのが出る。
あなたのコンピュータがネットワーク上の DHCP サーバから IP アドレス情報を取得しているのであれば、DHCP サーバはネットワーク上にある WINS サーバ (NetBIOS ネームサーバ) についての情報を提供することもできます。DHCP で提供される WINS 設定は /var/lib/samba/dhcp.conf から自動的に読み込まれるため、smb.conf ファイルを変更する必要があります。この機能を使うためには、dhcp-client パッケージがインストールされている必要があります。 DHCP から WINS 設定を使うよう smb.conf を変更しすか。
 <はい>/<いいえ>
>はいを選択
$ sudo nano /etc/samba/smb.conf
文末に以下の5行を追加
----------------------------------------------
[pi]
path = /home/pi
read only = No
guest ok = Yes
force user = pi

[USB-HDD]
path = /media/pi/HD-ADU3
read only = No
guest ok = Yes
force user = pi
----------------------------------------------
$ sudo service smbd restart
$ sudo systemctl enable smbd

9.FTPのインストール別ページ

10.USB-HDDの自動スピンダウン別ページ

11.KUMAN5インチラズベリーパイ用モニタの設定(別ページ
12.デジタルフォトフレームの導入別ページ

13.録画サーバーの導入 (別ページ)(未作成)

2020年6月28日日曜日

ラズベリーパイ Docker & Docker-compose導入

mirakurunの導入にDockerが必要らしいが、docker-compose pull で失敗する。
Dockerってなに? な状態から、導入まで

環境

・RaspberryPi 3B+
・カーネル:Linux raspberrypi 4.19.118-v7+
・OS: Raspbian GNU/Linux 10 (buster)



Dockerってなに?

 Linux上で別なLinuxシステムを起動するコンテナ型仮想化を利用するための管理ソフト。
仮想化とは、OS上に仮想的に別なOSを構築するもの、VMwareとかVirtualBOXとかみたいなやつ。中でもコンテナ型仮想化とは、仮想的な物理マシンの構築は行わず、元のOS上に隔離されたエリアを作り、その内部で新たなソフトウェア実行環境を構築する。コンテナの内外では干渉しあわない。コンテナを移動するだけで別なPC環境でも同様に扱うことができる。ソフトウェアの開発・配布に便利、、、らしい。なんとなくしか分からん。

Docker-composeってなに?

 複数のコンテナを使用するサービスを構築・実行するための手順を自動化

導入


Docker
$ sudo apt install docker >> $ docker --version >>-bash: docker: コマンドが見つかりません
となり、apt では上手く導入できません。
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
$ docker --version
>Docker version 19.03.11, build 42e35e6 となり、導入できました。
$ docker-compose version
>/usr/local/bin/docker-compose: 行 1: Not: コマンドが見つかりません

Docker-composeの導入
$ git clone https:///github.com/docker/compose.git
$ cd compose
$ git checkout 1.26.0
※最新版は1.26.0だった。(2020.6.22時点)
$ ./script/build/linux
>40分位かかった。
$ cd dist
>"docker-compose-Linux-armv7l"が作成されている。
$ ./docker-compose-Linux-armv7l version
>docker-compose version 1.26.0, build d4451659
>docker-py version: 4.2.1
>CPython version: 3.7.7
>OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019
※このままではdocker-composeが使えないのでbinにコピーする。
$ sudo cp docker-compose-Linux-armv7l /usr/local/bin/docker-compose
$ sudo chown root:root /usr/local/bin/docker-compose
※chown:所有権の設定 chown ユーザー(:グループ) ファイル
$ sudo chmod 755 /usr/local/bin/docker-compose
※chmod 755:誰でも読込みと実行はできるが、書き込みは自分だけ。
$ ls -l /usr/local/bin/
>-rwxr-xr-x 1 root root 8156972  日付 docker-compose
$ docker-compose version
>docker-compose version 1.26.0, build d4451659
>docker-py version: 4.2.1
>CPython version: 3.7.7
>OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

docker-compose pullが出来るようになった。


ERROR: Couldn't connect to Docker daemon at+docker://localhost- is it running?と表示されてエラーになる場合、Docker と Docker-composeがグループに入っておらず、権限がない場合に表示されるらしい。
$ sudo usermod -aG docker $USER
にてdockerグループに現在のユーザが登録されて、docker-compose buildなどが実行可能となる。再起動(ログアウトでも可?)などすると登録が反映される。

2020年6月7日日曜日

ラズベリーパイ ベンチマーク

ラズベリーパイ3B+のベンチマークをしてみた。
使用したのは、
UnixBench:Version 5.1.3

Unix系OSであるRaspbianではUnixBenchというベンチマークが利用できるらしい。他にもsysbenchやGPU用のglmark2とかがあるらしい。機会があれば。

実行環境
RaspberryPi 3B+
OS:GNU/Linux -- 4.19.118-v7+ (Raspbian 10 Buster)
電源:5V 3.0A 


インストール&計測
$ git clone https://github.com/kdlucas/byte-unixbench
$ cd byte-unixbench/UnixBench
$ ./Run

ベンチマーク結果は /home/pi/byte-unixbench/UnixBench/results/  に入っています。1時間位はかかるみたいなので、時間にゆとりをもって行いましょう。56℃くらいまでCPU温度は上昇しました。


評価項目
テスト名説明
Dhrystone 2 using register variables 主に整数演算処理の性能を測定する古典的ベンチマークテスト。
結果数値は1秒間の処理回数が表示される。
Double-Precision Whetstone 主に浮動小数点演算処理の性能を測定する古典的ベンチマークテスト。
結果数値は1秒間の処理命令数が表示される。
Execl Throughput execl関数によるプロセス作成を行いその性能を測定する。
結果数値は1秒間のシステムコール処理回数が表示される。
File Copy (※1) bufsize (※2) maxblocks
(※1:1024,256,4096)
(※2:2000,500,8000)
ファイルのコピー速度を測定する。(※2)KBのファイルを(※1)Byte毎に処理。
結果数値は1秒間のファイル処理容量(KB)が表示される。
Pipe Throughput プロセス間通信で使われるパイプのスループットを測定する
結果数値はパイプ処理回数。
Pipe-based Context Switching プロセス間通信で使われるパイプによるコンテキストスイッチ性能を測定する
結果数値はパイプ処理回数
Process Creation 子プロセスの生成速度を測定する
結果数値はフォーク処理回数
System Call Overhead システムコール実行時のオーバーヘッドを測定する
結果数値は1秒間のシステムコール処理回数
Shell Scripts シェルスクリプトの実行性能を測定する
結果数値はループ処理回数


実行結果

Benchmark of raspberrypi / GNU/Linux on 土 6月 06 2020

BYTE UNIX Benchmarks (Version 5.1.3)

Test System Information

System: raspberrypi: GNU/Linux
OS: GNU/Linux -- 4.19.118-v7+ -- #1311 SMP Mon Apr 27 14:21:24 BST 2020
Machine: armv7l: unknown
Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
CPUs: 0: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)
1: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)
2: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)
3: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)
Uptime: 23:16:05 up 1 day, 2:11, 2 users, load average: 0.00, 0.00, 0.07; runlevel 2020-06-05

Benchmark Run: 4 CPUs; 1 parallel process

Time: 23:16:05 - 23:44:04; 27m 59s

System Benchmarks

Test Score Unit Time Iters. Baseline Index
Dhrystone 2 using register variables 5173197.1 lps 10.0 s 7 116700.0 443.3
Double-Precision Whetstone 1430.1 MWIPS 9.7 s 7 55.0 260.0
Execl Throughput 883.9 lps 30.0 s 2 43.0 205.5
File Copy 1024 bufsize 2000 maxblocks 142819.6 KBps 30.0 s 2 3960.0 360.7
File Copy 256 bufsize 500 maxblocks 43274.2 KBps 30.0 s 2 1655.0 261.5
File Copy 4096 bufsize 8000 maxblocks 337429.5 KBps 30.0 s 2 5800.0 581.8
Pipe Throughput 281688.8 lps 10.0 s 7 12440.0 226.4
Pipe-based Context Switching 45913.1 lps 10.0 s 7 4000.0 114.8
Process Creation 2106.5 lps 30.0 s 2 126.0 167.2
Shell Scripts (1 concurrent) 1757.6 lpm 60.0 s 2 42.4 414.5
Shell Scripts (8 concurrent) 511.3 lpm 60.1 s 2 6.0 852.1
System Call Overhead 690392.9 lps 10.0 s 7 15000.0 460.3
System Benchmarks Index Score: 314.0

Benchmark Run: 4 CPUs; 4 parallel processes

Time: 23:44:04 - 00:12:11; 28m 07s

System Benchmarks

Test Score Unit Time Iters. Baseline Index
Dhrystone 2 using register variables 17680727.4 lps 10.0 s 7 116700.0 1515.1
Double-Precision Whetstone 4864.7 MWIPS 9.8 s 7 55.0 884.5
Execl Throughput 1908.4 lps 29.9 s 2 43.0 443.8
File Copy 1024 bufsize 2000 maxblocks 212820.4 KBps 30.0 s 2 3960.0 537.4
File Copy 256 bufsize 500 maxblocks 60151.4 KBps 30.0 s 2 1655.0 363.5
File Copy 4096 bufsize 8000 maxblocks 545417.9 KBps 30.0 s 2 5800.0 940.4
Pipe Throughput 964227.6 lps 10.0 s 7 12440.0 775.1
Pipe-based Context Switching 168143.6 lps 10.0 s 7 4000.0 420.4
Process Creation 3995.0 lps 30.0 s 2 126.0 317.1
Shell Scripts (1 concurrent) 4017.5 lpm 60.1 s 2 42.4 947.5
Shell Scripts (8 concurrent) 538.8 lpm 60.2 s 2 6.0 898.0
System Call Overhead 2281338.8 lps 10.0 s 7 15000.0 1520.9
System Benchmarks Index Score:703.1



インターネットで拾ってきた他人様の実行結果

環境running 1 parallel copy of testsrunning 4 parallel copy of tests
RPi3B+(GNU/Linux -- 4.19.118-v7+)3.0A314.0703.1
RPi3B+(GNU/Linux -- 4.14.34-v7+)2.0A308.1442.4
RPi3B+(GNU/Linux -- 4.14.34-v7+)3.0A355.8783.8
RPi3B+(?)2.1A303.5407.2
RPi3B+(GNU/Linux -- 4.19.80-v7l+)336.3867.2

2020年5月31日日曜日

RaspberryPi DLNA導入

DLNAサーバ 導入

環境:RaspberryPi3B+
OS:OS:Raspbian 10.4 (buster)
DLNAサーバソフト:minidlnaを使用
テキストエディタ:nano
外付けHDD:HD-AD4U3


$ sudo apt update
$ sudo apt upgrade
$ sudo apt install minidlna(2020.5.31時点での最新Ver.1.2.1)
$ sudo nano /etc/minidlna.conf

/etc/minidlna.conf
1user=root
2media_dir=/media/pi #(USBが自動的にマウントされる/media/piをディレクトリとして設定)
3db_dir=/var/cache/minidlna
4port=8200
5friendly_name=RPi
6inotify=yes (フォルダを監視し、変更があった場合に自動でデータベースを更新するオプション)
7album_art_names=Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg
8album_art_names=AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg
9album_art_names=Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg
10notify_interval=895 (変更を監視する周期(秒指定))
11listening_ip=192.168.0.209 (ラズパイのIP)??


$ sysctl fs.inotify.max_user_watches
>>>8192と出る。

$ sudo nano /etc/sysctl.d/minidlna.conf
※新規ファイルを作り、「fs.inotify.max_user_watches = 81920」を追記。

$ sudo chown minidlna /media/pi
※外付けHDDのパーミッション設定。media_dir=で設定したディレクトリを指定。

$ sudo systemctl restart minidlna
※minidlnaサービスを再起動

PC等のブラウザで”http://http://raspberrypi:8200/”と入力すると、




”Media library”が正しくカウントされていればOK。



USBHDDが/media/piにマウントされる前にminidlnaが起動してしまうと、上手く動作しないので、minidlnaの起動を少し遅らせる。
$ sudo nano /etc/init.d/minidlna
※do_start()の画像真ん中の位置に"sleep 60"を挿入。 これで起動を60秒遅らせる。

$ sudo systemctl enable minidlna
※mnidlnaを自動起動有効にする。

2020年5月25日月曜日

bluetoothキーボード

ラズパイ用に専用キーボードが欲しいと思って、amazonでbluetoothキーボードを購入。今使っていっるマウスがbluetooth接続なので、bluetoothで揃えてみた。

今回購入したのは、EWIN製『ZR-067-B009』というキーボード。2480円。



【特徴】
JIS規格準拠の標準日本語配列のキーボード
3台のデバイスとマルチペアリング
Bluetooth5.1に対応
コンパクトで軽量設計(295x120x20mm、290g

【使用感】
・とてもコンパクトで机が広く使えます。
・日本語jis配列で使いやすい。_とか~が入力できない時は、”Fn”+”w”でWindows用にすれば良いかも。
・接続は簡単で”Fn”+”a”,”s”,”d”で接続番号を選らぶ。
⇒”Fn”+”Tab”でペアリング開始
⇒PCやラズパイで接続機器の追加を選択し”Bluetooth 5.1 Keyboard”を選択すれば勝手に接続される。
※裏面の"connect"ボタンは何に使うのか。。。
・打音は若干気になりますが、そこまでうるさくないです。
・まだ使い慣れていないからですが、エンターキーを押す際に”「”を間違って押してしまいます。
・¥の場所は、何かの間違いでしょうか?予想外の場所にあります。
・特徴にもある3台のデバイスとマルチペアリングはすごい便利
 PCとラズパイでキーボード接続しなおすのが面倒なので、新しく購入したけど、”ファンクションキー+a”で待ち時間なく操作デバイスを切り替え可能。旧キーボードは要らないかも。。。
・耐久性とかはまだ分からないので、しばらく使って何か問題があれば追記すると思う。



2020年5月21日木曜日

マウスでキーボード操作

ラズパイ用に5インチモニターを購入したが、現在の作業環境では、キーボードを1台しか置けないので、Windows機とラズパイを同時に操作することが難しい。

マウスで簡単なキーボード操作ができないか。せめてエンターキーだけでもマウスで使えると助かると思って調べてみた。

1.xbindkeys と xdotool をインストール
$ sudo apt install xbindkeys xdotool

2.ボタンの番号を調べる。
$ xev | grep button
エンターキーに使いたいボタンを押してみると、
  state 0x0, button 8, same_screen YES
ボタン8にEnterキーを割り当てたい。


3.設定ファイルを作成する。
$ nano ~/.xbindkeysrc
新規作成し、下記のコマンドを記載して保存。
---~/.xbindkeysrc---
#ボタン8へエンターキーを割り当て。Enterキーは”Enter"ではなく"Return"。
"xdotool key Return"
b:8
-----------------------

4.設定ファイルの再読み込み
$ killall xbindkeys
$ xbindkeys

現在使っているBluetoothマウス『BSMBB505BSK』
※写真の数字がボタンの番号

xdotoolの詳細な使い方は他サイトに多数記載されているので割愛。

<xdotool コマンド 引数>
コマンドは今回は、キー入力をシュミレートする"key"コマンドを使用。
引数に割り当てたいキーを入力している。
※本来の使い方では、スクリプトを記載し、ボタン一つで様々なスクリプトを動かすことが可能。今回とは逆にキーボードでマウス操作することも可能。

2020年5月14日木曜日

ラズパイ デジタルフォトフレーム化

先日、kuman製5インチモニターを購入したので、RPiをデジタルフォトフレームとして使ってみたいと思います。

環境:
Raspberry Pi 3 Model B+
OS:Raspbian 10.3 (buster)

1.fehとxscreensaverのインストール
$ sudo apt install feh
$ sudo apt install xscreensaver
 ※fehはコマンドで操作できる画像ビューア

 2.Raspberry Pi 3B+ スリープモードの解除
方法は3通りあるが、①が簡単そう。

①スタートメニュー → 設定 → スクリーンセーバー を選択
モード(M):セーバーを無効にする(D)を選択する。
(xscreensaverをインストールするとスクリーンセーバーを選択可能)


②スクリーンセーバーの無効化
$ sudo nano /etc/lxsession/LXDE/autoatart
---/etc/lxsession/LXDE/autoatart---
@lxpanel --profile LXDE
@pcmanfm --desktop --profile LXDE
@xscreensaver -no-splash
@xset s off     (※追記)
@xset s noblank  (※追記)
@xset -dpms     (※追記)

 -----------------------------------------


$ sudo nano /etc/lightdm/lightdm.conf
文末に以下の2行を追記する。
 ---/etc/lightdm/lightdm.conf---
[SeatDefaults]
xserver-command=X -s 0 -dpms
------------------------------------

再起動する。

3.スライドショーを起動する
 最初に表示させたい画像をフォルダ(例 /home/pi/Pictures)にまとめます。
$ feh -Y -x -q -D 10 -R 43200 -F -Z -r /home/pi/Pictures/

4.スクリプト化
デスクトップ上にstart_slideshow.sh(名前は適当)というスクリプトファイルを作成。
中身は以下
---/home/pi/Desktop/start_slideshow.sh---
#!/bin/bash
startx 
feh -Y -x -q -D 60 -R 43200 -F -Z -r /home/pi/Pictures/
-------------------------------------------------
ダブルクリックして、実行を選択すれば、スライドショーが実行され、デジタルフォトフレームとして使用可能。


番外編.fehのオプション説明

-Y, --hide-pointer
 ポインタを非表示にします(スライドショーに役立ちます)。
-x, --borderless
 フチなしウィンドウを作成します。
-q, --quiet
 失敗したロードの致命的でないエラーを報告しません。冗長モードと静止モードは相互に排他的ではありません。最初のモードは情報メッセージを制御し、2番目のモードはエラーのみを制御します。
-D, --slideshow-delay float スライドショーモードの場合、スライドが自動的に切り替わるまでfloat秒待機します。
-R, --reload int int秒後にファイルリストと現在の画像を再読み込みします。HTTP Webカメラまたは頻繁に変更されるディレクトリの表示に役立ちます。(ファイルリストのリロードはまだ実験的であることに注意してください。)ゼロに設定すると、あらゆる種類の自動再読み込みが無効になります。 画像が削除されると、fehは次の画像を表示するか、終了します。 ただし、画像がまだ存在していてもロードできない場合、fehは引き続きロードを試みます。このオプションを設定すると、inotifyベースの自動再読み込みが無効になります。
-F, --fullscreen ウィンドウを全画面表示にします。このモードでは、大きな画像は常に画面に合わせて縮小され、-zoom zoomは小さな画像にのみ影響し、画面サイズに合わせて必要以上に拡大することはありません。唯一の例外は100倍のズームです。この場合、画像は常に100%ズームで表示されます。 --thumbnailsと組み合わせると、このオプションはサムネイルの概要から開いた画像にのみ影響します。サムネイルリスト自体は引き続きウィンドウ表示されます。
-Z, --auto-zoom
 フルスクリーン/固定ジオメトリモードで画像を画面サイズにズームします。
-r, --recursive
 コマンドライン引数内のディレクトリを再帰的にそれらのディレクトリのコンテンツに展開し、最下位レベルまで下げます。
-z, --randomize スライドショーで複数のファイルを表示する場合は、表示する前にファイルリストをランダム化してください。リストは、スライドショーが循環する(つまり、最後の画像から最初の画像に移行する)たびに再ランダム化されます。

2020年5月13日水曜日

Kuman 5インチ ラズベリーパイ用モニタ

amazonにて「Kuman 5インチ 800*480 HDMI モニター タッチパネル ラズベリーパイ 液晶 ラズパイ Raspberry Pi ディスプレイ 保護ケース Raspberry Pi 3 2 Model B B+ A A+ SC5AC」を¥4950にて購入。

Raspberry Pi 3B+用に購入。問題なく使えた。
Description:Raspbian GNU/Linux 10 (buster)


 箱の中に説明書は英語の紙1枚のみ。
 組み立て方はアマゾンの商品紹介画像をみると大体わかる。

 

<<組み立て時の注意点>>
※保護フィルムを外せと書かれており、外そうとするが、とても硬い。
※①の四角いフレームには薄いのと厚いのがある。薄いほうがバリが少ないので、全面に 使うと良い。
※長いネジ4本は⑤の四角いフレームに使う。
※黒いドーナッツ状の物は④と⑤の間に入れて⑥になるのと、⑦のラズパイと保護パネルの間に入れて⑨にする。


取扱説明書の内容
ステップ1)最新のRaspbianを準備しろ。
ステップ2)ラズパイを接続しろ。
ステップ3)ドライバーを入れろ。
1)SSHで接続しろ。
2)下のコマンドを実行しろ。
$ sudo rm -rf LCD-show
$ git clone https://github.com/goodtft/LCD-show.git
$ chmod -R 755 LCD-show
$ cd LCD-show/
$ sudo ./LCD5-show
3)上記実行すると勝手に再起動され、ディスプレイとタッチパネルが使える。

タッチパネルが使えるようになったけど、SSHでも接続できなくなったので、いったん強制再起動。⇒正常に使用可能となった。
 

設定
/boot/config.txtを修正しろとサイトには書いているけど、最初から800*480にて表示されている。
$ tvservice -s
→state 0x6 [DVI DMT(87)RGB full 15:9], 800x480 @ 59.00Hz, progressive

タッチパネルをキャリブレーション
大体合っているので、飛ばす。

2.1A出力のモバイルバッテリーでも電圧低下マークが出ることもなく、使用可能。モニタとしての消費電力はかなり低い模様。

今後の予定
デジタルフォトフレームとして使用する

使ってみて気づいたこと
・モニター側とラズパイ側で電源入力が2系統存在するが、どちらでも利用可能。普段はコンセントから電源を取り、移動したいときにモバイルバッテリーを別系統のmicroUSB端子に接続すれば、電源を落とすことなく、移動も可能。
・2系統から電源を取ることで低電圧を防止することも可能。
・モニタ裏面のバックパネルと書かれたスイッチはモニタの電源スイッチとして使用できる。

2020年4月18日土曜日

WEBカメラ

以前スカイプ用に購入したロジクール製C270が使わなくなり、押入れに入れたままだったことを思い出し、ラズパイに接続してなにかできないかな〜と思い、引っ張り出してきました。
色々なサイトを見てみると、監視カメラとして利用していることが多いようなので、今回は監視カメラとして設置できるようにしてみた。

Raspberry Pi 3 Model B+
OS:Raspbian 10.3 (buster)
WEBカメラ:ロジクール HD Webcam C270

以下がUSBカメラを接続する前のlsusbの状態です。
pi@raspberrypi:~ $ lsusb
Bus 001 Device 004: ID 0411:023a BUFFALO INC. (formerly MelCo., Inc.)
Bus 001 Device 006: ID 0411:02c1 BUFFALO INC. (formerly MelCo., Inc.)
Bus 001 Device 005: ID 1c4f:0002 SiGma Micro Keyboard TRACER Gamma Ivory
Bus 001 Device 007: ID 0424:7800 Standard Microsystems Corp.
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

キャプチャデバイスも存在していません。 →存在してるっぽい
pi@raspberrypi:~ $ ls /dev/video*
/dev/video10  /dev/video11  /dev/video12

接続すると以下が追加されました。
pi@raspberrypi:~ $ lsusb
Bus 001 Device 008: ID 046d:0825 Logitech, Inc. Webcam C270

接続して認識されると、ビデオキャプチャデバイスも生成されています。
pi@raspberrypi:~ $ ls /dev/video*
/dev/video0  /dev/video1  /dev/video10  /dev/video11  /dev/video12

これでWEBカメラを使う準備ができました。
次はアプリを使用しての画像取り込みになりますが、どのソフトが良いのかわからないので、
適当に調べて詳しく使い方が乗っているアプリを使うことにします。


★★guvcviewを使用してみました★★
$ sudo apt install guvcview
$ guvcview &
※使い方がよくわかりません。今回はパスします。

★★motionを使用してみた★★ 最新バージョン (4.1.1) 2020/2/25
$ sudo apt install motion
続行しますか? [Y/n] →y
motion.confという設定ファイルをいじりますが、設定ファイルを変更する前に別ファイル名でオリジナルをコピーしておいてください。
$ cd /etc/motion
$ sudo cp motion.conf motion.conf.bak
$ sudo nano motion.conf

confファイルの中を見てみると、、、
logは/var/log/motion/motion.logに出力されるようです。
画像のサイズを変更できるようです。(defaultは320*240)
エンコードにはffmpegを使用しているようです。
defaultのbpsは400000=50KByte/s
コーデックは”mpeg4, msmpeg4, swf,flv, ffv1, mov, mp4, mkv, hevc”を利用可能なようです。
保存先ディレクトリ”/var/lib/motion”のようです。

設定変更!!

$ sudo nano /etc/motion/motion.conf
(Ctrl+oで保存、Ctrl+xで終了)
$ sudo motion
ブラウザで”localhost:8081”と検索するとストリーミングされる。
ブラウザで”localhost:8080”と検索するとブラウザ上で操作できる。
実際に変更項目を確認しながらやるとベター。ALL → action → quitで停止できる。

★設定変更した項目★
daemon on
norm 1(使用するビデオ規格 0:PAL 1:NTSC 2:SECAM 3:PAL NC no colour)
width 640
height 480
framerate 12(640*480だと概ね12-14fpsしかでない)
output_pictures on(動体検知時に画像を出力する)
ffmpeg_video_codec mp4(mkvから変更)
locate_motion_mode on(動体マーカをつける)
text_double on(日付はフォントが小さいためonとしておけば、大きな文字になる。)
v4l2 17 →8or15 (C270は8:Motion-JPEGと15:YUYVに対応)
(https://motion-project.github.io/4.1.1/motion_guide.html#Options_Video4Linux_Devices)

※デフォルトのまま
stream_localhost on(ストリーム接続をローカルホストのみに制限する)
target_dir /var/lib/motion (静止画や動画を保存するディレクトリ)
ffmpeg_output_movies on(動体検知時に動画を出力する)
event_gap 60


では起動!
$ sudo motion
ブラウザで"localhost:8081"と検索窓に入力すると、カメラの映像を見ることができた。
動体検知された時の映像がtarget_dirである/var/lib/motionに保存されている。
ディレクトリ内のファイルを削除するには管理者権限が必要なので、
$ sudo rm /var/lib/motion/*.jpg
*ワイルドカードを使用すると便利。



監視カメラやWEBカメラとして使えるようになったけど、今のところ利用予定はなし。

2020年1月4日土曜日

WI-U3-866DS 購入

ネットワーク周りの改善のために、wifi子機を購入。
アマゾンにて2019.11.19購入 ¥3253

IEEE802.11a/b/g/n/acに対応。ac対応の中から選んだ。
アンテナ2つなので、5GHzなら866Mbps、2.4GHzなら300Mbps。
ビームフォーミング対応。
延長ケーブル付属(地味にうれしい)

メーカーの公称実効速度は491Mbps

googleのspeedtestでは
ダウンロード:81.3Mbps
アップロード:17.5Mbps



ルーターに有線接続しているPCがないので、本機(WI-U3-866DS)をRPTに無線接続し、RPTに有線接続しているラズベリーパイとiperf3で計測してみた。
※PC(クライアント) ~ RPT --- RPi(サーバ) :~無線.---有線
300秒計測 平均58.3Mbps 最小10.2Mbps 最大115Mbps 標準偏差25.0
クライアントマネージャⅤ(バッファローの無線接続ツール)では電波状態76-82%で推移。

ラズベリーパイでよく使うコマンド

ラズベリーパイを使う中で、よく使うコマンド

poweroff
システムのシャットダウン。
$ sudo shutdown -h now でも可。

reboot

システムの再起動。
$ sudo shutdown -r now

ls
ファイルやディレクトリの情報表示。
$ ls -l :で詳細表示可能。

cd
ディレクトリの移動
$ cd .. :一つ上のディレクトリに移動
$ cd ~ :ホームへ戻る

mkdir
ディレクトリを作成
$ mkdir dir  :dirという名前のディレクトリを作成

mv
ファイルやディレクトリの移動、名前の変更。
$ mv file1 /etc  :file1という名前のファイルを/etcディレクトリに移動。
$ mv file1 file2  :file1という名前のファイルをfile2という名前に変更。

cp
ファイルやディレクトリのコピーを作成。
$ cp file1 file2 :file1という名前のファイルをfile2という名前で複写。
$ cp -r dir1 dir2 :ディレクトリdir1の内容をすべてdir2へ複写。

rm
ファイルやディレクトリの削除。ディレクトリを削除するときは-rオプションをつける。
$ rm file1 :file1を削除
$ rm -r dir1 :ディレクトリdir1を削除

cat
ファイルの中身をテキスト表示。(逆順で表示させたい場合はtac)
nano等でも表示できるが、変更しない場合はcatの方が安全。

chmod
ファイルやディレクトリのパーミッション(アクセス権)の変更。
$ sudo chmod 755 file1 :file1のパーミッションを755に変更。

nano
テキストエディタnanoで編集。指定したファイル名が存在しなければ新規作成。
ctrl+oで保存、ctrl+xで終了。

apt
パッケージ管理。以前はapt-getだったが、現在はaptの使用を推奨。
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install パッケージ名


aptの履歴
/var/log/apt/history.logに履歴が残るので確認が可能。

wget
ファイルのダウンロード
$ wget https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRR-rtHiAbN9DtJ2LjpXtljV9MgPjAwikyH-CPBb7N91OV9M2oNjFfdDBuSpGZvVEuL4f31Fatv19d1fLgf-n5pO_3ojjiBQUMvzDYcPrx8B7JR53_2EFwTndfpig42PbCG590SSqBh_Q/s1600/sh_spindown.png

lsb_release -a
OSのバージョンを確認するコマンド。

raspi-config
RaspberryPiの設定ツール

echo
引数の中身を表示

|(パイプ)
commnd1 | command2
コマンド1の実行結果を引数としてコマンド2に送る。