私が歌川です

@utgwkk が書いている

relay-compilerが要求する命名規則

はじめに

みなさまはrelay-compilerを使っていて以下のようなエラーに遭遇したことはありませんか。私は3000回ぐらいあります。

ERROR:
Parse error: Error: RelayFindGraphQLTags: Operation names in graphql tags must be prefixed with the module name and end in "Mutation", "Query", or "Subscription". Got `BarQuery` in module `Foo`. in "components/Foo.tsx"

relay-compilerは graphql タグ内に記述したQuery, Mutation, Fragmentの名前に「モジュール名から始まる」「Fragment以外は種類 (Query, Mutation) で終わる」という規則を要求し、従っていない場合はコンパイルを失敗させます。例えば components/Foo.tsx なら FooQuery FooMutation Foo_user のように、モジュール名 Foo から始めないといけません。

一方で components/Bar/index.tsx のようなパスの場合は Bar がモジュール名になります。今のチームではReactコンポーネントのファイルパスは基本的にPascalCaseにして実装していますが、camelCase*1やsnake_caseやkebab-caseを使う場合も考えられるでしょう。

relay-compilerが要求するモジュール名がどのように判定されているのか、気になりませんか?

Relay 12の実装を見る

ということでrelay-compilerの実装を見ましょう。v12.0.0 タグにcheckoutして探してみます。

エラーメッセージをもとに探してみます。RelayFindGraphQLTags: でgrepするといくつか出てきます。今回該当するのは以下の行ですね。

github.com

validateTemplate 関数の呼び出し元は、同じファイルの find 関数のみなので、この引数が moduleName でモジュール名だと分かります。ということで getModuleName 関数の実装を見ればよさそうです。

getModuleName 関数の実装は以下です。コメントと合わせて読むと分かりやすいですね。kebab-caseはうまくcamelCaseに変換してくれるようです。snake_caseは回避したほうがよさそうなことも分かります。.ios.js.android.js のようなファイル名のときに特別対応が行われているのは知りませんでした。

getModuleName 関数のテストを見たほうが早いかもしれませんね。

github.com

Relay 13

ところで今日、Relay 13がリリースされていました。1行目にさらっと書いてありますが、relay-compilerは完全にRustで書き直されたようです。手元にrelayのリポジトリをcloneしていたのですが、久しぶりにpullしたらめちゃくちゃ時間がかかってびっくりしました。

github.com

気を取り直して勘でRustを読んでいきます。module name でgrepしたら以下の行が見つかりました。ここで module_name というフィールドに渡している値を特定できればよさそうに見えますね。

github.com

すぐ上を見ると extract_module_name という関数がありそうですね。この関数の定義は以下です。正規表現が使われていないのですが、おそらくここで互換性を壊すようなことはないだろうと想像します。

github.com

テストも見てみました。一見するとRelay 12までと挙動は変わっていなさそう?

github.com

おわりに

relay-compilerが要求する命名規則が分かりました。そろそろRustを難なく読み書きできるようになったほうがよいのかもしれません。

*1:先頭が小文字。Reactコンポーネントだとあまりない?

2021振り返り

去年の振り返りはこちら。

blog.utgw.net

ライフイベントがいろいろあったので、それを起点に振り返ってみる。

退学した

去年は大学院を休学してずっとアルバイトをしていた。そのまま1年が経過して、今年も休学を続けようかと思っていたけれど、思い直して退学することにした。

学位があるに越したことはないけど、モチベーションがないのに無理をしていてもよいことはないと思っていて、きっかけがあり背中を押された感じ。今のところは、やっぱり在学したままの方がよかったのではないかとか、学位があった方がよかったと思うことはない。どうしても研究をやりたくなったらまた入学し直すのだろうと思う。

就職した

大学院を退学して新卒入社した。ひきつづき京都にいる。

今はReactやGraphQLを駆使したWebサービスの開発に携わっている。どちらの技術要素も入社以前はチュートリアルを流し読みしたことがあるぐらいだったけど、卒なく使いこなせている (と自分では思っている)。宣言的UIやスキーマ駆動開発・コード生成の体験がよくできていると感じる。たまにPerlを読み書きすることもある。

意外なのが、けっこうコミュニケーションを取る動きをしまくっている。こんなにやり取りを行うことになるとは想像していなかった。ちゃんと議論をした上で仕事をできているのはいいことだと思う。

引っ越した

学生の頃よりずっと住んでいたマンションの一室から、京都市内の別のマンションの一室に引っ越した。引っ越しに伴っていろいろ捨てたり買い揃えたりしたので、生活の質はかなり上がったと思う。今の情勢だと自室にいる時間が圧倒的に長くなるので、部屋に投資した効果がよく出ていると思う。

2022年に向けて

社会人2年目ということになるので、自分の身の回り以外や少し先の未来のことも考えられるようになりたい。あと、そろそろみんなで飲みに行きまくりたい……。

旧居を退去

昨日退去立ち会いをやった。歴史的経緯によって管理会社の人も自分も原状があいまいすぎた。6年も住んだら壁紙代はチャラになる。

敷金から賃貸契約時に定めたクリーニング代を差し引いた額が全部返ってくるので、実質的に満額返還ということになる。今更気になってクリーニング代について調べてみた。クリーニング特約というものがあるらしい。こちらとしては、請求されすぎなければなんでもよい気がする。

Q16 賃貸借契約にクリーニング特約が付いていたために、契約が終了して退去する際に一定の金 額を敷金から差し引かれました。このような特約は有効ですか。

A クリーニング特約については①賃借人が負担すべき内容・範囲が示されているか、②本来 賃借人負担とならない通常損耗分についても負担させるという趣旨及び負担することに なる通常損耗の具体的範囲が明記されているか或いは口頭で説明されているか、③費用と して妥当か等の点から有効・無効が判断されます。 https://www.mlit.go.jp/common/001005064.pdf

空っぽになった旧居で手を叩くと、音がやけに反響した。学生時代をまるまる過ごした家なので安くて狭くて不便でも思い出ぐらいはある。ユニットバスを破壊した思い出とか……。

引っ越してから買ったもの

引っ越すにあたっていろいろ買った。

冷蔵庫

www.muji.com

無印良品の冷蔵庫を買った。基本的に水とコーラぐらいしか冷やさないのでなんでもいいと思うけど、下側が冷凍室なのが気に入っている。

ドラム式洗濯機

部屋の見学をしたときは、これはドラム式洗濯機を置けるかは怪しいですね、と言われたのだけど無事に設置できた。洗濯から乾燥まで一気にやってくれるので楽。動作音や振動はそんなに気にならない。

プラズマクラスターの効果はよくわからない。

空気清浄機

加湿器を新しくするついでに加湿機能付きのものを買った。空気のきれい度ランプみたいなのが付いていて、旧居から持ってきた段ボール箱を開封すると赤くなっておもしろかった。

プラズマクラスターの効果はよくわからない。

ルンバ

ルンバの名前はパイモンにした。ちゃんと分かるようにテプラを貼ってある。名前付きの首輪みたいなマインドだと思う。

床の物を全部どかしておいたらルンバが勝手に掃除してくれて便利。たまにゴミ入れを掃除するとホコリが溜まっていてすごい。継続的に掃除してくれるのがいい。

メタルラック

床にモノを置くだけでは収納効率がよくない。大小あわせていくつか買った。組み立てがやや大変だけど確かに高さ方向のスペースをうまく使えるようになって便利。

カーペット

旧居から持ってきたラグやカーペットを新居の部屋に敷くとサイズがぜんぜん合わなかった。どうせなので新調することに。こたつを使うので、こたつと両立できるものを選んだ。

昇降机

flexispot.jp

部屋が広くなったので机が欲しいと思っていて、Flexispotの手動昇降机がよいらしいと教えてもらったので買った。これまではこたつで仕事していたので遥かにグレードアップした。組み立てが大変だった……。

終わりに

手取りを超える額の引き落しが控えているけど後悔はしていない。おかげでヨドバシポイントが10000ptを超えた。


今週のお題「買ってよかった2021」

よいレビューコメントを集めておきたい

弊社では他者評価を行うことになっているのだけれど、その際に他者評価対象の同僚のファインプレーをサクッと思い出せるようにしたい、と日頃から思っている。振り返りの文章で言及されていない内容だとなおよいと思う。

最高の実装ができてすごい!! の他にも、こういうレビューコメントで救われました、プロダクトの性質を見通すことができている!! といったことを伝えておきたい。評価シーズンになってから思い出すと時間がかかるので日頃からメモしておきたい、と他者評価の入力を終えてから思った。

GitHubだとPRのレビューコメントに対するpermalinkが取れるので、それをスプレッドシートとかに記録しておくのが手軽だろうか。いいと思ってみんなにも知ってもらいたいなら日頃からそういう表明をしておくとよさそう。ファインプレーのpermalinkならなんでもいいはずなので、レビューコメントに限らずPRのdiffとか、issueのコメントとか、そういうのも記録しておくとよいのではないか。

『「集合と位相」をなぜ学ぶのか』を読んだ

熱伝導方程式を解くためにフーリエ級数の理論が考案されて、ところで積分とは何か、実数とは、集合とは……というふうに、先人の議論を追って、集合・位相が数学における共通語になった経緯を教えてくれる本だった。

証明はぬるっと流す感じで読んだ。学生時代も微分積分学の講義の証明をよく噛み砕けなくて丸暗記してから試験に臨んだのだった……。