mmag

ハマったことメモなど

Elixir

iexで「recompile」が便利だった

iex(1)> MyApp.MySup.start_my_server {:ok, #PID<0.101.0>} iex(2)> recompile 15:34:42.541 [info] Application my_app exited: :stopped Compiled lib/my_app/my_app.ex Compiled lib/my_app/my_sup.ex Generated my_app app {:restarted, [:my_app]} い…

Phoenixでgulpとか(brunchじゃないやつ)を使う

Phoenixフレームワークでは、mix phoenix.serverするとデフォルトでbrunchが立ち上がって、 web/staticらへんのファイルを監視してくれます。 とてもありがたいのですが、「え〜、brunch???」と思う方もいらっしゃるでしょう。 そんなときは、おもむろにconf…

phoenixでGET以外のリンクが効かなくなったときのメモ

なにが起きた phoenixのv0.16.0が出たのでガッとアップデートしたら、一緒にphoenix_htmlとかもバージョンが上がりました。動くっしょ〜と何も考えずにいたら、動かなくなってました。 症状は、linkヘルパで作ったリンクの内、GET以外(確認したのはPOSTとDELE…

Elixir Playgroundが便利っぽい

My @elixirlang playground is finally out! You can run code (!) & share/embed snippets. Have a look: http://t.co/dYoYOxMPOn #myelixirstatus— Steve Domin (@stevedomin) 2015, 8月 10 ということなので使ってみよう。 便利っぽい。

Ectoで複数のRepoを使う

なにがしたい 例えば、レガシーなシステムを徐々にモダンにしていきたいので、古いDBと新しいDBを 共存させたいとします。要は、異なる接続先の2つ3つのDBを使いたい。 どうする Repoを2つ作ります。 以下、Phoenixのディレクトリ構成に合わせて説明します。…

Ectoで生成されるidカラムの名前を変える

Phoenix v0.14.0, mariaex v0.3.2. 発端としては、デフォルトでつくられるidの名前をevent_idにしたかった。というか、事情によりしなければならなかった。table/2にprimary_key: falseを与えるとidが作られないというのはすぐにわかったのだけれど、auto_in…

Phoenixでconfirm付きのdelete

phoenix_htmlのlinkヘルパは、リクエストメソッドがgetの場合は普通にaタグでリンクを作り、そうでない場合はaタグをformでラップして、onclick属性が働くような組み立て方をしてくれます。 で、何かリソースをdeleteするようなリンクでは、「ホントにOK?」…

PhoenixでDBにseed

これが正解みたいな方法は無いのでは。多分。 # priv/repo/seeds.ex alias MyApp.User alias MyApp.Repo Faker.start Enum.each 1..99, fn i -> params = %{name: Faker.Name.name, email: Faker.Internet.email} User.changeset(%User{}, params) |> Repo.i…

HTTPoisonでパラメータありGETリクエスト

hackneyベースのElixir用HTTPクライアントライブラリのHTTPoisonでGETリクエストを送ろうとしてハマったのでメモ。 どこでハマったかというと、GETパラメータの指定方法がよくわからんかった。結論はこれ。 params = [key1: 1, key2: 2] HTTPoison.get!("htt…

社内Elixir勉強会をやってて思ったこと

5月のアタマから、だいたい週1回のペースで社内Elixir勉強会をやってきました。 新卒のペーペーですが、ちょっと思うことがあるので、だらだら雑にポエムを垂れ流しておきます。 特に、何か主張したいことがあるわけじゃないです。 ちなみに勉強会の資料はこ…

社内でElixir勉強会をした

GMOペパボ社内で「おいお前らElixirやるぞ!!」なことをしました。 資料はこちら Elixirだ 第1回 - 基礎だ - from Joe_noh 一応社内のエンジニアに届くかたちで呼びかけはしましたが、諸々の都合で急遽開催したので、結果ワタシが同期4人に対して1時間ほど…

MapSetがElixirに入るとのこと

Erlang 18のリリース後、Elixirに新モジュールMapSetが追加されるようです。 lexmagさんが実装・ベンチマーキングし、HashSetと比較した結果がこちら。 MapSet evaluation - elixir#3242 ひゃー。爆速。 この記事を書いている時点ではまだ全ての関数のベンチ…

phoenix.newがarchiveされるっぽい

以前、Phoenixプロジェクトの新規作成というエントリで書いた方法が、v0.10.0で導入されたbrunch周りでエラーを吐くようになっていて困ったっちー。 そこで、ふとphoenixframework/phoenixのmasterの様子を見てみると、こんなのがマージされてた。さすが、バ…

ElixirのHashSetを読んだ

lib/elixir/lib/hash_set.exです。 なにするやつか iex(1)> set = HashSet.new #HashSet<[]> iex(2)> set = HashSet.put(set, :a) #HashSet<[:a]> iex(3)> set = HashSet.put(set, :b) #HashSet<[:b, :a]> iex(4)> set = HashSet.put(set, :c) #HashSet<[:c,…

Mixプロジェクトに同梱したファイルを参照する

ある新しいライブラリに以下の問題があってムムッと思ってプルリクした。 例えばlib/data/people.ymlを置くとする。lib/my_app/module.exでこのファイルを読みたい。 # ダメな例 "lib/data/people.yml" |> File.open # 良い例 "../lib/data/people.yml" |> P…

メモ

Phoenix + Ember(Ember CLI) priv/static/js/にember-cliプロジェクトのdistへのsymリンク貼る。 web/templates/layout/application.html.eexとかに <%= if Dict.get(@conn.assigns, :ember_page, false) do %> <script src="js/dist/assets/vendor.js"></script> <script src="js/dist/assets/emph.js"></script> <% end %> とか書く。さらに、dist/ind…

Phoenixプロジェクトの新規作成

※ 追記 このエントリの内容は古くなっています。以下の記事を参照してくださいな。 phoenix.newがarchiveされるっぽい - mmag 追記終わり。 -- おひさ。 いままでは本家をgit cloneして目当てのバージョンのタグにチェックアウトして、 $ mix phoenix.new my…

Hex 0.6.0の新機能hex.docsしてみた

Elixirにはhexというパッケージマネージャがあって、そのv0.6.0がリリースされました。 目玉機能はhex.docsで、これで自分のライブラリのドキュメントをhttp://hexdocs.pm/ライブラリ名/バージョン番号に公開できます。バージョン番号を省略すると最新版に飛…

Phoenix+Houndでテスト回すと警告いっぱい出る

Elixir製の代表的ウェブアプリフレームワークPhoenixで、かの有名なRails Tutorialをなぞってみているのである。 Joe-noh/ph_microblog まだ途中だし、よくわからんとこは端折っているのである。 途中からはCapybaraが出てくるので、Houndを使って結合テスト…

mix deps.getでエラったら

Elixirで何かしようとしたら必ずmix newするのであります。 そしてElixirやErlangのライブラリを使おうとしたら、mix.exsのdepsに書くのであります。 大抵の場合は、 [{:hoge, github: "someone/hoge"}] みたいな感じでいけるけれども、git cloneにも色々あ…

Elixirのsupervisor, worker, superviseヘルパーがイケメンだった

最近Elixirのことしか書いてないです。たぶんもうしばらくこんな感じです。 ErlangでOTP使うときとか、スーパーバイズしたい子供をつくるときに、child_specと呼ばれる書き方でどんな子供をつくるか指定します。公式のドキュメントにはこんな風に書いてあり…

elixir-modeのタブインデントをスペースにした

使っていたノーパが壊れ、勢い余ってMBAを注文して舞い上がっている私です。 せっかく環境が新しくなったので、ghqとかモダンなものを入れてますし、せっかく環境が新しくなったので、前から気になってたelixir-modeのタブインデントをスペースにしようと思…

Elixirでループ使って関数定義しようとしてハマった

例えば、 defmodule Greeting do Enum.each [:hello, :goodbye], fn (greeting) -> def unquote(greeting) do IO.puts unquote(greeting) end end end というもの。上手く使えばコード量がドチャクソ減って幸せになれるのですが、「invalid syntax in def :h…

Elixirで新しく使えるようになったオペレータ

つい先ほどElixir 1.0.0がリリースされました。めでたいめでたい。 個人的には、1.0.0-rc2で入った変更に注目しております。 [Kernel] Add <~, ~>, <<~, ~>>, <~>, <|> as operators これです。 次のようなことができるようになりました。 defmodule M do de…

ElixirのPlug

今日はPlugです。 Plugとは まずPlugとはなんぞやというところですが A specification for composable modules in between web applications Connection adapters for different web servers in the Erlang VM だそうです。イメージはRackです。今はCowboyと…

ElixirのOptionParser

について述べます。 準備 まずは今回使うサンプルをば。この辺にはあんまり触れません。 mix new optsみたいなことして、 # lib/opts.ex defmodule Opts do def main(args) do OptionParser.parse(args) |> IO.inspect end end # mix.exs defmodule Opts.Mix…

Elixirのマクロについて浅く語ってみる

1.0のリリースが近づき、Elixir熱の高まりを感じる今日この頃、皆様いかがお過ごしでしょうか。 本日は、Elixirの特徴の1つであるマクロについて書いておこうと思います。対象読者は、Elixirの文法くらいはなんとなく分かるっていう人かな。 コードを書くコ…

MixにTaskを追加する

ElixirにおけるMixは、Rubyで言うとRakeポジションにあたるモノ。 当然タスクを自作できるはず。 まずmix new hogeして、ディレクトリ掘削作業。 $ mkdir -p lib/mix/tasks/hoge hogeってのはプロジェクト名と揃えておいたけど、fugaでもOK。いっぱい作って…

mix ecto.drop → no password supplied

$ MIX_ENV=dev mix ecto.drop Repo ** (Mix.Error) The database for repo Repo couldn't be dropped, reason given: Password: psql: fe_sendauth: no password supplied . lib/mix/tasks/ecto.drop.ex:32: Mix.Tasks.Ecto.Drop.run/1 (mix) lib/mix/cli.ex…

codepointsとgrapheme

Elixirのドキュメントを眺めていて、String.codepointsとString.graphemesの違いがわからなかったので調査。 ソースにはこんなコメントが。 複数の記号で1文字をなすものを表現するのがGraphemeという解釈でいいのかな。 つまりElixir特有のものではなくてUn…