odin's small box
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 の コマンドプロンプト では [Alt] を押しながら選択すると矩形選択でした。
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 のような動きをします。