mmag

ハマったことメモなど

マクロで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に期待した内容が書かれているかテス…

Advent of Code 2020

今年も12月になったのでAdvent of Codeを始めた。 https://adventofcode.com/ 昨年はIntcodeっていう仮想マシンみたいなものを拡張しながら問題を解いていく形式だった。実装して、与えられた入力を食わせて、答えをPOSTして、はい正解不正解、みたいな。た…

ブログのAPIからScoutを外した

最近日記の方のブログに簡単な監視を入れたんだけど、どうも500エラーがぽつぽつ出ていてステータスページの印象が悪くなってた。 なんぞーと思ってログを見たら20分弱間隔で膝にSIGTERMを受けている様子が見られた。なんかリソース食いすぎたりしてRenderの…

ブログにテーマを設定できるようにした

最近つくってるブログの話。設定を変える機能はまだつくっていなくて固定値がAPIから返ってくるだけなので「設定できるようにした」というのはタイトル詐欺で、実際は「APIレスポンスに応じてテーマが変わるようにした」が正しい。 仕組み SSRするときにAPI…

ブログにScoutを入れた

前回書いたブログを引き続き触ってて、レスポンスタイムとかなにもわからない状態だったので見れるようにした。RenderにはAddonっていう仕組みがあって、今の時点では LogDNA Scout Fromspree がある。ポチッとやると使えるようになるので、Front(記事表示…

ブログつくった

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

Custom Propertyが定義されていればそれを使い、定義されていなければデフォルト値を使うSassの変数

CSS

$main-color: var(--main-color, #345); ただ単に使えば#345にフォールバックするし、どこかで--main-colorを定義しておくと上書きできるっていう一発ネタ。おやすみなさい。

pre-commitが便利

https://pre-commit.com/ git commitする前にあれこれやってくれるやつ。Nodeのプロジェクトだとhuskyとか使うことがあるけど、monorepoで言語が混在してるときに便利。ルートにこんな感じの.pre-commit-config.yamlを置きます。 - repo: git://github.com/p…

Svelteコンポーネントをテストするときはテスト用コンポーネントを書くといい気がした

気がしているという程度なので話半分で。 前提 Svelteのコンポーネントをテストしたい。テストにはjestと@testing-library/svelteを使用。 本題 発端としては「Buttonコンポーネントをrenderするとslotの中身が表示される」というはじめの一歩的なものを書こ…

Svelteのstoreでバリデーションを実装する

追加 npmにpushしました。https://www.npmjs.com/package/svelte-validator 追記おわり いい感じのバリデーションのライブラリないかなーと探していたんですが自分で書ける気がしてきたのでPoC的なところまでやったやつです。 import { writable, derived } …

Renderでmonorepo管理されたアプリケーションを動かす

render.com RenderというPaaSがあります。ダッシュボードからGitHub連携してリポジトリ選んでbuildCommandとstartCommandを設定するとWebアプリがスポンと立ち上がって便利です。タイトルにはmonorepoとか書いてあるんですが、つまり言いたいことはbuildComm…

2019年に実装したちょい地味なやつ

SUZURI Advent Calendar 2019 2日目のエントリです。 SUZURIの開発をやっている者です。アイテムの追加とか機能の開発とかパフォーマンスの改善とか、そういうことをして暮らしています。何を書こうかなーという感じなんですが、今年担当した機能追加でオモ…

: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…

AtomでSvelte 3のSyntax Highlight

https://svelte.dev/docs#Component_format にもあるように*.svelteはだいたいHTMLなので、HTMLのハイライトを使うようにエディタを設定してやればよさそう。ブログに書くときもHTMLってことにすれば <script> export let name </script> <style> .p { color: purple; } </style> <p>Hello {name}</p>…

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…

PipenvとDocker Compose

最近Djangoのプロジェクトをつくっているのですが、docker-compose upで立ち上がるようにしておこうとググったところ、なんかイマイチじゃない?ってのが多く出てきたので、自分なりのやつを書いておきます。 Dockerfile FROM python:3.7-slim RUN apt-get u…

ハチャメチャに速いサイトをつくりたい

ということを思って、もうだいぶ前だけどhttps://surisuri.ninjaっていうのをつくった。半端になってるページもあるけど、やりたいことはざっとできたので趣味としては満足。Herokuで動いてます。ソースはこちら。いま仕事で開発してるサービスの公開APIで本…

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…

Gettextってよくできてるんだな、という感想

Elixir経由でしか使ったこと無いけど、Wikipediaを読むとどれでも大体同じっぽい。 joe-noh.hatenablog.com なんでよくできてると思ったかというと、仕事でRails書いててtranslation missingをチラホラ出してしまい「直してもまだ漏れがあるのかないのかわか…

dev.toコードリーディング会に参加した

smarthr.connpass.com 行ってきました。十数人で各々が好きなところから読み始めて、最後に見所や気づきを喋る流れでした。initializersを読んでいく人やモデル中心に見ていく人など様々。近日中に全員のメモが公開されるとのことですので、そのときはリンク…

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を扱うことだけが仕事じゃない。どんな…

Apolloのcache updateがやや辛そうに見える

使っているのはvue-apolloだけど。 Mutationした結果をつかってquery cacheを更新する、ということができる。これによってもう一回queryしなくてよくなるなどの効果がある。Optimistic responseと組み合わせると、迅速なフィードバックを利用者に返すことが…

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

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

Atomic Designのあいつら

Atomic Designという、コンポーネント単位で設計してく手法というか考え方みたいなものがあるわけですが、様々な解釈があるようでみんな違うこと言ってる気がしている。ここ半年くらい仕事とか趣味プロダクトで試したり、あちこちブログ読んだりしてなんとな…

GraphQLやってる

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