Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

subprocessライブラリでパイプ処理をする

前回の続き。
シェルの醍醐味(?)といえばパイプ処理。

実際のところ

output=`dmesg | grep hda`

に相当するコマンドが、以下の様に。

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) #入力はp1のstdout
p1.stdout.close()  # 他のプロセスがあったとき、p1がSIGPIPEを掴めるようにする。
output = p2.communicate()[0]

……なんか可読性が低いような気がしないでもないですが、
移植性を高めるためにやむなしって感じなんですかね??

シグナル関係は不勉強もいいとこなのですが、
どうもSIGPIPEシグナル*1は結構悪さをするケースがあるようですね。
第6回 UNIXプログラミングの勘所(3):Perl Hackers Hub|gihyo.jp … 技術評論社

*1:閉じてたり、そもそも存在しないパイプやソケットに書き込みしようとした

pythonでシステムコールするsubprocessライブラリ

Pythonでシェルコマンドを呼び出すにはos.callがあるが、
ナウなヤングはsubprocessをつかう

公式の動機付け(PEP 324 -- subprocess - New process module)として

No implicit call of /bin/sh. This means that there is no need for escaping dangerous shell meta characters. <<

実際のところ

PEP 324 -- subprocess - New process module | Python.orgより

output=`mycmd myarg`

output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]

引数も渡せるぞ

import subprocess
import sys
 
command = ["ls", "-l"]
 
res = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
 
sys.stdout.buffer.write(res.stdout)

【自習メモ】cvlcコマンド

動画/音声再生ツールとして著名なVLCにはCLI用のインターフェイスが付いています。
このうち、ヘッドレス……というか、GUIなしで起動するのがcvlcです。

こいつを使うと、標準入出力を経由した動画や音声の再生・加工が容易に行えます。
imagemagick みたいなノリですね。

お手本のコマンドが

$ cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8160}' :demux=h264

mux はマルチプレクサの略で、
その引数tsはmpeg2系の取り扱いの模様。
demux は出力側のマルチプレクサで、h264はお馴染みの動画規格ですね。
(コンテナというらしいが詳細未検証)
https://wiki.videolan.org/TS/#Container_formats

http://sp.e-words.jp/w/TS%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB.html

【イベントログ】第四回ロボデックスにいってきました

東京ビッグサイトで開催されたロボットの活用事例展示会 ロボデックス にいってきました。

www.robodex.jp


ユニバーサルロボティクス、相変わらず盛況



台湾製ロボット テックマンシリーズ


某食品ロボットベンチャーがユニバーサルロボティクスから乗り換えたという、
台湾製🇹🇼テックマンの実機見てきたんですが……なんか画処理系ライブラリがデフォルトで入ってて強い。

稼働中にワーク対象移動しても治具とマーカーの相対位置が変わらなければ
Z方向の傾きも補正してくれる強い機能が実装されてます。
……そんなもん、自社で実装してたらアホほど工数かかるので超助かります。

あと、テックマン社はOMRONにOEM生産をやってるらしく、
一部展示企業はOMRON製いうてプレゼンしていました。
オムロン株式会社と台湾・協調ロボットメーカー テックマン・ロボット社 協調ロボット分野で戦略的提携を締結 “人と機械が協調するモノづくり現場”の更なる実現に貢献 | オムロン

日本の総代理店はSSIさんというところでした。
TM ROBOT 協働ロボット SSI株式会社

【自習メモ】sigaction関数でエラーハンドリング

shuzo-kino.hateblo.jp
の自習メモの続き。
大元で使われていたsigal関数はすでに古いものらしく、sigaction関数を使えというお達しが。

で、そのsigaction関数の定義は以下の通り。
ただし、三番めの引数は非推奨らしく理由がない限りはNULL。

int sigaction(int signum, const struct sigaction *act,
              struct sigaction *oldact);

実際につかうとこんな感じ。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>

static void exit_process()
{
    fprintf(stderr, "Exit normally.\n");
    exit(0);
}


int main(void) {
    int rc = 0;
    struct sigaction act;

    /* シグナル設定 */
    memset(&act, 0, sizeof(act));
    act.sa_handler = exit_process; /* 関数ポインタを指定する */
    act.sa_flags = SA_RESETHAND;   /* ハンドラの設定は一回だけ有効 */

    /* SIGINTにシグナルハンドラを設定する */
    rc = sigaction(SIGINT, &act, NULL);

    // 検証用に10秒だけまつ
    sleep(10);

    return 0;
}

実行結果

$ gcc sigtest2.c 
$ ./a.out 
^CExit normally.

ここで、SIGINTは

SIGINT Termキーボードからの割り込み (Interrupt)

signal関数と比較すると、シグナルを掴むモンが構造体になって色々取り回せるようになったようです。