タグ

ブックマーク / ymmtmsys.hatenablog.com (13)

  • HTTPリクエストからChannelへメッセージを送る - yBlog

    GETやPOSTなどのHTTPリクエストを受け取り、その処理の中でChannelにデータを送信したい場合、以下のように書くことでメッセージを送信できる。 HelloPhoenix.Endpoint.broadcast_from! self(), "rooms:lobby", "new_msg", %{uid: uid, body: body} http://hexdocs.pm/phoenix/Phoenix.Channel.html の "Broadcasting to an external topic" の箇所に書いてあったのを ここ に合わせて少し変更した。そこの例では channel 側のコードとして書かれているけど、controller 側のコードの中でも使えた(まあ、*.Endpoint モジュールの関数なので当たり前?)。 ちなみに、これで何をしたかったのかというと、flu

    HTTPリクエストからChannelへメッセージを送る - yBlog
  • コマンドラインの引数を得る方法 - yBlog

    Elixirでコマンドラインのツールを書く方法が(自分の観測範囲内では)二通りある。 一つはスクリプトとして実行する方法。もう一つは、escript を使う方法(こっちの方法も名前からするとスクリプトとして実行されてるっぽいけど)。 スクリプトとして実行した場合、System.argv/0 を使えばいつでもコマンドに渡された引数を得ることができるけれど、escript を使った場合は System.argv は nil を返してくる。 ということのメモ。 スクリプトとして実行した場合 ソース defmodule RunScript do def go(argv) do IO.inspect argv IO.inspect System.argv end end RunScript.go(System.argv) 実行 $ elixir run_script.exs one two thre

    コマンドラインの引数を得る方法 - yBlog
  • Elixirで正規表現 - yBlog

    Elixir の正規表現は Regexモジュール を使う。 仕事ではPHPを書くことが多い。PHPの正規表現は PCRE関数 が標準的だろう。普段使うPCRE関数をElixirのRegex で置き換えるとしたらどうなるのか? 比較の対象は preg-match と preg_replace の二つにする。理由は、その二つをよく使うので (その二つくらいしか使わないとも言う)。 preg_match と比べて 単純なマッチ 単純にマッチするかどうかを判定する場合, Regex.match?/2 を使う。 <?php echo preg_match('/foo/', 'foo'); // => 1 iex> Regex.match?(~r/foo/, "foo") true 名前なしキャプチャ 名前なしキャプチャを利用する場合, Regex.run/3 を使う。preg_match はキャプチ

    Elixirで正規表現 - yBlog
  • PhoenixのLogger - yBlog

    とりあえず、アプリが起動する状態になった。 Phoenix・Elixir をちょっとさわって思ったのは、コード上に型が現れてれていないとなにかと調べにくい、ということ。馴染みのある言語なら、型が現れてなくてもなんとかなっちゃうんだけど、馴染みのない言語だとそうはいかない。 結局コード見ててもわからないので、ログを出しまくって、どういう動きをするか、どういうデータが入力・出力されるのかを追っているところ(デバッガみたいなのはある?)。まあ、始めはログの出し方もわからなかったのだけれど。 Logger ドキュメントはこちら debug, info, warn, error の4レベルがある。 使い方としてはこんな感じ(サンプルはここで作ったhello_phoenixプロジェクト)。 defmodule HelloPhoenix.PageController do use HelloPhoeni

    PhoenixのLogger - yBlog
  • IEx.Pryでデバッグ - yBlog

    ここで デバッガみたいなのはある? と書いた。調べてみたところIEx.pryが使えることがわかった。 使い方 大雑把にいうとこんな感じ IEx モジュールを require する。 ブレイクポイントコードに仕込む。 iex でサーバを起動する リクエストを出す。 ブレイクポイントに到達すると、pry を実行するかを尋ねられるので Y を入力する。 respwan で処理を続行する。 コードはこんな感じ(ベースはここ)。 defmodule HelloPhoenix.PageController do use HelloPhoenix.Web, :controller require IEx def index(conn, _params) do IEx.pry # ブレイクポイント render conn, "index.html" end end できること 変数の内容を表示させる など

    IEx.Pryでデバッグ - yBlog
  • 求めていたのはinspect/2だった - yBlog

    to_string/1 ではなくinspect/2 だった。 iex(1)> to_string %{a: 1, b: "hoyhoy"} ** (Protocol.UndefinedError) protocol String.Chars not implemented for %{a: 1, b: "hoyhoy"} (elixir) lib/string/chars.ex:3: String.Chars.impl_for!/1 (elixir) lib/string/chars.ex:17: String.Chars.to_string/1 iex(1)> inspect %{a: 1, b: "hoyhoy"} "%{a: 1, b: \"hoyhoy\"}" Map には to_string が定義されていないので、どうすればログに出力できるのかを悩んでいたのだけれど、これで解決

    求めていたのはinspect/2だった - yBlog
  • mix phoenix.new のオプション - yBlog

    アプリケーション作成時のオプションに何があるか調べてみた(といっても、大して調べてないけれど)。 答えはここに。 --app アプリケーション名?よくわかってない。 --module モジュール名を指定する。phoenix.new したときのディレクトリ名とモジュール名を異なる名前にできる。 --database PostgreSQL以外のDBを使うときに。 --no-brunch brunchを使わないときに指定する。APIサーバとして使うならこれを指定した方がいいかも。 --no-ecto Ectoを使用しない場合に使用。

    mix phoenix.new のオプション - yBlog
  • Phoenixのデプロイ - yBlog

    Erlang (Elixir) の機能の中で気になっているのが、ホットデプロイだ。といっても、そういう機能があるからといって気軽にデプロイできるものでもないらしいけど。 デプロイに関するスライド。 http://sile.github.io/slide/kbkz_tech_05/#/ http://www.slideshare.net/ohr486/shibuyaex-1-elixir?next_slideshow=1 デプロイ方法 Exrm Exrm (Elixir Release Manager) を使うのがよさげ。 Phoenix 公式でも紹介されている。 設定方法などはそちらを参照。 パッケージ作成 MIX_ENV=prod mix release で番環境用のリリースパッケージが rel/hello_phoenix/releases の下にバージョンごとに作成される。 起動 $

    Phoenixのデプロイ - yBlog
  • Phoenix で Poolboy を使ってコネクション(プロセス)プーリング - yBlog

    Poolboy を使ってコネクションプーリングができるようにする。接続先は memcached。 memcached のクライアントにはmcdを使った。 サンプルのhello_phoenixを元にした。手を加えたファイルだけ以下に貼っておく (ちなみに Phoenix は v1.0.0)。 実行してみと、、、 % curl localhost:4000 {"val":"Hello Phoenix"} 成功。 メモ mcd はプロセスを生成した時点ではmemcached と接続されていない。ので、start_link してすぐに使おうとすると、結果が取れない。 max_overflow の値を0以上にすると、プールしている数が size に達していてもさらにそこから max_overflow 分だけプロセスを生成する。 max_overflow 分のプロセスは必要になった時点で生成されるので

    Phoenix で Poolboy を使ってコネクション(プロセス)プーリング - yBlog
  • HTTPoisonのプーリング - yBlog

    HTTPクライアントにHTTPoisonを利用してみた。 同時実行数を増やすと50コネクション以上のコネクションは作成されないことがわかった。コードを見てみると、内部ではhackneyが使われていることがわかった。 hackney のドキュメントをみると、何も指定がなければデフォルトのプールが利用されるようだ(これ?)。 変更するためにはどうしたらよいかを調べた。 プールの数を変更する方法 名前をつけてプールを開始する。 poolname = :mypool options = [max_connections: 10] :hackney_pool.start_pool(poolname, options) HTTPリクエストを送る際のパラメータで、[hackney: [pool: :mypool]] を渡す。 HTTPoison.get!("http://localhost:4001",

    HTTPoisonのプーリング - yBlog
  • prefecture_jp というライブラリを作成した - yBlog

    prefecture_jpというライブラリを作成した。Hexにも上げた。 機能 都道府県コードから都道府県名への変換、またはその逆。都道府県コードは JIS X 0401 に対応(0埋め2桁の数字)。 使い方 単体で 都道府県コードから都道府県名を検索 iex> PrefectureJp.find("01").name "北海道" iex> PrefectureJp.find(code: "13").name "東京都" 都道府名から都道府県コードを検索 iex> PrefectureJp.find(name: "東京都").code "13" 都道府県情報の一覧 iex> PrefectureJp.all [%PrefectureJp.Prefecture{area: "北海道", code: "01", name: "北海道", name_e: "hokkaido", name_h:

    prefecture_jp というライブラリを作成した - yBlog
  • Elixirのドキュメント生成方法 - yBlog

    mix.ex の deps に ex_doc と earmark を追加する。バージョンは最新版で。 defp deps do [{:ex_doc, ">= 0.0.0", only: :docs}, {:earmark, ">= 0.0.0", only: :docs}] end パッケージのダウンロードとコンパイル $ mix deps.get $ mix deps.compile 環境変数に docs を設定して、mix docs コマンドを実行する。 $ MIX_ENV=docs mix docs 出来上がり。 ドキュメントを hex に上げる。 $ MIX_ENV=docs mix hex.docs

    Elixirのドキュメント生成方法 - yBlog
  • Elixir v1.1.0 - yBlog

    v1.1.0 がリリースされていた (下書きしているときは、v1.1.0 だったけれど、現在の最新版は v1.1.1)。 機能追加で特記すべきことは、Enum, Dict, Task への関数の追加と、MapSet 型の追加、と書かれている。HashSet よりも速く、今後はSetの実装はMapSetがメインになっていくっぽい。英語がよく理解できていない。ついでに言うと HashSet と MapSet の違いもよくわかっていない。 今後は MapSet を使うようにすればいいのかな。

    Elixir v1.1.0 - yBlog
  • 1