ハコヅミを作る #60:料理にカテゴリとおすすめ度を付ける(2つの Issue を1つの PR に、人のレシピをコピーしてよいか)

前回(#59)と同じ日の、続きです。キャンプの前に料理を登録していて、気になったところを直しました。

  • 料理にカテゴリを付ける
  • おすすめ度の★を付ける
  • 2つの Issue を、1つの PR にまとめる
  • 人のレシピを、コピーしてよいか
  • 書く欄があっても、また書き忘れる

料理にカテゴリを付ける

料理の一覧は、名前順の1列でした。数が少ないうちはよいのですが、朝ごはんも、おつまみも、同じ列にまざります。

ギアと消耗品の一覧は、カテゴリごとに、緑の仕切りで分かれています。料理も、同じ形にします。

料理の編集の画面。「名前(必須)」の欄にホットサンド、その下の「カテゴリ」の欄に朝食

名前の下に、カテゴリの欄(架空のデータ)

カテゴリは、決まった選択肢から選ぶのではなく、自由に書きます。前に使ったカテゴリは、候補に出ます。ギア・消耗品と同じ作りです。

リスト表示にも、仕切りを入れるか

カード表示は、ギアと同じように仕切ればよい、とすぐ決まりました。迷ったのは、リスト表示です。1件が1行の一覧に、仕切りを入れると、うるさくならないか。

頭の中で考えても分からないので、Claude Code に画面イメージを出してもらいました。出てきたのは、絵ではなく、実際の画面です。一覧のページを一時的に書き換えて、架空の料理を入れて撮り、撮ったあとでコードを元に戻しています。

料理の一覧のリスト表示。「おかず」「おつまみ」「朝食」「未分類」の緑の仕切りの下に、料理が1行ずつ並ぶ。名前の後ろに、おすすめ度の★が出ている料理がある

リスト表示。カテゴリごとに仕切る

見てみると、うるさくはありませんでした。フリーの料理は 20 件までなので、仕切りで縦に伸びる分も、気になりません。リスト表示にも、仕切りを入れることにしました。

「入れたらどう見えるか」で迷ったときは、言葉で話し合うより、実際の画面を見るほうが早く決まります。

分けないと決めたところ

キャンプの登録の画面には、「作る料理」を選ぶ欄があります。ここも、カテゴリで分けるか。Claude Code の案は「分ける」でした。

わたしは、分けないことにしました。1回のキャンプで作る料理は、せいぜい数品です。選ぶ側の一覧(最大 20 件)が、仕切りで長くなるほうが、使いにくいと考えました。

同じデータでも、画面ごとに、要るかどうかは違います。「一覧で分けたから、ここも」と、そろえることを目的にしないようにします。


おすすめ度の★を付ける

ギアには、おすすめ度(★5つ)と、おすすめ理由の欄があります。料理にも、同じものを付けました。

料理の編集の画面の、おすすめ度の欄。★が5つ塗られていて、右に「未設定に戻す」のボタン。その下に、おすすめ理由の欄

ギアと同じ、おすすめ度の欄

今は、自分の覚え書きです。「これは、またやりたい」「これは、手間のわりに」を残しておけます。

本当のねらいは、もう少し先にあります。ハコヅミには、ほかの人のギアやキャンプを見られる「共有」の機能を、いずれ作る予定です。そのときに、ほかの人の「おすすめの料理」を参考にしたい。そのための項目を、先に用意しておきます。

欄そのものは、ギアの部品をそのまま使いました。「1〜5 の数であること」「おすすめ理由は 1000 文字まで」という決まりも、ギアのものを使い回しています。新しく作ったのは、一覧に★を出すところだけです。

料理の一覧のカード表示。「おかず」「おつまみ」の仕切りの下に、カードが2列で並ぶ。カードの下の「食材 0 件」の右に、★が出ている

カード表示。食材の数の右に★

★を付けていない料理(焼き枝豆)には、何も出しません。「☆☆☆☆☆」と出すと、「評価が低い」ように見えるからです。


2つの Issue を、1つの PR にまとめる

カテゴリと、おすすめ度。やりたいことは別々なので、Issue は2つに分けました。

ただ、作るところは、ほとんど重なります。

  • どちらも、料理のテーブルに列を足す
  • どちらも、登録・編集の画面に欄を足す
  • どちらも、一覧の見た目を変える
  • どちらも、データの書き出しに項目を足す

別々に作ると、データベースの変更(マイグレーション)が2つ、PR が2つ、リリースが2回になります。同じファイルを続けて触るので、2つ目の PR は、1つ目がマージされるのを待つことになります。

そこで、Issue は2つのまま、実装は1つのブランチ・1つの PR・1つのマイグレーションにまとめました。

別々に作る まとめて作る
Issue 2 2
マイグレーション 2 1
PR と CI 2 回 1 回
リリース 2 回(か、待って1回) 1 回

Issue を分けておくのは、「何を確かめたら終わりか」(受入条件)を、機能ごとに持つためです。PR の本文には、2つの Issue の受入条件を、それぞれ表にして載せました。

「1つの Issue に、1つの PR」は、分かりやすい決まりです。でも、目的は、あとから追えることと、確かめやすいことです。同じ場所を触る小さな機能は、まとめたほうが、どちらも良くなります。


人のレシピを、コピーしてよいか

おすすめ度の Issue を書きながら、もう1つ、先の話を Claude Code に聞きました。

共有された他の人の料理を自分の方にコピーする機能はどうだろうか? 利用規約などで明記する必要があると思うが、他の人の料理を取り込むことは問題となるか?

返ってきた整理は、こうでした(Claude Code は法律の専門家ではないので、作る前に確かめる前提です)。

問題になりにくいところ

  • 材料の一覧と、「切る」「10 分煮る」のようなふつうの手順は、アイデアや事実に近く、一般に、著作権では守られにくい
  • 自分のために写して使うだけなら、手で書き写すのを、楽にしているだけ

問題になりうるところ

  • 写真。はっきり著作物で、人が写っていることもある。コピーでは、写真を持っていかないのが安全
  • 工夫のある文章。もとの人が、本やサイトから写していた場合、コピーで広がってしまう
  • 「退会するとすぐ消える」という約束。もとの人が退会しても、コピーは、相手の手元に残る

3つ目は、言われるまで気づきませんでした。ハコヅミのプライバシーポリシーには、退会すると、登録内容や画像はすぐに消える、と書いてあります。コピーの機能を作ると、この文が、そのままでは正しくなくなります。

機能を1つ足すと、すでに書いてある約束が、ずれることがあります。「この機能を入れたら、規約のどの文が変わるか」を、作る前に見ます。

コピーした料理は、共有できないようにする

わたしからは、こう足しました。

ただ、他の人からコピーした料理は共有不可とする必要はありそう(真似しながら新規に作れば回避できてしまうが)

人のレシピを、ボタン1つでコピーして、そのまま自分の名前で共有できてしまうのは、よくありません。料理に「コピーしたもの」の印を持たせて、共有の切り替えを出さないことにします。

手で打ち直せば、すり抜けられます。それは、分かったうえで、よしとしました。止めたいのは、「ボタン1つで、人のレシピが、自分の名前で出回る」ことです。手で打ち直す人まで、仕組みで止める必要はありません(そこは、通報で扱います)。

守りを考えるときは、「完全に防げるか」ではなく、「何を、どのくらい面倒にするか」で考えます。

この機能は、共有そのものがまだないので、今は作りません。Issue にもせず、Notion の「共有」の段階に、案として書いておきました。


書く欄があっても、また書き忘れる

今回のリリースには、データベースの変更が入っています。ハコヅミでは、そういうリリースの PR に、「マージの直前の時刻」を書く欄を用意しています。データが壊れたときに、その時刻の状態へ戻すためです。

#57で、この欄を書き忘れた話を書きました。そして今回、また書き忘れました。

マージのあとで、Claude Code が、空のままの欄に気づきました。前回と同じく、GitHub に残っているマージの時刻を、「あとから書き足した」と分かる形で入れてあります(マイグレーションが当たるのは、マージのあとなので、戻す時刻として使えます)。

2回続いたので、わたしの注意力のせいにするのは、やめます。Claude Code の言葉です。

2回続いたので、欄を書いてもらう形そのものが合っていないと思う。

そのとおりです。PR の本文に欄があっても、マージのボタンを押すときには、本文を読み返していません。次からは、リリースの PR を作るときに、Claude Code のほうから「マージする前に、時刻を書いたか」を一言たしかめてもらいます。

同じ失敗を2回したら、「次は気をつける」では直りません。忘れても困らない形に、手順のほうを変えます。


おわりに

  • 「入れたらどう見えるか」で迷ったら、実際の画面を見て決める
  • 一覧で分けたからといって、選ぶ欄まで分けるとは限らない。画面ごとに、要るかを考える
  • 評価を付けていないものには、何も出さない(空の★は、低い評価に見える)
  • Issue は機能ごとに分けて、同じ場所を触るものは、1つの PR にまとめる
  • 機能を足す前に、すでに書いてある約束(規約・ポリシー)のどの文が変わるかを見る
  • 守りは、「完全に防げるか」ではなく、「何を、どのくらい面倒にするか」で考える
  • 同じ失敗を2回したら、気をつけるのではなく、手順を変える

次回は、キャンプで実際に使ってみた話を書く予定です。

← トップページに戻る