2020-04-04

RHEL7にFedora 30のchroot環境をつくる

  1. まずディレクトリをつくる
    sudo mkdir -p /opt/chroot/fedora30/var/lib/rpm
    sudo rpm --root /opt/chroot/fedora30/var/lib/rpm --initdb
    
  2. パッケージをインストールする
    wget ftp://ftp.jaist.ac.jp/pub/Linux/Fedora/releases/30/Everything/x86_64/os/Packages/f/fedora-release-30-1.noarch.rpm
    wget ftp://ftp.jaist.ac.jp/pub/Linux/Fedora/releases/30/Everything/x86_64/os/Packages/f/fedora-release-common-30-1.noarch.rpm
    wget ftp://ftp.jaist.ac.jp/pub/Linux/Fedora/releases/30/Everything/x86_64/os/Packages/f/fedora-repos-30-1.noarch.rpm
    wget ftp://ftp.jaist.ac.jp/pub/Linux/Fedora/releases/30/Everything/x86_64/os/Packages/f/fedora-gpg-keys-30-1.noarch.rpm
    sudo rpm --root /opt/chroot/fedora30 --nodeps -ivh fedora-release-30-1.noarch.rpm fedora-release-common-30-1.noarch.rpm fedora-repos-30-1.noarch.rpm fedora-gpg-keys-30-1.noarch.rpm
    
  3. 必要となる設定ファイルをつくる
    sudo mkdir -p /opt/chroot/fedora30/{dev,etc}
    sudo cp -a /dev/{null,stderr,stdout,stdin,zero,random,urandom} /opt/chroot/fedora30/dev/
    sudo cp /etc/{resolv.conf,localtime} /opt/chroot/fedora30/etc/
    
  4. yumでbashとdnfをインストールする
    sudo yum --nogpgcheck --installroot=/opt/chroot/fedora30/ install bash dnf
    
  5. chrootして、他のパッケージをインストールする
    sudo chroot /opt/chroot/fedora30/
    dnf install packages...
    

2020-03-29

timeoutコマンドで設定したタイムリミットをキャンセルするには

timeoutコマンドを使用すると、任意のコマンドの実行時間を制限することができる。 例えば、
timeout 30 sleep 1h
は、sleep 1hというコマンドを実行し、30秒経つとTERMシグナルを送る。

一度設定したタイムリミットを延ばしたくなった場合、以下のようにするとよい。

kill -s SIGKILL PID
または、
kill -s SIGSTOP PID
なお、PIDtimeoutプロセスの方のPIDである。 後者の場合、SIGCONTを送れば、ストップしていた時間は延長されずにタイムリミットが経てばTERMシグナルが送られる。

2020-03-28

tcpdumpを一般ユーザーで実行する設定

Tcpdumpをsudoなしで一般ユーザーから実行するための設定方法を説明する。
  1. まず/usr/sbin/tcpdumpが実行できるユーザーを限定する。
    sudo groupadd pcapgroup
    sudo usermod -a -G pcapgroup user
    sudo chgrp pcapgroup /usr/sbin/tcpdump
    sudo chmod 750 /usr/sbin/tcpdump
    
    もしwheelでよければ、1行目のgroupaddは要らない。
  2. ケーパビリティを/usr/sbin/tcpdumpに設定する。
    sudo setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
    
上記の設定後に、tcpdumpがpromiscuous modeに設定することも含めて、ユーザー権限でできるようになる。

参考

2020-03-23

RolandのミキサーM-200iのREACポートのオーディオをLinuxマシンで録音

Rolandという浜松にある音響機器メーカーが出しているM-200iというオーディオミキサーがある。 このミキサーには、REACポートというディジタル音声を40チャネル出力するポートが備わっている。 ステージボックスとの接続や他のミキサーとの接続に使用するポートで、Ethernetパケットに音声情報を載せて送るようになっている。

Windows用には、このポートを通して録音するソフトが出ている。 Mac OS X用には、サードパーティからREAC driverというGPL3のツールが出ている。 どちらもLinuxでは使用できないので、REAC driverのソースを参考に、Linuxで動くものを作成し始めた。

REAC driverのようなカーネル空間で動くオーディオドライバにすると扱いやすいのだろうが、そこまでするのは大変なので、ユーザー空間で動かすプログラムをつくることにした。 Linuxのsocketをつかってプログラムを書いてみたが、パケットロスを回避するのが難しく断念、最終的に、tcpdumpでファイルに保存しておき、後処理をすることにした。

  1. まず、M-200iのREACポートとLinuxマシンとをLANケーブルで接続する。 (1 Gbpsでリンクすることを期待していたのだが、dmesgを見るとなぜか100 Mbpsでリンクしていた。)
    e1000e: enp0s31f6 NIC Link is Up 100 Mbps Full Duplex, Flow Control: None
    e1000e 0000:00:1f.6 enp0s31f6: 10/100 speed: disabling TSO
    
    今回はストレートケーブルを使って、スイッチングハブなどを介さずに接続した。
  2. 以下のようにtcpdumpでキャプチャし、ファイルに保存する。このとき、オプション-Bでカーネル上のバッファサイズを大きく取っておく。今回使用した環境 (Intel Core i7-7700 + H270) では、256MiBに設定したらようやくパケットロスしなくなった。
    $ tcpdump -i enp0s31f6 -B 262144 -w a.pcap
    
    このときtcpdumpはパケットロスしたと報告するのだが、次のステップでパケットを解析すると、音声情報が載ったパケットのロスは無かった.
  3. そのあと、自作のプログラムで、チャネルを選択して24-bit WAVE形式に変換する。プログラム自体はそのうちGitHubで公開するかもしれない。
    $ reacrecorder --save-channels 21,22,39,40 --save-wav-24 --load-pcap-file a.pcap
    

REAC driverにはM-200iとのネゴシエーションなどいろいろな処理が書かれているのだが、今回の用途には必要なかった。 REAC masterとなるM-200iから常に音声データがブロードキャストされている。 そのパケットをキャプチャしてWAVEに変換すれば良いだけだった。

2020-01-02

カイロ比較

寒い季節に入り、外出時にカイロを持ちたくなる。色々な種類のカイロを比較し、コストの点でどれが良いか考えてみる。

使い捨てカイロ

鉄を袋の中で徐々に参加させることで発熱する。

まとめ買いすれば、1個あたり20円くらい。

電気カイロ

リチウムイオン電池に充電しておき、内蔵のヒーターにより発熱する。 ラインナップが豊富だが、 今回は7800mAhで3000円のものを比較に取り上げる。

蓄えられるエネルギーは、

7800mAh × 3.6V = 28Wh
ジュールになおすと、
28Wh × 3600s/h = 101kJ
になる。 というわけで、充電1回あたりの電気代は0.03円になる。

リチウムイオン電池は、高温で使用するとあまり寿命が持たないという点も考慮するべきで、例えば1シーズン4ヶ月毎日使用し、2年間こわれないとすると、240回使用できることになる。 本体価格3000円の場合は、1回あたりのコストは

3000円 / 240 = 12.5円
になる。

スイッチがついており使用したいときだけ発熱できる。

オイル充填式カイロ

ベンジン (ナフサ、ガソリンとも呼ばれる) を白金触媒により酸化させることで発熱する。酸化反応を開始するために最初だけ火で加熱させるが、使用中に炎が出ているわけではない。 白金カイロminiを例に比較する。持続時間12時間で他のカイロと比較しやすいので。

燃料は500ml入が640円くらいで販売されているので、1回あたり12.5ml使用する場合の1回あたりのコストは、

640円/500ml × 12.5ml = 16円
となる。 火口は1シーズン毎に取り替えが推奨されている。742円で販売されており、4ヶ月毎日 (120日) 使用すると仮定し、
742円 / 120 = 6.2円
が1回あたり火口のコストになる。 本体は何年でも使用できるようなので、1回あたりコストには含めない。合計で、22円/回になる。

ガソリンの比重が0.737g/ml、発熱量が47kJ/gなので、熱量は

12.5ml × 0.737g/ml × 47kJ/g = 433kJ
である。

なお、白金カイロstandard (miniの2倍) は使い捨てカイロの13倍の熱量とのことなので、使い捨てカイロの熱量は60-70kJであろうと考える。

燃料を使用するので、健康上・安全上の注意が必要である。燃料を飲まない、吸わない、火気の無い場所で保管・給油する。
いちど発熱が始まると、燃料を使い切るまで発熱し続ける。電気カイロのようにon/offを繰り返すような使い方 (通勤・通学の行きと帰りだけ使用するなど) には不便かもしれない。

比較

コスト、熱量など、表にまとめる。

熱量の点ではオイル充填式カイロが最も高い。この比較では白金カイロminiだが、standardは2倍になる。また、コスト1円あたりの熱量で比べても、オイル充填式カイロの方が良い。

使い捨てカイロ 電気カイロ オイル充填式カイロ
時間12h12h12h
1回あたりコスト20円13円22円
本体価格n/a3000円2400円
質量40g250g70g
1回あたり熱量60-70kJ100kJ433kJ
熱量/コスト3.3kJ/円8.0kJ/円19kJ/円

使用シナリオ

使用するシナリオを想定し、どのカイロが良いか考えてみる。

通勤・通学

朝・夕方に1時間づつなど、断続的な使用であれば、電気カイロが良いだろう。使用するときだけonにすれば良い。 初期費用は使い捨てカイロより高いが、上記の例では150回使用すれば使い捨てカイロと同じコストになる。

レジャーなど

もし継続的にカイロを使用する必要が無いのであれば、使い捨てカイロが良いだろう。

外の仕事

外で働くなど長時間にわたってカイロを使用したいのであれば、オイル充填式カイロが良いと思う。 いちど発熱が始まると燃料を使い切るまで発熱し続ける。途中で止めるわけにはいかない。
広告

2019-03-02

Xperia Z5にFacebookアプリをインストールできない

Messenger, Messenger Lite, Facebook Lite などをインストールしようとすると、いずれもエラーコード 910 で失敗した。

サードパーティからAPKをダウンロードして、adb installをつかってインストールすると良いという記事を見つけたので試してみたが、 以下のエラーで結局できなかった。

Failure [INSTALL_FAILED_DUPLICATE_PERMISSION: Package com.facebook.mlite attempting to redeclare permission com.facebook.permission.prod.FB_APP_COMMUNICATION already owned by com.facebook.appmanager]

どうやら、プリインストールされている com.facebook.appmanager が悪いようだ。

ここまで調べて、インストールは諦めることにした。

もともとインストールしようとした同期は、ブラウザでMessengerにアクセスすると、アプリのインストールを促されて使用できなくなったからだ。 ブラウザをDesktop siteモードにすると、Messengerにアクセスできるので、回避策になる。

2018-11-02

pip install --userでインストールしたパッケージをprocmailで使用する

ホームディレクトリにPIPをつかってパッケージをインストールすると、.local/lib/の下に展開される。 ところが、このディレクトリはSELinuxのコンテクストがunconfined_u:object_r:gconf_home_t:s0になっており、問題が生じる。

例えば、ProcmailからPythonを呼び出し、その中でモジュールをインポートしようとすると、以下のようなエラーメッセージが出る。 以下はBeautifulSoupを使用した例。

Traceback (most recent call last):
  File "/tmp/a.py", line 3, in 
    from bs4 import BeautifulSoup
ImportError: cannot import name 'BeautifulSoup'

とりあえず以下のコマンドで問題を回避する。 $ chcon -R unconfined_u:object_r:user_home_t:s0 .local/lib/python3.4/site-packages/