mmag

ハマったことメモなど

Elixir

BOLG依存パッケージアップデート業 2022/09/18

ちょっと前にdependabotを入れたせいで(おかげで)大丈夫そうならポチポチアップデートしてしまっており、しばらくこのシリーズも書いてないことに気づいたので、今朝来ていたdependabot PR2つだけ書いておく。 logger_json https://github.com/Nebo15/logg…

BOLG依存パッケージアップデート業 2022/07/30

API Dependency Current Latest Status credo 1.6.4 1.6.5 Update possible ecto_sql 3.8.3 3.8.3 Up-to-date ex_aws 2.3.3 2.3.3 Up-to-date ex_aws_s3 2.3.3 2.3.3 Up-to-date gettext 0.19.1 0.20.0 Update possible hackney 1.18.1 1.18.1 Up-to-date id…

PostgreSQLでpublic以外のスキーマをつくって使う

dev.classmethod.jp という記事を見かけたのが発端。いままで特に深く考えずにpublicスキーマの世界で生きていたんだけど、ユーザごとにスキーマつくって権限あげるのがお行儀いいよな、と思ってやってみた。 -- init.sql CREATE DATABASE mydb TEMPLATE='te…

BOLG依存パッケージアップデート業 2022/06/12

APIだけちゃちゃっとやるます。 Dependency Current Latest Status credo 1.6.4 1.6.4 Up-to-date ecto_sql 3.7.2 3.8.3 Update possible ex_aws 2.3.1 2.3.2 Update possible ex_aws_s3 2.3.2 2.3.2 Up-to-date gettext 0.19.1 0.19.1 Up-to-date hackney 1…

BOLG依存パッケージアップデート業 2022/04/26

API ex_aws 2.2.10 2.3.1 Update possible oban 2.10.1 2.12.0 Update not possible phoenix 1.6.6 1.6.7 Update possible phoenix_pubsub 2.0.0 2.1.1 Update possible plug 1.13.4 1.13.6 Update possible ex_aws https://github.com/ex-aws/ex_aws/blob/c…

BOLG依存パッケージアップデート業 2022/03/24

API Dependency Current Latest Status credo 1.6.3 1.6.4 Update possible ecto_sql 3.7.2 3.7.2 Up-to-date ex_aws 2.2.10 2.2.10 Up-to-date ex_aws_s3 2.3.2 2.3.2 Up-to-date gettext 0.19.1 0.19.1 Up-to-date hackney 1.18.1 1.18.1 Up-to-date id_to…

BOLG依存パッケージアップデート業 2022/02/23

いつもさらっとChangelog見て雰囲気で上げてるんだけど、どうせなら何したか書くか、という1発目。npmは数が多くてまとめるの面倒なので、とりあえずhexだけ...。 Dependency Current Latest Status credo 1.6.2 1.6.3 Update possible ecto_sql 3.7.2 3.7.2…

Phoenix LiveViewでCustom Elementsを使うとスタイルが崩れる

github.com 自分はShoelaceってのを使っていて起きたんだけど、どうやらLiveViewがDOMの差分を更新するときに、Custom Elementの子ノードに手を出してしまうっぽい。phx-update="ignore"を付けて回避。 <sl-button phx-click="like" phx-update="ignore"> <sl-icon slot="prefix" name="hand-thumbs-up"></sl-icon> Like </sl-button>

GitHub ActionsからHexにパッケージを公開する

name: Publish on: push: tags: ['v*'] jobs: publish: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: erlef/setup-elixir@v1 with: otp-version: '23.1.1' elixir-version: '1.11.2' - uses: actions/cache@v1 with: path: deps key:…

マクロでTypespecsも書く

前の記事でもマクロでゴニョゴニョするときのことを書いたけど、今回もそれ系。 前提 マクロで関数定義してるとします。使う例は以下のAPIクライアント。Enum.mapで回しててdefmacro使ってないけど、やりたいことはcompile timeに関数を定義するってことなの…

Elixirでドキュメントのテストを書く

結論 https://hexdocs.pm/elixir/Code.html#fetch_docs/1を使えばできる。 前提 以下を題材にします。 defmodule MyModule do @moduledoc "モジュールの説明" @doc "関数の説明" def my_fun do end end @moduledocや@docに期待した内容が書かれているかテス…

ブログつくった

長らく放置していたブログプラットホームのリポジトリがあったんだけど、最近のご時世もあって日々の変化が少ないので、日記でも書こうかなと思って開発再開してリリースまでしました、という話です。技術的な面について書きます。 構成 まずはざっくりイメ…

:sys.get_stateをよく忘れる

http://erlang.org/doc/man/sys.html#get_state-1 GenServer使ったモジュールの単体テストでstate見ようとして、いつも思い出せなくてググってるので3回書く。 :sys.get_state(pid) :sys.get_state(pid) :sys.get_state(pid) :sysがパッと出てこねーんだよな…

Protocolの@deriveについて調べた

Elixir 1.9がそろそろ出そうなところに1.8の話をするんですけど、1.8からInspectプロトコルで文字列化される構造体のメンバをキーで指定できるようになりました。 defmodule User do @derive {Inspect, only: [:id, :name, :age]} defstruct [:id, :name, :a…

Phoenixでresourcesをネストさせるときにaliasも設定できる

普通にやるならこうする。 scope "/v1", MyApp do pipe_through :api resources "/users", UserController, only: [:index] do resources "/articles", ArticleController, only: [:index] end end 生成されるルーティングはこれ。 $ mix phx.routes user_pa…

Ectoのカスタムロガー

github.com 3.0-rc.1がもっぱら話題のEctoですが、ロガーを追加する方法をたまたま見つけたので書いておきます。Ecto.Repoをuseするときにloggersっていうオプションを渡します。 defmodule MyApp.Repo do use Ecto.Repo, otp_app: :my_app, loggers: [ {Ect…

ExUnitAssertMatchっていうパッケージを書いた

hex.pm 伝わる人には伝わる言い方をすると、https://github.com/r7kamura/rspec-json_matcherみたいなことがしたい。 例えばPhoenixのコントローラのテストとかで、レスポンスのJSONの形式をテストしたいときに assert json["user"]["name"] == "John" asser…

PhoenixでPage Specific JavaScript

と言ってもすでにインタネットに情報があります。 medium.com まずはviewモジュール名(@view_module)とテンプレート名(@view_template)からjsファイルのパスが導出できるように取り決めしておき、bodyタグのdata属性にそのパスを吐き出しておく。で、DOMCont…

GenStageのcastやcallもdispatchするんですね

github.com 以前ふむふむ眺めただけだったので触ってみたら微ハマりした。 defmodule Producer do use GenStage ... def enqueue(item) do GenStage.cast(__MODULE__, {:enqueue, item}) end def handle_cast({:enqueue, item}, state) do {:noreply, [item]…

EctoからSQL関連の機能が分離されるらしい

github.com EctoはポスグレなんかのRDBMSと使われることが多いと思われるけど、役割としてはschemaでデータの構造を定義したりchangesetでデータを操作したりrepoを通して実際にデータを保存したりといろいろあり、SQLを扱うことだけが仕事じゃない。どんな…

ElixirのConfigに関する議論が盛り上がっている

これ elixirforum.com 課題意識としては、Mixプロジェクトにおけるconfigはアプリケーションが起動するときに読み込まれるけれど、その一方でそれをreleaseビルドするときはコンパイルするときに読み込まれるという違いがあり、混乱のもとになっている、とい…

GraphQLやってる

前に書いた社内向けの日報Webサービスで、RESTful(RESTish?)なAPIからGraphQLなAPIに書き直しをしてる。 サーバ側 そもそもそんなに大きなアプリケーションではないので、雑にhas manyやらassociationsを辿っていく程度のものはすぐにできた。認証はAuthoriz…

使ってない依存パッケージがmix.lockに残ってるとき

なんやかんやで、mix.exsからは消えてるのに、mix.lockには残っちゃってる依存性があるとき。 $ mix deps.unlock --unused でmix.lockから消せる。

AbsintheでContextを組み立てたりMiddlewareを挟んだり

最近AbsintheをつかってGraphQLサーバを実装しはじめているのですが、これどう書くんだろと思って調べたことがあったのでメモ。 調べたと言ってもドキュメントに全部書いてあったので、ドキュメント写してるみたいになってる。まあいいよね。 Context GraphQ…

one_for_allとrest_for_allはtemporaryなプロセスの死で発火しない

再起動戦略one_for_allのSupervisorがいたとして、そこにtemporaryなWorkerとpermanentなWorkerがぶら下がっているとします。 permanentがWorkerがクラッシュすると、temporaryなWorkerが落とされて、両方再起動します。one_for_allなので。 しかしながら、t…

umbrellaではRPCしてくれる君をつくろうという話

Elixirのumbrellaは知っていましたが、実際これ分散させて動かすときどうなんのさ、というイメージがぱっとしていなかったのですが、こちらを読んだら腹落ち感が生まれたのでメモ。特にInterface Moduleを切った上でRPCする、というところ。 medium.com 例え…

Absintheをちょっと触った

Absinthe(アブサン、アブサント)というElixirのライブラリがありまして、GraphQLのAPIやってみよということでちょっと触りました。 http://absinthe-graphql.org/ ほんとにちょっと触っただけなので見せるコードもありませんが、いくつか思っていることを…

あっちこっちでpreload問題

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

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

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

はやく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本…