読者です 読者をやめる 読者になる 読者になる

mmag

ハマったことメモなど

Phoenix v1.3からのディレクトリ構成をもう一度調べる

はいこんにちは。 Phoenix v1.3.0-rc.0がリリースされました。前リリースからの大きな変更として、Phoenixプロジェクトのディレクトリ構成がガラッと変わります。新たな構成に対応したジェネレータは、phoenix.*ではなくphx.*というタスクになっています。つ…

ニポポタマスを支える技術

こんにちは。 わたくし、勤め先の有志と社内向けの日報投稿Webサービス、ニポポタマス(通称ニポタマ)をやっています。元々は会社の開発合宿でつくりはじめたものですが、会社のみんなが日々の出来事、書きたいことを書ける場として、また僕ら開発者がやり…

あっちこっちでpreload問題

こんばんは。 Ectoでは関連を明示的にpreloadすることがよくあります。例えばUserがPostを複数持っていて、それをUserControllerのshowアクションでこんなjsonで返したいとき、 { "user": { "name": "joe_noh", "posts": [ {"title": "...", body: "..."}, {…

知らなかった、と言ったな。あれは嘘だ。

はい。 先日、Ecto.Changeset.change/2 知らなかった - mmagというエントリを書いたのですが、前に自分が書いたコードでchange/2使ってました。はい、知ってました。 例えば、UserとOrganizationがmany_to_manyな関係にあるとします。あるユーザを、ある団体…

Ecto.Changeset.change/2 知らなかった

Ectoのmany_to_manyのドキュメントを読んでいたら、使用例の中でEcto.Changeset.change/2という関数が使われていました。 構造体からchangesetをつくってくれる関数なようです。知らなかった。struct入れてもchangeset入れてもいいみたい。キャストやバリデ…

postcssで書いたものをwebpackで1つのまとめる

こういうやつ、いつもハマって時間使うので書いておきます。 postcssが〜とかではなく、extract-text-webpack-pluginがどんなやつなのか分かってなかったのが問題でした。これを使うと各loaderでコネコネした結果を指定したファイルに吐き出してくれます。こ…

リバースプロキシ(Nginx)がToo Many Redirects

おはようございます。 SSLの終端はNginxで、その後ろにWebアプリがいる、みたいなよくある構成をやっていたら、「リダイレクトが多すぎます」というようなエラーが出ました。前にも同じような構成をつくったことがあったので、こんなところでハマるとは、と…

PhoenixでモデルのSchemaに無い属性をレスポンスのJSONに含める

はいっこんばんは。 PhoenixでJSON APIを書いてて迷ったことがあったので書きます。見落としている簡単なやり方があるんじゃないかと。 前提 UserモデルとPostモデルがあり、UserはPostをlikeできるとします。postsテーブルのカラムはidとtitleとbodyがあり…

はやくElixirConf 2016の録画が観たいという気持ち

もう時間は深夜1時を回っていて寝なきゃいけないのに、こんなツイートを見てウォーッ!!となってしまった。 Watch this space for #ElixirConf videos. All should be out by Sep 26.https://t.co/I2OsL8TQFW— ElixirConf (@ElixirConf) 2016年9月8日 でもまだ1本…

erlenv&exenv から evm&kiex にしてみた

exenvがGitHubからバージョンリストを引っ張ってくるときに、APIのrate limitに引っかかってelixirがインストールできないことがあったり、メンテされてなかったりで、なんかなーという感じだったので乗り換えてみた。あと、intellijを使ってみようとしたら…

Phoenix v1.3からディレクトリ構成が変わるっぽい

※ 多分に推測が含まれています。あとでちゃんと調べないと ※ 今まさに海の向こうではElixir & Phoenix Conf 2016が行われているのですが、インタネッツを通してこんなツイートが流れてきました。 Coming in Phoenix 1.3 #elixirconf @elixirphoenix #myelixi…

社内ISUCON

弊社GMOペパボで社内ISUCONというイベントが行われ、総勢10チームによる戦いが繰り広げられました。競技の詳細は近々テックブログあたりに書かれるんじゃないかと思うので割愛して忸怩たる思いを連ねます。 自分は若手チーム(2年目+1年目+1年目、自分は2年…

Gettextの使い方メモ

はいコンバンハ。 Gettextっていうモジュールがあるんですが、POTとかPOファイルとか、なんかよくわかんなかったので書いておきます。 できること いわゆるi18n、アプリケーションの国際化ができます。Phoenixアプリ前提にしてしまいますが、例えばHTMLに <h1><%</h1>…

これからはexrmではなくdistilleryを使っていくべきらしい

github.com 1週間ほど前にこんなコミットがあり、exrmは御役御免になるそうです。代わりに今後はdistilleryを使うように書かれています。読み方はディスティラリーかな。 作者はexrmと同じ人で、exrmを開発していくよりも一度ゼロから書き直したほうがよいと…

hex v0.13.0に上げたらクラッシュするようになった

hexのv0.13.0出たよアップデートしてね、というメッセージが出たので、v0.13.0に上げてみたところ、mixタスクを実行するとこんなエラーを吐いて止まるようになってしまった。 Could not start Hex. Try fetching a new version with "mix local.hex" or unin…

Payment Request APIを試す

Payment Request APIという仕様の策定が進んでいるという話を聞きまして、ちょっと触ってみました。 あまりコードは書いてないですが、ここに置いてあります。 github.com https://joe-noh.github.io/payment_request_api/でも試せるようにしてあります。108…

「GenStage.Flowをちょっと触ってみた」っていうエントリ書こうとしたらよくわかんなくなったけどアッて気づいて解決した

んですよ。 GenStage.Flowのドキュメントには、 alias Experimental.GenStage.Flow File.stream!("path/to/some/file") |> Flow.from_enumerable() |> Flow.flat_map(&String.split(&1, " ")) |> Flow.reduce(fn -> %{} end, fn word, acc -> Map.update(acc…

気づいたらheroku-buildpack-elixirが最新バージョンに対応してくれてた

昨日か一昨日くらいにheorku-buildpack-elixirを使って、herokuに以下の組み合わせを指定したらErlangのインストールでコケた。 Erlang 19.0.2 Elixir 1.3.2 おやおやと思ってソースを見に行って、この行でS3からPrebuiltなErlangを落としてきていることがわ…

mix test --listen-on-stdinについて

こんばんわ。Elixir v1.3.2がリリースされましたね。 github.com withのelseでwhenが使えるようになったのが目玉っぽいのですが、mix testに--listen-on-stdinというオプションが入ったことに良さがあるのではないでしょうか。このオプションが入ったプルリ…

ansibleのinventoryファイルには接続方法が書けた

昨日の記事ではdockerコンテナさんにansibleを適用していきましたが、最後にこんなことを書いていました。 web.ymlにconnection: dockerが入り込んできていて、開発環境はdocker、本番環境にはsshで、とか分けたい場合なんかはちょっと工夫が必要そう。 する…

dockerコンテナにansibleを適用する

ディレクトリ構成 Best Practicesのこの辺りを参考に。 . ├── Dockerfile ├── docker-compose.yml ├── hosts ├── requirements.txt ├── roles │ └── common │ ├── tasks │ │ └── main.yml │ └── templates │ └── we_are_the.txt.j2 ├── site.yml └── web.yml…

いつのまにか Elixir v1.3.1 が出てた

んですよ。 最近全然追えてなかったんですが、Bug Fix中心かな?とおもったらBug Fix中心でした。 github.com ただ改めて、こんだけの規模のプロジェクトで、issueが10件、プルリク3つって凄いなーと思いました。みなさんいつもありがとうございます。

dockerにitamaeレシピを適用してserverspecでテストする

やりたいことは表題の通り。結果はGitHubに。 docker まずはDocker for Macをインストール。アイコンかわいい。 docs.docker.com 起動したら適当なイメージを落としとく。 $ docker pull ubuntu:xenial gems 適当なディレクトリを切ってGemfileを作成。 # Ge…

MVPアーキテクチャってこうですかわかりません

世の中にはMVCやMVVMやMVPといったアーキテクチャがたくさん考えられています。そういうものに基いてアプリケーションを開発していくと、コードが整理されてメンテナンス性が上がったりテストしやすくて幸せなわけですが、本当に自分の書いているコードはこ…

新卒研修でgitについて座学をした

こんばんわ。 この度、勤務先のGMOペパボで新卒エンジニアの研修担当になりまして、その一環としてgitやGitHubについて1時間ほどお話をしました。 もっとgit from Joe_noh 手元でコミットしてプルリク出すとかはできる前提で、 コンフリクトしたときどうする…

ExUnitで不要なログを出力させないようにする

前回のエントリで、ExUnitには色々と便利なタグがあるということを書きました。 今日は、そのうちの1つcapture_logについて書きます。 使い所 例えばJWTを扱うためのライブラリjokenは、不正なトークンを与えると以下の様なログを吐きます。 21:17:51.385 [w…

ExUnitで特定のテストだけ実行・スキップする方法

特定のテストだけ実行する ファイル単位で指定して実行する mix testに引数を渡すことで、そのファイルだけテストを実行できます。 $ mix test test/my_test.exs 行番号を指定して実行する ファイル単位の指定に加えて、:5のように行番号を指定できます。 $ …

ExUnit.Caseのasyncオプションはfalseがデフォルト

直近の3エントリでは醜態を晒し、もう晒しきったと思いきや別のところで勘違いをしていたことがわかったので書いておきます。 Elixirでテストを書くときはExUnitを使うのが定石となっていまして、以下のような書き方をします。 defmodule App1Test do use Ex…

遅いと思ったときに原因を調べない奴は何をやってもダメ

昨日は遅いと思ったからといってすぐspawnするのはダメとか言っていたけど、もう少し前にやることがあるだろうがオイ、という話。 前々回のエントリで、 こんな遅かったっけ?と思いながらおもむろにspawn と書いた。「こんな遅かったっけ?」と思ったのにそ…

遅いと思ったからといってすぐspawnするのはダメ

昨日は遅いと思ったらとりあえずspawnとか言っていたのが、そうもいかなくなりましたという話。 昨日書いたやつがこれ。Rails Tutorialに沿って書いている。 ## priv/repo/seeds.exs alias PhMicroblog.{User, Repo} defmodule Helper do def insert_user!(n…

遅いと思ったらとりあえずspawn

以前にも書いたように、Rails Tutorialをphoenixでやってたやつをまたちょいちょい書いている。 その中で、seedでダミーのユーザを100人つくるというのがあった。かなり前にseedつくる用のパッケージ書いたなと思い出してメンテしてねぇやべぇとおもったけど…

Elixir 1.2.6がリリースされた

今から3、4時間前に、Elixir v1.2.6がリリースされていました。 github.com バグ修正はとりあえず置いといて、機能追加として以下があったようです。 Erlang 19のサポート RC 2まで来ているErlang/OTP 19をサポートするようになりました。 quote generated: …

はてなブログでElixirがsyntax highlightされるようになってた

さっきのエントリを書いているときに気づいたのだけれど、Elixirのコードにちゃんと色がつくようになっていた。これまでは文法やキーワードが似ているrubyを指定してお茶を濁していたのだけれど、今後はelixirと書けそう。いつからなんだろ。 比べてみるとこ…

Elixir 1.3から使える時間に関するsigil

Elixir 1.3から時間に関する構造体がいくつか定義されました。そのうちの3つ、Date, Time, NaiveDateTimeをつくるsigilが追加されています。それぞれ~D, ~T, ~Nです。 iexで~D(2016-06-04)と打っても、そのまま表示されてしまい何が作られているのかよくわか…

こういうプルリクはどうなんだろうか、という話

github.com github.com github.com github.com よいところ 読みやすくなる スペルミスが無くなる 用語が統一される よくないところ ノイズになる git blameが見づらくなる 大事なプルリクが埋もれる 誰も悪くないんだけどねぇ。 やるなら一気に1コミットで、…

ExUnitのdescribeとnamed setupについてもう少し丁寧に

今日の昼に書いたエントリはとても雑だったので、もう少し丁寧に書きます。 describe describe/2マクロを使うことで、複数のテストケースをまとめることができます。 defmodule MyAppTest do use ExUnit.Case, async: true describe "addition" do test "1 +…

ExUnitでdescribeが使えるようになった

昨日は小言を並べました。 ついさっきElixir 1.3.0-rc.0がリリースされていることを発見しました。 github.com 変更点を眺めていると、気になる一文が!! [ExUnit] Support for bundling tests together with describe/2 なんと!! 試す こんな風に使いま…

hexパッケージの名前付けについて小言を並べる

前回はvalidate_confirmationという関数のことを書きました。 今日はhexパッケージの名前はどうあるべきかについて思うトコロを書いていきます。 なんでこんなことを書こうと思ったかというと、hex.pmに"Naming your package"というセクションが設けられたか…

validate_confirmation/3 という存在を思い出した

一通り実装してから、Ecto.Changeset.validate_confirmation/3があったことを思い出してしまった。 model |> cast(...) |> validate_confirmation(:password) ってすると、passwordとpassword_confirmationの値が一致してるかチェックしてくれる。

mix test に --stale オプションが追加された

昨日は途中で寝ながらエントリを書きました。 さて、このプルリクで入った機能について書きます。 github.com mix testに--staleというオプションが追加されたよ、というものです。 --stale --staleオプションを付けると、前回のテスト以降に変更されたコー…

get_in/2 と Access.all/0 の処理を追っていく

昨日はAccessモジュールに入った便利関数についてのエントリを書きました。 今日はそれがどうやって実現されているのか読みます。今の時点での最新版はd24a263です。 Access.all/0 まずそもそもAccess.all()は何を返すのでしょうか。 def all() do &all/3 en…

Elixir 1.3に入るAccessモジュールの関数

先ほど、こんなTweetを見た。 Elixir v1.3 will have new accessors for nested data structures. Here is how to upcase all languages names in a map: pic.twitter.com/FNTTqjpDeP— Elixir Lang (@elixirlang) May 26, 2016 %{languages: [%{name: "elixi…

GenRouterってなんぞ

社内のElixir勉強会で↓のtalkを観た。 GenRouter, GenStageという新たなアイデアを検証中で、elixir-lang/gen_brokerにコードがあるとのこと。 github.com 見どころはたくさんあるけれど、今日はGenRouter。 GenRouterのmoduledocの最初の方 読んでく。 複数…

priv/repo/migrationsが無くてテストもできなかった

昨日はPhoenixアプリをちょっと書いたエントリを書きました。 そのプロジェクトは私物のPCでphoenix newして生成したものなのですが、会社のPCでgit cloneしてmix testとやったら何かエラー。 ** (Mix) Could not find migrations directory "priv/repo/migr…

npmから取ってきたBootstrapをBrunchを通してPhoenixで使ったりした

昨日は老いを感じるエントリを書きました。 懲りずにまた作り直しをちょこちょこと始めたのですが、やっぱりElixir楽しいですね、はい。 Rails Tutorialはこれで3回目くらいですが、昔やってたゲームを引っ張り出してきたような懐かしさが少しあります。 www…

そう、歴史は繰り返すのだ

今日ふと、「Rails TutorialをPhoenixでやってみてたことあったな」と思い、GitHubを漁ったところ、https://github.com/Joe-noh/ph_microblogというリポジトリが発掘されました。 github.com 最後のコミットは約1年前。phoenixのバージョンは0.9.0。 バージ…

Vector ClockとCRDTについて調べた

昨日 Vector ClockとCRDTsについて調べてるけどまだ上手く説明できない と泣き言を言った後、調べてなんとか書きました。actorの気持ちにはあんまりなってません。 言葉や概念の正確さが不安なので、詳しい方にぜひご教授頂きたいです。 Phoenix.Presence Ch…

Vector ClockとCRDTsについて調べてるけどまだ上手く説明できない

社内のElixir勉強会で↓のtalkを観た。 Phoenix Presenceを実装するためのベースになっているVector ClockとCRDTsについて調べたり議論したのだけれど、混乱して「よくわからんね」となったので宿題として調べている。色々わかってきて「こういうことかな〜」…

Elixir Meetup #2 でLTしてきた

できないことはPortで外注 from Joe_noh www.slideshare.net なんかkeynoteからPDFにしてslideshareに上げたら日本語消滅しました。 なのでpptxにしてから上げたので、フォントが意図したものじゃないのですがご勘弁ください。 自分が話したのは、Portモジュ…

Ecto 2.0.0-betaを試す (3)

今回はEcto.Multiです。 なにそれ Ecto.Multiとはそもそも何かというと、1つのトランザクション内で行われるべき複数のRepo操作をまとめるデータ構造です。DBを操作する前にどのような変更がなされるのか覗き見することができます。これの導入に伴い、before…

テーマはFB matteをベースにしてます。作者さんに感謝を込めて。