私が歌川です

@utgwkk が書いている

エレベーター神社の夢

学校の裏の小高い丘の上に神社があって、そこに行ってモニュメントに手をかざすと、指輪付きの栽培キットみたいなものをもらえる。

帰ろうとしたら誰かに間違えられたのか、女の人に話しかけられてわけがわからないので困る。

神社を出てエレベーターで降りようとするけど上りしか来ない。

GraphQLの規格には書いてあるけど意外と知らなかったこと

はじめに

2021/10 時点の規格を読んでいきます。ご存知でしたか?

意外と知らなかったこと

不要なfragmentの定義を含めたクエリを書いてはいけない

https://spec.graphql.org/October2021/#sec-Fragments-Must-Be-Used

「不要なfragmentの定義を含めたクエリを書いてはいけない」こと自体は、GraphiQLなどで試しているとたまに怒られることから経験的に知っているのですが、規格上そうなっています。クエリの文字数が減ればpayloadも小さくなるので理にかなっていそう。

inline fragmentにdirectiveを書ける

https://spec.graphql.org/October2021/#sec-Inline-Fragments

たしかに @include directiveを使いたくなりそうですね。書く位置には気をつけましょう。

interfaceは別のinterfaceを実装できる

https://spec.graphql.org/October2021/#sec-Interfaces.Interfaces-Implementing-Interfaces

GraphQLのinterfaceは別のinterfaceを実装できます。規格にあるスキーマの例では、Node インタフェースと Resource インタフェースが定義されており、ResourceNode インタフェースを実装していることが示されています。

interface Node {
  id: ID!
}

interface Resource implements Node {
  id: ID!
  url: String
}

ちなみにこちらも循環参照はできません。

interfaceには少なくとも1つのフィールドを含める必要がある

https://spec.graphql.org/October2021/#sec-Interfaces.Type-Validation

GraphQLのインタフェースは少なくとも1つのフィールドを持つ必要があります。従って、以下のような空のinterfaceは不正です。

開発に利用するライブラリによっては素通しされてしまうこともあるかもしれません。たとえばRelay v13.0.0ではエラーにならないようでした。

interface Dummy # invalid

規格に準拠していないとどうなるか

ライブラリの振る舞いが保証できなくなります。たとえば、apollo-kotlinでは規格に準拠していないスキーマを使うと以下のような分かりづらいエラーが出る場合があります。

github.com

Pixel 6を買った

セールの波に乗るしかない、ということで買った。もともと使っていたPixel 3aを下取りに出すこともできてお得。

家で使うぐらいなのでケースなしでいいかと思ったけど、Daft Punkみたいなカメラが傷つきまくるのはちょっと偲びない気もしたので、適当なケースをヨドバシで注文して装着した。画面フィルムは付けてない。

やっぱり評判通りに大きな端末で、まあ家で使うぶんには大きくてもいいか。KindleとかYouTubeとか見るぶんには画面が大きい方ほうが有利なのかもしれない。

指紋認証は今のところグッと押したらちゃんと反応していて好印象。iPhoneのFace IDは指紋よりも反応しやすくてけっこう気に入ってて、マスクを付けたまま認証できるようになったのでもうTouch IDには戻れないな、という感じだったけど、こちらはどうか。

スペックをちゃんと読んでいなくて、イヤホンジャックがないことに届いてから気づいたけど、なんとかします。

スマホの名前にキャラクター名を付けるのがブーム。今使ってるiPhoneの名前は「パイモンのiPhone」だけど、パイモンはiPhone使ってなさそう。もうちょっと別の人の名前にしてもよい気がするけど、新しいiPhoneを買うのが先かどうか。

ドキドキ文芸部プラス! をちょっとやった。いつまでネタバレを回避しないといけないのかが難しくて曖昧なことを言うけど、追加要素のサイドストーリーを読むのが一番いいと思う。ローカライズはちょっと雑かもしれない。

あとは名越先生の実況動画 (プラス! ではない) を見たらいいと思う。

www.youtube.com

GraphQL Code GeneratorでTypeScript向けのenumの型だけを生成してみる

tl;dr

  • プラグインを作る (改造する) と実現できることは分かった
  • 既存のプラグインのオプションを調整するだけで実現できるかは不明

背景

GraphQLスキーマファイルを生成するためにGraphQL Code Generatorを使っており、GraphQLクエリに関するコード生成はrelay-compilerを使っている。また、プログラミング言語としてTypeScriptを使って開発している。

動機

relay-compilerが生成するTypeScriptファイルにenumの型定義が含まれている。enumを使うqueryやfragmentのファイルに型定義があるけど、個別のファイルとして欲しい。

GraphQLクエリを書いた箇所ごとにenumの型定義があるので借用する、という形ではなくenumの型定義が置いてあって自由に使えるとよさそう、というイメージ。コンポーネントに紐づかないユーティリティー関数を書きたくなる場合もあって、そういうときにどこからenumの型定義を借用するのか、という問題が出てしまう。

既存の手法

GraphQL Code GeneratorのTypeScriptプラグインでもenumの型は生成できるけど、inputの型なども含まれてしまう。欲しいのはenumの型定義なので、うまく出力を絞りたい。

TypeScriptプラグインを改造する手法

GraphQL Code GeneratorのTypeScriptプラグインの出力を絞ればよいのではないか、という方針でちょっと書いてみた。enum.tsを見ると、enumの型定義だけしかないことが分かると思う。

github.com

おわりに

GraphQL Code GeneratorのTypeScriptプラグインを改造すると表題にあることは達成できると分かった。もうちょっと手軽にできる方法があればよいけど、誰か知ってたら教えてください。

blog.utgw.net

このとき買ったFitbit Charge 4をずっと使っていて、ついにバンドが折れた。

Amazonで適当なバンドを探していたけど、この、ネイビいブルーという色名に (色にも) 惹かれたのでただちに買って、今日届いた。つけ心地は普通。

Fitbitを使いはじめてもう5年目ということが分かる。なんだかんだでバンドを買い替えつつたまに新しいモデルを買うぐらいで暮らしている。

blog.utgw.net