カテゴリー: 技術系

  • ソース解説(1) 全体の地図と、境目の引き方

    ソース解説(1) 全体の地図と、境目の引き方

    このサイトの作りについては何度か書きましたが、中のコードそのものには触れていませんでした。

    ここから何本かに分けて、実際のファイルを開きながら説明していきます。まずは全体の地図と、読むために知っておいたほうがいい前提からです。

    この記事で扱うこと

    フォルダの分け方、依存しているものの数、そして「サーバーで動く部品」と「ブラウザで動く部品」がどこで分かれているかです。次回以降、個別のファイルを1つずつ読んでいきます。

    本番で必要な依存は5つしかない

    package.json を開くと、公開後に動かすために必要なものはこれだけでした。

    名前 役割
    next ページを組み立てて配る本体
    react / react-dom 画面を書く仕組み
    graphql-request WordPressへ問い合わせる
    graphql その問い合わせ文を解釈する

    この他に、開発中だけ使うもの(型検査、書式の検査、CSSの生成、型の自動生成)があります。本番の動作に関わるのは上の5つだけです。

    少ないほうが、後で困らない

    部品を足すたびに、その部品の脆弱性を見張る相手が1つ増えます。入れていないものは、更新も監視も要りません。

    目次も検索も日付の整形も、自分で書いてあります。どれも数十行で、外から持ってくるほどの分量ではありませんでした。

    フォルダは3つに分かれている

    コードは src/ の下にあり、大きく3つです。

    場所 入っているもの
    src/app/ URLと1対1で対応するページ
    src/components/ 画面に出る部品
    src/lib/ 画面に出ない処理とデータ

    app/ は特別で、ファイルの置き場所がそのままURLになります。app/blog/page.tsx が /blog に、app/blog/[slug]/page.tsx が /blog/記事名 になります。角かっこは「ここは可変」という意味です。

    ルーティングの設定ファイルはありません。フォルダを作ればURLが増えます。

    境目は「ブラウザが要るかどうか」で引く

    ここがいちばん説明の要るところです。

    いま作っているのは、ほとんどのコードがサーバー側で動く形です。ページはあらかじめ組み立てられ、訪問者にはHTMLとして届きます。ブラウザで動くコードは、必要な部品にだけ付けます。

    その指定が、ファイルの1行目に書く "use client" です。

    書いていない 書いてある
    どこで動くか サーバー サーバーとブラウザ両方
    できること CMSへの問い合わせ、秘密の値の利用 クリック、スクロール、保存
    訪問者に届くJS 増えない そのぶん増える

    このサイトの部品を数えると、ちょうど半々でした。16個ずつです。

    これとは別に、スクロールの位置や保存した設定を読むための小さな処理が3つ、src/lib/ にブラウザ用として置いてあります。部品ではないので上の数には入れていません。

    書いてある側はどれも、ブラウザでしか手に入らないものを触っています。スクロールの位置、クリック、保存した設定、画面の幅。逆に言えば、それらが要らない部品には付けていません。

    「とりあえず付ける」と、全部が重くなる

    "use client" は、そのファイルから読み込んでいるものにも連鎖します。上のほうの部品に付けると、その下にぶら下がる部品まで一緒にブラウザへ送られます。

    迷ったときに付けておくと動きはしますが、動く代わりに、送るものが静かに増えます。境目はできるだけ末端に置くほうがよく、このサイトでも「ボタン1つだけを別部品にして、そこにだけ付ける」という形がいくつかあります。

    型は、CMSの都合に追いつくために使っている

    TypeScriptを使っている理由は、書き間違いを見つけるためだけではありません。

    記事のデータはWordPressから届きます。項目の名前も、値が空になり得るかどうかも、決めているのはCMS側です。手で型を書き写すと、CMS側で項目を足した日から、少しずつずれていきます。

    そこで、CMSが公開している仕様を読み取って型を自動生成しています。コマンドを1つ走らせると、実際に書いた問い合わせ文に合わせた型ができます。

    「空かもしれない」を、こちらの都合で消せない

    自動生成された型は、title や slug を「無いかもしれない」ものとして扱います。実際に下書きや移行中のデータでは空になり得るからです。

    手書きなら、面倒なので「必ずある」と書いてしまうところです。生成された型は、こちらの願望ではなく相手の仕様を写しているので、そこで手が止まって「無かったらどうするか」を考えることになります。

    この先で読んでいくもの

    次回以降、次の順で中身に入ります。

    回 読むもの 話の中心
    2 目次を作る処理 HTMLを文字列として扱う
    3 同意を取る仕組み 保存する形と、読み込まない実装
    4 CMSから取ってくる処理 キャッシュと、失敗する前提
    5 RSSとサイトマップ 文字列を自分で組み立てる場所

    今回の学び

    まず、依存の数は、後から効いてくるということ。今のところ5つで足りていて、そのぶん更新の通知も脆弱性の報告も少なく済んでいます。数十行で書けるものを外から持ってこない、という判断が積み重なった結果でした。

    次に、境目は機能ではなく「何が必要か」で引くこと。ブラウザでしか手に入らないものを使う部品だけを、ブラウザ側に置いています。見た目の複雑さや行数とは関係がありません。

    そして、相手が決めていることは、相手から写すこと。CMSのデータの形はこちらで決められません。手で書き写すとずれていくので、生成させています。ずれないことより、ずれようがない形にしてあることのほうが大事でした。

  • 同じ「丸み」でも、比べる相手が違えば別の表に置く

    同じ「丸み」でも、比べる相手が違えば別の表に置く

    フッターの上の角を丸めています。ページの下に別の面が敷かれている、という見え方を作るためです。

    ところが、実機で見返すと「もう少し丸くていい、50pxでもいいくらい」と感じました。当時は14pxでした。

    この記事で扱うこと

    丸みを1つの表で持っている構成に、表へ入れられない値が出てきたときの扱いです。1か所だけ大きくするか、表そのものを直すか、という話ではありませんでした。

    丸みは1つの表で持っている

    このサイトでは、角の丸さを6段階の表で持っています。既定値より意識的に小さくしてあります。

    名前 この表の値 もとの既定値
    DEFAULT 3px 4px
    md 4px 6px
    lg 6px 8px
    xl 8px 12px
    2xl 10px 16px
    3xl 14px 24px

    表で持っている理由は、調整を1か所で終わらせるためです。「全体的にもう少し角を立てたい」と思ったとき、この表の数字を書き換えれば、丸みを指定しているすべての場所が同じ方向へ動きます。個別に書いていたら、直し漏れた場所だけが取り残されます。

    一番大きい値を50pxにすればいい、ではなかった

    最初に考えたのは、表の一番大きい値を50pxにすることでした。フッターはその値を使っているので、これで目的は果たせます。

    しかもこの値は、調べたらサイト全体でフッター1か所しか使っていませんでした。他に影響が出ないので、書き換えても壊れません。

    それでもやめました。

    「いまは1か所しか使っていない」は、変えてよい理由にならない

    壊れないことと、正しいことは別です。表の一番大きい値を50pxにすると、この表の意味そのものが変わります。

    いまは1か所でも、次に誰かがカードの角を「一番大きく」したくなったとき、受け取る値は50pxになります。そのときには「なぜ一番大きい丸みだけ極端なのか」を説明できる人がいません。壊れるのは今日ではなく、次にこの表を使うときです。

    比べる相手が違うものは、同じ表に置けない

    考え直して分かったのは、この表が何のためにあるかでした。

    DEFAULTから一番大きい値までは、1本の段階になっています。小さいものから大きいものへ並んでいて、ボタン、入力欄、タグ、カードのように本文の中に置かれる部品のためにあります。

    これらの部品には共通点があります。画面の中で隣り合って並ぶので、互いの丸みを見比べられるということです。ボタンよりカードのほうが少し丸い、という関係が意味を持ちます。だから同じ段階の上に居る必要があります。

    フッターは違います。幅が画面いっぱいあり、隣に並ぶものがありません。比べる相手は画面の縁だけです。

    部品の丸み 面の丸み
    対象 ボタン・入力欄・カード フッターのような大きな面
    置かれる場所 本文の中 ページの下に敷かれる
    比べる相手 隣り合う他の部品 画面の縁
    決め方 段階の中での前後関係 その面だけで見て伝わるか
    段階から出して、名前を付けた

    表の6段階はそのままにして、panel という名前で50pxを別に足しました。段階の外です。

    こうすると、表を書き換えたときに動くのは部品だけになります。面の丸みは別の判断で決まるので、一緒に動かないほうが正しい。同じ「丸み」という言葉で呼んでいても、決め方が違うものは別の場所に置くということです。

    なぜ14pxでは足りなかったのか

    数字の話も書いておきます。

    同じ半径でも、対象が横に広いほど、角の丸みは相対的に小さく見えます。幅300pxのカードの14pxと、幅1200pxのフッターの14pxでは、目に入る割合が違います。

    フッターの角を丸めているのは、そこに背景がわずかに覗いて「下に別の面が重なっている」と伝えるためです。角が丸いことに気づけない大きさでは、その役割を果たしません。14pxは、部品としては十分でも、面としては足りませんでした。

    今回の学び

    まず、壊れないことは、変えてよい理由にはならないこと。使っている場所が1か所しかなければ、書き換えても何も起きません。ただし表の意味は変わっていて、次にその表を使う人が想定外の値を受け取ります。影響が出るのが今日でないだけです。

    次に、同じ言葉で呼んでいるものが、同じ決め方とは限らないこと。部品の丸みは隣と比べて決まり、面の丸みはそれ単体で伝わるかで決まります。決め方が違うものを1本の段階に押し込むと、どちらかが無理をすることになります。

    そして、例外は、例外だと分かる場所に置くこと。段階の中に極端な値を混ぜると、段階のほうが読めなくなります。外へ出して名前を付ければ、なぜそこにあるのかを書き残せます。書き残せる形にすること自体が、判断を残す手段になります。

  • 進捗バーが0から始まらないのは、測る場所を1つ間違えていたからだった

    進捗バーが0から始まらないのは、測る場所を1つ間違えていたからだった

    記事を開いた瞬間、読み進み具合のバーが9.5%を指していました。まだ何もしていません。

    「あと90%」と出ているのを見て、手が止まりました。進み具合を名乗るものが0から始まらないのは、やはり変です。

    この記事で扱うこと

    なぜ0から始まらなかったのか、どこを基準に測るかで何が変わるのか。そして、終わりの位置を動かさずに始まりだけ直す方法です。

    分母を本文の高さに変えたところまでは合っていた

    このバーは一度直しています。

    最初はページ全体の高さを分母にしていました。ところがページの下には、前後の記事へのリンク、一覧へ戻るリンク、フッターが続きます。実測するとその部分だけで1205pxありました。

    つまり本文を読み終えても90%前後にしかならず、100%にするには読むもののないフッターまでスクロールする必要がありました。勢いよく動かす人は慣性で最下端まで行くので満たせてしまい、文章を追って読む人ほど100%にならない。そこで分母を本文の高さに変えました。

    ここまでは正しい判断でした。それでも、始まりの値は0になりませんでした。

    下端で測ると、開いた時点ですでに進んでいる

    計算はこうなっていました。

    画面の下端が、本文の上端からどれだけ入ったか。それを本文の高さで割る。

    この式だと、ページを開いた時点で本文の一部がすでに画面に映っています。実測した記事では、本文の上端がページの297px地点にあり、画面の高さが745pxでした。開いた瞬間に本文の448pxぶんが映っていることになります。本文の高さが4731pxなので、9.5%です。

    式は正しく、意味だけが合っていなかった

    「画面に映った本文の割合」としては、9.5%は正確な値です。計算間違いではありません。

    ただし、この数字が名乗っていたのは「読み進み具合」でした。読み進み具合なら、読み始める前は0です。式が答えていた問いと、表示が名乗っていた問いが、別のものでした。

    上端で測り、分母を移動量に合わせる

    基準を画面の下端から上端に変えました。

    あわせて分母も変えています。上端で測ると、本文の末尾まで読み切ったときの移動量は「本文の高さ − 画面の高さ」になります。本文の高さのままだと、最後まで読んでも100%に届きません。

    スクロール位置 旧(下端で測る) 新(上端で測る)
    0(先頭) 9.5% 0.0%
    297(本文の上端) 15.7% 0.0%
    2000 51.7% 42.7%
    4283(本文の末尾) 100.0% 100.0%
    100%になる位置は動いていない

    直したのは始まりの側だけに見えますが、実際には分子と分母を同時に取り替えています。それでも100%になる位置は同じ4283pxのままでした。

    分子から画面1つぶんを引いたなら、分母からも画面1つぶんを引く。両方に同じ量を効かせているので、終点は動きません。片方だけ直していたら、今度は末尾で100%に届かなくなっていました。

    割り算の正しさは、分子だけを見ても分母だけを見ても判断できません。

    そしてこの4283pxは、読了として記録される位置でもあります。バーが満杯になるのと「読了済み」に変わるのが同じ瞬間になりました。

    本文が画面に収まる記事はどうなるか

    短い記事では「本文の高さ − 画面の高さ」が0以下になります。割り算が壊れる形です。

    この場合は100%を返しています。動かす余地が無く、開いた時点で最後まで見えているからです。読了の判定も同じ扱いになっていて、開いた時点で全区画が埋まります。2つの表示が同じ答えを出すので、ここでも食い違いません。

    今回の学び

    まず、0から始まらない指標は、測る対象と名乗りがずれている合図だということ。9.5%という値そのものは正確でした。式が答えていたのは「画面に映った割合」で、表示が名乗っていたのは「読み進み具合」です。数字が合っているかより先に、何を名乗っているかを確かめる必要がありました。

    次に、割り算は分子と分母を組で見ること。基準を1つずらすと、分子と分母の両方に同じ量が効きます。片方だけ直すと、始まりが直って終わりが壊れます。今回は両方に効かせたので、終点を動かさずに始点だけ直せました。

    そして、同じことを指す表示は、同じ場所で切り替わるべきだということ。バーの100%と読了の記録は、以前は別の位置にありました。いまは同じ4283pxで揃っています。揃っていれば、片方を見て他方を推測できます。ずれていると、どちらが本当なのかを毎回確かめることになります。

  • 「画面に入った」で数えたら、17%残して読了になった

    「画面に入った」で数えたら、17%残して読了になった

    記事を最後まで読んだかどうかを、サイト側で判定しています。その作りを一度入れ替えたあとで、まだ食い違っていることに気づきました。

    調べたら、本文をまだ17%残している位置で読了が成立していました。

    この記事で扱うこと

    「画面に入った」で数えると何が起きるか、それを「通り過ぎた」に変えると何が揃うか。そして、速く動かしたときに何を数えていいのかです。

    本文を区画に分けて、通った跡を見ている

    判定の仕組みはこうです。本文の高さを6つの区画に分け、画面に映った区画に印を付けます。全部に印が付いたら読了とします。

    時間では測っていません。開いて放置しても時間は進むので、読まずに読了になってしまうからです。通った経路そのものを見れば、連続して読んだ人は必ず全部を通り、途中を飛ばした人には穴が残ります。

    ここまでは意図どおりに動いていました。問題は「映った」をどう数えるかのほうにありました。

    最後の区画は、画面に入った瞬間に埋まる

    最初の数え方は「画面と少しでも重なった区画に印を付ける」でした。素直な書き方に見えます。

    この数え方だと、最後の区画は画面の下から顔を出した瞬間に埋まります。まだ読んでいない部分が画面の下に残っていても、区画としては「映った」ことになります。

    実際の記事で測りました。本文の高さが4731px、画面の高さが745px、1区画は788pxです。最後の区画が画面に入るのは、本文の83%まで進んだところでした。

    数え方 最後の区画が埋まる位置 そのとき画面の下に残っている量
    画面に入ったら 本文の83% 17%
    下端まで通り過ぎたら 本文の100% 0%

    読み終わりを指す数字が、2つとも違う場所にあった

    同じページには、読み進み具合を出す細いバーもあります。こちらは「本文の末尾が画面の下端に来たら100%」で計算していました。

    つまり同じ「読み終わり」を指しているはずの2つが、17%ずれた場所を指していました。バーはまだ「あと17%」と言っているのに、記録のほうはもう読了になっている。どちらも動いていて、どちらも例外を出しません。

    同じ言葉で呼んでいたので、違うものだと気づけなかった

    どちらも「読み終わり」と呼んでいました。呼び名が同じだと、中身も同じだと思ってしまいます。

    実際には片方は「画面に入ったか」、もう片方は「画面を通り過ぎたか」を見ていました。言葉のほうが先に一致してしまうと、数字がずれていても照らし合わせる動機が生まれません。

    「通り過ぎた」に変えると、位置が揃う

    区画に印を付ける条件を、下端まで通り過ぎたかどうかに変えました。

    最後の区画の下端は、本文の末尾と同じ位置です。そこを画面の下端が越えるのは、本文を読み切ったときになります。バーが100%になるのと、読了が成立するのが、同じ瞬間になりました。

    直したのは条件式の不等号ひとつぶんですが、意味はかなり変わっています。「見えた」を「見終えた」にしたので、読む側の実感と一致するようになりました。

    速く動かしたときに、何を数えていいのか

    もうひとつ直したところがあります。

    目次から飛んだときに、途中を読んだことにしてはいけません。かといって、速くスクロールしただけの人を弾いてもいけません。この2つを分けるのに、以前は移動量のしきい値を置くことを考えていました。

    置かずに済む書き方がありました。前回の画面の下端と、いまの画面の上端の、大きいほうを下限にします。

    「表示された範囲」は、1本の式で書ける

    ふつうにスクロールしているあいだは、前回の下端のほうが大きくなります。1回の移動が画面の高さに収まるので、通り過ぎた範囲は全部目に入っています。

    大きく飛んだときは、いまの画面の上端のほうが大きくなります。飛んだ距離のうち画面の高さを超えた部分は一度も表示されていないので、そこは数えません。いま映っている1画面ぶんだけが残ります。

    場合分けが要らないだけでなく、処理が詰まって移動が飛び飛びに見えたときも、表示された範囲だけが自然に残ります。しきい値を決めていたら、その値の妥当性を考え続けることになっていました。

    実際のジオメトリで確かめました。連続して100px、300px、700px、744pxずつ動かした場合とPageDownでは、いずれも読了になります。一気に最下部へ飛んだ場合は成立しません。目次から中ほどへ飛んで最後まで読んだ場合は、手前に穴が残って成立しません。飛んだあとに戻って全部読めば成立します。

    今回の学び

    まず、同じ名前で呼んでいるものが、同じものだとは限らないこと。「読み終わり」を2か所で判定していて、どちらもそう呼んでいました。呼び名が一致していると、中身を照らし合わせる機会が来ません。ずれていたのは実装ではなく、言葉のほうが先に揃ってしまったことでした。

    次に、「見えた」と「見終えた」は別の状態だということ。画面に入った時点で数えると、まだ読んでいない部分が残ります。人が読み終えたと感じるのは通り過ぎたときなので、そちらに合わせるほうが実感と一致します。

    そして、しきい値を置く前に、置かずに書ける形を探すこと。今回は下限の取り方を変えるだけで場合分けが消えました。しきい値は、決めた瞬間から「その値でよいのか」を考え続ける対象になります。要らないなら、無いほうが軽い。

  • 一瞬だけ、白くなる

    一瞬だけ、白くなる

    ダークモードを入れました。色を反転させるだけの作業だと思っていたのですが、最後に厄介なものが残りました。

    ページを開いた瞬間、一瞬だけ白くなる。そのあと黒に切り替わる。暗い部屋で見ると、はっきり目に刺さります。

    この記事で扱うこと

    切り替えを3状態にした理由、開いた瞬間に白くなる現象の正体、そして24か所に散らばった色を1つずつ直さずに済ませた方法です。

    まず、切り替えを何状態にするか

    最初は「ライト/ダーク」の2つで作りかけました。書いている途中で手が止まりました。

    OSにも同じ設定があります。夜になると自動で暗くなる設定を使っている人は、サイト側で固定されると、その設定が効かなくなります。

    そこで3状態にしました。

    状態 何が起きるか
    システムに合わせる(初期値) OSの設定に追従する。夜に自動で暗くなる
    ライト OSが暗くても明るいまま
    ダーク OSが明るくても暗いまま

    初期値を「システムに合わせる」にしたのは、何も選んでいない人の意思表示は、すでにOS側にあるからです。サイトが勝手に上書きするものではありません。

    一瞬だけ白くなる、の正体

    ここが今回の本題です。

    このサイトのページは、あらかじめ組み立てたHTMLを配っています。速いのですが、組み立てた時点では、見る人がどちらを選んでいるか分かりません。

    選択はブラウザに保存されています。サーバーはそれを読めません。だから最初に届くHTMLは、必ずどちらかの配色で塗られた状態で届きます。

    そのあとJavaScriptが動いて、保存された選択を読み、色を切り替える。この「そのあと」が見えてしまうのが、白い一瞬の正体でした。

    速いページほど、目立つ

    表示が遅いページでは、白い一瞬は読み込み中の一部として紛れます。

    表示が速いページでは、完成した画面が出たあとに色だけが変わるので、はっきり分かります。速くしたことが、この問題を見えやすくしていました。

    解決は、順番を変えること

    JavaScriptを速くしても解決しません。画面が描かれる前に決めるしかありません。

    やったのは、HTMLの先頭に小さなスクリプトを1つ置くことです。ページの本体が描かれる前にブラウザがそこを読み、保存された選択(無ければOSの設定)を見て、いちばん外側の要素に印を付けます。

    そのあとにCSSが適用されるので、最初から正しい色で描かれます。切り替わる瞬間そのものが無くなります。

    「読み込みを止めるスクリプト」を、あえて置く

    ふだんは、描画を止めるスクリプトは避けるべきものです。表示が遅くなるからです。

    ここは例外にしました。処理は数行で一瞬ですし、止めないと画面がちらつく。原則より、原則が守ろうとしているもの(見え方)を優先しました。

    ついでに、スクロールバーも合わせた

    色を切り替えたあとも、スクロールバーやフォームの部品が明るいままでした。これらはブラウザが描いていて、サイトのCSSでは届きません。

    ブラウザに「このページは暗い配色です」と伝える指定が別にあります。それを一緒に切り替えることで、部品の側も揃いました。

    色を1つずつ直すのは、やめた

    ここも判断が要りました。

    画面の色は「白い背景」「濃いグレーの文字」のように、部品ごとに書いてあります。素直にやるなら、その1つずつに「暗いときはこの色」を書き足していきます。

    数えてみると、色の指定は24個のファイルに散らばっていました。

    1つずつ足すと、足し漏れが残る

    24か所すべてに正しく書き足せたかどうかは、全部の画面を暗くして見て回るまで分かりません。漏れた場所だけ明るいまま残ります。

    しかも次に色を調整したくなったとき、また24か所を探し直すことになります。

    色に名前を付けて、名前のほうを差し替えた

    やり方を変えました。「白」や「濃いグレー」という色そのものではなく、その名前が指す中身を入れ替えることにしました。

    部品側の書き方は一文字も変えていません。「白い背景」と書いてある場所はそのままで、「白」が何色を指すかを、明るいときと暗いときで切り替えます。

    結果として、直した場所は色の定義1か所だけになりました。次に微調整したくなったときも、探すのはそこだけです。

    記事の本文も、同じ仕組みで済んだ

    記事の本文はCMSから来ます。見出しも段落も表も、こちらで書いたHTMLではありません。記事を書くたびに手で色を入れる運用は続きません。

    ここは幸い、作ったときから色に名前を付けてありました。「本文の文字色」「罫線の色」「引用の背景」といった名前で書いてあったので、中身を差し替えるだけで済みました。当時そうしておいた理由は「あとで調整しやすいから」程度でしたが、今回はそれがそのまま効きました。

    ただし、例外が2か所あった

    この方法には穴があります。もともと背景が濃い場所です。

    フッターとトップの見出し部分は、明るいときでも背景が濃紺です。そこに置いてある白い文字まで一緒に反転させると、濃紺の上に濃い色の文字になって読めなくなります。

    この2か所だけは、名前を使わずに色を直接書きました。仕組みで揃えられる範囲と、そうでない範囲を分けた形です。

    例外は、例外だと書いておく

    あとから見た人が「ここだけ書き方が違う」と気づいたとき、理由が書いていないと統一しようとして壊します。

    直す判断のほうが自然に見えるので、なぜそうなっているかを同じ場所に残しました。

    色を反転させただけでは、読めなかった

    中身を入れ替えるとき、白と黒をそのまま逆にするとまぶしすぎます。

    暗い背景に純白の文字を置くと、文字のふちがにじんで見えます。背景も純黒だとコントラストが強すぎて長く読めません。実際に暗い部屋で読んでみて、背景を少し明るく、文字を少し暗い白に寄せました。

    逆に、薄いグレーの文字はダークモードで読めなくなります。明るいときに「補足だから薄く」としていた箇所が、暗い背景では沈んで消えます。補足の文字は、暗いとき用に明るさを上げ直しました。

    反転は、変換ではない

    明るい配色で成立していた濃淡は、暗い配色ではそのまま成立しません。

    薄い=控えめ、という関係が逆になるためです。片方で作ってからもう片方を作るのではなく、両方を見ながら決める必要がありました。

    やらなかったこと

    画像を暗くすること。ダークモードで画像の明るさを落とす手はありますが、記事のアイキャッチはもともと暗い配色で作ってあるので、これ以上落とすと沈みます。

    切り替えにアニメーションを付けること。色がなめらかに変わるのは気持ちよさそうですが、切り替えは一瞬で終わるべきものです。演出を挟むと、ちらつきを消すためにやった作業と矛盾します。

    今回の学び

    まず、設定は上書きより追従を初期値にすること。OSに同じ設定がある以上、何も選んでいない状態はすでに意思表示です。サイトが先に決めてしまうと、その意思が消えます。

    次に、ちらつきは速さの問題ではなく順番の問題だということ。処理を速くしても、順番が後ろにある限り見えてしまいます。速くする前に、どの順で決まるかを見る必要がありました。

    そして、原則には、それが守ろうとしているものがあること。「描画を止めるスクリプトを置かない」は、見え方を良くするための原則です。その原則を守ることで見え方が悪くなるなら、優先すべきは原則のほうではありません。

    あわせて、散らばったものを1つずつ直さないこと。24か所に手を入れる作業は、終わったかどうかを自分で確かめられません。名前を1つ挟んで、そこだけを差し替える形に持っていけるなら、その手間のほうが安く済みます。

    最後に、反転は変換ではないこと。明るい配色で作った濃淡は、暗い配色では意味が変わります。片方から機械的に作れるものだと思っていたのが、今回いちばんの見込み違いでした。

  • 一覧が長くなると、探せなくなる

    一覧が長くなると、探せなくなる

    記事の一覧ページに検索欄を付けました。作りながら決めたことを書いておきます。

    結論から書くと、サーバーには問い合わせていません。検索という言葉から想像される仕組みより、だいぶ簡単なものを選びました。なぜそれで足りると判断したかが、この記事の中身です。

    この記事で扱うこと

    検索をサーバー側でやらないと決めた理由、検索の対象に本文を入れなかった理由、そして表記ゆれの吸収です。

    そもそも、なぜ必要になったのか

    記事が20本を超えたあたりで、自分でも過去記事を探せなくなりました。

    「DNSの話、どの記事に書いたっけ」と思って一覧を開き、上から順に見出しを読んでいく。これは読者にやらせる作業ではありません。

    用語集には先に検索を付けていました。116語を目で追うのは無理だと分かっていたからです。記事も同じ状態になりつつありました。

    サーバーに聞かない、と決めた

    検索の作り方は大きく2つあります。

    やり方 仕組み
    サーバー側 入力のたびにCMSへ問い合わせ、絞り込んだ結果を返してもらう
    ブラウザ側 すでに読み込んである一覧を、その場で絞り込む

    WordPressには検索の仕組みが最初から入っていて、GraphQLからも呼べます。素直に考えればそちらです。

    それでもブラウザ側にしたのは、一覧ページがすでに全記事を持っていたからです。

    このサイトの一覧ページは、あらかじめ組み立てたHTMLを配っています。ページを開いた時点で、全記事のタイトル・抜粋・タグはもうブラウザの中にあります。そこにあるものを、わざわざもう一度サーバーに聞きに行く理由がありません。

    聞きに行くと、壊れやすくなる

    入力のたびにCMSへ問い合わせると、CMSが落ちている間は検索も落ちます。

    いまの構成は、CMSが止まっていても閲覧は続けられるようにしてあります。検索のためにその性質を手放すのは、割に合いませんでした。

    もちろん、これは記事数に依存する判断です。数百本になれば一覧ページ自体が重くなるので、そのときは作り直します。いま正しいことと、ずっと正しいことは違います。

    本文は、検索の対象にしなかった

    次に迷ったのが、どこまでを検索の対象にするかです。

    本文まで探せたほうが便利なのは間違いありません。ただ、一覧ページは本文を読み込んでいません。タイトルと抜粋とタグだけです。

    本文まで含めると、一覧ページが運ぶデータは数十倍になります。検索できるようにするために、一覧ページの表示が遅くなる。これは順序が逆だと思いました。

    検索欄を使う人より、一覧をそのまま眺める人のほうが多いはずです。多いほうを遅くして、少ないほうを便利にする交換はしたくありませんでした。

    「便利」は、どこかの負担と交換されている

    機能を足すとき、増えるのは画面の要素だけではありません。読み込む量、壊れる箇所、直す手間も一緒に増えます。

    足す前に「何と引き換えか」を書き出すと、要らない機能はだいたいそこで消えます。

    表記ゆれを、どこまで吸収するか

    日本語の検索でいちばん厄介なのは、同じものを指す書き方が複数あることです。

    同じ記事にたどり着いてほしい入力
    Next.js
    next.js
    nextjs
    NEXT
    ネクスト

    全部を完璧に扱うのは無理なので、機械的に処理できる範囲だけ揃えました。

    やっているのは4つです。全角と半角を揃える、大文字と小文字を揃える、カタカナをひらがなに寄せる、記号と空白を落とす。入力側と、記事側の両方に同じ処理をかけてから比べます。

    これで「WordPress」も「wordpress」も「ワードプレス」も同じ扱いになります。「ネクスト」で Next.js が出るところまでは面倒を見ていません。そこまでやるなら辞書が必要で、辞書は誰かが更新し続けないと古びます。

    用語集と同じ関数を使った

    この処理は、用語集の検索ですでに書いてありました。

    そのままコピーすることもできましたが、コピーした側は直されません。片方の揺れを直したときに、もう片方は古いままになります。共通の場所に出して、両方から呼ぶようにしました。

    関数を1つ切り出すだけの作業ですが、2箇所目が現れた時点でやっておかないと、3箇所目が現れたときにはもう誰も揃えません。

    0件のときに、何を出すか

    最後まで残ったのがこれでした。

    「見つかりませんでした」とだけ出すのは、行き止まりです。探しに来た人を、何も持たせずに帰らせることになります。

    このサイトには用語集があります。記事名では見つからなくても、語の説明としては存在していることが十分あり得ます。0件のときは、その語で用語集を引く導線を出すようにしました。

    行き止まりを作らない

    0件は失敗ではなく、「その言葉では記事が無い」と分かった状態です。次に行ける場所を1つ添えるだけで、意味が変わります。

    今回の学び

    まず、すでに手元にあるものを数えること。検索と聞くと問い合わせる仕組みを想像しますが、一覧ページはもう全記事を持っていました。持っているものを使えば、増える部品はゼロです。

    次に、機能を足すときは何と引き換えかを書くこと。本文まで検索できるようにすると、一覧の表示が遅くなります。多いほうを犠牲にして少ないほうを便利にしていないか、毎回確かめる価値があります。

    そして、同じ処理が2箇所目に現れたら、その時点で1つにすること。コピーした側は直されません。3箇所目が現れてからでは遅すぎます。

    最後に、0件にも行き先を用意すること。見つからなかったという事実は、それ自体が次の手がかりになります。

  • 見つけてもらうために、書き方は変えない

    見つけてもらうために、書き方は変えない

    このサイトで検索まわりにやってきたことを、順番に並べてみます。

    先に立場を書いておくと、順位を上げる方法は扱いません。やってきたのは「存在を知らせる」「探している人の言葉に近づける」の2つだけで、どちらも順位を操作する話ではありません。

    この記事で扱うこと

    何を先にやったかという順番、記事の見出しと検索結果の文字を分けた判断、そして「やらないと決めたこと」です。

    最初にやったのは、存在を知らせること

    公開したばかりのサイトには、外部からのリンクがありません。検索エンジンはリンクをたどってページを見つけるので、誰からもリンクされていないサイトは、そもそも見つけてもらえません。

    そこで最初に用意したのは3つです。

    用意したもの 役割
    sitemap.xml ページの一覧を直接渡す
    robots.txt 見に来てよい範囲を伝える
    構造化データ ページの意味を機械が読める形で示す

    あわせてSearch Consoleに登録しました。ここでつまずいた話は別記事にしていますが、要点はドメインを買った会社の管理画面と、実際にDNSを答えているサーバーが別だったことです。設定は保存できるのに、誰も参照しない。エラーも出ない。丸一日かかりました。

    順位ではなく、到達

    これらは順位を上げるものではありません。見つかるまでの時間を短くするものです。

    存在を知られていない状態で書き方の工夫をしても、読む相手がいません。順番として、先にこちらでした。

    次にやったのは、記事どうしをつなぐこと

    記事が20本を超えたあたりで、1本読んだ人が次に何を読むかという導線が無いことに気づきました。

    やったことは3つです。

    ひとつめは用語集です。116語をまとめ、記事の末尾から「この記事に出てくる用語」として繋ぎました。これは検索対策として始めたものではなく、初学者にも読めるようにするためのものです。ただ結果として、記事どうしが用語を介してつながりました。

    ふたつめは関連記事です。以前は「1つ新しい記事」と「1つ古い記事」しか出していませんでしたが、公開日が近いことと内容が近いことには関係がありません。タグの重なりで選ぶように変えました。

    みっつめはページの統合です。実績とスキルの個別ページは、トップページの同名セクションとほぼ同じ内容でした。同じ内容が2つのURLにあると、検索エンジンにどちらを出すか選ばせることになります。統合して、旧URLは転送しました。

    そして、タイトルを2つに分けた

    ここが今回いちばん考えた部分です。

    このサイトの記事の見出しは、内容を説明するのではなく、含みを持たせて付けています。

    これまでの見出し
    速くしたら、壊れた
    所有権をどう証明するか
    「読み終えた」をどう数えるか
    ゆっくり読む人ほど、読了にならなかった

    読んだあとに何かが残るように、と思って付けています。

    ところが検索する人は、この言葉では探しません。「所有権をどう証明するか」で検索する人はいませんが、「Search Console 所有権確認 DNS」で困っている人はいます。中身はまさにそれなのに、言葉が噛み合っていませんでした。

    見出しを書き換える案は、やめた

    検索語を入れた説明的な見出しに直せば、噛み合います。しかしそれをすると、読み物としての性格が変わります。

    このサイトは、作業の記録であると同時に、判断の記録として書いています。見出しはその入口なので、そこを検索エンジンに合わせて書き換えるのは、目的と手段が入れ替わっている気がしました。

    場所によって、見られ方が違う

    検索結果のリンクは「探している言葉と一致するか」で開かれます。SNSで共有されたリンクは「面白そうか」で開かれます。

    見られ方が違うなら、出す文字も違っていい。そう整理したら、答えが出ました。

    見出しはそのままにして、検索結果に出す文字だけを別に持つことにしました。SNSで共有されたときは見出しのほうを出します。

    出る場所 出す文字
    検索結果 Search Consoleの所有権確認をDNSのTXTレコードで行う
    ページの見出し・SNS 所有権をどう証明するか

    文字数も測った

    あわせて、検索結果に出る幅も測りました。目安は全角30文字ほどです。

    サイト名の接尾辞「| KiSAKU Portfolio」が全角9.5文字ぶんを毎回占めていて、公開中21本のうち14本がこの幅を超えていました。接尾辞を記事ページから外すだけで、超えるのは7本に減りました。

    サイト名は検索結果のURL表示にも出ています。タイトルの中で場所を取ってまで繰り返す必要は、薄いと判断しました。

    やらないと決めたこと

    逆に、やらないことも決めました。

    検索語を狙って記事を量産すること。書いていないことは書けません。このサイトの記事は、実際に自分がつまずいて調べたことだけで成り立っています。検索語から逆算して書き始めると、その前提が崩れます。

    用語を1語1ページにすること。個別ページのほうが検索に有利、という一般論はあります。しかし1語400字のページを100枚作ると、中身の薄いページが多いサイトと見なされる可能性がありました。この規模では逆効果と判断して、分野ごとにまとめています。

    広告を置ける場所すべてに置くこと。内容と無関係な記事に広告を挟むと、読んだ人の信頼を削ります。掲載できる場所の数と、掲載すべき場所の数は違います。

    一般論が、自分の規模で成立するとは限らない

    「個別ページのほうが強い」「記事数が多いほうが有利」——どれも間違いではありませんが、条件付きの正解です。

    条件を確かめずに無条件の正解として受け取ると、規模が合わないまま実行して逆効果になります。

    まだ測っていない

    正直に書くと、ここまでの効果はまだ数字で確かめていません。

    Search Consoleに登録したのが最近で、記事の公開も始めたばかりです。いま順位やクリック数を見ても、変化なのか誤差なのか区別がつきません。

    やったことを記録しておいて、数字が溜まってから振り返るつもりです。効果を確かめる前に「効果があった」と書かないことも、この記録の一部だと思っています。

    今回の学び

    まず、順番があること。存在を知られていない段階で書き方を工夫しても、読む相手がいません。まず見つかる状態を作り、それから中身の噛み合わせを直す。逆にすると、労力の割に何も起きません。

    次に、探している人の言葉と、書いた人の言葉は違うこと。良い見出しを付けたつもりでも、それが検索で使われる言葉とは限りません。両立しないなら、場所ごとに出す文字を変える手があります。

    そして、一般論は条件付きの正解だということ。規模や状況が違えば逆に働きます。自分の数字に当てはめてから採用するべきです。

    最後に、確かめる前に成果を語らないこと。やったことと、効いたことは別です。記録として残す価値があるのは、前者を正確に書いておくことのほうだと思います。

  • 登録してから、広告を出すまで

    登録してから、広告を出すまで

    このサイトで、成果報酬型の広告を扱えるようにしました。

    手続きそのものは難しくありません。順番を間違えると手戻りになるところがいくつかあったので、そこを中心に残しておきます。

    この記事で扱うこと

    登録から掲載までの流れと、着手する順番。そして「何を紹介するか」を先に決めておくべき理由です。

    全体の流れ

    順番
    1. 掲載するサイトを整える     ← 審査で見られる
    2. ASPに登録する(サイト審査)
    3. 広告主ごとに提携を申し込む   ← 1件ずつ
    4. 承認される
    5. リンクタグを取得する
    6. 記事に置く
    7. 広告であることを表示する

    時間がかかるのは2と4です。どちらも相手の審査待ちなので、こちらからは進められません。待っている間に何をやっておくかで、承認後の速さが変わります。

    先にやっておくべきだったこと

    プライバシーポリシー

    これが最初です。広告を出すかどうかに関係なく、アクセス解析でCookieを使い、問い合わせフォームで個人情報を受け取っているなら、すでに必要になっています。

    広告の話が出てから慌てて作ることになりました。順番としては、サイトを公開した時点で用意しておくものです。

    広告であることを示す仕組み

    2023年10月から、広告を広告と分かる形で示すことが必要になりました。書き忘れると規制に触れます。

    本文に手で書く方法もありますが、手で書くものは、いつか書き忘れます。記事にタグを付けたら自動で表示が出る形にしておくと、忘れようがなくなります。

    これは提携が決まる前に作れます。実際、先に作っておいたので、承認後は記事にタグを付けるだけで済みました。

    何を紹介するかを決める

    ここがいちばん大事だと思います。「実際に使っているものだけ」と先に決めました。

    使っていないものを紹介できない理由

    このサイトは、書いた人が何を考えて作ったかを読んでもらう場所です。使ったことのないものを勧めた瞬間、他の記事も同じ調子で書かれていると思われます。

    1件の報酬と、全記事の信頼が釣り合いません。

    この条件で残るものは、多くありません。実際に契約しているサービスのうち、扱いのあるものだけになります。選択肢が減るのは、条件が効いている証拠だと考えることにしました。

    1つの広告主を、複数の記事に置くとき

    紹介できるものが少ないと、同じ広告主を複数の記事に置くことになります。ここで手を抜くと、同じ文面が何ページにも並びます。

    読者からは「どの記事にも同じ広告が挟まっている」としか見えません。検索エンジンから見ても、同一の内容が複数ページに散っている状態です。

    そこで、記事ごとに違うことを書く形にしました。企画の記事には選定の基準を、構築の記事にはつまずいた点を、公開の記事には契約前に知りたかったことを。どれもその記事で扱っている内容の延長線上にあります。

    この形なら、追記そのものが記事の情報量を増やします。

    置かない記事を決める

    候補に挙げた記事のうち1本を外しました。URLの処理に関する記事で、ドメインにもサーバーにも触れていません。

    ここに広告を置くと、内容と無関係な広告を挟んだことになります。読んだ人の信頼を削る割に、クリックもされないはずです。

    置ける場所すべてに置かない

    掲載できる場所の数と、掲載すべき場所の数は違います。文脈が合わないところに置くと、合っている場所の説得力まで下がります。

    収益の見込みについて

    正直に書くと、この規模のサイトで大きな金額にはなりません。

    それでも意味があると考えたのは、仕組みを一度通しておくと、判断の材料が手に入るからです。何がクリックされ、何がされないか。どの記事から動きがあるか。これは推測では分かりません。

    そして、こうして手順と判断を書き残せます。

    今回の学び

    まず、待ち時間のある手続きは、待つ前に準備を終えること。審査は自分では進められません。その間にできることを先に片付けておくと、承認された日に掲載できます。

    次に、条件を先に決めておくこと。「実際に使っているものだけ」を後から決めると、すでに置いたものを見直すことになります。基準は、選ぶ前に決めるから機能します。

    そして、忘れうることは、忘れられない形にすること。広告の表示は、書き忘れが規制に触れます。手で書く運用にした時点で、いつか漏れます。

    最後に、置ける場所すべてに置かないこと。数を増やすほど1件あたりの説得力は下がります。合う場所にだけ置くほうが、結果として届きます。

  • 分類は、探す人の手がかりではない

    分類は、探す人の手がかりではない

    用語集が116語になりました。分野ごとに8ページへ分けてあります。

    ある日、自分で「WAFってどこに書いたっけ」と探して気づきました。分野を当てないと、たどり着けません。

    この記事で扱うこと

    分類が誰のためのものかという話と、検索をブラウザ側に置いた判断、そして「打ち方の違いで見つからない」を潰すための文字のならし方です。

    分類は、書く側の都合でできている

    8つの分野は、書くときには役に立ちました。どこに何を書くかが決まり、抜けにも気づけます。

    しかし探す側から見ると、事情が違います。

    WAFを調べたい人がやること
    用語集を開く
      ↓
    8つの分野から、それらしいものを選ぶ  ← ここで当て推量
      ↓
    違ったら戻ってやり直す

    調べたい語が決まっている人にとって、分類は遠回りです。「WAFはセキュリティの話だ」と分かっている人は、そもそもWAFを調べません。

    整理した本人にしか使えない整理

    分類は、作った人には自明です。だから使いにくさに気づきません。自分で探して詰まって初めて、これは自分用の並べ方だったと分かりました。

    検索を、ページの先頭に置いた

    入力するとその場で絞り込まれ、押せば該当の語まで直接飛びます。分野の一覧は、検索していないときだけ出します。

    絞り込んだ結果の下に一覧が残っていると、どこまでが結果なのかが分からなくなるためです。

    打ち方の違いで、見つからないようにしない

    ここに手間をかけました。同じ言葉でも、打ち方は人によって違います。

    入力 探しているもの
    キャッシュ / きゃっしゅ / キャッシュ キャッシュ
    waf / WAF / WAF / わふ WAF
    resize / リサイズ ResizeObserver

    これを別物として扱うと、「あるのに見つからない」という結果になります。本人からすれば、無いのと同じです。

    比べる前に、全角と半角、大文字と小文字、カタカナとひらがなを一方に寄せています。読み(ひらがな)と、URLに使っているローマ字のIDも検索対象に含めました。日本語入力では変換の途中でも文字が届くので、確定前のひらがなでも当たるようにしてあります。

    なぜブラウザ側で絞り込むのか

    検索といえばサーバーに問い合わせる形が思い浮かびますが、今回は全部のデータを最初に渡してしまう形にしました。

    渡すもの
    語 + 読み + 1行の説明 + 置き場所  × 116語
    = 十数キロバイト(記事1本の本文より小さい)

    この量なら、最初に渡しても負担になりません。1文字打つたびに通信する必要がなくなり、待ち時間がゼロになります。

    規模が変われば、答えも変わる

    これは116語だから成立する判断です。数千語になれば、最初に渡す量が重くなり、サーバー側で絞り込む形が正しくなります。

    いまの規模で正しいことを選び、変わったら選び直すほうが、最初から大きく作るより速く進めます。

    残った引っかかり

    ひとつ、きれいでない点があります。用語の本文はCMS、検索用の索引はコードと、置き場所が分かれました。

    語を1つ足すには、両方を更新する必要があります。片方だけ直すと食い違います。

    いまは116語で、更新も自分1人なので回せます。ただしこれは「気を付ける」で運用している状態で、いつか間違えます。数が増えるか、更新する人が増えたら、索引をCMSから作る形へ変えるつもりです。

    今回の学び

    まず、分類は書く側の道具で、探す側の道具ではないこと。整理した本人には自明なので、使いにくさに気づけません。自分で探して詰まるまで分かりませんでした。

    次に、「あるのに見つからない」は、無いのと同じこと。打ち方の違いは利用者の間違いではありません。揃えるのは、こちら側の仕事です。

    そして、いまの規模で正しいものを選ぶこと。将来を見越して大きく作ると、そのぶん今日が遅くなります。変わったときに選び直せる形にしておけば十分です。

    最後に、気を付けて運用している場所は、書き留めておくこと。本文と索引が分かれている件は、いま把握しているから回るだけです。忘れた頃に食い違います。

  • 最初の画面に、本文が無かった

    最初の画面に、本文が無かった

    記事ページを開いたときに何が見えているかを、実際に測りました。

    測ったもの 値
    画面の高さ 723px
    本文が始まる位置 772px
    先頭のアイキャッチ画像 455px

    最初の画面に、本文が1文字も出ていませんでした。タイトルと日付と画像で埋まっていて、文章はスクロールしないと始まりません。

    この記事で扱うこと

    アイキャッチを消した理由、コードブロックにコピーボタンを付けた理由、見出しに個別リンクを足した理由、そして関連記事の選び方を日付から変えた理由です。

    1. アイキャッチを、記事ページから消した

    455pxは画面の6割です。ここを何が占めているかを考え直しました。

    このサイトのサムネイルは、記事タイトルを文字として描いた画像です。つまり、すぐ上の見出しと同じ内容を、画像でもう一度見せていたことになります。

    同じことを二度言うために、画面の6割を使っていた

    検索から来た人は「探している答えがここにあるか」を数秒で判断します。その数秒に見えているのがタイトルの繰り返しでは、判断する材料がありません。

    画像そのものは、記事一覧のカードとSNSで共有されたときの表示に使っています。作るのをやめたのではなく、本文を読む画面には置かないという判断です。

    2. コードブロックに、コピーボタンを付けた

    ある記事にはコードブロックが25個ありました。コマンドや設定値は、読むためではなく手元で使うために載せています。

    選択してコピーもできますが、折り返しのある長い行では取りこぼしやすい。ボタンを1つ足すだけで、この摩擦が消えます。

    ひとつ決めたのは、クリップボードが使えない環境ではボタンを出さないことです。押しても何も起きないボタンは、無いより悪いので。

    3. 見出しに、その見出しへのリンクを足した

    見出しが12個ある記事で、「この部分を見てほしい」と人に伝える手段がありませんでした。記事のURLしか送れず、相手は自分で探すことになります。

    用語集では語ごとに直接指せるよう整備したのに、記事側は未対応でした。同じ問題です。

    実装は、目次を組み立てる処理の中で一緒に埋め込みました。表示のあとにブラウザ側で差し込むこともできますが、そのぶん読み込むJavaScriptが増えます。すでに文字列を組み立てている場所があるなら、そこで済ませるほうが軽い。

    4. 関連記事を、日付ではなく内容で選ぶ

    これまで記事の末尾には「1つ新しい記事」と「1つ古い記事」だけを出していました。

    公開日が近いことと、内容が近いことには関係がありません。直前に書いた記事がまったく別の話題、ということは普通に起きます。

    タグの重なりを2点、カテゴリの重なりを1点として、上位3件を出すようにしました。

    なぜタグを重く見るか
    カテゴリ: 技術系 … ほぼ全記事が同じ
    タグ    : dns, seo, nextjs … 話題が分かれる

    カテゴリだけで判断すると、ほぼ全記事が等しく「関連」になります。粗い区分は、近さを測る物差しになりません。

    数を揃えるために、関係ない記事を混ぜない

    重なりが1つも無い記事は出しません。3件に満たなければ、その数だけ出します。1件も無ければ、セクションごと出しません。

    「関連記事」という見出しは、書いてあることが本当である前提で読まれます。体裁のために埋めると、その前提が崩れます。

    今回の学び

    まず、自分のページを、来た人の目で測ること。作っている側は上から下まで知っているので、最初の画面に何が見えているかを意識しません。数字にすると一目で分かります。

    次に、同じ内容を二度見せていないかを疑うこと。タイトルの画像とタイトルの文字は、別々に作ったので気づきませんでした。並べて初めて重複だと分かります。

    そして、片方で解決したことは、もう片方でも起きていること。用語集では直接指せるように整備したのに、記事では手つかずでした。同じ問題は、場所を変えて何度も出てきます。

    最後に、物差しが粗いと、何も測れないこと。全記事が同じ値を持つ項目で並べ替えても、順番は決まりません。分類は、細かさがそろって初めて役に立ちます。