wkzk's blog

なんか消去法的に、もしくはブログであることを求められてるときに書くかもしれないブログ。

ぼくの目でみたYAPC2014 #yapcasia

ブログを書くまでがYAPC( @yapcasia )なので久しぶりにブログで書いてみます。

2011年以来2回目の参加。なかなか仕事でいけない中、参加できてよかった。

よくDVDでいいじゃんて思われる映画と、やっぱりお金払ってでも映画館で見たいと思われる映画があるとしたらYAPCは後者の分類かなと思いました。多分、あまり語られないすごさとかも感じ取れるんじゃないかな。

■ 英語

@ さんはちょいちょい会館ホールを横切ったときに見かけてたんだけど、英語でしゃべってました、外国人と。僕の英語はたどたどしいけど、聞こえる英語はとてもナチュラルでカッケーと思いました。で、ちょいちょい違う外人としゃべってました。きっと見えないところでこういう人のこういうこともYAPCをささえてるひとつなのかなーって思ったりした。

■ コミュニティスタッフ

受付しかり、セッション前のコメントしかり、まー、しっかりしてますよね。カッチカチという意味のしっかりではなく。企業の意思のもとで動いているわけではない、(いろいろな会社に属してはいるけど)、各個人の意思をもってスタッフとしていろいろ運営してくれてるんだなーと。だから楽しそうにみえました。

■ 個人的に好きだったセッション

(1)Go For Perl Mongers @lestrrat
Perl Mongerじゃなくてもわかりやすかったです。タイトルに素直な内容でした。Goにいっては、、ということらしいけどif errorのハンドリングの記述をゴリゴリ書くのは、普段、java屋さんなので慣れが必要w。オブジェクト指向忘れろ、とも言われてたのでいっぱい書いて慣れてみたいところ。

(2)ウェッブエンジニアのローレベルプログラミング @
一番見てて楽しかった。後から公開されるスライドとかみてもわかんないかな。マウスカーソルがプルプルするだけでみんな笑って部屋がほっこりした。多分、一番前提知識がない内容だったからだと思うけど、純粋に楽しめた。アセンブリみたの高校時代以来だな。翌日本屋いったら、ラズパイやarduinoの書籍が並んでた。。なんか、取り残されてた感とワクワク感がいっぱいつまった20分でした!

(3)そんなにビッグでもないデータ処理手法の話 @
最初のほうの説明はわかりやすいし、見積もりに関するexact data sizeとrough data sizeの話は、うんうんわかるわかるって感じで共感して聞いてました。ちゃんとした知識がないとかけない絵と運用してないと表現できない説明だなと思いました。

全体的に、早口すぎてちょいちょい大事なキーワードをメモれなかった気がする。 スライド一番最後の「Share software, know-how, concerns」のところでもなんかすっげーいいこと言ってた気がするんだけど覚えてない。。無念。

■ その他

LTとHub

家の子供の都合で夕方には出ないといけないのでLTは見れなかったし、Hubでの飲みに参加できなかったのが残念でした。LLなイベントの中、加齢臭とエンプラ臭を漂わせながら、いろいろな人としゃべりかった。jvmオプションでGC回数を減らすようなことでよろこびをかんじてるウゼー輩だけどわいわいがやがやしたかった。また来年。

参加した2011年と比べて

mongerじゃないせいかもしれないけど、全然今年の方が面白かった。もちろん以前もいっぱい刺激をもらったのは変わらないけど。

ゆーすけべーさん

@ 'sおとうさんとは数年前のBPMオフでたくさんお世話になってたので、しゃべりにいこうと思ってたけど忘れちゃったw それぐらいひとつひとつのセッションもろもろが楽しかった。LT司会、OP/EDおつかれさまでした。(会場にいれなかったけど)また今度、どこかで。

■ 最後に

There is more than one way to do it 感を堪能できました。すばらしいコミュニティです。で、ダラダラ書きましたが一言でまとめるとしたら
「楽しかった」
です。行ってよかった、はい。

Riak Source Code Reading @東京 #1に参加しました

http://connpass.com/event/1396/

今会える、隔週コードリーディング、Riak Source Code Readingに参加しました。
腹へって家のご飯めざして、そそくさと帰ってきましたがおもったことを日記に。

1. 入門者向けのコーナーもあるのでビギナーも安心

想像してたのはソース1個1個よんで、それがosのkarnelの話にまで及んだらそれすらも生き血としてすすってCのソースも淡々とコード読むものだと思って、恐いもの見たさ精神で望んだのですが、そこまでは今日はいかなかったのでよかったです。

ふつうに初心者/中級者向けと、がっつり向けの2コマで進めていくようなので、興味ある、ちょっとさわったぐらいだけど初心者だし、っていうだけで悩んでる人がいたら迷わず参加してもいいかも。

そんな入門者向けの1コマがこちら。
https://docs.google.com/presentation/d/1TEUie_V7kr6Z7reeNNnQTUQUWcWzFfHXFZxtgofEx5Q/edit#slide=id.p

実際に説明+複数ノード動かしながらだったのでわかりやすかったです。
http://docs.basho.com/riak/latest/tutorials/fast-track/What-is-Riak/
ここらへんのところですね。時間内におさめるべくいい感じでまとめてくれての説明でした。リングの話、配置、再配置、検知とかとかちゃんと話すると、きっとこれだけでも2時間とか費やしそうなテーマだとおもうので難しいところですね

関連して@kuenishiさんの紹介でriak_control. よくいわれる管理コンソールですかね。初めてみましたがUIは結構coolでした。データがどのノードにどんなふうに配置され、どのノードが生きてる、死んでるとかが把握できたり、殺したり、生き返らせたりとかできるようです。ちなみに認証はBASIC認証でした。

2. 自分のペースでソースのチェックができた

2コマ目のほうががっつり系なのかな。Bitcask/LevelDB+riakでのバックエンドとしての扱い方についてソースの説明が決めました。細かいところではさっぱりわかんないことばかりでしたが、発表資料にソース名がちゃんと書いてあるので、淡々と進んでいく中、説明に無理してついていかずに自分のペースで気になったソースをもんもんと追ってました。

https://github.com/csakatoku/riak_scr_jp/blob/csakatoku_kv_backend_draft/%231/csakatoku.md

後半の異なるバケツで同じキーだとごにょごにょ。。sextでソータブルだから近い場所にいるからパフォーマンス目的でごにょごにょ。。とからへんは途中で迷子になりました。いつかゆっくり調べようと思います。(しないかも)

3. 次回は12/11 19:00 ,場所は同じくBasho Japan Office.

http://connpass.com/event/1518/

(1)map-reduce
(2)conflict resolution / riak_dt

の2つのテーマで話があるようです。erlang, riakが中心だけど、それらをしってなくても分散システムではちょいちょい意識するようなことが聞けそうな感じです。

4. しめ

erlangの話は職場では皆無なので、こういった場があるだけでもちょっとうれしかったです。

次回は#2といった感じで続きますが、#0,1との関連性もなさそうなので、前回参加してないからとか気にしなくてもよさそうです。なので迷ったら四ッ谷行くといいと思うよ。

ぼくも、いつか発表する人として手があげられるように、こつこつコード読んで/書いていきたいと思いました、マル。

みなさまお疲れさまでした。

rebarはじめて物語

日頃、java屋なのでmavenと近い印象で望みましたが結構似てました。とても長いけどメモまでに。

0. rebar準備

Githubから取得してmakeします。できたrabarをプロジェクトで利用します。

1. プロジェクト作成

hello_rebarという名前にします。otpアプリケーションが複数あることもふまえてappsというサブディレクトリを作成します。あとは後述するリリース用のrelディレクトリを作ります。で、さっきmakeしたrebarをhello_rebarディレクトリ下にコピる。

2. テンプレート自動生成

rails/mavenと同様にテンプレート生成します。

  1. create-app appid=hello_rebar でアプリケーションの骨格である各ファイルを作成
  2. create template=simplemod modid=hello_rebar テストディレクトリも含めたシンプルなモジュールを作成

3. rebar.config修正

mavenのpom.xmlみたいなものですね。作成したhello_rebarディレクトリ下にファイルを用意します。今回は外部ライブラリ参照ぐらいしておきたいのでlagerをログ出力として使います。lagerの利用で必要なのはerts_optにパラメタの追加が必要なのでたします。また、mavenと同様にdependencyを追加します。

やったのは

  1. 今回はサブディレクトリきったのでsubdirの指定を追記。
  2. コンパイルするとわかるけど、結構WARNがでるのででないようにするerts_optを指定。xref checkを追加。
  3. {parse_transform, lager_transform}がlagerで必要なのでerts_optに追加
  4. versionをR15に。
  5. 一番最後に依存ライブラリ宣言を追加

4. 依存ライブラリ取得

rebar.configの内容にもとづいて依存ライブラリ取得、コンパイルをします。get-depsで取得、list-depsコマンドで確認します。

5. gen_serverのサンプルモジュール作成

いよいよモジュール作るのですが、その前に今回、サブディレクトリきって動かすことにしたので自動生成したhello_rebar/srcディレクトリをhello_rebar/apps/hello_rebar/srcに移動することにします。

$ mkdir -p apps/hello_rebar
$ mv src apps/hello_rebar/

今回つくるのは単純にhello/1の関数を用意して、文字列をわたしてHello,+文字列でログ出力するというhello world級なものです。gen_serverのテンプレートをベースにstart()とhello/1とそのcallbackを自動生成されたhello_rebar.erlに書きたします。以下、抜粋。

start() ->
	gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
%% 略 %%
hello(Name) ->
	Reply = gen_server:call(?MODULE, {hello, Name}),
        lager:info("Hello, ‾s‾n", [Reply]). 
%% 略 %%        
handle_call({hello, Name}, From, State) ->
    Reply = lists:append(["newbie- ", Name]),
    {reply, Reply, State}.

ログ出力はlager:infoのところですね。他にもログレベルはあるようですが今日は割愛。
フルソースははると長いのでリンクだけ。こちら

6. コンパイル

そろったので、早速コンパイル。./rebar compileコマンドだけです。

7. 軽く動作確認

パスをとおして、実際に起動してみます。起動後は必要なアプリケーションを起動してからhello_rebarを起動して動作確認します。

erl -pa apps/*/ebin deps/*/ebin -boot start_sasl -s hello_rebar

そうするとPROGRESS_REPORTがわさっと出力されて、erlang shellモードになりますので、そのままlager起動に必要なcompilerとsyntax_toolsを起動していきます。最後にhello_rebarを起動してhello/1を呼び出して動作確認します。

「Hello, newbie- waki」と出力されます。q().でぬけます。

8. リリース

rebar create-node、generateコマンドをつかってリリース準備します。erlangのreltoolをベースにしているので必要な設定はreltool.configにて編集します。順序的にはcreate-node => reltool.config編集 => generateとなります。

で、次にreltool.configを修正します。フルソースはこちら。
生成されたreltool.configで修正したのは以下のところになります。

  1. lib_dirにapps, depsを宣言
  2. アプリ宣言箇所に必要なライブラリを追加(compiler, syntax_tools, lager)
  3. excl_app_filters下のapp宣言にも同様にcompiler, syntax_tools, lager分の宣言を追加

で、最後にgenerateします。

で、このあとバージョンアップもやるので作成したディレクトリをリリース用にみたてて、renameします。

mv hello_rebar hello_rebar_release

9. リリース動作確認

すでにbin下にコマンドができてます。

sh hello_rebar_release/bin/hello_rebar start
sh hello_rebar_release/bin/hello_rebar attach

start指定でするとバックグラウンドで起動されまして、やりとりしたい場合はattachするとshell経由で会話できるようになりますが、ここではconsoleで動作確認します。

先の軽い動作確認と同様にhello_rebarを起動して、helloで文字列をわたしてログ出力されるのが確認できます。ちなみにログの場所はデフォルトだと実行ディレクトリ(今回でいうと/Users/waki/hello_rebar/rel/hello_rebar_release/log)にconsole.logをはじめいくつかのログが出力されます。

って感じです。

10. バージョンアップ

では、こんどはホットスワップでアップデートしてみます。アップデートの段取りはこんな感じのようです。

(1)該当ソースなおす
(2)XXXXX.app.src、reltool.configのバージョン番号を修正
(3)compile
(4)generate
(5)appupファイル作成
(6)新リリースファイル作成
(7)リリースハンドラで反映!

です。以下、それぞれの補足説明を(1)からおってかいていきます。

(1)該当ソースなおす
今回はログ出力している部分をHello,からGoodByeに変えます

(2)XXXXX.app.src、reltool.configのバージョン番号を修正
まず、hello_rebar.app.srcを修正します。vsnを2にします。

次に、reltool.configを修正します。{rel, "hello_rebar", "1",の"1"を"2"に変えます。

(3)compile
(4)generate
上記ふたつは最初にやった手順といっしょです。generateするときはrelディレクトリでの実行ということも間違えないようにしてればすんなりいきます。

(5)appupファイル作成
appupベースでアップデートを行います。これ自体はrebarとは直接的に関係ないです。rebarは簡単なappupファイルを作成してくれます。

previous_releaseで指定するのは現在、動いている実行環境のディレクトリで、先ほどrenameしたディレクトリになります。

(6)新リリースファイル作成

リリース用に実行環境をまるっとつつんだgzパッケージをgenerate-upgradeコマンドをつかって作成します。

hello_rebarにバージョン番号がついて、hello_rebar_2.tar.gzが作成されます。このtar.gzパッケージを動作しているディレクトリ下のreleaseディレクトリにおきます。

cp hello_rebar_2.tar.gz hello_rebar_release/releases/

(7)リリースハンドラで反映!
あとは最新モジュールでアップデートします。erlang shellからrelease_handlerをつかって反映させます。これ自体はrebarとは関係ないです。

メッセージがGoodByeになりました。ちなみにrelease_handler:which_releases().でその時うごいているバージョンを確認しています。unpack_releaseして、install_releaseでアップデートされます。make_permanentをするとrebootしてもこのバージョンで動き続けるようになります。

以上です。

以下、オフィシャルサイトとそれ以外に参考したリンクです、勝手に感謝m(_ _)m!
本家rebar wiki
Erlang に興味を持った人へ
Erlang: ログライブラリLager
Erlang rebar tutorial: generating releases and upgrades


最後に今日の教訓:「長すぎよくない」

以上、ひやひやどきっちょでした。

rabbitmqでチュートリアルをうごかす

とにもかくにもサーバいれる

https://www.rabbitmq.com/install-mac.html
(ソースからやる場合はこちら。https://www.rabbitmq.com/build-server.html
インストール手順はこのまま。erlangはもともといれてたので。あとはrabbitmq-serverをおとします。

curl -O http://www.rabbitmq.com/releases/rabbitmq-server/v2.8.7/rabbitmq-server-2.8.7.tar.gz
tar xvzf amqp_client-2.8.7-src.tar.gz 
sudo TARGET_DIR=/opt/local/rabbitmq SBIN_DIR=/opt/local/rabbitmq/sbin/ MAN_DIR=/opt/local/rabbitmq/man make install

pythonやれxsltprocやれ必要なので事前になにも入ってない人は先にそっちをいれるべし。で、もう動かせそうだけど、rabbitmq-serverの設定まわりをちょっと変えます

https://www.rabbitmq.com/configure.html
にまるっとかいてあるけど、要は設定ファイルは2つ。env用とconfig用。envを以下の記述だけにして/etc/rabbitmq/rabbitmq-env.confとして保存。

NODENAME=waki-rabbit
#CONFIG_FILE=/etc/rabbitmq/wkzk
MNESIA_BASE=/Users/wkzk/rabbit-mnesia

nodenameがデフォだどhostnameからひっぱってくるようなので明示的に指定したのと、rabbitmq-serverを起動する際にmnesiaのDBが必要なので、それの置き場所を指定しました。

で、あとは起動するだけ。

sbin/rabbitmq-server -detached

ってすると

wakimac:rabbitmq wakizaka$ sbin/rabbitmq-server -detached
Activating RabbitMQ plugins ...
0 plugins activated:

って感じで地味にバックグラウンドで起動します。止めるときには

sbin/rabbitmqctl stop

だって。

実行したときのログはデフォで/var/log/rabbitmq下に出力されて、さっき明示的に指定したNODENAMEがログファイル名でつかわれます。saslのログもあわせて二つ作られます。

クライアントいれる

メッセージング送受信でクライアントが必要なので入れます。せっかくのAMQPなのでerlang clientで送信して、javaで受信する言語をまたいで動作確認することにします。

https://www.rabbitmq.com/erlang-client.html
で、てっとりばやくうごかしたかったのでコンパイル済のezファイル2つがあったので、それだけおとします。

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

erlang clientのチュートリアルはgithubから拝借します。
https://github.com/rabbitmq/rabbitmq-tutorials/tree/master/erlang
send.erlがあるので、ぱくってこれをこのまま動かします。escriptなのでshellと同じのりでそのまま実行ですね。

wakimac:~ wkzk$ ./send.erl 
 [x] Sent 'Hello World!'

で送信されたっぽいです。次にjava側で受信します。java clientはmaven経由でおとします。eclipseを起動してpom.xmlに以下を宣言追加しただけ。(m2eプラグインを先にいれてある状態)

  <dependencies>
    <dependency>
      <groupId>com.rabbitmq</groupId>
      <artifactId>amqp-client</artifactId>
      <version>2.8.7</version>
    </dependency>
  </dependencies>

さっきのgithubのtutorialにjavaもあるので
https://github.com/rabbitmq/rabbitmq-tutorials/blob/master/java/Recv.java
これをこのまま使います。で、実行!
f:id:wkzk:20121003012640p:plain
うけとれました!!

言語またいで送受信できて新鮮!結構、思ったより動いたので調子にのってつんであった本みながらもうちょっとちゃんと動作させてみようかなぁ。

RabbitMQ in Action: Distributed Messaging for Everyone

RabbitMQ in Action: Distributed Messaging for Everyone

  • 作者: Alvaro Videla,Jason J. W. Williams
  • 出版社/メーカー: Manning Pubns Co
  • 発売日: 2012/04/28
  • メディア: ペーパーバック
  • クリック: 7回
  • この商品を含むブログを見る


以上、チュートリアルのコード動作検証より、はてなブログを書く方に時間かかったので涙目、の巻でした(え