名前付きパイプを試してみる

Unix/Linux には 名前付きパイプというものがあります。

Unixドメインソケットの説明で「名前付きパイプに類似した機能を備え〜」と書いてあって 今まで何となく「パイプに名前付けらるんだな」くらいにと思ってましたが 実際に使ったことがなかったので、試してみます。

使用するのは mkfifo というコマンド。

$ mkfifo /tmp/namedpipe

これで作成完了。

$ ls -l /tmp/namedpipe

prw-rw-r-- 1 xxxxx xxxxx 0 Oct 22 22:06 /tmp/namedpipe

なんかできてますし 権限の先頭が "p" になってます。

機能はなんとなく想像できますね。

動作を確認するために、 まず別のコンソールで この名前付きパイプを tail します。

$ tail -f /tmp/namedpipe

待機状態になりました。

tail しているコンソールとは別のコンソールで 名前付きパイプに向かってリダイレクトしてみます。

$ echo test1 > /tmp/namedpipe
$ echo test2 > /tmp/namedpipe

tail しているコンソール側に 出力されていきます。

$ tail -f /tmp/namedpipe

test1
test2

なるほど、直接つながっていなくても 名前付きパイプを通してデータが連携できてますね。

rm コマンドで削除できます。

$ rm /tmp/namedpipe

ここまでだと、ほぼ通常のファイルを使っても同じようなことができますが 受け側で tail していない状態でリダイレクトすると 通常のファイルとは違う動きになりました。

$ echo test3 > /tmp/namedpipe

受け側が 名前付きパイプを tail していないとこの状態で リダイレクトすると リダイレクトした側が待機状態になります。

受け側で 名前付きパイプに tail や cat などすると リダイレクト側の待機が解除されます。

$ cat /tmp/namedpipe

test3

便利に使えるケースはありそうですね。

Windows10 の コマンドプロンプトで矩形選択する

メモです。

以前は、コマンドプロンプトの「簡易編集」が有効になっていれば 矩形選択できていたのですが、 Windows10 になったためか できないようになっていました。

WRITE_0964_01

Windows10 の コマンドプロンプト では [Alt] を押しながら選択すると矩形選択でした。

WRITE_0964_02

PostgerSQL ARRAY_AGG の と Oracle の LISTAGG

PostgreSQL には 行を 配列に変える ARRAY_AGG という関数があります。 これと配列を文字列に変える ARRAY_TO_STRING を組み合わせることで 行をカンマ区切りなどの文字列にすることができます。

例えば こんなテーブルに対して...

db=# SELECT id, name FROM fruit;

 id |  name
----+--------
  1 | りんご
  2 | みかん
  3 | ぶどう

次のような結果を得ることができます。

db=# SELECT ARRAY_TO_STRING(ARRAY_AGG(name order by id), ',') AS names FROM fruit;

        names
----------------------
 りんご,みかん,ぶどう

これを Oracle でなんとかできなかと思っていたんですが Oracleでも11g R2 から LISTAGG という関数が追加されていました。

SQL> SELECT LISTAGG(name, ',') WITHIN GROUP (order by id) AS names FROM fruit;

        names
----------------------
 りんご,みかん,ぶどう

LISTAGG 関数は ARRAY_AGG + ARRAY_TO_STRING のような動きをします。

Google サイト内検索

Amazonアソシエイト