mmag

ハマったことメモなど

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

Ectoのmany_to_manyのドキュメントを読んでいたら、使用例の中でEcto.Changeset.change/2という関数が使われていました。

構造体からchangesetをつくってくれる関数なようです。知らなかった。struct入れてもchangeset入れてもいいみたい。キャストやバリデーション無しで変更を入れたいときに使うのじゃ、とのこと。

user = Repo.get(User, 1)

changeset = Ecto.Changeset.change(user)

changeset = Ecto.Changeset.change(user, %{name: "john"})

changeset = Ecto.Changeset.change(changeset, %{age: user.age + 1})

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

こういうやつ、いつもハマって時間使うので書いておきます。

postcssが〜とかではなく、extract-text-webpack-pluginがどんなやつなのか分かってなかったのが問題でした。これを使うと各loaderでコネコネした結果を指定したファイルに吐き出してくれます。これを使わずテキトーにやると、HTMLに謎の<style>が生成されて、えっ、productionでもこういう感じなの...と不安になります。

// webpack.config.js

var ExtractTextPlugin = require("extract-text-webpack-plugin");
var CopyWebpackPlugin = require("copy-webpack-plugin");

var extractCSS = new ExtractTextPlugin("css/app.css");

module.exports = {
  entry: [
    "./web/static/js/app.js",
    "./web/static/css/app.css",
  ],
  output: {
    path: "./priv/static",
    filename: "js/app.js",
  },
  module: {
    loaders: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: "babel",
        query: {
          presets: ["es2015"],
        },
      },
      {
        test: /\.css$/,
        loader: extractCSS.extract(  # この辺がよくわからんかった
          'style-loader',
          'css-loader',
          'postcss-loader',
        )
      },
    ],
  },
  postcss: [],
  plugins: [
    extractCSS,
    new CopyWebpackPlugin([{from: "./web/static/assets"}]),
  ],
};

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

おはようございます。

SSLの終端はNginxで、その後ろにWebアプリがいる、みたいなよくある構成をやっていたら、「リダイレクトが多すぎます」というようなエラーが出ました。前にも同じような構成をつくったことがあったので、こんなところでハマるとは、という感じでしたが、設定ファイルから1行抜けているのが原因でした。ポカミス。

upstream app {
    server 127.0.0.1:4000;
}

# For WebSocket
map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

server {
    listen 80;
    listen [::]:80;
    server_name MYDOMAIN.COM;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name MYDOMAIN.COM;

    ssl_certificate     /etc/letsencrypt/live/MYDOMAIN.COM/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/MYDOMAIN.COM/privkey.pem;

    location / {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;  # これ忘れてた
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;

        proxy_pass http://app;
    }
}

http → httpshttpshttps → ... というリダイレクトがされていたので、443の設定がトチってるんじゃのーと調べていたら見つかったわけです。

/socketへのリクエストのときにしか必要ない設定もあるので、その辺を整理して、あとSSLのランクみたいなの測るやつでAくらいにしときます。


追記

ホントに原因これなのかなという気がしてきた。合わせて使ってるcloudflareの設定が疑わしい。