Co-Routine / Scheme

By admin 11月 25th, 2014, under プログラミング

以前コルーチンの記事Co-Routine / Pythonを書きましたが、Scheme(Lisp)でやってみました。最近、データ処理には「やはりLispが向いているかも」という気まぐれから、Schemeに再びはまっています。Schemeといえば、call/ccによる「継続」が有名ですが、ならばコルーチンでしょう、ということになりました。しくみがわかりやすいようにシンプルなものにしました。

#lang racket
(define cont #f)
(call/cc (lambda (return) 
           ((lambda (yield)(yield 1)(yield 2)(yield 4)) 
            (lambda (value)
               (call/cc (lambda (c)
                    (set! cont c)
                      (return value)))))))

scheme01

今回使ったこのDrRacketというツールは、初めて使ったのですが、とても高機能で使いやすいです。再びはまったのも、このツールによるところが大です。

http://blog.livedoor.jp/kosugip/archives/692821.html 参考

calling Clojure from Java

By admin 11月 6th, 2014, under プログラミング

前回の流れで、今回はClojureを呼び出してみました。

環境: Java 1.8.0_25, Clojure 1.6.0, Leiningen 1.0 / Windows 8.1
JavaMain.java

import clojuresub.core;

public class JavaMain{
	public static void main(String[] args){
		String str = "Java String";
		core.sub(str);
	}
}

lein new clojuresub

を実行の後、以下のようにプログラムコード、プロジェクトファイルを記述します。
core.clj

(ns clojuresub.core
  (:gen-class
   :name clojuresub.core
   :methods [#^{:static true} (sub [String] String)]))

(defn -sub
  [s]
  (println (str "Clojure Message : " s)))

project.clj

(defproject clojuresub "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.6.0"]]
  :aot :all
  :main clojuresub)

clojuresubディレクトリで、

lein compile
javac -cp .\target\classes JavaMain.java
java -cp .`;target\classes`;clojure-1.6.0.jar JavaMain

を実行します。
clojre-1.6.0.jarは、leiningenインストール時の.m2フォルダリポジトリ内の深いところからカレントにコピーしておきます。

lein uberjar

を実行してjarを作成し、下記のように実行することもできます。

clojure01

参考:
http://stackoverflow.com/questions/2181774/calling-clojure-from-java
http://www.coderanch.com/t/601586/clojure/Calling-Clojure-Java-code

calling Scala from Java

By admin 11月 3rd, 2014, under プログラミング

JavaからScalaを呼び出すときのメモです。

環境: Java 1.8.0_25, Scala 2.11.4 / Windows 8.1

public class JavaMain {
	public static void main(String args[]){
	
		String str="Java String";
		ScalaSub.sub(str);
	}
}
object ScalaSub{
	def sub(arg:String) = {
		println("Scala Message : " + arg);
	}
}

PowerShellでコンパイル。(セミコロンのエスケープに注意)
scala01

PubSub / Redis Server

By admin 8月 10th, 2014, under プログラミング

RedisサーバでメッセージのPublish/Subscribeをやってみた。

環境 : redis-server 2.8.4 / Ubuntu 14.04 LTS

まずはRedisサーバのインストールから。

apt-get install redis-server

これだけでサーバも起動します。

WindowsからRedis Desktop Manager (http://redisdesktop.com/)を使いたかったたので、サーバをリモートからアクセスできるようにします。

service redis-server stop
vi /etc/redis/redis.conf

bind にリモートからアクセスするサーバのIPアドレスを設定
requirepass にpasswordを設定

service redis-server start

Subscribe用のクライアントを開きます。

redis-cli -h 192.168.11.11 -a password

テスト用に値もセット。
そしてSubcribe。
redis01

まとめてしまいましたが、subcribeをして下のpublishを待ち、publish実行後subscribeでmessageを受信します。

redis02

設定した値は、次のように確認できます。
redis03

以上、簡単ですがメモでした。

Co-Routine / Python

By admin 5月 28th, 2014, under プログラミング

超簡単にPythonでコルーチンを表現するのにす、わかりやすいと思われる例をメモしておきます。

def ro1():
	for i in range(1,5):
		print i

def ro2():
	for i in range(101,105):
		print i

ro1()
ro2()

1
2
3
4
101
102
103
104

これを以下のようにすると、

def co1():
	for i in range(1,5):
		yield i

def co2():
	for i in range(101,105):
		yield i

i1 = co1()
i2 = co2()
for i in range(1,5):
	print i1.next()
	print i2.next()

1
101
2
102
3
103
4
104

今度は、コルーチンが得意なLuaでもっといろいろなテストをしてみたいと思います。

MQTT / RabbitMQ

By admin 3月 9th, 2014, under プログラミング

前回の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

By admin 3月 6th, 2014, under プログラミング

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プログラム

By admin 2月 9th, 2014, under プログラミング

「プログラミング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、強力に創造性を刺激してくれそうです。

関数型言語

By admin 1月 30th, 2014, under プログラミング

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でデータ処理用サーバを作ってみたいと思っています。
またまたひさびさの投稿でした。

Before iOS7, After iOS7

By admin 9月 28th, 2013, under 未分類