DiaryException このページをアンテナに追加 RSSフィード Twitter

2016-02-13(土)

[]Apache Storm DRPCのHTTP APIを使う

Apache Stormのdefaults.yamldrpc.http* の項目があることから分かるように、Storm 0.10.0のDRPCサーバはDRPCクライアントから利用されるほかに、HTTP APIを持っている(0.9.6にはない)。つまり、HTTPクライアントPerlHTTPクライアントライブラリでもcurlでもWebブラウザでも)を用いて、DRPCサーバに処理リクエストを投げ、トポロジの処理結果をレスポンスとして受け取ることができる。

何が嬉しいか

HTTPリクエストに対する処理がスケールアウトしやすい

StormのDRPCは、Distributed Remote Procedure Callの略だが、Stormのトポロジの入力を外部から受け付け、トポロジを通して得られた処理結果を外部に返すためのものである。Stormのトポロジは、入力データを流す始点となるSpoutと、データを処理するBoltに分けられるが、DRPCアプリケーション場合、Spoutは外部から入力データを受け付け次のBoltに流し、Boltはデータに処理を行いその結果を次のBoltに渡し、最後のBoltが最終的な処理結果のデータを外部に返す。

Stormのトポロジを構成するSpout、Boltはスケールアウトできるように設計されているので、処理が重い部分・並列分散処理させたい部分の並列数を増やす指定をすることで、実行するスレッド(あるいはプロセスマシン)を増やしたり、逆に処理を分散させたくない部分の並列数を1にしたりもできる。また、クラスタ構成するマシンの台数を増やすことで、アプリケーション内の並列分散処理の性能を高めることができる。マシンを増やした際の作業は、Stormの仕組みのおかげで、非常に簡単で、アプリケーションに変更は必要ない。

DRPCのHTTP APIを用いることで、このStormの並列分散処理の仕組みをそのまま、HTTPリクエストに対する処理に適用することができる。

このメリットイメージ図を551肉まん風に書いてみた。

f:id:LaclefYoshi:20160213215135p:image

マイクロサービスを作りやすい

1つのStormクラスタに、複数のDRPCアプリケーションデプロイすることができる。Netflixなどがよく言っている、マイクロサービスアーキテクチャ実装のために、この仕組みは適している。

1つのDRPCアプリケーションリクエストに対する重厚長大な処理をさせるよりも、複数のDRPCアプリケーションを1つのクラスタの中に並べ、それぞれのDRPCアプリケーションに小さな処理を担当させた方が、より変化に対応しやすい環境となる。たとえば、スケールアウトしやすかったり、処理のある一部分の変更が容易になる。

DRPCのHTTP API仕様

DRPCサーバHTTP APIstorm-core/src/clj/org/apache/storm/daemon/drpc.cljを見ると、

となっていることがわかる。引数を省略した場合、空文字関数に渡される。GETとPOSTの両APIに実行時の違いは無さそうなので、クライアントの都合でどちらを使うかを選択すれば良いようだ。

実際に使ってみた。

Stormクラスタセットアップ

最低限の設定として、ZookeeperとNimbus、DRPCサーバアドレス指定する(すべてlocalhost)。それを使ってコンポーネントを起動する。

$ curl -O http://ftp.meisei-u.ac.jp/mirror/apache/dist/storm/apache-storm-0.10.0/apache-storm-0.10.0.tar.gz
$ tar zxvf apache-storm-0.10.0.tar.gz; cd apache-storm-0.10.0/
$ cp conf/storm.yaml conf/storm.yaml.default
$ vim conf/storm.yaml
$ diff conf/storm.yaml.default conf/storm.yaml
18,23c18,22
< # storm.zookeeper.servers:
< #     - "server1"
< #     - "server2"
< #
< # nimbus.host: "nimbus"
< #
---
> storm.zookeeper.servers:
>     - "localhost"
>
> nimbus.host: "localhost"
>
37,39c36,37
< # drpc.servers:
< #     - "server1"
< #     - "server2"
---
> drpc.servers:
>     - "localhost"

$ ./bin/storm dev-zookeeper &
$ ./bin/storm nimbus &
$ ./bin/storm supervisor &
$ ./bin/storm drpc &

Storm DRPCアプリケーションデプロイ

DRPCストリームを含むStormトポロジを、Stormクラスタデプロイする。今回はapache-storm-0.10.0.tar.gzに同梱されている、storm-starterから2つ拝借する。

$ ./bin/storm jar \
  examples/storm-starter/storm-starter-topologies-0.10.0.jar \
  storm.starter.trident.TridentWordCount TridentWordCount
$ ./bin/storm jar \
  examples/storm-starter/storm-starter-topologies-0.10.0.jar \
  storm.starter.BasicDRPCTopology BasicDRPCTopology

DRPCのHTTP APIアクセス

TridentWordCountは時間が経つにつれストリームに流れた文の量が増え、単語カウントが大きくなっていく。適当なタイミングでアクセスしてみた。対象関数wordsで、引数として2つ「the」と「eat」をそれぞれGETとPOSTで渡してみた。

$ curl http://localhost:3774/drpc/words/the
[[2679]]

$ curl -X POST -d eat http://localhost:3774/drpc/words/
[[536]]

DRPCクライアントを用いた時と同様の返り値であるようだ。

次に、BasicDRPCTopologyについて。対象関数exclamationで、引数として「eat」と「Hello」をそれぞれGETとPOSTで渡してみた。

$ curl http://localhost:3774/drpc/exclamation/eat
eat!

$ curl -X POST -d Hello http://localhost:3774/drpc/exclamation
Hello!

こちらも想定通り。

ちなみに、空白を含む文字列などを引数に渡す際にはURLエンコードして渡してやればStormの方でデコードしてくれて、結果もデコードされた文字列で返される。

$ curl http://localhost:3774/drpc/exclamation/The%20cow%20jumped%20over%20the%20moon
The cow jumped over the moon!

DRPCはStormの機能の中でも割とマイナな方だと思っていたが、かなり実用的な進化をしていて嬉しい。drpc.https.* などの設定項目があることから、セキュアな環境もサポートしているようだ。

2015-11-21(土)

[]aitendoのUSBASPが替わってた

AVR-USBASP-B在庫なしで、AVR-USBASP-Cが大量にあった。

Bの方はaitendoロゴがありマイコンがATMEGA8Aだったが、CはV2.0 Lcsoft Studioと書いてあってATMEGA8Lを使っている。

ベースはどちらもUSBasp - USB programmer for Atmel AVR controllers - fischl.deのようだが、Cは USBasp AVR Programmer, Program Atmel AVR microcontrollers, $18.00などで販売されている派生版のようだ。違いを説明しているブログここなどにあった。

本家ファームウェアアップデートは止まっているし、わざわざ新しい既成品を揃える必要は無いかなと思って、買わなかったけどメモ

2015-10-17(土)

[]myThingsのIDCFチャンネルとESP-WROOM-02とのMQTT双方向連携

準備

使うArduinoライブラリGitHub - interactive-matter/aJson: aJson is an Arduino library to enable JSON processing with Arduino. It easily enables you to decode, create, manipulate and encode JSON directly from and to data structures.GitHub - knolleary/pubsubclient: A client library for the Arduino Ethernet Shield that provides support for MQTT.の2つ。

Arduinoライブラリディレクトリの、PubSubClient.h内の#define MQTT_MAX_PACKET_SIZE 128となっているところを#define MQTT_MAX_PACKET_SIZE 1000にする

myThings外部サービスチャンネル(トリガー) → IDCFチャンネル(アクション) → ESP-WROOM-02

myThingsアプリ上で、Yahoo!天気をトリガーにしたものと、ぐるなびトリガーにしたものの2つの組み合わせを作成した。それぞれでアクションに渡すメッセージはそれっぽい感じにしている。

f:id:LaclefYoshi:20151017210748j:image f:id:LaclefYoshi:20151017210622j:image

ESP-WROOM-02には以下のArduinoコードビルドしたものアップロードし、Arduino IDEシリアルモニタを表示した状態で、Wi-Fi・Meshbluに接続しておく。

myThingsアプリから、2つの組み合わせを手動実行する(あるいは待つ)と、Arduinoシリアルモニタに以下のようなメッセージが出力された。

.............
WiFi connected
IP address: 192.168.10.20
succeeded to connect to mqtt broker
{"topic":"message","data":{"devices":["MESHBLU_ACTION_UUID"],"payload":"東京(東京)の2015-10-17の天気は曇り、最高気温20、最低気温16、降水確率40、風向き北の風、波の高さ0.5メートル","fromUuid":"MYTHINGS_UUID"}}
	東京(東京)の2015-10-17の天気は曇り、最高気温20、最低気温16、降水確率40、風向き北の風、波の高さ0.5メートル
{"topic":"message","data":{"devices":["MESHBLU_ACTION_UUID"],"payload":"肉 × イタリアン Hana 六本木店 〒106-0032 東京都港区六本木7-14-10 誠志堂ビル6F","fromUuid":"MYTHINGS_UUID"}}
	肉 × イタリアン Hana 六本木店 〒106-0032 東京都港区六本木7-14-10 誠志堂ビル6F
{"topic":"message","data":{"devices":["MESHBLU_ACTION_UUID"],"payload":"個室&イタリアン CERTO! 六本木店 〒106-0032 東京都港区六本木4-11-5 アネックスビル1F","fromUuid":"MYTHINGS_UUID"}}
	個室&イタリアン CERTO! 六本木店 〒106-0032 東京都港区六本木4-11-5 アネックスビル1F
{"topic":"message","data":{"devices":["MESHBLU_ACTION_UUID"],"payload":"六本木 PALETTE 〜Italian Tapas〜 〒106-0032 東京都港区六本木7-14-10 誠志堂ビル6F","fromUuid":"MYTHINGS_UUID"}}
	六本木 PALETTE 〜Italian Tapas〜 〒106-0032 東京都港区六本木7-14-10 誠志堂ビル6F
{"topic":"message","data":{"devices":["MESHBLU_ACTION_UUID"],"payload":"豪快 イタリアン食堂 DESERT 〒106-0032 東京都港区六本木7-15-25 六本木7thビル2F","fromUuid":"MYTHINGS_UUID"}}
	豪快 イタリアン食堂 DESERT 〒106-0032 東京都港区六本木7-15-25 六本木7thビル2F
{"topic":"message","data":{"devices":["MESHBLU_ACTION_UUID"],"payload":"六本木バル PIZZANIA 〒106-0032 東京都港区六本木2-3-7 セントラルクリブIII1F","fromUuid":"MYTHINGS_UUID"}}
	六本木バル PIZZANIA 〒106-0032 東京都港区六本木2-3-7 セントラルクリブIII1F

これで、ESP-WROOM-02がmyThingsのトリガーチャンネルからメッセージを受け取れていることが確認できた。

ESP-WROOM-02 → IDCFチャンネル(トリガー) → 外部サービスチャンネル(アクション

myThingsアプリ上で、IDCFチャンネルをトリガーにしてYahoo!メールアクションにした組み合わせを作成した。

f:id:LaclefYoshi:20151017220258j:image

ESP-WROOM-02には以下のArduinoコードビルドしたものアップロードし、Arduino IDEシリアルモニタを表示した状態で、Wi-Fi・Meshbluに接続しておく。ここでは、DHT11の温湿度センサ接続し、その情報を流している。

しばらくするとArduinoシリアルモニタに以下のようなメッセージが出力された。

.............
WiFi connected
IP address: 192.168.10.20
succeeded to connect to mqtt broker
Humidity: 39.00 %	Temperature: 24.00 *C
{"devices":["MESHBLU_ACTION_UUID"],"payload":{"humidity":39.00000,"temperature":24.00000}}
Humidity: 39.00 %	Temperature: 24.00 *C
{"devices":["MESHBLU_ACTION_UUID"],"payload":{"humidity":39.00000,"temperature":24.00000}}

Meshbluに以下の様なPythonサブスクライバを登録しておくと、メッセージが出力された。

connected with result code0
received message: {"topic":"message","data":{"devices":["MESHBLU_ACTION_UUID"],"payload":{"humidity":39,"temperature":24},"fromUuid":"MESHBLU_TRIGGER_UUID"}} from MESHBLU_ACTION_UUID
received message: {"topic":"message","data":{"devices":["MESHBLU_ACTION_UUID"],"payload":{"humidity":39,"temperature":24},"fromUuid":"MESHBLU_TRIGGER_UUID"}} from MESHBLU_ACTION_UUID

同時に、myThingsアプリアクション指定したメールアドレス宛に以下のようなメールが届いた。

f:id:LaclefYoshi:20151017223556p:image

これで、ESP-WROOM-02からメッセージトリガーとなり、アクションが発火していることが確認できた。

残念ながら、IDCFチャンネルのトリガーメッセージの内容を元にアクションメッセージを変更する方法がわからなかった。

2015-10-03(土)

[]markdown-modeがoutline-minor-modeをサポートしていた

たぶんずっとまえから

(add-hook 'markdown-mode-hook
          '(lambda () (outline-minor-mode t)))

任意のヘッダの上にカーソルを置いて、TABで折りたたみ・展開される。

f:id:LaclefYoshi:20151003173714p:image

f:id:LaclefYoshi:20151003173710p:image

2015-09-12(土)

[]langtool.el情報ポップアップ表示できるようにした

GitHub - mhayashi1120/Emacs-langtool: LanguageTool for EmacsLanguageToolデスクトップ版をEmacsから使うためのElispで、ispell (aspell) と共に、英文を書く際にお世話になっている。

標準の使い方だとlangtool-check-bufferでチェックプログラムを走らせ、問題があるとしてハイライトされた部分文字列カーソルを置いてlangtool-show-message-at-pointでその指摘内容を確認するのだが、この指摘内容の表示がlangtool-error-buffer-name指定したバッファ名でウィンドウが開くので、結構見づらい。

f:id:LaclefYoshi:20150912203652p:image

そこで、これを GitHub - auto-complete/popup-el: Visual Popup Interface Library for Emacs で表示するようにした。

f:id:LaclefYoshi:20150912203650p:image

これで見易くなった。langtool-correct-buffer修正候補も出せるようになるともっと嬉しいが、そこまでする気力が無かった。

Emacs Lispって、Haskellでいうtakeが無いの?

2015-09-06(日)

[][]FeatureFuを使ってみた

FeatureFuはLinkedInが作り公開しているFeature Engineeringのためのライブラリ

使い方から機能を述べると、数式をS式文字列として書き、変数に値をバインドしその文字列評価すると、数式の結果が返ってくる。

参考資料

検証のためのコード

$ cd ~/
$ git clone https://github.com/linkedin/FeatureFu.git
$ cd FeatureFu/
$ gradle clean jar
$ cd ~/
$ git clone https://github.com/laclefyoshi/test_featurefu.git
$ cd test_featurefu/
$ mvn clean test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

肝となるコードgistに写した。ここに、現在のFeatureFuで使える演算子 (Operator) が全て列挙されている。

¥sum¥prodforreduceで書いて、その内側の数式をFeatureFuで書いておけば、使い回しもし易くなる、という考えだろう。論文に書かれた数式をコードに落とすのには慣れが必要だが、こういうライブラリがあれば、考えなければいけないことが1つ減ってありがたい。

2015-08-06(木)

[]OCNモバイルONE開通までの流れ

月末にOCNモバイルONE(音声対応)に申し込んで、開通までの流れを記録した。MNPはしていない。

月末は混むといわれているが、7営業日(+週末2日)で全て完了したので、まあ順調だったな方ではなかろうか。

第1週 月曜

goo SimSellergooスマホ+OCNモバイルONE(音声対応)を注文

第1週 火曜(1営業日経過)

クレジットカード決済が完了した旨のメールが届く

第1週 水曜(2営業日経過)

商品が発送された旨のメールが届く

第1週 木曜(3営業日経過)

商品が到着(gooスマホ+OCNモバイルONEの申込書)

申込書に従い、OCNモバイルONEフォームアクティベーションコード等を入力して、SIM申し込み

ここからOCNモバイルONESIMが届くまでできること

第1週 金曜(4営業日経過)

OCNモバイルONE申込受付完了の旨のメールが届く

第2週 月曜(5営業日経過+週末2日)

OCNモバイルONESIMが到着

ここからOCN会員登録証が届くまでできること

第2週 水曜(7営業日経過+週末2日)

OCN会員登録証が到着

登録証に記載されたメールアカウントメール確認すると、050plusの番号とパスワード記載されたメールが届いていた

ここからできること
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |