ハコヅミを作る #65:プロフィールにアイコンを付ける(絵で選んだ大きさは、実物で見ると小さかった)

#62・#63で、ギア・キャンプ・料理を共有できるようにしました。共有のページには、表示名が出ます。でも、名前だけが並んでいると、だれがだれなのか、ぱっと見分けがつきません。

そこで、アイコンを登録できるようにしました。

  • 共有を作る前に書いた Issue を、読み直す
  • Google の画像は、使わない
  • 画面イメージの案から、選ぶ
  • 実物を見たら、小さかった
  • 透けた画像で、線が見えた
  • 「今は見えません」を、その日のうちに書き換える
  • 直しを小分けにして、Actions の予算が減った
  • 確かめたあとに、直しごと戻してしまった

共有を作る前に書いた Issue を、読み直す

アイコンの Issue は、1週間ほど前に書いてありました。共有の機能を作る、ずっと前です。そのときは、「料理のあとは、ベータ版まで機能を足さない」と決めていたので、後回しにしていました。

取りかかる前に、Claude Code が Issue を読んで、こう言いました。

Issue を書いたのは共有を作る前で、「ほかの人にアイコンを見せること」は対象外になっている。今は共有があるので、アイコンがいちばん役に立つのは、みんなの共有の一覧と、共有のページになる。

そのとおりでした。Issue の「対象外」には、こう書いてあります。

ほかの人に、アイコンを見せること(共有)

書いたときは、正しい線引きでした。共有がまだないのだから、見せる先がありません。でも今、この Issue のとおりに作ると、「自分にしか見えないアイコン」ができあがります。ヘッダーの右上に自分の顔が出るだけの機能です。

かといって、Issue の対象外を、黙って対象にするわけにもいきません。見せるほうには、規約とプライバシーポリシーの改定が要ります。通報の扱いも、共有を止めたときの扱いも、決めることがあります。

2つに分けました。

  • 1つ目(もとの Issue):アイコンを登録できる。自分にだけ見える
  • 2つ目(新しい Issue):共有のページに、アイコンを出す

そして、本番には、2つをまとめて出すことにしました。規約の改定を、1回で済ませるためです。

古い Issue は、書いたときの前提で書かれています。前提が変わっていたら、取りかかる前に、読み直す。当たり前のことですが、Issue に「対象外」と書いてあると、それ以上考えずに進めてしまいそうになります。


Google の画像は、使わない

ハコヅミのログインは、Google アカウントです。Google からは、名前と、プロフィールの画像の URL が届きます。

アイコンを登録していない人に、この Google の画像を出す。よくある作りです。登録の手間がなくて、最初から顔が出ます。

ハコヅミでは、使いません。未設定の人は、人の形の絵のままです。

理由は、表示名を作ったときと同じです。Google の名前は、本名のことが多い。プロフィールの画像は、本人の写真のことが多い。それが、本人の知らないうちに、ほかの人に見える場所へ出てしまうのを、避けたいからです。

「見せるものは、本人が、見せるために登録したものだけ」。表示名で引いたこの線を、アイコンでも守ります。

テストでも、確かめています。テスト用の利用者に、Google の画像の URL をわざと入れておいて、ヘッダーにも、アカウントの画面にも、ページの中身のどこにも、その URL が出てこないことを見ます。

切り取るのは、ブラウザ

画像を選ぶと、ブラウザの中で、まん中を正方形に切り取って、256px に縮めてから送ります。切り取る場所を自分で動かす機能は、作っていません。

サーバーは、画像の種類と大きさは確かめますが、「正方形かどうか」は見ていません。Cloudflare Workers の中で画像を読み解く処理を、入れていないからです。代わりに、画面で出すときに、いつも丸く切り抜きます。正方形でない画像が直接送られてきても、見た目は崩れません。


画面イメージの案から、選ぶ

Issue には、こう書いてありました。

文言と見た目は、取りかかるときに、画面イメージの案を出して、人が選んでから作る

ヘッダーの右上は、今、人の形の絵と表示名が、枠の中に並んでいます。ここにアイコンをどう入れるか。Claude Code が、実際の画面に案をはめた絵を、3つ出してくれました。

ヘッダーの絵が4つ、縦に並んでいる。1つ目は今の形(枠の中に人の形と「やまもり」)。2つ目は案A(枠の中の人の形が、小さな丸いアイコンに替わっている)。3つ目は案B(枠がなく、少し大きいアイコンと名前)。4つ目は案C(大きな丸いアイコンだけで、名前がない)

上から、今の形・案A・案B・案C(架空のデータ)

  • 案A:今の枠のまま、人の形を、小さなアイコン(20px)に替える
  • 案B:枠をなくして、アイコンを少し大きくする
  • 案C:アイコンだけを大きく出す。名前は出さない

わたしは、案A を選びました。今の見た目からの変化が、いちばん小さい。未設定の人と、並びが同じになる。Claude Code のおすすめも、案A でした。

アカウントの画面のほうは、「表示名」のまとまりを「プロフィール」に変えて、アイコンと表示名を1つのカードにまとめる案を選びました。

アカウントの画面の「プロフィール」のカード。左に丸いアイコン、右に「画像を変える」のボタンと、赤い枠の「アイコンを削除」のボタン。その下に説明の文、線をはさんで「表示名」の入力欄と「保存」のボタン

アカウントの画面の「プロフィール」(最初に作った形)


実物を見たら、小さかった

案A で作って、開発環境に出しました。自分のアカウントで、自分のアイコンを登録して、見ました。

小さい。

ヘッダー。右上の枠の中に、とても小さな丸いアイコンと「やまもり」

案A で作ったヘッダー(架空のデータで撮り直したもの)

絵で見たときは、これでよいと思いました。実物を、自分のアイコンで見ると、何の絵なのかが、分かりにくい。20px の丸は、人の形の線画なら読めますが、写真や絵には、小さすぎました。

こう頼みました。

案Cのアイコンサイズにして、その横に名前を出すイメージ案を出して。丸のアイコンの背後に現在の枠+名称を出して、枠の左端はアイコンの背面にあるイメージ(伝わる?)

伝わりました。

ヘッダー。右上に、大きな丸いアイコンがあり、その右に「やまもり」と書いた枠が出ている。枠の左端は、アイコンのうしろに隠れている

直したあと。アイコンから、名前の札が出ている形

アイコンは 34px。その右に、今までの枠と表示名を置いて、枠の左端は、アイコンのうしろに隠します。アイコンを登録していない人のヘッダーは、今までのままです。

なぜ、絵で決めきれなかったか

案の絵は、ちゃんと、実際の画面の大きさで作ってありました。それでも、決めきれませんでした。

絵を見るときは、3つを見比べています。「どれが、今の画面になじむか」という目です。その目で見ると、変化の小さい案A が、よく見えます。

実物を見るときは、使っています。「これは、自分のアイコンだと分かるか」という目です。見ているものが、違いました。

それに、案の絵のアイコンは、はっきりした色の、単純な絵でした。自分で登録したアイコンは、もっと細かい絵です。小さくしたときに、つぶれ方が違います。

小さい部品の見た目は、絵では決めきれない。実物の大きさで、自分のデータで見て、はじめて分かる。そう割り切って、「選ぶ → 作る → 見て直す」の1回分を、最初から見込んでおくほうが、よさそうです。


透けた画像で、線が見えた

直したものを開発環境で見て、もう1つ、気づきました。

わたしのアイコンは、背景が透けた絵です。その丸の中に、うしろにある枠の、左端の線が、透けて見えていました。

アイコンを枠のうしろに「重ねた」ので、アイコンが透けていれば、うしろが見えます。案の絵のアイコンは、背景まで塗ってある絵だったので、気づきませんでした。

丸の中を、ヘッダーと同じ緑で塗るようにしました。

ヘッダー。右上の丸いアイコンは、背景が透けたテントの絵で、丸の中はヘッダーと同じ緑。その右に「やまもり」の枠が出ていて、丸の中に枠の線は見えない

背景が透けた絵をアイコンにしたところ。丸の中に、線は見えない

テストも足しました。全部が透けた画像を登録して、枠の線が通るはずの場所を撮り、その絵が1色だけであることを確かめます。線が見えていれば、色が2つになります。


「今は見えません」を、その日のうちに書き換える

1つ目の Issue では、アイコンは、自分にしか見えません。アカウントの画面の説明には、こう書きました。

今は、ほかの利用者には見えません。

プライバシーポリシーの「共有にしても、見えないもの」にも、アイコンを足しました。

その数時間後、2つ目の Issue で、共有のページにアイコンを出しました。

「みんなの共有」の一覧。1人目と2人目は、名前の左に丸いアイコン。3人目は、淡い緑の丸に人の形

みんなの共有の一覧。アイコンを登録していない人は、人の形

「やまもり さんの共有」のページ。見出しの左に、丸いアイコン。その下に、共有しているギアが、カテゴリごとに並んでいる

1人の共有のページ

説明の文は、こうなります。

ギア・キャンプ・料理のどれかを共有すると、表示名と一緒に、ほかの利用者に見えます。

「見えません」と書いた文を、同じ日に、「見えます」に書き換えたことになります。ポリシーの「見えないもの」からも外して、「見えるもの」に移しました。

これが本番で起きていたら、困ります。「見えません」と読んで登録したアイコンが、あとから、見える側に変わるからです。

そうならないように、2つをまとめて本番に出すと、最初に決めてありました。「見えません」の文は、開発環境にしか出ていません。本番の利用者が最初に読むのは、「共有すると、見えます」のほうです。

Issue を分けることと、リリースを分けることは、別の話です。作る単位は小さく、約束が変わる単位は1回で。

アイコンだけのスイッチは、作らなかった

ギア・キャンプ・料理には、種類ごとのスイッチと、1件ごとのスイッチがあります。アイコンにも、「アイコンを見せる・見せない」のスイッチを付ける手は、ありました。

付けませんでした。アイコンは、表示名と同じ、その人の「顔」です。共有をオンにしている人は、表示名が見えます。アイコンも、一緒に見えます。見せたくない人は、アイコンを登録しなければ、人の形のままです。

切り替えを増やすと、「何が見えていて、何が見えていないのか」を、覚えておくものが増えます。#62 で、スイッチの形を3回変えて、身にしみました。

代わりに、共有をオンにするときの確認に、1文を足しました。

表示名と、アイコン(登録していれば)も、見えます。

規約は、同じ日の3回目

共有にすると見えるものが増えたので、利用規約とプライバシーポリシーも、直しました。同じ日の、3回目の改定です。「最後に改定した日」の表示は、やはり変わりません。

前回、「同じ日に2回改定するくらいなら、まとめて書いておけばよかった」と書きました。その日のうちに、3回目です。反省が、まったく活きていません。

ただ、今回は、言い訳ができます。1つ目の Issue だけで本番に出していたら、4回目があったはずでした。まとめて出したので、3回で済んでいます。


直しを小分けにして、Actions の予算が減った

ヘッダーの直しは、2回ありました。大きくする直しと、緑で塗る直し。それぞれ、別の PR にして、出しました。

その夜、GitHub の請求の画面を見ると、Actions の予算の残りが、10% を切っていました。

ハコヅミの CI は、PR を1つ出すたびに、約 13 分を使います(型チェックと、3つに分けた画面のテスト)。マージすると、デプロイで約 2 分。小さな直しでも、1本で 15 分です。Claude Code に数えてもらうと、今月は、13 日で、CI が 156 回、デプロイが 143 回、流れていました。

無料の枠(月 2,000 分)は、最初の1週間で 90% を使い、そのあと使い切りました。そこからは、使った分だけの請求です。金額は大きくありませんが、予算に達すると、CI もデプロイも止まります。本番に、出せなくなります。

予算を上げたうえで、進め方も変えました。2つ目の Issue では、機能、規約とポリシーの文、使い方のページ、お知らせ、プロジェクトのメモを、全部1つの PR に入れて、push は1回にしました。見た目の確認は、push の前に、手元で撮った絵で済ませます。

受入の直しを小分けにしたくなるのは、「言われたことを、すぐ直して、すぐ見せたい」からです。気持ちは分かりますが、1回ごとに 15 分が流れます。ヘッダーの2つの直しは、1つ目を見たときに、もう少し触って、透けた画像にも気づいていれば、1本で済みました。受入で見るときは、1つ見つけても、そこで止めずに、ひととおり触ってから伝える。これは、わたしの側の直しどころです。


確かめたあとに、直しごと戻してしまった

最後に、小さな失敗を1つ。Claude Code の失敗です。

透けた画像のテストを書いたあと、Claude Code は、「このテストは、本当に、直しがないと落ちるのか」を確かめました。直した1行を、わざと元に戻して、テストを流します。落ちました。テストは、ちゃんと働いています。

ここまでは、よい進め方です。問題は、そのあとでした。

元に戻した1行を、もう一度直すために、Claude Code は、Git で「そのファイルを、最後に記録したときの状態に戻す」操作をしました。ところが、直しは、まだ記録(コミット)していませんでした。戻った先は、直す前の状態です。直しごと、消えました。

Claude Code は、すぐに気づきました。戻したあとに、直しの行があるかを数えていて、それが 0 だったからです。同じ直しを入れ直して、テストを流し直しました。失ったのは、数分です。

「直しを外して、テストが落ちることを確かめる」のは、よい習慣です。ただ、外す前に、直しを記録しておく。そうすれば、戻す先が、ちゃんと「直したあと」になります。

そして、何かを戻したら、戻ったあとの状態を、見る。今回、被害がなかったのは、そこを確かめていたからでした。


おわりに

  • 古い Issue は、書いたときの前提で書かれている。前提が変わっていたら、取りかかる前に読み直す
  • 「対象外」を、黙って対象にしない。分けて、別の Issue にする
  • 見せるものは、本人が、見せるために登録したものだけ。Google の画像は、代わりにも使わない
  • 小さい部品の見た目は、絵では決めきれない。実物の大きさで、自分のデータで見る
  • 重ねたものは、透ける。背景まで塗った絵だけで試すと、気づかない
  • 作る単位は小さく、約束が変わる単位は1回で。Issue を分けても、リリースはまとめられる
  • 切り替えを増やすと、覚えておくものが増える。同じ「顔」なら、同じスイッチで動かす
  • 受入で1つ見つけても、そこで止めずに、ひととおり触ってから伝える
  • 直しを外して確かめる前に、直しを記録しておく。戻したら、戻ったあとを見る

アイコンは、今日、本番に出ました。本番の「みんなの共有」の一覧には、まだ、だれも並んでいません。

テスタを募集しています。キャンプに行く方、よければ、最初のアイコンになってください。

← トップページに戻る