読者です 読者をやめる 読者になる 読者になる

それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

POSIX の メッセージ・キューを確認する。コマンドで。

POSIX message queue を確認する。

Linux なら /dev に出現する。

takuya@:~$ ls /dev/mqueue/

キューがあるとき

/sample という名前でキューを作ったのでキューを確認することが出来る。

takuya@:mq$ ls /dev/mqueue/
sample

キューの状態をサクッと確認する。

cat すれば中身が見られる。

takuya@:mq$ sudo cat  /dev/mqueue/sample
QSIZE:30         NOTIFY:0     SIGNO:0     NOTIFY_PID:0

キューを削除する

/dev/ から消せば、簡単にゴミを消せる。

参考資料

http://unix.stackexchange.com/questions/70837/linux-command-to-check-posix-message-queue

PythonでPOSIXのMessageQueue を使う。

POSIX の メッセージ・キューを使う。

プロセス間通信などと呼ばれる。POSIXのキューを使ってみる。

プロセス間通信 - Wikipedia

プロセスとプロセスのデータのやり取りにメッセージ・キューを使うことで幾分楽になる。マルチスレッド以前に複数プロセスでデータをやり取りすると複数分散して処理が楽になることもある。

動作例

youtu.be

ポイント

  • 送信側はドンドン送信できる。
  • 受信側は逐次読み込んで取り出せる。
  • データが空っぽなら、受信側はブロックされる。

受信側は、なにもしなくても受信不可ならブロックされるので楽ちん。感覚的には、空っぽのパイプと同じですね。

インストール

python で使うには posix_ipcを使う

pip install posix_ipc

Queueにメッセージを追加

#!/usr/bin/env python

import json
import posix_ipc

def main () :
  mq = posix_ipc.MessageQueue("/my_q01", posix_ipc.O_CREAT )
   #
  cnt = 0
  #
  while True:
    cnt = cnt + 1
    obj = { "counter": cnt }
    mq.send( json.dumps( obj ) )
    print("pushed: %d" % cnt )
    time.sleep(1)


if __name__ == "__main__" :
  main()

Queue からメッセージを取り出す

#!/usr/bin/env python

import json
import posix_ipc

def main () :
  mq = posix_ipc.MessageQueue("/my_q01", posix_ipc.O_CREAT )
  # 
  while True:
    data = mq.receive()
    print( data[0] )
    time.sleep(1)

if __name__ == "__main__" :
  main()

Queue を削除する

#!/usr/bin/env python
import posix_ipc

mq = posix_ipc.MessageQueue("/my_q01")
mq.unlink()

参考資料

Semanchuk.com - POSIX IPC for Python - Semaphores, Shared Memory and Message Queues

シェルで指定文字に文字列を分割して結合する。

文字列をシェルで、指定文字数に分割して結合するには

選択肢になるコマンドは、分割・結合でそれぞれ次の通り

  • 分割
  • 結合
    • paste
    • tr

などが使えることがわかった。

分割の例
fold -w2
grep -E -o '.{2}'

文字列を指定文字に分割する。fold コマンド

fold コマンドが便利。ruby であればsplit/grep などで出来る。

takuya@~$ echo $(openssl rand -hex 6) | fold -w1
0
3
3
9
5
2
f
0
7
3
1
e

fold -w コマンドは、指定バイトで切り出す。

takuya@Desktop$ echo $(openssl rand -hex 4) | fold -w4
d0ac
01f3

指定バイトなので日本語のようなユニコード文字列は3バイトで切り出す。

takuya@~$ echo ああああ | fold -w 3
あ
あ
あ
あ

grep でもなんとか出来る

 echo $(openssl rand -hex 4) | /bin/grep -i -E  -o  '.{2}'
7f
1c
10
ec

おお。grep 万能説!

さて、分割した文字列を結合するには

join かと思いきや、paste を使うと便利だった。

paste -sd ':'

paste で複数行を結合

takuya@Desktop$ cat - | paste -sd ","
a
b
c
a,b,c

使いみち

xdd/hexdump/od 何かと組み合わせると便利かも

たとえば、画像のdumpをちょっと見る。

takuya@Desktop$ xxd -p  -l 100 logo.png  | ~/.bin/grep -i -E  -o  '.{2}' | paste -sd ","
89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,00,60,00,00,00,2d,08,03,00,00,00,66,80,9e,b8,00,00,00,19,74,45,58,74,53,6f,66,74,77,61,72,65,00,41,64,6f,62,65,20,49,6d,61,67,65,52,65,61,64,79,71,c9,65,3c,00,00,03,12,69,54,58,74,58,4d,4c,3a,63,6f,6d,2e,61,64,6f,62,65,2e,78,6d,70,00,00,00,00,00

例えば、MACアドレスっぽいものを作る

takuya@~$ echo $(openssl rand -hex 6) | fold -w2 | paste -sd ':'
7e:25:cb:0b:70:ef

参考資料

http://stackoverflow.com/questions/15553493/how-to-print-only-the-hex-values-from-hexdump-without-line-numbers-or-ascii-tabl

http://stackoverflow.com/questions/2764051/how-to-join-multiple-lines-of-file-names-into-one-with-custom-delimiter

http://stackoverflow.com/questions/7578930/bash-split-string-into-character-array