はじめに
こんにちは。プロダクト開発部の髙木です。先日、弊社のブログでテックブログの入稿システムについて紹介しました。このシステムは、ブログ記事の作成から投稿まで、これまで手作業で行っていた工程を大幅に自動化し、記事執筆に集中できる環境を提供するものです。
このシステムを運用している中で、サムネイル画像生成機能において、一部の文字が太字にならないという問題が発覚しました。調査・修正を行う過程で、技術的な問題を解決するだけでなく、チーム開発において非常に重要な「どうしてこうしたんだろう?」を考えるきっかけを得られました。
問題の発見と原因の特定
サムネイルの文字が太字にならない
今回問題となったのは「絆」という漢字でした。通常、サムネイル作成システムによって生成される画像では、すべての文字が統一された太字フォントで表示されるはずです。しかし、ある記事のサムネイルを確認したところ、「絆」という文字だけが細字で表示され、他の文字と視覚的に異なる状態になっていました。

この現象を詳しく調査したところ、リポジトリに内包していたフォントファイルにその文字が含まれていないことが判明しました。システムは存在しない文字を代替フォントで表示していたため、視覚的な違いが生じていました。技術的な挙動の原因は特定できましたが、そもそもなぜそのような問題が起きる状態になっていたのか、その背景や経緯については不明でした。
最初のアプローチ:Google Fontからのダウンロード
問題の根本的な解決を図るため、まずはGoogle FontsからNoto Sans JPのフォントファイルをダウンロードし、既存のフォントファイルと置き換えることにしました。この新しいフォントファイルを使用してサムネイル生成をテストしたところ、期待通り「絆」という文字も正しく太字で表示されるようになりました。
問題が解決したと安心して、この修正をコミットしてリモートリポジトリにプッシュしようとしたところ、予想外のエラーが発生しました。これまでそのような大きなファイルを扱った経験がなかったため、Gitでは約1MBを超えるファイルをプッシュしようとするとサイズ制限によってエラーが出ることを、このときに初めて知りました。
サブセット化という解決策
バッファサイズ変更よりも良い方法
最初は、Gitの設定でバッファサイズを上げて大きなファイルをプッシュできるようにすることを検討しました。しかし、調べている過程で、フォントファイルのサブセット化という、より根本的で効率的な解決手法があることを知りました。
サブセット化とは、フォントファイルから実際に使用しない文字を排除して、必要最小限の文字セットのみを含むフォントファイルを作成する技術です。今回のブログのサムネイル生成という用途を考えると、日本語のすべての文字を含む必要はありません。そのため、ファイルサイズを大幅に削減できるサブセット化の方針の方が、長期的に見てもメンテナンス性やパフォーマンスの観点から適切だと判断しました。
「絆」が含まれなかった理由
今回使用していたフォントファイルに「絆」が含まれなかった理由を考えてみました。結構身近に感じていた漢字でしたが、この漢字が常用漢字に含まれないことがわかりました。たしかに子ども頃に習った記憶はない気がする…。
今後も常用漢字以外の漢字をタイトルに使用する可能性があります。そのため、ある程度使用される可能性のあるフォントはサブセット化する際に含めておく方が安全であること考えました。
常用漢字以外の文字の選定
使用される傾向のある常用漢字以外の漢字は、文化庁の資料から抽出しました。
常用漢字表の字体・字形に関する指針(報告)について(報告) | 文化庁
こういったPDFから抽出するコードをさっと作ってくれるのは、LLMの良いところだなと改めて思いました。
結果と成果
それらの文字を含めたフォントファイルを作成したところ、1MB未満となりコミット、プッシュすることができました。
先駆者の行動をリスペクトする
「なぜそうしたのか」を理解する
記事のタイトルに戻りますが、おそらくこの問題は、このシステムを担当した方も全く同じことを考えたのだと思います。フォントファイルを入れてみたら1MBを超えていて、ファイルサイズを減らすために常用漢字のみを入れたフォントファイルを作成したのだと思います。
想像力と知識の不足を認める
日常的に「どうしてそうしなかったんだろう」と思うことは多いですが、自分が同じ立場に立つと「だからこうしたんだな」となることが多いです。それは自分の想像力が足りていないこともありますが、知識が足りていなくてそのような結論になってしまうことが多いと感じています。
先駆者の行動はリスペクトを持って分析し、その上で「こうした方が良さそう」にもっていくことは、同じチームとして活動していく仲間として大切な考え方です。技術的な問題を解決することは重要ですが、その過程で過去の意思決定を否定するのではなく、理解し、その上で改善を提案することが建設的だと考えています。
おわりに
今回のフォントファイルのサブセット化を通じて、技術的な問題解決だけでなく、チーム開発において重要な視点について改めて見直す良いきっかけになりました。「絆」という漢字にぴったりのテーマだったということもあり書いてみました。
自分の知識が深まれば深まるほど、自分の考えが適切であると考えることが増えていくと思います(その考えが間違っていることもたくさんありますが…)。そのような状態でも、先駆者の行動の理由を理解し、リスペクトを持って改善を進めることは、自分の知識も深めつつ良いチームになっていくうえで必要なことだと改めて思いました。自分だけの話ではなく、一緒に働いている人とやりやすく仕事をしていくうえで大切にしていこうと思います。
コメント