- 投稿日:2021-01-03T23:47:21+09:00
Couldn't open /etc/securetty
当方のUbuntuは20.04.1です。
sshでアクセスすると/var/log/auth.log
に変なログが。Dec 31 18:37:55 groove sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: そのようなファイルやディレクトリはありません Dec 31 18:37:57 groove sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: そのようなファイルやディレクトリはありません Jan 1 15:25:36 groove sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: そのようなファイルやディレクトリはありません Jan 1 15:25:40 groove sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: そのようなファイルやディレクトリはありません Jan 1 15:25:41 groove sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: そのようなファイルやディレクトリはありませんsudo cp /usr/share/doc/util-linux/examples/securetty /etc/securettyコピーしないといかんのはどうかと思う。
- 投稿日:2021-01-03T21:52:58+09:00
Amazon Linux2でLNPP環境を構築する
Amazon Linux2上に、LAMP環境ならぬLNPP環境を構築する手順です。
LAMPとの比較
今回構築するLNPP環境を、お馴染みLAMP環境と比較すると以下の通り。
LNPP LAMP OS Linux Linux WEBサーバ Nginx Apache DB PostgreSQL MySQL プログラミング言語 PHP PHP WEBサーバをApacheではなく、Nginx、DBをMySQLではなく、PostgreSQLにしています。
※呼び方間違ってたら教えてください。環境、バージョン情報
- OS: Amazon Linux2
- WEBサーバ: Nginx1.18.0
- DB: PostgeSQL 11.5
- プログラミング言語: PHP 7.4.11
- クライアントPC: Windows10(PuTTYにてAmazon Linux2に接続)
手順
1. ソフトウェアのインストール
まず、Amazon Linux2環境にSSH接続して、環境の構築に必要な各種ソフトウェアをインストールします。
今回は、Amazon Linux2のExtras Libraryのお力を借りることにしました。(1) 以下のコマンドを実行し、Extras Libraryで利用可能なトピックの一覧を確認します。
amazon-linux-extras初期状態では以下のようになっているはず。
・・(以上省略) 35 kernel-ng available [ =stable ] 36 BCC available [ =0.x =stable ] 37 mono available [ =5.x =stable ] 38 nginx1=latest available [ =stable ] 39 ruby2.6 available [ =2.6 =stable ] 40 mock available [ =stable ] 41 postgresql11=latest available [ =11 =stable ] 42 php7.4=latest available [ =stable ] 43 livepatch available [ =stable ] 44 python3.8 available [ =stable ] 45 haproxy2 available [ =stable ] (以下省略)・・(2) Nginx, PostgreSQL, PHPをインストールします。
以下3つのコマンドを順に実行しましょう。sudo amazon-linux-extras install nginx1 sudo amazon-linux-extras install postgresql11 sudo amazon-linux-extras install php7.4※うちPostgreSQLは、psqlのコマンドがインストールされるだけのようなので、普通にインストールもします(以下のコマンドを実行すればOK!)
sudo yum install postgresql-server postgresql-devel postgresql-contrib(3) 再度、amazon-linux-extrasコマンドを実行し、Nginx, PostgreSQL, PHPが有効になっていることを確認します。
amazon-linux-extras以下のように、available → enabledに変わっていればOK!
・・(以上省略) 35 kernel-ng available [ =stable ] 36 BCC available [ =0.x =stable ] 37 mono available [ =5.x =stable ] 38 nginx1=latest enabled [ =stable ] 39 ruby2.6 available [ =2.6 =stable ] 40 mock available [ =stable ] 41 postgresql11=latest enabled [ =11 =stable ] 42 php7.4=latest enabled [ =stable ] 43 livepatch available [ =stable ] 44 python3.8 available [ =stable ] 45 haproxy2 available [ =stable ] (以下省略)・・2. Nginx
(1) まず、以下のコマンドを実行し、Nginxの設定を確認しましょう。
vi /etc/nginx/nginx.confHTTP接続の場合のドキュメントルートは、
/usr/share/nginx/html
ですので、配下にWEBページで表示させたいファイルを作成します(もちろん設定変更してもOK)ちなみに、該当箇所は以下(rootと記載のある部分)。
・・(以上省略) server { listen 80; listen [::]:80; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; (以下省略)・・(2) 以下の通り実行して、PHPの設定内容を表示する、index.phpを作成しましょう。
sudo vi /usr/share/nginx/html/index.phpファイルが開いたら、insertモードで以下の内容をコピペ→保存します。
<?php phpinfo();(3) Nginxを起動します。
sudo systemctl start nginx.service(4) ブラウザで以下のURLを叩いて、PHP設定内容が表示されることを確認します。
http://パブリック IPv4 DNS/index.php※パブリック IPv4 DNSはAWSのコンソール(EC2)より、確認できます。
3. PostgreSQL
続いてPostgreSQLの設定を行います。
(1) まず、以下のコマンドを実行して初期化をしましょう。
sudo postgresql-setup initdb(2) 設定ファイルの格納先を確認します。
sudo find / -name pg_hba.conf自分の場合は、以下の通りでした。
/var/lib/pgsql/data/pg_hba.conf(3) 設定ファイルを開き、以下の通り内容を変更して、一時的にパスワードがなくてもログインできるようにします(後続の手順で設定)。
sudo /var/lib/pgsql/data/pg_hba.conf■変更前
・・(以上省略) # IPv4 local connections: host all all 127.0.0.1/32 ident # IPv6 local connections: host all all ::1/128 ident (以下省略)・・↓ (「ident」(2ヶ所)を「trust」に変更)
■変更後
・・(以上省略) # IPv4 local connections: host all all 127.0.0.1/32 trust # IPv6 local connections: host all all ::1/128 trust (以下省略)・・(4) PostgreSQLを起動し、ログイン → パスワード設定します。
sudo systemctl start postgresql.service psql -h localhost -p 5432 -U postgres「postgres=#」と表示されたらログインできているので、以下のDDLを実行してパスワード設定しましょう。
alter role postgres with password 'postgres';※上記では、ユーザー: postgresのパスワードをpostgresに設定しています。
(5) 設定ファイルを以下の通り変更して、パスワードなしではログインできないようにします。
・・(以上省略) # IPv4 local connections: host all all 127.0.0.1/32 md5 # IPv6 local connections: host all all ::1/128 md5 (以下省略)・・※(3)の「■変更後」の「trust」(2ヶ所)を「md5」に変更しています。
(6) pdo_pgsqlが存在するか確認します(今回はPDO接続するため)
php -m | grep pdopdo_pgsqlが表示されなければ、以下コマンドを実行してインストールします。
sudo yum install --enablerepo=remi,remi-php74 php-pgsql(7) fpm-phpを再起動して、変更を反映させます。
sudo systemctl restart php-fpm※WEBサーバがApacheの場合はApacheの再起動なのですが、Nginxの場合はfpm-phpが再起動の対象となります。
(8) ブラウザから接続確認するためのpostgres.phpを作成しましょう。
sudo vi /usr/share/nginx/html/postgres.phpinsertモードにて、以下の通り記述→保存。
<?php $DBHOST = "127.0.0.1"; $DBPORT = "5432"; $DBNAME = "postgres"; $DBUSER = "postgres"; $DBPASS = "postgres"; try{ //DB接続 $dbh = new PDO("pgsql:host=$DBHOST;port=$DBPORT;dbname=$DBNAME;user=$DBUSER;password=$DBPASS"); print("接続成功".'<br>'); }catch(PDOException $e){ print("接続失敗".'<br>'); print($e.'<br>'); die(); } //データベースへの接続を閉じる $dbh = null; ?>※ソースコードは、@ga_ku さんの PHPでPostgreSQLに接続する方法 | Qiitaより拝借しました(一部改変)。
(8) ブラウザで以下のURLを叩いて、「接続成功」と表示されればOK!
http://パブリック IPv4 DNS/postgres.phpこれにて、環境構築 → ブラウザからの動作確認が一通りできました!
終わりに
Apache, MySQLもいいけれど、あまり馴染みのないNginx, PostgreSQLにも触れてみたくって。
特にPostgreSQLとPHPの連携のところ(PDO)で躓いたけど、できてよかった。参考
LAMPとの比較
手順
1. ソフトウェアのインストール
- Amazon Linux 2 を実行している EC2 インスタンスに Extras Library からソフトウェアパッケージをインストールする方法を教えてください。 | aws
- Extras library (Amazon Linux 2) | aws
- Amazon linux2にpostgresqlをインストールする手順 | 瀬戸内の雲のように
2. Nginx
3. PostgreSQL
- 投稿日:2021-01-03T18:59:00+09:00
プチロボ基板でサーボモータ制御をするシリアル通信単機能モジュールをC言語で作ってみた
はじめに
WR-XX制御基板は、合計で20個のサーボモータを同時にコントロールできますが、シリアル通信でコントロールデータを送信します。通信の仕組みそのものは単純ですので、サーボモータを一つだけ操作するモジュールを作ってみました。
この基板は、PICを2個使って制御をしていますが、PIC側のソースコードまでは公開されていません。したがって、制御コマンドの仕様は「WR-XX 通信プロトコル ガイド(第2版)」からの情報に限られます。
サーボ制御出力コマンド(コマンド 6)
WR-XX基板に接続されたサーボモータの動作を制御するコマンドです。
各サーボごとの回転位置の指定、移動速度(全て同一となります)、コマンドを受信してからの動作開始までの時間などを指定することができます。
(中略)
モータの指定は連続の番号でしか行えません。M0~M4,M10,M15の分だけといった飛び飛びの指定はできません。
WR-XX基板はこのコマンドを受け取ってもPCへの返信は何も行いません。使い方の概要
今回制作したプログラムでは、サーボモータの動作はコマンドライン引数で指定します。
[ファイル名] [目標値 M0] [移動速度] [待機時間]
目標値 :約160°を220分割して指定します。
移動速度:15段階。MG90Sは、0.1秒/60° 1.8kgf・cm(4.8V)で動作するようです。
待機時間:15ms~3.3秒(220段階)(例)サーボモータ M0 のみを 110 の位置へ速度10、待機時間15msで移動します。
$ gcc WR-XX_motion-script.c $ ./a.out 110 10 1ソースコード
WR-XX_motion-script.c/*********************************************************************************************************** * WR-XX Motion Script for Linux ver. 0.1.2 * Author : Lian Ivvakanni (12-19-2020) * License: Dual BSD/GPL (with absolutely no warranty.) * Purpose: send return message to Wonder Roid Motion Maker V3.1.1 ***********************************************************************************************************/ #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <fcntl.h> #include <termios.h> #include <unistd.h> #include <string.h> #include <stdio.h> #include <stdlib.h> /* change this definition for the correct port */ #define MODEM_DEVICE "/dev/ttyS8" #define BAUD_RATE B38400 /* command item number */ #define M 32 /* buffer size */ #define N 32 int main(int argc, char *argv[]) { int fd, i; struct termios tio; char s[N], buf[N], ret[M][N]; /* Command 5: A/D status dummy data */ char com_6[M] = {0xFD,0x07,0x06,0x01,0x0F,0x6E,0xFE}; /* target position: approx 160° */ if(atoi(argv[1]) > 0 && atoi(argv[1]) <= 220) com_6[5] = atoi(argv[1]); else com_6[5] = 0x00; /* velocity */ if(atoi(argv[2]) > 0 && atoi(argv[2]) <= 15) com_6[4] = atoi(argv[2]); else com_6[4] = 0x0A; /* wait time 15ms/1 */ if(atoi(argv[3]) > 0 && atoi(argv[3]) <= 220) com_6[3] = atoi(argv[3]); else com_6[3] = 0x01; /* set return data */ for(i = 0; i <= 7; i++) ret[i][2] = i + 0x10; /* clear structure for port settings */ memset(&tio, 0, sizeof(tio)); /* BAUDRATE: 38400 bps CS8 : 8bit,no parity,1 stopbit (8n1) CLOCAL : local connection, no modem contol CREAD : enable receiving characters */ tio.c_cflag = BAUD_RATE | CS8 | CLOCAL | CREAD; /* Open modem device for reading and writing */ fd = open(MODEM_DEVICE, O_RDWR); if (fd < 0) {perror(MODEM_DEVICE); exit(-1);} /* clean the modem line and activate the settings for the port */ tcflush(fd, TCIFLUSH); ioctl(fd, TCSETS, &tio); write(fd, com_6, M); close(fd); return 0; }おわりに
コマンドラインで使うなら、デバイスの指定もできるようにしたいところですが、関数として使用するにはちょうどいいかな、という感じでの仕上がりになっています。本当のところ、やっと、ここまで来たな・・・と感無量です。
次は、サーボモータ二つを使ったプログラムに挑戦します。
あとは、サーボモータの「トルク」という数値が現実の世界でどのような役割を担って働くのかよくわかりませんので、今後、ちゃんと調べておこうと思います。
- 投稿日:2021-01-03T18:01:59+09:00
【インフラ】Linuxコマンド、シェルスクリプト集
内容
- ネットワークコマンド
- サーバコマンド
ネットワークコマンド
◆ netstat -anp
ポート利用状況
取得$ netstat -anp Proto Local Address Foreign Address State TCP 0.0.0.0:53 0.0.0.0:0 LISTENING TCP 0.0.0.0:80 0.0.0.0:0 LISTENING◆ ipconfig
- ipconfig:
Windows
のコマンド環境- ifconfig:
UNIX
のコマンド環境//ネットワーク環境の確認 $ ipconfig /all $ ipconfig addr show◆ hostname
- サーバ
ホスト名
を確認する$ hostname $ uname -n $ uname -a //詳細表示route
◆ ルーティングテーブルの内容表示
- メトリック:
メトリックの値の小さい経路
が最適な宛先ルートとしてルーティングテーブルに登録される$ route print Network Destination Netmask Gateway Interface Metric 0.0.0.0 0.0.0.0 192.168.1.254 192.168.1.10 1◆ ルーティング追加(Linux)
//IPアドレス:192.168.30.0 ゲートウェイ:192.168.1.254 サブネットマスク:255.255.255.0 $ route add -net 192.168.30.0 gw 192.168.1.254 metric 1 netmask 255.255.255.0 eth0サーバコマンド
◆ w
- 現在の
サーバの状態
を簡易出力する$ w 16:40:10 up 1:26, 1 user, load average: 0.00, 0.01, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT vagrant pts/0 10.0.2.2 15:28 0.00s 0.17s 0.00s w◆ vmstat
- 各種
リソースの使用状況
を表示する$ vmstat 1 3 //1秒単位で3プロセス表示 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 59188 140888 162272 1216520 3 3 6 88 6 7 2 1 94 3 0 0 0 59188 140880 162272 1216548 0 0 0 0 186 366 1 0 99 0 0 0 0 59188 140880 162272 1216548 0 0 0 0 168 362 1 1 99 0 0◆ iostat
- オプション"-c"で
CPU使用率
表示- オプション"-d"で
I/Oデバイス
の使用状況表示$ iostat Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn vda 0.46 2.63 9.55 2239142 8134170 vdb 0.00 0.00 0.00 1754 8参考文献
- 投稿日:2021-01-03T16:48:49+09:00
(Windows10)Linux環境とgnuplotを導入する。
この記事の対象者
・
Windows10
のマシンしか持っていないが、Linux
環境が必要な人。
・最近サーバーの勉強を始めた人。
・プログラミングの授業がもうすぐ始まる大学生。Abstract
Windows10
上で、Ubuntu
ターミナルとLinux
コマンド(bash
、ssh
、git
、apt
など)を使える環境を構築する。そして、Ubuntu
にgnuplot
を導入し、出力結果をWindows10
上で表示できるようにする。Windows10 でLinuxの環境を構築する。
Microsoft Storeで「Ubuntu 18.04 LTS」または「Ubuntu 20.04 LTS」をインストールする。
18.04
https://www.microsoft.com/store/productId/9N9TNGVNDL3Q20.04
https://www.microsoft.com/store/productId/9N6SVWS3RX71
Windowsのファイルを参照するためには、以下のように
/mnt/
ディレクトリを先頭につければ良い。例えば、Cドライブのファイルに移動するときは
$ cd /mnt/C/...などとするとアクセスできる。
X Window Systemの導入
今回は、
X Window System
を導入することで、Linux(Ubuntu)上で実行した結果(例えばgnuplot
で出力したグラフなど)をWindows上で表示できるようにする。Linux(Ubuntu)にはx11
を、WindowsにはXming
をインストールする。x11のインストール
先ほどダウンロードしたUbuntuを起動して以下のコマンドを入力する。
#aptの更新 $ sudo apt update $ sudo apt upgrade #x11のインストール $ sudo apt install x11-appsここで、Limux側には
x11
が正常にインストールされ、Windows側にはGUIが存在していないことを確認する。今、x11
で何か表示させようとすると、エラーが出るはずである。以下のコマンドを実行する。$ xeyes &とすると、
Error: Can't open display
と表示されればO.K.
Xmingのインストール
Xming X Server for Windowsから以下のファイルをダウンロードしてインストールする。インストール後は必ず再起動をする。
・Xming-fonts-7-7-0-10-setup.exe
インストールができているかのチェック
以下のコマンドを実行して目のウィンドウが出てきたら成功。
$ xeyes &注意
xeyes &
を実行すると、Error: Can’t open display:
または
Error: Unable to initialize GTK+, is DISPLAY set properly?
のようなエラーが出る場合がある。この時、
$ export DISPLAY=:0または
$ export DISPLAY=:0.0を実行してもう一度
xeyes &
を実行するとうまくいく。おまじない
上記のコマンドを
~/.bashrc
に追記すると次回から入力しなくて良くなる。以下ではVi
で~/.bashrc
編集するためのコマンド例をあげておく。上から実行するだけで、~/.bashrc
にexport DISPLAY=:0
またはexport DISPLAY=:0.0
を追記できる。まず、
Vi
で~/.bashrc
を開く。$ vi ~/.bashrc次に、
Vi
内で以下を1行ずつ入力する。#最終行へジャンプ Shift + g #インサートモード i #行末へ移動 Fn + -> #改行 Enter #おまじないの入力 export DISPLAY=:0 または export DISPLAY=:0.0 #インサートモードを抜ける Esc #保存してViを終了 :wq最後に
~/.bashrc
の変更を反映する。$ source ~/.bashrcgnuplotのインストール
まず、Ubuntuの中で
lock
ファイルを作る。$ sudo touch /var/lib/dpkg/lock $ sudo chmod 640 /var/lib/dpkg/lock $ sudo chown root:root /var/lib/dpkg/lock次に
apt
を更新する。(2.でやっていたら不要)$ sudo apt update $ sudo apt upgrade最後に、
gnuplot
をインストールする。$ sudo apt install gnuplotgnuplotの動作確認
ターミナル上で
gnuplot
と入力して起動する。
以下のコマンドを入力して$y=\sin(x)$のグラフが出てきたら成功。gnuplot> set terminal x11 gnuplot> plot sin(x)注意
ここで
Error: Can’t open display:
または
Error: Unable to initialize GTK+, is DISPLAY set properly?
のようなエラーが出た時、
export DISPLAY=:0
などを実行するか、おまじないのところをもう一度実行する。おまけ 好きなエディタをインストールする。
・Vim(Ubuntuに標準で入っている。)
・VScode(https://code.visualstudio.com/)
・インストール方法など
https://qiita.com/Shi-nakaya/items/c43fb6c1e638d51bf1c8・Atom(https://atom.io/)
・インストール方法など
https://qiita.com/purini-to/items/caca2a0c56e984b2f9d8参考にしたサイトなど
Bash on Ubuntu on Windows + XmingによるGUI
https://qiita.com/makky0620/items/e31edc90f22340d791ff
gnuplotのインストール時のエラー
これの#4(https://forums.ubuntulinux.jp/viewtopic.php?pid=32854)
- 投稿日:2021-01-03T12:35:03+09:00
LinuxデスクトップでDSD音源のネイティブ再生
想定している読者
デスクトップLinuxを使用していて、DSDのネイティブ再生に興味を持っている方。
DSDって何?
アナログの音をデジタルに変換する時の変調方式としてPCMとΔΣ変調の2つが実用化されていますが、世の中のデジタル音源のほとんどはPCMで 1)、ΔΣ変調音源のシェアなんて0.1%にも満たないでしょう。ΔΣ変調がどマイナーな最大の理由は、ΔΣ変調でデジタル化されたデータは再加工が困難だという点にあります。ΔΣ変調方式でデジタル化されたデータは音の大きさの変更すらできません。そのため録音側ではミキシング作業ができないし 2)、再生側でもアナログのボリュームしか使えないというめんどくささがあります。
DSD (Direct Stream Digital) とはソニーとフィリップスが商標を持つΔΣ変調で録音と再生を行うハイレゾオーディオシステムの呼称です。1999年にCDよりも音のクオリティが高い光学円盤として発売されたSACDが最初に世に出たDSD製品になります。ただその後音楽配信のメディアは光学円盤からオンラインに移行したため、現在DSD音源というとオンラインで配信される、拡張子が .dsf, .dsdiff, .wsd のファイルを指すことが多いようです。本記事もそれに倣います。
DSDはボリュームの変更すら難しいという扱いの不便があるにもかかわらず、その音の魅力から一部の熱心な録音エンジニアやオーディオ愛好家からの強い支持をうけ、数は少ないながらも新譜が脈々とリリースされ続けています。注;
1): ネットや光学円盤で流通している音源データとしてはΔΣ変調方式はマイナーなのですが、DAコンバーターチップの内部でデジタルデータをアナログの音声信号に変換する部分ではΔΣ変調は多用されています。
2): 楽曲データの製作時にミキシング作業をなくすというのは現実的でないので、ほとんどのDSD制作現場ではΔΣ変調されたデータを一旦PCMやアナログ、もしくは擬似的なΔΣフォーマットに変換して作業をせざるを得ません。ミキシングの際一時的にPCM変換するのはDSD原理主義者からは邪道だとみなされるようです。DSDっていい音なの?
私の経験では、ビットレートが同じくらいならDSDのほうがPCMより絶対的に良い音だと感じたことはないです。ただ2つの変調方式の違いはなんとなく感じます。
PCM音源と比較して、DSDの音には演奏現場に居るような空気感があると良く言われます。SACD が出回り始めた時もみんな空気感って言葉を使ってましたね。私もDSDの音を聞いてみるまでは、空気感って何だよ?って思ってたのですが、聞いてみたら”空気感”でした。(なんだそりゃ)
DSDっていい音なのか、また空気感ってなんだというのは皆さんで体験していただくしかありません。本記事がそのお役に立てれば本望です。DSDのネイティブ再生って何?
ΔΣ変調のDSDデータをPCMに変換すること無くPCからDAコンバーター(以下DAC)に転送して、DAC側でアナログの音データに変換するのが”ネイティブ再生”です。LinuxでDSDのネイティブ再生をするには、DAC、デバイスドライバ、Linuxのカーネル、アプリケーションソフトが全て対応している必要があります。
再生装置
本記事では読者がDSD再生ができるDACを所有していて、ALSAで音を出せている前提で話をします。
注;
本記事では深入りしませんが、DAC側がDSDを本当にネイティブに再生しているのかという問題があります。DSDの再生が可能だと謳っているDACでも、実際には内部でDSDデータをPCMに変換してから音を再生する製品があるからです。基本的にはDSDデータは音量すら変更できないので、DSDに対してデジタルでボリュームが調整できるDACはDSDをネイティブ再生していないと考えられます。
ところがESS Technology 社のDACチップを使った製品ではDSDネイティブ再生を謳っていながらデジタルボリュームが使えます。なんでこんなことができるのかESS社から正式なアナウンスがないようですが、ネットの掲示板情報によれば、DSDの 1,0,0,1,1,0,... という2値のデータを同じ周波数の 63,0,0,63,63,0,... という6ビットデータに変更して、この6ビット数を増減させることで音の大きさを変えているとのことです。こういう方法だったら一種のDSDネイティブ再生方式だと言えるような気がします。(その後で32ビット352.8KHzとかのPCMにしてるとの推測もあります)デバイスドライバ
DSDのネイティブ再生に対応している新しめのUSB DACの多くはUSBポートにXMOS社のチップを使ってますが、その場合はたいていネイティブ再生が可能だと思います。ただ例外もあるようですのでお使いのDACがLinuxでDSD再生できるかどうかはググってみてください。"WindowsのASIO DoPにしか対応しません" というDACはLinuxのデバイスドライバではDSDネイティブ再生はできないかもしれません。再生中のサウンドがDSDネイティブ再生かどうかの確認手段は後述します。
HDMI接続のAV機器は知見がないのですが、対応は困難みたいです。カーネル
Linuxの4.1.10以上のカーネルはDSDネイティブ再生の機能を有します。最近のメジャーなディストリビューションだったら特に何も考えなくていいです。
ソフトウェア
後述します。本記事はMPDを使う方法をメインに説明します。Debian 10, Ubuntu 18, Manjaro で動作確認してます。
Linux でDSDのネイティブ再生ってどんな方法があるの?
普通のアプリケーションソフトを使う方法
Linuxでの音楽再生によく使われる、Audicious, Banshee, Clementine, VLCなどは2020年時点ではDSDのネイティブ再生をサポートしていません。Audicious, DeadBeef などではDSD音源を再生する機能はあるのですが、これはDSD音源をPCMに変換してDACにデータを送る機能であり、DACはPCMデータを受け取って再生することになります。ネイティブ再生ではありません。
有料のソフトならDSDネイティブ再生が可能なものもあります。
HQPlayer という高品質オーディオプレーヤーはでコンシューマー向けは6万円、スタジオ向けが48万9千円というなかなか結構なお値段です。もう少し庶民的なソフトとしては JRiver Media Center
というのがあり日本のAmazonでは7200円でした。
残念ながら、単独のアプリケーションソフトでDSDのネイティブ再生ができて無料っていうのは現在無いです。Windowsの音楽再生ソフトを使う方法
Windowsで評価の高い音楽再生ソフトFoobar2000はWine上で動くそうなので、これを使う手もあります。Wine ではなく VMwareや Virtual Box 上のWindows でFoobar2000 を動かすほうがシステムのリソースは食いますが、設定はより簡単かもしれません。具体的な方法は割愛します。
MPD; Music Player Daemon を使う方法
MPDは各種のオーディオデータを再生するサーバーです。MPDはユーザーインターフェースを持たないので、楽曲を再生する時はMPDクライアントと呼ばれるアプリケーションソフトを組み合わせる必要があります。LinuxでDSDをネイティブ再生するにはこれが最適解ではないでしょうか。ただ、設定はちょっと面倒です。また最近の Red Hat 系ディストリビューションではMPDの公式パッケージが用意されてないみたいです。
MPDクライアントは60種類以上ありますが、本記事では Cantata というソフトを使うこととします。
番外編 スマホを使って HF Player で再生 < Linux デスクトップ関係ねえじゃん
オンキョー製の Android, iOS 用音楽再生アプリのHF Player はDSDのネイティブ再生をサポートしてます。スマホとDACをつなぐUSBケーブルがあれば、これが一番お手軽なDSDのネイティブ再生手段だと思います。
MPD で DSD のネイティブ再生
MPDパッケージをインストールした素の状態だと、MPDはPC起動時にsystemdによってデーモンとして起動します。これでも悪くはないですが、起動停止や設定変更が一般ユーザー権限でできる方が使い勝手が良いので本記事ではログインユーザー権限でMPDをコントロールするよう設定を変更することとして説明をします。
作業は次の手順になります。
- MPD, Cantata のインストール
- PC起動時にmpdが systemd によって起動されないように変更
- 設定ファイルのための情報収集
- 設定ファイルの書き換え
- オーディオデータの再生
- DSDネイティブ再生していることの確認コマンド打ち込みの説明で、コマンドの前に "#" が付いている時はルート権限で、"$" が付いている時はログインユーザー権限でコマンドを打つことを意味します。
● MPD, Cantata のインストール
Debian,Ubuntu# apt-get install mpd cantata
Arch,Manjaro# pacman -S mpd cantata
MPDは /usr/bin に置かれ、一般ユーザーの権限で起動停止が可能な状態でインストールされます。
● PC起動時にmpdが systemd によって起動されないように変更
MPDをインストールした直後はルート権限でMPDが動いているので、一旦
# systemctl stop mpd
などとしてMPDを止めます。
次いで次回以降の起動時にMPDが起動しないように設定をします。今日びのLinuxでは、起動時のサービス停止コマンドは# systemctl disable mpdですね。GUIが慣れてる方や init.d 的な手法を使われている方はお好みの方法でどうぞ。
● 設定ファイルのための情報収集
MPDを動かすための設定ファイルに、DSDネイティブ再生をするDACのハードウェア番号もしくはデバイス名が必要になります。次のコマンドを叩いてみてください。
$ cat /proc/asound/cards例えばこんな感じの出力が返ってきます。
0 [PCH ]: HDA-Intel - HDA Intel PCH HDA Intel PCH at 0xc5740000 irq 131 1 [NVidia ]: HDA-Intel - HDA NVidia HDA NVidia at 0xc4000000 irq 17 2 [HUDmx1 ]: USB-Audio - Audinst HUD-mx1 Audinst, Inc. Audinst HUD-mx1 at usb-0000:00:14.0-2, full speed 3 [G20 ]: USB-Audio - Gustard USB Audio 2.0 Gustard Gustard USB Audio 2.0 at usb-0000:00:14.0-1, high speed 4 [Audio ]: USB-Audio - NFJ USB Audio VIA Technologies Inc. NFJ USB Audio at usb-0000:00:14.0-6, full speedハードウェア番号は左端の数字、[ ]内の文字列がデバイス名です。ハードウェア番号は、USB接続のDACなら接続するUSBポートを変えたり、電源を入れる順序を変えることで変わるので注意してください。
ベンダー名からDACを特定できると思います。● 設定ファイルの書き換え
ログインユーザーがmpdを起動する時、MPDは
~/.config/mpd/mpd.conf
という設定ファイルを読みに行きます。mpd.conf の内容はmpdのバージョンによって微妙に異なるので、インストールしたMPD に添付されているファイルをベースに書き換えることとします。
ベースとなる設定ファイルのありかはディストリビューションによって異なっているので、それぞれ下記のコマンドで mpd.conf の雛形を用意してください。debianの場合$ mkdir ~/.config/mpd # mpd 設定ファイルのためのディレクトリ作成 $ mkdir ~/.config/mpd/playlists # 再生リストのためのディレクトリ作成 $ sudo cp /etc/mpd.conf ~/.config/mpd $ sudo chown YOUR_USER_NAME ~/.config/mpd/mpd.confubuntuの場合$ mkdir ~/.config/mpd # mpd 設定ファイルのためのディレクトリ作成 $ mkdir ~/.config/mpd/playlists # 再生リストのためのディレクトリ作成 $ cd ~/.config/mpd $ cp /usr/share/doc/mpd/mpdconf.example.gz ./ $ gzip -d mpdconf.example.gz $ mv mpdconf.example mpd.confmanjaroの場合$ mkdir ~/.config/mpd # mpd 設定ファイルのためのディレクトリ作成 $ mkdir ~/.config/mpd/playlists # 再生リストのためのディレクトリ作成 $ cp /usr/share/doc/mpd/mpdconf.example ~/.config/mpd/mpd.conf次にエディタで ~/.config/mpd/mpd.conf を開いて内容を書き換えていきます。
最低限書き換えないといけないのは、①指定ディレクトリとファイル、②出力デバイス、③出力先のIPアドレス の3点です。①指定ディレクトリとファイルの書き換え
設定ファイルに music_directory, playlist_directory で始まる行があるので次のように書き換えます。
music_directory "あなたが音楽ファイルを置いているディレクトリ" playlist_directory "~/.config/mpd/playlists" xxxx_file で始まる行があるので、次のように書き換えます。 db_file "~/.config/mpd/tag_cache" log_file "~/.config/mpd/mpd.log" pid_file "~/.config/mpd/pid" state_file "~/.config/mpd/state" sticker_file "~/.config/mpd/sticker.sql"②出力デバイスの書き換え
Audio Outputセクションに出力デバイスを次のように書き加えます。
# Audio Output ################################################################ audio_output { type "alsa" # この行は必須 name "Gustard USB Audio 2.0" # この行はラベルなので任意の名前でOKです device "hw:G20,0" # 先に調べた、DACのデバイス名、もしくはハードウェア番号を指定します # "hw:デバイス名,0" もしくは "hw:ハードウェア番号,0" と書きます。 # device "hw:3,0" # ハードウェア番号でDACを指定する例 mixer_type "none" # mixer_type は "none" (ボリュームを加工せず送出)か # "software" (MPDクライアントでボリューム調整する)か # "hardware" (alsaのボリュームを使用する) DSDのネイティブ再生時にはボリュームは効きません。 }もし複数のデバイスを同時に鳴らしたいなら、鳴らしたいデバイスそれぞれに対して
audio_output{ ... }
を複数書けば良いです。DSD音源を再生すると、ネイティブ再生対応のデバイスにはネイティブのDSDデータが送られ、対応していないデバイスには自動的にPCMに変換されたデータが送られます。③出力先のIPアドレス
bind_to_address
の行を書き換えます。mpdを動かすPCだけでMPDクライアントを使用する場合bind_to_address "localhost"
mpdを動かすPCに192.168.0.10/24が割り当てられている場合で、ネットワーク192.168.0.0/24にある他のマシンでもMPDクライアントを使用する場合bind_to_address "192.168.0.10"
どのマシンのMPDクライアントに対しても応答する場合bind_to_address "any"
● オーディオデータの再生
MPD の起動は、
$ mpdとコマンドを叩くだけです。MPDを止めるときのコマンドは、
$ mpd --killです。
MPDを常時起動させるなら、.profile
に追加するなり、GUIを使って自動起動されるなりお好みの方法でどうぞ。
MPDを起動させたらいよいよ音を出してみましょう。おおっとその前にアンプのハードウェアボリュームを最小に絞らなくては。DSDはソフトウェアボリュームが効かず100%の音量が出力されるので、PCMの音楽を鳴らした後にDSDの音源が巨大音量で再生されて心臓が飛び出そうになる、っていうのはDSDあるあるです。
先にインストールしたCantataを起動しましょう。Cantataの操作は特に癖がなく、感覚的に使えると思います。なんならPCM音源を含めて常用の音楽再生アプリとしても良いかもです。
左端の"フォルダ”アイコンを選択してペイン左側の"Server Folders” (上の図でマウスカーソルが置かれてるところ)をクリックするとmpd.conf の music_directory で指定したディレクトリが開きます。ここから聞きたいファイルを選んでペイン右側にドラッグ-ドロップして再生ボタンをクリックすればファイルが再生されるはずです。ハードウェアボリュームを上げていってください。サウンドが再生されましたよね?おめでとう。● DSDネイティブ再生していることの確認
ネイティブ再生してるかの確認は、もしDACに再生中のデータのフォーマットを表示する機能がついている場合、その表示を見るのが早くて確実です。
表示する機能がなければ、先に調べたDACのデバイス名を DEV_NAME として、次のコマンドを叩いてみてください。DEV_NAMEは確認したいDACのデバイス名$ cat /proc/asound/DEV_NAME/pcm0p/sub0/hw_params何も再生していない時
closedDSDデータをネイティブ再生している時
access: RW_INTERLEAVED format: DSD_U32_BE <------- DSDという語が付いてる = DSDネイティブ再生してる subformat: STD channels: 2 rate: 88200 (88200/1) ...PCMデータを再生している時
access: RW_INTERLEAVED format: S32_LE <------- DSDという語がついてない。4) subformat: STD channels: 2 rate: 96000 (96000/1) ...注4); DSDのネイティブ再生には、DoP; DSD over PCM という方式もあります。これはDSDデータをPCMデータの転送フォーマットに埋め込んで転送するという方式で、ちょっと前のDACだとこのDoPでしかDSDデータを受け付けないものがあります。DoPでデータを転送しているときは"DSD"は付かず
format: S32_LE
もしくはformat: S24_LE
となります。私はDoPに対応しているDACを所有しておらず、申し訳ないですが DoP専用DACの再生についてはこれ以上のことが書けません。
- 投稿日:2021-01-03T12:25:15+09:00
Linux grepコマンドの使い方
grepコマンドとは
ファイルの中の特定の文字列(パターン)がある行を抽出するコマンド
Linuxコマンドの中で最もよく使うコマンドの1つ基本書式
grep [オプション] 検索パターン ファイル名 [ファイル名] #ファイル名は複数指定できる もしくは コマンド | grep [オプション] 検索パターン ※[]は省略可オプション
●検索関連のオプション
オプション 意味 サンプルコード -E 検索に拡張正規表現を使う 使用例1 -i 大文字と小文字を区別せずに検索する 使用例2 -P 検索にPerl正規表現を使う 使用例3 -x 行全体がパターンと一致するものを検索する 使用例4 ●表示関連のオプション
オプション 意味 サンプルコード -A 行数 一致した行の後の行も表示する 使用例5 -b パターンの前に何文字あるかを併せて表示する 使用例6 -B 行数 一致した行の前の行も表示する 使用例7 -c 一致するものが含まれている回数のみ表示 使用例8 -C 行数 一致した行の前後の行も表示する 使用例9 -h ファイル名を表示しない(複数ファイル指定時) 使用例10 -H ファイル名を併せて表示する 使用例11 -l 一致するものが含まれているファイルのファイル名のみ表示する 使用例12 -L 一致するものが含まれていないファイルのファイル名のみ表示する 使用例13 -m 回数 パターンと一致するものを含む行が指定した数に達したら処理を終了する 使用例14 -n 行番号を併せて表示する 使用例15 -o 一致した箇所だけを表示する 使用例16 -q 結果を表示しない(主にシェルスクリプトなどで判定用に使う) 使用例17 -v パターンに一致しない行を表示する 使用例18 ●検索対象関連のオプション
オプション 意味 サンプルコード -r ディレクトリを指定した場合はサブディレクトリ内のファイルも含めて検索する 使用例19 -R サブディレクトリも含めて検索、さらにシンボリックリンクの先 使用例20 基本使用例
#/etc/passwdファイルの中身を「hoge」で検索する場合 grep hoge /etc/passwd 実行結果 hoge:x:1000:1000::/home/hoge:/bin/bash #「hoge」が含まれる行が表示される #コマンドの実行結果について任意のパターンを検索する場合 cat /etc/passwd | grep HOGE 実行結果 HOGE:x:1001:1001::/home/HOGE:/bin/bash #コマンドの実行結果から「HOGE」が含まれる行だけが表示される ##「cat /etc/passwd」のみだと下記のような実行結果(ファイルの中身を全て表示する) root:x:0:0::/root:/bin/bash ・ ・ ・ hoge:x:1000:1000::/home/hoge:/bin/bash HOGE:x:1001:1001::/home/HOGE:/bin/bash ・ ・ ・ #複数のファイルを指定して検索する場合 /etc/test.txt aaa bbb ccc ddd eee fff /etc/test1.txt aaa aaa bbb aaa bbb ccc grep aaa /etc/test.txt /etc/test1.txt 実行結果 test.txt:aaa test1.txt:aaa test1.txt:aaa test1.txt:aaa #/etc/passwdファイルの中身を正規表現で検索する場合 grep ^h... /etc/passwd 実行結果 halt:x:7:0:halt:/sbin:/sbin/halt #最初に「h」から始まる4文字の単語が含まれる行が表示される hoge:x:1000:1000::/home/hoge:/bin/bash #正規表現の詳細については別ページ参照使用例1
検索に拡張正規表現を使う
#/etc/sysconfig/network-script/enp0s3ファイルの中身を拡張正規表現で検索 grep -E "((25[0-5]|1[0-9][0-9]|[0-9]?[0-9])\.){3}(25[0-5]|1[0-9][0-9]|[0-9]?[0-9])" /etc/sysconfig/network-scripts/ifcfg-enp0s3 実行結果 IPADDR=192.168.0.2 #IPアドレスが含まれる行が表示される GATEWAY=192.168.0.1 DNS1=8.8.8.8使用例2
大文字と小文字を区別せずに検索する
#/etc/passwdファイルの中身を大文字・小文字の区別なく「hoge」で検索 grep -i hoge /etc/passwd 実行結果 hoge:x:1000:1000::/home/hoge:/bin/bash #大文字・小文字関係なく、「hoge」と「HOGE」のどちらでも含まれる行が表示される。 HOGE:x:1001:1001::/home/HOGE:/bin/bash #「Hoge」や「hogE」を含む行があれば、その行も表示される使用例3
Perl正規表現を使って表現する
#/etc/httpd/conf/httpd.confファイルの中身をPerl正規表現を使って検索 grep -P "\d" /etc/httpd/conf/httpd.conf #数字が含まれる行が表示されるように検索 実行結果 # See <URL:http://httpd.apache.org/docs/2.4/> for detailed infomation. # <URL:http://httpd.apache.org/docs/2.4/mod/directives.html> ・ ・ ・使用例4
行全体がパターンと一致する行があるか検索する
#行全体がパターンと一致する行が含まれているか確認する場合 grep -x IPADDR=192.168.0.2 /etc/sysconfig/network-scripts/ifcfg-enp0s3 実行結果 IPADDR=192.168.0.2 #行全体がパターンと一致する行のみ表示される ##grep -x IPADDR= /etc/sysconfig/network-scripts/ifcfg-enp0s3 と実行した場合 実行結果なし #行全体がパターンと一致する行が無いと何も表示されない使用例5
一致した行の後の行も表示する
#/etc/test.txtをAオプションで検索する場合 /etc/test.txt 1 aaa 2 bbb 3 ccc 4 ddd 5 eee 6 fff grep -A1 ccc /etc/text.txt 実行結果 3 ccc #パターンと一致した3行目と1つ後の4行目が表示される 4 ddd grep -A2 ccc /etc/text.txt 実行結果 3 ccc #パターンと一致した3行目と後ろの4行目と5行目が表示される 4 ddd 5 eee使用例6
パターンの前に何文字あるかを併せて表示する
#/etc/test.txtをbオプションで検索する場合 /etc/test.txt 1 aaa 2 bbb 3 ccc 4 ddd 5 eee 6 fff grep -b fff test.txt 実行結果 20:fff #パターンと一致した文字列の前に何文字あるかを一緒に表示される(改行や空白も1文字に含まれる)使用例7
一致した行の前の行も表示する
#/etc/teat.txtをBオプションで検索する場合 /etc/test.txt 1 aaa 2 bbb 3 ccc 4 ddd 5 eee 6 fff grep -B1 fff /etc/test.txt 実行結果 5 eee #パターンと一致した6行目とその前の5行目が表示される 6 fff grep -B2 fff /etc/test.txt 実行結果 4 ddd #パターンと一致した6行目とその前の4行目と5行目が表示される 5 eee #「-B」の後の数字で何行前まで表示するか決められる 6 fff使用例8
パターンと一致したものが含まれる行の行数のみを表示する
#/etc/test1.txtをcオプションで検索する場合 /etc/test1.txt 1 aaa 2 aaa 3 bbb 4 aaa 5 bbb 6 ccc grep -c aaa /etc/test1.txt 実行結果 3 #パターンと一致したものが含まれる行の行数のみ表示使用例9
一致した行の前後の行も表示する
#/etc/test.txtをCオプションで検索する場合 /etc/test.txt 1 aaa 2 bbb 3 ccc 4 ddd 5 eee 6 fff grep -C1 eee /etc/test.txt 実行結果 4 ddd #パターンと一致した5行目とその前後の4行目と6行目が表示される 5 eee 6 fff grep -C2 ddd /etc/test.txtで検索 実行結果 2 bbb #パターンと一致した4行目とその前後の2行目、3行目、5行目、6行目が表示される 3 ccc #「-C」の後の数字で前後何行目まで表示するかを決められる 4 ddd 5 eee 6 fff使用例10
ファイル名を表示しない(複数のファイルを検索した場合のみ)
#/etc/test.txtと/etc/test1.txtをhオプションで検索する場合 /etc/test.txt aaa bbb ccc ddd eee fff /etc/test1.txt aaa aaa bbb aaa bbb ccc grep -h aaa /etc/test.txt /etc/test1.txtで検索 実行結果 aaa #ファイル名が表示されない aaa aaa aaa使用例11
ファイル名も併せて表示される
#/etc/test.txtをHオプションで検索する場合 /etc/test.txt 1 aaa 2 bbb 3 ccc 4 ddd 5 eee 6 fff grep -H aaa /etc/test.txt 実行結果 test.txt:aaa #ファイル名が表示される使用例12
一致するものが含まれているファイルのファイル名のみ表示する
#/etc/test.txtと/etc/test1.txtをlオプションで検索する場合 /etc/test.txt 1 aaa 2 bbb 3 ccc 4 ddd 5 eee 6 fff /etc/test1.txt 1 aaa 2 aaa 3 bbb 4 aaa 5 bbb 6 ccc grep -l ddd /etc/test.txt /etc/test1.txt 実行結果 test.txt #パターンと一致したものを含むファイル名のみが表示される使用例13
一致するものが含まれていないファイルのファイル名のみ表示する
#/etc/test.txtと/etc/test1.txtをLオプションで検索する場合 /etc/test.txt 1 aaa 2 bbb 3 ccc 4 ddd 5 eee 6 fff /etc/test1.txt 1 aaa 2 aaa 3 bbb 4 aaa 5 bbb 6 ccc grep -L ddd /etc/test.txt /etc/test1.txt 実行結果 test1.txt #パターンと一致したものを含まないファイル名のみが表示される使用例14
パターンと一致するものを含む行が指定した数に達したら処理を終了する
#/etc/test1.txtをmオプションで検索した場合 /etc/test1.txt 1 aaa 2 aaa 3 bbb 4 aaa 5 bbb 6 ccc grep -m 2 aaa /etc/test1.txt 実行結果 1 aaa #回数を2と指定したので1行目と2行目のみが表示される 2 aaa使用例15
行番号を併せて表示する
#/etc/test.txtをnオプションで検索した場合 /etc/test.txt aaa bbb ccc ddd eee fff grep -n ccc /etc/test.txt 実行結果 3 ccc #行番号も併せて表示される使用例16
一致した箇所だけを表示する
#/etc/test2.txtをoオプションで検索した場合 /etc/test2.txt aaa bbb ccc ddd eee fff ggg hhh iii grep -o aaa /etc/test2.txt 実行結果 aaa #パターンと一致した箇所のみ表示されるので、「bbb ccc」は表示されない使用例17
結果を表示しない(主にシェルスクリプトなどで判定用に使う)
#/etc/test.txtをqオプションで検索する場合 /etc/test.txt aaa bbb ccc ddd eee fff grep -q aaa /etc/test.txt 実行結果なし #実行結果が表示されない使用例18
パターンに一致しない行を表示する
#/etc/test.txtをvオプションで表示する場合 /etc/test.txt aaa bbb ccc ddd eee fff grep -v aaa /etc/test.txt 実行結果 bbb #パターンと一致しない行が表示される ccc ddd eee fff使用例19
ディレクトリを指定した場合はサブディレクトリ内のファイルも含めて検索する
#/etc/test(ディレクトリ)をrオプションで検索した場合 下記のようなディレクトリ構造という想定 etc-test-testtest(ディレクトリ)-test1.txt(ファイル) -test.txt(ファイル) /etc/test/test.txt aaa bbb ccc ddd eee fff /etc/test/testtest/test1.txt aaa aaa bbb aaa bbb ccc grep -r aaa /etc/test 実行結果 test.txt:aaa testtest/test1.txt:aaa #サブディレクトリ(testtest)にあるファイルの中身まで検索される testtest/test1.txt:aaa testtest/test1.txt:aaa使用例20
サブディレクトリ、さらにシンボリックリンクの先まで含めて検索する
#/etc/testをRオプションで検索した場合 下記のようなディレクトリの構成を想定 etc-test-testtest(ディレクトリ)-test1.txt -test.txt -test.3txt(tteesstt.txtのシンボリックリンク) -tteesstt.txt /etc/test/test.txt aaa bbb ccc ddd eee fff /etc/test/testtest/test1.txt aaa aaa bbb aaa bbb ccc zzz /etc/tteesstt.txt xxx yyy zzz grep -R zzz /etc/test 実行結果 test/testtest/test1.txt:zzz #サブディレクトリにあるファイルとシンボリックリンク先のファイルまで検索して表示する test/test3.txt:zzz
- 投稿日:2021-01-03T10:55:12+09:00
プチロボ用シリアル通信のC言語コードのサンプルを見直しましたので、ご一報まで。
はじめに
2020年末の連休中に
ROS1
(melodic
)の開発環境をwsl(1)
+VS Code
に整理しました。開発環境の利用テストを兼ねて、昨年作成したプチロボ用ダミーコードの修正作業を実施しましたので、コミュニティーの皆様への新年のご挨拶(!?)もかねてアップデート版のコードを忘備録としてアップします。・当初の制作記事、共立エレショップのプチロボサポートサイトのリンク
https://qiita.com/ivvakanni/items/8b5c00b37abe983d9ac1利用環境
・Windows 10 Home
・Wsl1/ubuntu18.04
・WondeRoid Motion Maker Ver3.1.1
・WR-2R4 USBアダプタ X 2 (Buffalo:USBハブ経由)Windows PCにUSBハブを経由して
WR-2R4 USBアダプタ
2 個をプチロボの付属ケーブル(4線)
で接続し、一つのアダプタは Wondows 10 の通信COMポートをMotion Maker
ソフトから、もう一つのアダプタを wsl 上の ubuntu で tty(ttyS3
)を使用して接続して、このプログラムの動作を半二重通信でテストしています。この方法の良いところは、デバイスの抜き差しが一つのポートで済むことです。また、二つのアダプタが散逸するのも防止できるので一石二鳥です。ちなみに、私は、
WR-2R4用の無線モジュール
も持っているので、将来的には、無線使用時のコマンドにも対応させてみたいです。もちろん、Windows PC 側でデバイスを認識させれば、市販の安いUSB/シリアル変換アダプタでも動きます。ただし、
wsl2 だとCOMポートがつながらない
というような記事が散見されたので、真偽は確認していませんが、一応、wsl1を使用しています。
Windows PowerShell
からのコマンドは以下の通り。C:\> wsl --set-version Ubuntu-18.04 1主な変更点
・後からのメンテナンスの利便性のためにコメントを随所に入れた。
・コマンド5以外の返信に対応した。mytty-wr-xx-0.2.1.c/*********************************************************************************************************** * WR-XX Dummy for Linux ver. 0.2.2 * Author : Lian Ivvakanni (01-03-2021) * License: Dual BSD/GPL (with absolutely no warranty.) * Purpose: send return message to Wonder Roid Motion Maker V3.1.1 ***********************************************************************************************************/ #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <fcntl.h> #include <termios.h> #include <unistd.h> #include <string.h> #include <stdio.h> #include <stdlib.h> /* change this definition for the correct port */ #define MODEM_DEVICE "/dev/ttyS3" #define BAUD_RATE B38400 /* command item number */ #define M 8 /* buffer size */ #define N 32 #define HEADER 0xFFFFFFFD #define FOOTER 0xFFFFFFFE int main(int argc, char *argv[]) { int fd, i, j, k, len; struct termios tio; char s[N], sprn[N], buf[N], ret[M][N]; /* Command 5: A/D status dummy data */ char dum_5[] = {0xFD,0x0F,0x15,0x46,0x46,0x46,0x46,0x46,\ 0x46,0x46,0x46,0x46,0x46,0x00,0xFE}; /* set return data */ for (i = 0; i <= 7; i++) ret[i][2] = i + 0x10; /* clear structure for port settings */ memset(&tio, 0, sizeof(tio)); /* BAUDRATE: 38400 bps CS8 : 8bit,no parity,1 stopbit (8n1) CLOCAL : local connection, no modem contol CREAD : enable receiving characters */ tio.c_cflag = BAUD_RATE | CS8 | CLOCAL | CREAD; /* Open modem device for reading and writing */ fd = open(MODEM_DEVICE, O_RDWR); if (fd < 0) {perror(MODEM_DEVICE); exit(-1);} printf("Device Opened...\n"); /* clean the modem line and activate the settings for the port */ tcflush(fd, TCIFLUSH); ioctl(fd, TCSETS, &tio); while(1){ /* clear buffer memory */ memset(buf, '\0', N); /* open device to read */ len = read(fd,buf, sizeof(buf)); if(len < 0) printf("Device Read Error...\n"); /* find header */ if(buf[0] != HEADER) continue; /* check command data size */ if(buf[buf[1] - 1] != FOOTER) continue; /* optional: set buffer to string */ for (i = 0; i < buf[1]; i++){ sprintf(s, "%02X ", buf[i]); strcat(sprn,s); } printf("Rec: %s: %d\r\n", sprn, i); memset(sprn, '\0', sizeof(sprn)); /* find command and send its return, if any */ if(buf[2] == 0x00) write(fd, ret[0], 4); if(buf[2] == 0x02) write(fd, ret[2], 4); if(buf[2] == 0x03) write(fd, ret[3], 4); if(buf[2] == 0x05) write(fd, dum_5, 15); len = 0; } close(fd); return 0; }おわりに
2020年は、
ARM11
上での動作環境にこだわりすぎて実質的なROS
の学習が思うように進みませんでした。そこで、そうした反省を踏まえ、ROSのGUI環境がwslで動くことを知ったこともあり今年前半はROS1
に関しては、開発学習環境をwsl1
(ubuntu 18.04
) 上のMelodic
に固定してみます。そして、少し落ち着いたら、夏前までにはROS2
にもチャレンジしてみたいですね。ちなみに、wsl を使用することで、旧型の ubuntu 搭載PC は奥にしまい机が広く使えるようになったのがうれしいです。ROS専用サーバもRaspberry pi 2 にubuntu18.04を入れて導入しましたので、非常に簡単にできました。
それでは、改めまして、コミュニティーのみなさまの興味深く役立つ記事を楽しみにしておりますので、本年もどうぞよろしくお願いいたします。
- 投稿日:2021-01-03T09:28:02+09:00
メールユーザーの作成方法
ssh でログイン出来ないメールのみのユーザーの作成方法です。
ubuntu 20.10 で確認しました。ログインできるユーザーを taro と hanako に限定する
/etc/ssh/sshd_config(省略) AllowUsers taro hanakoメールユーザーを作成する
sudo adduser --uid 1511 scott確認
1) メールを作成したユーザーに送る
scott@example.com2) メールの受信を確認する
3) ssh で ログインできないことを確認する
ssh scott@example.com