コミケ告知

サークル活動の詳細は circle タグの記事へ。
ラベル Erlang の投稿を表示しています。 すべての投稿を表示
ラベル Erlang の投稿を表示しています。 すべての投稿を表示
2016年3月5日土曜日

Cowboyの使い始めではまったところメモ (privとは何ぞや)

ElixirでWebサーバーといえばPhoenixですが、既存のElixirアプリケーションにちょっとWebサーバーの機能を足すだけの場合にはちょっと大規模すぎたので、PhoenixよりもコンパクトなCowboyを使うことにしました。Phoenixのサーバーコア部分はCowboyなので、比してコンパクトという表現は実はちょっとおかしいですね。

ソースコードのexamples以下には、いくつもサンプルプロジェクトがあり、それをそのまま動かすのも、参考にして動かすのも簡単です。ドキュメントもErlangなのに十分にあり、必要なハンドラを定義して差し込むだけで動きの把握もしやすく、素晴らしいライブラリですね。

ただしひとつだけ罠があり、それはサンプルで用いられるファイル読み出し指定が priv_dir や priv_file であることです。例えばstatic_worldのサンプルでは…

Dispatch = cowboy_router:compile([
 {'_', [
  {"/", cowboy_static, {priv_file, static_world, "index.html"}},
  {"/[...]", cowboy_static, {priv_dir, static_world, "", 以下略
 ]}
]),
Elixirで書くとこんな感じ:
dispatch = :cowboy_router.compile([
  {:_, [
      {"/", :cowboy_static, {:priv_file, :static_world, "index.html"}},
      {"/[...]", :cowboy_static, {:priv_dir, :static_world, ""}, 以下略}
  ]}
])

これをiexで走らせると動いて安心していたのですが、escriptにしたりアプリケーションとしてリリースしようとしたりすると全然動かない。index.htmlなどのファイルが見つからないときの挙動をする…。 どこに置いてもindex.htmlなどのファイルをアプリケーションが見つけてくれない。
同様にpriv方面ではまっている英語の記事があり、そちらではそのまま力技で解決していましたが、そんなに頑張らなくても、単にprivディレクトリを使う指定をやめればOKでした。

dispatch = :cowboy_router.compile([
  {:_, [
      {"/", :cowboy_static, {:file, "web/index.html"}},
      {"/static/[...]", :cowboy_static, {:dir, "web/static"}}
  ]}
])

実コードから引っ張ってきたので若干パス指定が違いますが、要点は:priv_fileではなく:file、:priv_dirではなく:dirを使うこと。アプリケーションからの相対位置で無事読めました。privディレクトリがErlang的に特別なものらしいのです。ぐぐるとほとんど情報がないなかに、ユーザーズガイド邦訳から以下の説明が見つかります。

アプリケーション固有のファイルの格納に使用されます。例えば、Cの実行ファイルがここに置かれます。code:priv_dir/1関数を使用すると、このディレクトリにアクセスすることができます。

単にprivという名前のディレクトリではないことはわかりました。Cの実行ファイルを格納するようなところに、Webのリソースを置くのはなんか違うんじゃないかなという感覚があるのですが…

# 2016/04/20追記
公式のMix.Tasks.Escript.Buildの項目に
Note: escripts do not support projects and dependencies that need to store or read artifacts from the priv directory.

とありました。
2014年10月30日木曜日

歌舞伎座.tech#5「すごいErlangをゆかいに学ぶ会」に参加してきた

いつのまにかAkkaやらErlangやら、並行処理系のフレームワークを扱っているドワンゴさん所の勉強会。今回はErlangということで、ささっと参加申し込みして楽しみにしていました。

公式:  歌舞伎座.tech#5「すごいErlangをゆかいに学ぶ会」 - connpass

発表枠

(以下の表は、現時点での公式イベントページより引用)
発表者資料
sile@ドワンゴ「ドワンゴでのホットデプロイ事例」

「なぜERLANGにしたのか」(前回資料)
mururu@学生「Elixir 1.0」
shino@Basho「本番環境を止めずに問題を安全に解析する方法」
voluntas@時雨堂「Erlang/OTP + Lua」

Elixirが文法や機能説明である以外は、実戦で使われた事例から一般的に使えそうな話を引っこ抜いて話してくれるような、実用性の非常に高い濃い内容でした。Erlang/OTPという存在自体が、実装は枯れていて、いかにシステムを構築するかを考えればよいフレームワークなので、勉強会も自然とそうなるんでしょうね。


LT枠


(以下の表は、現時点での公式イベントページより引用)
発表者資料
山口能迪@ymotongpoo「『すごいErlangゆかいに学ぼう』でゆかいなところ」
t_egg(Comming Soon)「Euler with Erlang」
KOU_CHANG@ドワンゴErlang Utility Library (GitHub Repository)

LTはゆるい雑談な感じで。(感想とくになし)

懇親会

ピザと飲み物(缶アルコールとソフトドリンク)が配給されました。木曜日だというのに、23時まで酒飲みながらgdgdして、みなさん翌日大丈夫だったんでしょうか?
Elixirの講演をされた方を探していくつか聞いてみようかと思ったけれども、うっかり顔を覚えておくのを忘れたので、そのへんで適当に雑談。何の偶然か同業者の方を発見してしまい、Erlangとはあまり関係ないところで楽しかったです。
Erlangはすぐに「他の人がメンテできねえ」に到着してしまって、小さくて若者・精鋭がそろうところか、好き勝手にやれる研究部門でもないと、なかなか難しいですね。Scalaと違って、見た目がカッコよくて人が釣れる言語ならまだ可能性はあるかもしれないですが…

総括

Erlangを実際に使っている人にとっては、非常に実用性の高いイベントです。
Erlangを触ったことがない人の場合は…どうでしょうね。概要説明などせずに実際の問題に入るので、講演の概要くらいしか頭に残らないのでは。それなら家でスライドナナメ読みしたほうがマシw 細かい特性差を除くと機能はAkkaに近いので、Actor Modelの使いどころについてはあちらで慣れてくる手もありかも。

Erlang関係の勉強会は半年に一回くらいは開催する、というような話が聞こえてきた気がするので、次回以降にも期待しましょう。個人的にはその頃までに、Elixirで何か小物を作れたらいいなーと目論んでおります。


2014年4月1日火曜日

Elixir relexによるassemble

Releaseに際して、Scalaならばfat JARを生成するためのsbt-assemblyというものがあります。Elixirではrelexがそれに相当するようです。
親切なドキュメントは無く、最初はうまくいかなかったのですがrelexを使っているプロジェクトを発見して、そこのmix.exsを真似するとうまくいきました。


  • depsにrelexを追加
  • Code.append_pathでライブラリのパスを追加
  • defmodule Release を追加


参考資料

特に追加設定をせず mix relex.assebleを実行すると、Erlangのランタイムまで丸ごと入ります。include_erts? や include_elixir? などのオプションがあり、Releaseモジュールの中で定義することでデフォルト設定を上書きできるようです。ドキュメントはなさそうなので、relexのrelease.exsを参照。

中でシェルスクリプトを生成しているため、純粋なWindows環境では上手く動かなそうに見えます。
2014年3月25日火曜日

Elixir - Hello worldを求めて右往左往

先日の歌舞伎座.tech #3で存在を思い出したElixir。早速というほど早速でもないのですが、ちょっと使ってみるかーという気になりました。情報量が少ないのは覚悟していたものの、困ったことにちゃんとしたHello worldが見つからず、それなりに苦労することに。


Hello worldにおいて、「コンソールに文字を表示する文法を覚えましょう」というのは目的の一部でしかありません。元々のC言語で言えば、ソースコードを作成する→コンパイルする→実行する この一連の流れを体験するためのものです。
公式にはGetting Startedがありますが、インストールの次はいきなりインタラクティブシェル(iex)を使った文法説明。いやそうじゃない、まず最終的な出力ファイルの作り方を教えてくれよと。プロダクトでもiexから走らせます、という事であればそれで良いんですが。

試行錯誤したりTwitterで教わったりしつつ、最低限のところまでは進めたので、書き残しておきます。

ソースコード作成

% cat hoge.ex
defmodule Hoge do
  def hello do
    IO.puts "hoge world"
  end
end

Hogeモジュールを定義し、その中にhello関数を作成。中はコンソールへの出力のみ。

コンパイル

% elixirc hoge.ex

ここまでは何の問題も無し。ただし、2回目以降のコンパイルではwarningが出ます。
% elixirc hoge.ex
hoge.ex:1: warning: redefining module Hoge

びっくりするけども、実際のところ問題はない模様。
参考:Warning “Redefining module” when file is containing 2 Modules

実害のないwarningなんて、warningをスルーする習慣がつくだけだから良くないのでは…

実行

% elixir -e Hoge.hello
hoge world

-eで ModuleName.function_name を指定。

コンパイルで出来あがるのはErlang VMのbeamファイルなので、Erlang VMで実行できるはずだ!と試したところ、Elixirのbeamファイル群がある場所を検索パスに含めてあげれば、実行できる模様。

% erl -pa "D:\bin\elixir\lib\elixir\ebin" -noshell -s Elixir.Hoge hello -s init stop
hoge world
 

mixを使う

mix.は、Scalaならsbt、元のErlangならrebar相当となる、依存するライブラリ管理・テスト・実行あたりまでをカバーする、Elixir付属のビルドツールです。前述のようにいちいちelixircを叩いてコンパイルすることはあまりなくて、基本的にこれを使うっぽい。
参考:Introduction to Mix

まずは雛形を作成。

% mix new hoge --bare
* creating README.md
* creating .gitignore
* creating mix.exs
* creating lib
* creating lib/hoge.ex
* creating test
* creating test/test_helper.exs
* creating test/hoge_test.exs

Your mix project was created successfully.
You can use mix to compile it, test it, and more:

    cd hoge
    mix compile
    mix test

Run `mix help` for more information.


ソースコードはlib以下に出来ます。今回はhello worldなので、lib/hoge.exにIO.putsを置くだけ。(要は前述のソースコードと同じようにhello関数を作るだけ。ソースコード略)
あとは、mixにコンパイルしてもらいます。

% mix compile
Compiled lib/hoge.ex
Generated hoge.app

そして実行。

% mix run -e Hoge.hello
hoge world

依存するライブラリやアプリケーション設定などは、mix.exsに記述すればいいようです。


2012年2月2日木曜日

Erlangでのディレクトリ作成、file_lib:ensure_dir/1

# はてなダイアリーから移動した記事です。あまり真面目に整形していません。

Erlang -- filelib
ディレクトリがなければ作る、既に存在しても正常動作として、何もしない。

Eshell V5.9  (abort with ^G)
1> filelib:ensure_dir("log").
ok

ok。しかしディレクトリが作成されていないので、log/hoge.logなど開こうとすると死にます。ensure→ok→失敗ってなんじゃい。

2> filelib:ensure_dir("log/").
ok

末尾にスラッシュを付けるのが正解でした。