Archive for the ‘プログラミング’ Category

MQTT / RabbitMQ

日曜日, 3月 9th, 2014

前回のRabbitMQでMQTT(MQ Telemetry Transport)の動作確認もしてみたので、そのメモをしておきたいと思います。
MQTTについては以下参照。

HTTPからMQTTへ – IBMが提唱するモノとモノがつながる時代に最適化したプロトコル&アプライアンス
http://it.impressbm.co.jp/special/2013/12/09/5313

AMQP(Advanced Message Queuing Protocol)と何が違うのか、どのように使い分けるのか、ということですが、MQTTは組み込み機器等で軽量M2M(Machine-to-Machine)の通信で使われるもの、と認識しています。

インストールは、前回の手順の続きで、プラグインを追加し、サーバを再起動します。
環境 : MacOSX 10.9
参考 : https://gist.github.com/voluntas/8238751

./sbin/rabbitmq-plugins enable rabbitmq_mqtt
./sbin/rabbitmq-server

次に、PublisherとSubcriberのプログラムをPythonで用意します。
(これは参考サイトのものをそのIPアドレスを変えて使いました。pub.py,sub.py)
以下モジュールをインストールします。
環境 : Windows7

pip install paho-mqtt

通信内容をキャプチャして内容を見てみたかったので、別のマシンからアクセスすることにしました。
コマンドプロンプトをPub/Subと別々にひらき、それぞれを実行します。(subから実行。複数可)
pubを実行すると、

my/topic/string 0 hello world

と表示されます。

「軽量」ということなので、どんなパケットだろうということでパケットキャプチャしてみました。
mqtt_sub
上はsub側のバケット部分を選択しています。下はpub側。
mqtt_pub

確かに少ないですね。

RabbitMQ / Mac

木曜日, 3月 6th, 2014

Erlangつながりで、MacでRabbitMQをうごかしてみたので、メモしておきたいと思います。

RabbitMQ(ラビットエムキュー)は、Advanced Message Queuing Protocol(AMQP)を使用した、オープンソースのメッセージ指向ミドルウェア。RabbitMQ Serverは、Erlang言語で記述されており、クラスタリングとフェイルオーバーのためにOpen Telecom Platformフレームワークで構築。
(by Wikipedia)

まずMac用Erlangを以下からダウンロードしてインストール
http://code.google.com/p/rudix/downloads/detail?name=erlang-R15B02-0.pkg
/usr/local/binにerlなどがイントールされます。

RabbitMQサーバは以下サイトから rabbitmq-server-mac-standalone-3.2.4.tar.gz をダウンロード
http://www.rabbitmq.com/install-standalone-mac.html
rabbitmq_server-3.2.4/sbinのファイルを実行します。

以下チュートリアルを使用
https://github.com/rabbitmq/rabbitmq-tutorials/tree/master/erlang

チュートリアルの中に以下を展開します。

git clone https://github.com/rabbitmq/rabbitmq-tutorials
cd rabbitmq-tutorials/erlang
wget http://www.rabbitmq.com/releases/rabbitmq-erlang-client/v2.7.0/rabbit_common-2.7.0.ez
unzip rabbit_common-2.7.0.ez
ln -s rabbit_common-2.7.0 rabbit_common
wget http://www.rabbitmq.com/releases/rabbitmq-erlang-client/v2.7.0/amqp_client-2.7.0.ez
unzip amqp_client-2.7.0.ez
ln -s amqp_client-2.7.0 amqp_client

rabbitmq_server
プラグインを有効にします。

./rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
mochiweb
webmachine
rabbitmq_web_dispatch
amqp_client
rabbitmq_management_agent
rabbitmq_management
Plugin configuration has changed. Restart RabbitMQ for changes to take effect.

これで、ブラウザで管理画面が表示できます。(サーバ起動後 guest/guestでログイン)

RabbitMQ.

サーバを起動します。

./rabbitmq-server

RabbitMQ 3.2.4. Copyright (C) 2007-2013 GoPivotal, Inc.
## ## Licensed under the MPL. See http://www.rabbitmq.com/
## ##
########## Logs: ./../var/log/rabbitmq/rabbit@N-no-MacBook-Pro.log
###### ## ./../var/log/rabbitmq/rabbit@N-no-MacBook-Pro-sasl.log
##########
Starting broker… completed with 6 plugins.

rabbitmq-tutorials/erlang

ls
README.md emit_log_topic.erl receive_logs.erl
amqp_client new_task.erl receive_logs_direct.erl
amqp_client-2.7.0 rabbit_common receive_logs_topic.erl
emit_log.erl rabbit_common-2.7.0 send.erl
emit_log_direct.erl receive.erl worker.erl

tutorial実行

./send.erl
[x] Sent ‘Hello World!’
./receive.erl
[*] Waiting for messages. To exit press CTRL+C
[x] Received <<"Hello World!">>

参考サイト
http://d.hatena.ne.jp/iwasakims/20130512/1368378919
http://opentechnica.blogspot.jp/2012/02/macrabbiqmq.html

ErlangでTCPプログラム

日曜日, 2月 9th, 2014

「プログラミングErlang」(オーム社)この本を読むと、Erlangでいろいろと作ってみたくなります。
文法的にとっつきにくいところがあるのですが、実例が豊富にあり読み進めるにつれこの言語の魅力に引き込まれます。
私は関数型言語ということよりも、小さなプログラム同士を通信させながら大きなものをつくっていくという疎結合の特徴が魅力です。
そこでまず基本となる、TCPクライアント、サーバ通信のテストをしてみました。
本のサンプルを参考に、わかりやすくするためこれ以上ないくらいに余計な部分をそぎ落としました。

環境:Erlang R16B03(erts-5.10.4)[64-bit] Eshell V5.10.4 (otp_win64_R16B03.exe)/ Windows7

-module(socket_test).
-compile(export_all).
-import(lists, [reverse/1]).

start_client(Str) ->
    {ok, Socket} = 
	gen_tcp:connect("localhost", 1234,
			[binary, {packet, 4}]),
    ok = gen_tcp:send(Socket, Str),
    receive
	{tcp,Socket,Bin} ->
	    io:format("Client received = ~p~n",[Bin]),
	    gen_tcp:close(Socket)
    end.

start_server() ->
    {ok, Listen} = gen_tcp:listen(1234, [binary, {packet, 4},
					 {reuseaddr, true},
					 {active, true}]),
    {ok, Socket} = gen_tcp:accept(Listen),
    gen_tcp:close(Listen),
    loop(Socket).

loop(Socket) ->
    receive
	{tcp, Socket, Str} ->
	    io:format("Server received  = ~p~n",[Str]),
	    gen_tcp:send(Socket, [Str]),
	    loop(Socket);
	{tcp_closed, Socket} ->
	    io:format("Server socket closed~n")
    end.

クライアントとサーバは同じプログラムを使います。コンソールを二つ立ち上げてそれぞれErlangシェルで実行します。
[サーバ側]

c(socket_test).
socket_test:start_server().

[クライアント側]

socket_test:start_client(“TestMessage”).

“TestMessage”がサーバ側のコンソールに表示されます。

それぞれの言語、それをとりまく環境の得意なところを知っておくことによって、より効率のよいソリューションを生み出すことができると常々思っています。このErlang、強力に創造性を刺激してくれそうです。

関数型言語

木曜日, 1月 30th, 2014

SoftwareDesign 2月号で「関数型プログラミング再入門」という特集がくまれました。「再入門」とあるのがミソかなと思います。特集では、関数型言語Lisp、OCaml、Haskell、Erlangが取り上げられ、Python、JavaSE8、Rubyを利用した関数型プログラムが紹介されています。
関数型言語は昔から興味を持ち続けているのですが、習得がなかなか難しく、一度学んでもしばらく使わないとすぐに理解できなくなっていました。(仕事で使うことはほとんどありません) 最近は統計学、データ解析などがブームなのも後押しをして、私のモチベーションも「再び」上がり現在、F#、Hakell、Erlangを勉強中の身であります。ただ学ぶだけでなく、これを使って何かを作るという目的があると意欲がつづきます。このブログでも記事がかけたらなぁと思っています。この投稿はそのキックオフみたいな意味合いもあります。


しかしながらプログラム言語というのは、プログラマであればだれでも興味を持つ話題です。「これからはやる言語は何?」、「初めてプロクラムを組むんだけど何を学んだらいい?」、「仕事に有利な言語は何?」などなど、それぞれいろんな意見が飛び交います。今はたくさんありすぎて何から学んだらいいか本当に悩むところです。私自身がプログラムを初めてころは、Windowsもインターネットも一般的なものでなかった時代で、C言語とアセンブラでほとんど仕事をしていました。それからWindows等のGUIとともにC++、インターネットとともにJava、HTML、PHP、JavaScript・・・・などと現在に至るわけですが、テクノロジーの進化とともに時間的に緩やかに学ぶことができたのは幸運だったかもしれません。C++もJavaももっと前からあったのですが、大々的に使われだしたのは、それぞれ使われる環境がそろってきてからだと思っています。GUIのプログラムはオブジェクト指向がマッチし、ネットワークプログラムはJavaが得意とします。そして次に関数言語ですが、構文解析、並列処理を得意といます。これも昔からありますが、いよいよビッグデータの時代に「再び」脚光を浴びようとしているのではないでしょうか。

私は、F#でWindowsストアアプリ、Haskellでファイルコンバータ、Erlangでデータ処理用サーバを作ってみたいと思っています。
またまたひさびさの投稿でした。

C言語末尾再帰

火曜日, 11月 15th, 2011

最近マイブームなので、ちょっと気になってテストしてみました。
以下末尾再帰関数の具体例のメモです。
実際にスタックを消費せずループしているかどうか。
動作環境はMac Snow Leopardのコンソール。

/*test.c*/
#include<stdio.h>
void loop(int x)
{
        if(x == 0){
                return;
        }
        printf("%d ", x);
        loop(x + 1);
}
main()
{
        loop(1);
}

cc -o test test.c でコンパイルした場合、261623で、Segmentation fault.
cc -o test -O2 test.c でコンパイルした場合、無限ループ
アセンブラコードを見てみると、前者は、

_loop:
Leh_func_begin1:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
subq $16, %rsp
Ltmp2:
movl %edi, -4(%rbp)
movl -4(%rbp), %eax
cmpl $0, %eax
je LBB1_2
movl -4(%rbp), %eax
xorb %cl, %cl
leaq L_.str(%rip), %rdx
movq %rdx, %rdi
movl %eax, %esi
movb %cl, %al
callq _printf
movl -4(%rbp), %eax
addl $1, %eax
movl %eax, %edi
callq _loop

後者は、

_loop:
Leh_func_begin1:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
pushq %r14
pushq %rbx
Ltmp2:
leaq L_.str(%rip), %rbx
movl %edi, %r14d
jmp LBB1_1
.align 4, 0x90
LBB1_3:
leal 1(%r14), %esi
xorb %al, %al
movq %rbx, %rdi
callq _printf
addl $2, %r14d
LBB1_1:
testl %r14d, %r14d
je LBB1_4
xorb %al, %al
movq %rbx, %rdi
movl %r14d, %esi
callq _printf
cmpl $-1, %r14d
jne LBB1_3
LBB1_4:
popq %rbx
popq %r14
popq %rbp
ret

確かに関数呼び出しがなくなっている。
最適化しないと末尾再帰にならないみたいである。

Lazy K

日曜日, 9月 4th, 2011

関数型プログラム言語のひとつです。
組み込み関数が3つしかないとてもシンプルな構造をもつ言語です。
しかしこれだけでプログラムを組むことは、ちょっと非現実的で、Scheme言語(LISPの一種)から変換された形のものを実行します。

この話になった経緯ですが、最近関数型言語Clojure(Lispの一種)の必要性を感じ勉強していたところ、もう少しさかのぼってLispを勉強しようと思い、Scheme周辺の情報収集をしているときに見つけました。たったこれだけの記号でプログラムを表現できる(関数表現)のが面白く、実際に動かしてみたくなりました。
Lisp言語はとても古い言語なので、長くプログラマをやられている方なら、一度は興味を持たれたことがあると思います。私が興味をもったのは、随分前にMacでLispを使ったアルゴリズムコンポジションを知ったときでした。音楽データもリスト表現できるので、Lispには相性がいいのでしょう、結構ネットでも資料が見つかります。(Common Lisp Musicなど)
そのうち関数型言語が話題になり(Haskell)、またLispが脚光を浴びるとまた勉強したりしましたが、一時興味をもっても使わないとすぐに忘れてしまい、なかなかこの言語が身に付くことはありませんでした。書籍はかなりたまりましたが^^;
そして、今回Clojureです。CPUのマルチコア化に伴い、このような言語レベルで並列性が実現できる関数型言語がさらに必要とされてきた上、JVMで走るということで、急速に(私のまわりだけかもしれませんが)注目を集めています。まだ少ししか勉強していませんが、結構実用的に感じます。
今度は、長続きすればいいのですが・・必要と思ったときしか勉強しない、遅延評価的??

これは趣味にちかいですが、Lazy Kを実際に動かしてみました。

参考ページ
http://e.tir.jp/wiliki?%CB%DD%CC%F5%3A%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%ECLazy_K

Schemeは、Ubuntuでmit-schemeをインストール
Lazy-K は上記リンクよりWindows版をインストール

(load “./lazier”) ;Windows版からもってくる
(load “./prelude”) ;ネットから取得
(lazy-def ‘(test x) ‘(cdr x))
(print-as-cc (laze ‘test))

と実行すると、

SI(K(KI))

を出力

これをWindowsで、

lazy -e “SI(K(KI))”

と実行して、キーボードから

1 2 3 4

と入力してリターン
すると

2 3 4

と表示します。

(lazy-def ‘(test x) ‘(x))

に変更すると、

I

なんと一文字だけ出力します。(もっとも短いプログラム)
これは、標準入力をそのまま標準出力にエコーします。
上記リンクには、もっと長いサンプルコードがありますが、S,I,K,(,)しか使っていません。
今回、標準入力を出力しているのでいいですが、文字列とか表現しようと思うと大変そうです。
これだけシンプルなので、数字すら定義されていません。prelude.scmをみると、数字を関数表現しているのが面白いです。