I released http_proxy 0.3.0 which support play/record http request. Now, the library support multiple port proxy and each proxies support play/record request. Hex: https://hex.pm/packages/http_proxy Docs: http://hexdocs.pm/http_proxy/0.3.0/extra-api-reference.html GitHub: https://github.com/KazuCocoa/http_proxyMore
Tag Archives: elixir
[Elixir]implement binary search with Elixir
ElixirでBinary Searchを実装してみた。メモ。 This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters defmodule Search do def binary(_, []), do: -1 def binary(search, [head|tail]) when…More
[Elixir]1worker、1portでリクエストを待ってHTTPのリクエストをProxyする
HerokuがErlang製のHTTP Proxyを公開しましたね。少し中身見てみたのですが、彼らもForkしたCowboyを使ってProxyを構築しているっぽい。他にも軽く読んでは見たのですが、Erlangも多少読めるようになっててびっくり。 https://github.com/heroku/vegur 話は少し変わって、[Elixir]Elixirで簡単なHTTP Proxyを書いているときに出会ったエラーのメモで、Supervisorのworkerごとに異なるportを待ち受けてそれぞれが独立したproxyとして動作する機構を書いてたのですが、PIDの衝突の発生で思った感じでできてませんでした。 でも、考えるほどにやっぱりできるはずだよなーと思いもう少しやってみました。それと、先ほどのVegurでもやっぱり異なるPortで待ち受ける処理が書いてあって、やっぱり実装間違ってるなと確信。 もう一度考え直してみると、今回は考えた通りに書いていったら期待通り動作することができました。 結局は、 Plug.Adapters.Cowboy.http に対して与えている ref の与え方が間違っていた、という情けないミスでした… リポジトリ: https://github.com/KazuCocoa/http_proxy 前回の誤り 今回 これで、例えば以下のような実装を書いたときに、Supervisorで監視される各々のWorkerが異なるProcessとPortでリクエストを待つことができるようになります。 HttpProxy.Handle のモジュールに、先ほどのCowboyの起動が実装されていることを想定しています。 修正時のコミット(ファイルの置き換えあり): https://github.com/KazuCocoa/http_proxy/commit/8b5368f15a2e149ac7069a33379e4c190cf93374 Elixir/Erlangさわりはじめて、大学の頃もでしたが、やっぱり私は分散系に対して技術的な興味を持っているのだなーと感じました。More
[Elixir]ex_topで各PIDの動作をみる
Elixir/Erlangのprocessに対してtopコマンドを実行できるライブラリ https://github.com/utkarshkukreti/ex_topMore
[Elixir]Elixirで簡単なHTTP Proxyを書いているときに出会ったエラーのメモ
追記 2015/11/08 [Elixir]1worker、1portでリクエストを待ってHTTPのリクエストをProxyする で解消済 最近、簡単なHTTP Proxyを書いてみています。Elixir/Erlangの多プロセスで動作する点を利用して、軽量なproxyとして動作できるのかなー?というところがあってです。 https://github.com/KazuCocoa/http_proxy 以下のような感じでportを指定したら、そのportに対してどんなパスでアクセスしたかで接続先を制御できる感じにしています。 Plug や Cowboy を結局は使っています。Supervisorのworkerとしてプロセスは起動するようにもしています。 この動作確認の中で、ElixirのSupervisorで複数のPlugを持つ同一モジュールを動かそうとしたらPIDの競合でエラーがでたのでメモ。少し調べてみると、それはPlugが Plug.Adapters.Cowboy.httpや Plug.Adapters.Cowboy.https をSupervisorで起動するときに :name で __MODULE__ を指定しているのが原因な気がしています。 というのも、例えばSupervisorで呼ばれたときにまず起動するここらへんで使われる、start_link で最初に呼ばれるところで ref: を与えたり、 workerで与える :id を変えても変化なかったためです。ここな感じ。More
[Elixir]GenServerのcallとhandle_callにおける:nameによる指定
GenServer.start_link __MODULE__, default, [name: __MODULE__] で name を指定することの必要性に関してメモ。 以下の通り、Sample.neko を読んだ時、 __MODULE__ にメッセージが送られてGenServerのコールバックであるhandle_call にメッセージが送られる。そのパターンマッチで処理される handle_call が決定、実際にプロセスで処理される。という一連の処理を作るために、 start_link では名前をちゃんと与えることが必要。そうでなければ、process idを直接指定しなくてはいけない。(それはあまり現実的ではない..) 関連した修正はこちら https://github.com/KazuCocoa/my_bot_ex/commit/b9be93de02e47b97a2a2e93dcbb46104ddb47004More
[Elixir][Swift]ElixirやSwiftのprotocolなどの話
たまたま見つけて。 Comparing protocols and extensions in Swift and Elixir http://blog.plataformatec.com.br/2014/06/comparing-protocols-and-extensions-in-swift-and-elixir/ ElixirはClojureに影響されているのですね。protocol周辺の使い道。 パッと、 defimpl の対象となるタイプを思い出せなかったので以下にURLを一応。 http://elixir-lang.org/docs/stable/elixir/Kernel.html#defprotocol/2 こんな感じ。 defimpl の 第一引数のタイプ によって、どのタイプに対する実装かを示しています。 Swiftは、記事のものは古いので省略。も少しあとで。More
[Elixir]Post app reviews, get with simple_app_reporter_ex, to Slack
I implemented simple posting app reviews to slack with Elixir-Slack(version 0.2.0) and Reporter(version 0.2.5). Base implementation to handle post to slack with Elixir-Slack This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.…More
『Programming Phoenix』を読んでみた(まだドラフト版)
ElixirによるRoR実装と表現される、Phoenix Frameworkの作者による書籍『Programming Phoenix』を読んでみました。今はドラフト版ですが、こういうフレームワークの基本的な思想とか好きなのと、PhoenixはElixirのmacroを駆使しているという話をみて、気になって買って読んでみました。(Elixir、macroがほぼそのままLips形式の記述なのですが、そこも著者は気に入っているそう。) 以下ではElixir 1.1.0、Phoenix 1.0.3を対象としてます。 内容としては、簡単なサンプルを作りながらPhoenixの話、Ecto、Plug.Conn、Ecto.QueryなどのElixirの基礎要素の話がありました。テストの話なんかはまだ書きかけ。Phoenixの話ばかりと思ってたら、結構Elixirの周辺の機構の主要な要素をかいつまんでいて、良い意味でびっくりでした。 個人的には、 https://github.com/KazuCocoa/web_qa_vote で作っていたことがこの書籍読んだあとだったらもっとサクッとできたのかな、という感じでした。ある程度Elixirの文法わかって、簡単なWebアプリ作ったことがある人が、中身を理解するという段階で有用な書籍っぽい。 技術的なところは置いておいて、個人的に面白かったのは、所々でてくる、著者らによるコラムです。なんでこうしたか?というところに、どのような意図があってこうした、というのが散らばってます。 例えば、Phoenixの内部処理ではAtom keyを使うけれど、外部(開発者)はString keyでパラメータを書く。これは、データの安全性への考慮を含めているから、というような。Phonenixの web ディレクトリと lib ディレクトリの役割の違いなど。あと、HTMLのtemplateの処理がPhoenixではなぜ早いか?というところに対しては、Phonenixは、templateをStringではなくlinked listsとして扱っているから、そのぶん性能的な改善が見られる、らしい。 以下、書籍のまとめとかではないけれど、個人的に派生して読んだり学んだことのメモ。 Phoenixのテンプレート的な話 Viewを生成するとき、以下の Phoneix.HTML.safe_to_string の関数を通して、 :safe 要素を持つTupleでViewのhtmlを表現したりしている。 https://github.com/phoenixframework/phoenix_html/blob/master/lib/phoenix_html.ex#L156 Dive to logic of authorization 認証機構の実装の話も扱っていたので、ついでにGuardianの中身も覗いてみました。結構似たことしているので、初見では読み悩んでいた箇所もスラスラ読めるようになっててびっくり。 例えば、sign_inした状態のsessionを作り出すときの話。Guardianを使う場合、以下のような処理を書いたりします。 この中で、 Guardian.Plug.sign_in/4 を覗いてみると以下のような処理をしています。 guardian/lib/guardian/plug.ex この中でパイプでつながっている set_* 系のものを見ていると、 Plug.Conn.* のPlugの機構の中で put_session とかしてて、いろいろ conn に Map.put して情報を付与していることがわかります。 つまるとこ、Guardianは conn の構造体にあるassignsやstateなんかのキーに値を追加していっているのですね。なるほど。ちなみに、 put_session は、 Plug.ConnのprivateのMapに独自の情報を追加していくのですね。…More
[Elixir]power_assert_exをex_parameterizedと組み合わせて使ってみた
Power AssertのElixir版を、 @ma2ge さんが作成されていたので、ex_parameterizedと合わせてみました。ex_parameterizedは、パラメータ化テストの記述を支援する、簡単なマクロです。 power_assert_ex https://github.com/ma2gedev/power_assert_ex ex_parametarized https://github.com/KazuCocoa/ex_parameterized やることは簡単。単に、 use ExUnit.Case を use PowerAssert に置き換えるだけでした。 ex_parameterized自体、単に test マクロを内部では使っているだけなので、特に変なAST操作は行っていません。なので、問題なく表示されました。すごい。 以下は、ex_parameterizedのテストをわざと失敗させた時の出力結果です。 まだ色々と制限もありますし、ExUnitの結果自体そんなに読みにくいテスト結果なわけではありません。ただ、なんだかんだでテスト結果を観察することが楽になりますので、良いなーと思いました。More