20210103のLinuxに関する記事は9件です。

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: そのようなファイルやディレクトリはありません

https://askubuntu.com/questions/1239503/ubuntu-20-04-and-20-10-etc-securetty-no-such-file-or-directory

sudo cp /usr/share/doc/util-linux/examples/securetty /etc/securetty

コピーしないといかんのはどうかと思う。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.conf

HTTP接続の場合のドキュメントルートは、
/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

image.png

※パブリック 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 pdo

pdo_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.php

insertモードにて、以下の通り記述→保存。

<?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

image.png

これにて、環境構築 → ブラウザからの動作確認が一通りできました!

終わりに

Apache, MySQLもいいけれど、あまり馴染みのないNginx, PostgreSQLにも触れてみたくって。
特にPostgreSQLとPHPの連携のところ(PDO)で躓いたけど、できてよかった。

参考

LAMPとの比較

手順

1. ソフトウェアのインストール

2. Nginx

3. PostgreSQL

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

プチロボ基板でサーボモータ制御をするシリアル通信単機能モジュールを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;
}

おわりに

コマンドラインで使うなら、デバイスの指定もできるようにしたいところですが、関数として使用するにはちょうどいいかな、という感じでの仕上がりになっています。本当のところ、やっと、ここまで来たな・・・と感無量です。

次は、サーボモータ二つを使ったプログラムに挑戦します。

あとは、サーボモータの「トルク」という数値が現実の世界でどのような役割を担って働くのかよくわかりませんので、今後、ちゃんと調べておこうと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【インフラ】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

参考文献

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

(Windows10)Linux環境とgnuplotを導入する。

この記事の対象者

Windows10のマシンしか持っていないが、Linux環境が必要な人。
・最近サーバーの勉強を始めた人。
・プログラミングの授業がもうすぐ始まる大学生。

Abstract

Windows10上で、UbuntuターミナルとLinuxコマンド(bashsshgitaptなど)を使える環境を構築する。そして、Ubuntugnuplotを導入し、出力結果をWindows10上で表示できるようにする。

Windows10 でLinuxの環境を構築する。

Microsoft Storeで「Ubuntu 18.04 LTS」または「Ubuntu 20.04 LTS」をインストールする。

18.04
https://www.microsoft.com/store/productId/9N9TNGVNDL3Q

20.04
https://www.microsoft.com/store/productId/9N6SVWS3RX71
ubuntu

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-6-9-0-31-setup.exe

Xming-fonts-7-7-0-10-setup.exe

インストールができているかのチェック

以下のコマンドを実行して目のウィンドウが出てきたら成功。

$ xeyes &

eyes

注意

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編集するためのコマンド例をあげておく。上から実行するだけで、~/.bashrcexport 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 ~/.bashrc

gnuplotのインストール

まず、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 gnuplot

gnuplotの動作確認

ターミナル上で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)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 というソフトを使うこととします。
cantata_playback.png

番外編 スマホを使って 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.conf
ubuntuの場合
$ 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.conf
manjaroの場合
$ 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音源を含めて常用の音楽再生アプリとしても良いかもです。
cantata.png
左端の"フォルダ”アイコンを選択してペイン左側の"Server Folders” (上の図でマウスカーソルが置かれてるところ)をクリックするとmpd.conf の music_directory で指定したディレクトリが開きます。ここから聞きたいファイルを選んでペイン右側にドラッグ-ドロップして再生ボタンをクリックすればファイルが再生されるはずです。ハードウェアボリュームを上げていってください。サウンドが再生されましたよね?おめでとう。

● DSDネイティブ再生していることの確認

ネイティブ再生してるかの確認は、もしDACに再生中のデータのフォーマットを表示する機能がついている場合、その表示を見るのが早くて確実です。
表示する機能がなければ、先に調べたDACのデバイス名を DEV_NAME として、次のコマンドを叩いてみてください。

DEV_NAMEは確認したいDACのデバイス名
$ cat /proc/asound/DEV_NAME/pcm0p/sub0/hw_params

何も再生していない時

closed

DSDデータをネイティブ再生している時

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の再生についてはこれ以上のことが書けません。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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   

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

プチロボ用シリアル通信のC言語コードのサンプルを見直しましたので、ご一報まで。

はじめに

2020年末の連休中にROS1melodic)の開発環境を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を入れて導入しましたので、非常に簡単にできました。

それでは、改めまして、コミュニティーのみなさまの興味深く役立つ記事を楽しみにしておりますので、本年もどうぞよろしくお願いいたします。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

メールユーザーの作成方法

ssh でログイン出来ないメールのみのユーザーの作成方法です。
ubuntu 20.10 で確認しました。

ログインできるユーザーを taro と hanako に限定する

/etc/ssh/sshd_config
(省略)
AllowUsers taro hanako

メールユーザーを作成する

sudo adduser --uid 1511 scott

確認

1) メールを作成したユーザーに送る
scott@example.com

2) メールの受信を確認する

3) ssh で ログインできないことを確認する

ssh scott@example.com
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む