私が歌川です

@utgwkk が書いている

コカコーラゼロの定期おトク便の最適な周期をつかむ

平日に1.5Lペットボトルを1.5本弱ペースで飲むので、2週間で2箱 (12本) がいちばん近いか? 定期おトク便の周期を合わせるまでが大変で、家に大量のコーラがある暮らしが続いていた。今はちょっと足りないかもしれない。

コカ・コーラ ゼロ 1.5L PET ×6本

コカ・コーラ ゼロ 1.5L PET ×6本

  • Coca・Cola zero(コカ・コーラゼロ)
Amazon

grapheneでナイーブなnodesクエリを実装する

複数のIDを指定してデータを一括で取得したい場合があって、手作りした。ナイーブにはこういう感じでいける。N+1クエリになるのでもうちょっとうまくやる必要がありそう。

import graphene

class Query(ObjectType):
    # 中略

    nodes = graphene.Field(
        graphene.NonNull(graphene.List(relay.Node)),
        ids=graphene.List(
            graphene.NonNull(graphene.ID),
            required=True,
            description="The IDs of the object",
        ),
    )

    def resolve_nodes(root, info, **args):
        ids = args["ids"]
        return [graphene.relay.Node.node_resolver(None, root, info, id) for id in ids]

こういう実装をしたら以下のようなGraphQLスキーマになる。

type Query {
  # 中略

  nodes(
    """The IDs of the object"""
    ids: [ID!]!
  ): [Node]!
}

GoでGraphQLクライアントを書くために github.com/hasura/go-graphql-client を使ったら便利だった

あらすじ

Go言語でGraphQL APIを叩くクライアントを書くことがあって、クエリをベタ書きするのはともかく返り値にマッピングされるようなstructの型を用意するのが面倒すぎる。正常系だけならそれでもまだなんとかなるかもしれないけど、異常系のことも考えて書く……となると気が遠くなる。

なんとかならないかと思って探していたら表題のクライアントを見つけた。GitHub - shurcooL/graphql: Package graphql provides a GraphQL client implementation. をフォークして機能追加したライブラリらしい。

github.com

使ってみた

以下のようなGraphQLスキーマがあるとする。実際のスキーマからはだいぶ端折っている。

type Artwork implements Node {
  id: ID!
  title: String!
  caption: String!
  nsfw: Boolean!
  topIllust: Illust
}

type Illust implements Node {
  """The ID of the object."""
  id: ID!
  thumbnailUrl: String!
}

たとえば以下のようなGraphQLクエリを発行したいとする。

query artworkInfoQuery($id: ID!){
  node(id: $id) {
    ... on Artwork {
      title
      caption
      nsfw
      topIllust {
        thumbnailUrl
      }
    }
  }
}

以下のような無名structを作ってあげたら、変数も渡しつつリクエストできる。inline fragmentもシャッと書ける。これだけでGraphQLクエリを手書きする手間、レスポンスのJSONに合わせたstructを作る手間、異常系をハンドリングする手間が1つにまとまった。

graphqlClient := graphql.NewClient(graphqlAPIEndpoint, nil)

var artworkInfoQuery struct {
    Node struct {
        Artwork struct {
            Title   graphql.String
            Caption graphql.String
            Nsfw    graphql.Boolean
            TopIllust struct {
                ThumbnailUrl graphql.String
            }
        } `graphql:"... on Artwork"`
    } `graphql:"node(id: $id)"`
}
err = graphqlClient.Query(context.Background(), &artworkInfoQuery, map[string]interface{}{
    "id": graphql.ID(artworkID),
})
if err != nil {
    log.Print(err)
    return
}

ちょっとGraphQL APIを叩いてなんかやりたい、ぐらいのときには愛用することになりそう。

オタクグッズに関する考察

前から見ると部活のパーカーみたいに見えるけど、後ろには部員の写真がデカデカと載っている、と考えるとおもしろい気がする。部活のパーカーを作るとして、部員の顔をデカデカと載せることはないと思う。


↓これの話です。

f:id:utgwkk:20220415132929p:plain
ブルーアーカイブ パーカー アリス: キャラグッズ|ムービック

吉祥寺.pm 29でトークした #kichijojipm

kichijojipm.connpass.com

レギュレーションに則って*1一句用意してから臨みました。発表資料は以下です。

speakerdeck.com

自分にとって馴染みのない分野の業務に飛び込むという「挑戦」だったけど、振り返ってみればこれまでと変わらない方法で着実に身につけて知識を展開してきたのではないだろうか、という話をしました。技術的な詳細に触れずに自分なりのノウハウを展開できたと思います。このブログ記事を読んでいる皆様の、新しいことに取り組むときの心がけを教えてほしいです。


今回は「挑戦」がテーマということで、様々なことに挑戦してうまくいった話、うまくいかなかった話などをいろいろ聞くことができてよかったです。こういった発表を見ると、刺激を受けてなにか新しいことに手を出してみたくなります。

*1:リモート開催に句会レギュレーションは適用されるのか?