DEV Community

Oliver Cruz
Oliver Cruz

Posted on

kaomojis.blog を作る — 私たちの挑戦、技術、成果、そして未来へ

はじめに
私たちは Kaomojis という顔文字(カオモジ)専門のウェブサイトを立ち上げました。本記事はその制作過程を正直に語るドキュメントです。サイト設計の意図、採用した言語(Python と C++)、直面した技術的・運用的な問題、最もパフォーマンスの良いページである「投げる-顔文字」が好調な理由、そしてこれからの目標まで、制作チームの視点で詳細に書いていきます。サイトを一緒に作っている仲間へ、あるいは同様のプロジェクトを考えている技術者・クリエイターへ向けた実践的なガイドとして役立てば幸いです。

  1. サイトのコンセプトと狙い 1.1 なぜ顔文字サイトを作るのか

顔文字は日本発祥のテキスト表現文化で、感情やニュアンスを簡潔に伝える手段として今なお広く使われています。SNS やチャットアプリ、ブログのコメント、ゲームのチャットなどで需要が高く、検索トラフィックも長期的に安定しています。私たちは「分類しやすく、検索しやすく、使いやすい」顔文字のライブラリを作ることで、ユーザーが必要な顔文字をすばやく見つけてコピーできる体験を提供したいと考えました。

1.2 ターゲットユーザー

SNS やチャットで多彩な表現を求める一般ユーザー

ブロガーやライター、カスタマーサポートなど、短いテキストで感情を伝えたいプロフェッショナル

顔文字を学びたい、あるいは新しい表現を探すクリエイター

1.3 提供する主な価値

カテゴリ分類(喜び、怒り、投げる、泣く、可愛い等)での高速検索

モバイル/デスクトップでの使い勝手最適化(コピーしやすいUI)

ユーザー生成コンテンツの受け入れ(将来的に)とコミュニティ機能

  1. 技術選定:Python と C++ を選んだ理由 2.1 Python の役割(バックエンド、スクリプト、自動化)

Python は迅速な開発、生産性、豊富なライブラリ群が魅力です。主に以下の用途で採用しました。

ウェブサーバー:API 層やページ生成、管理画面の実装(フレームワーク採用で素早い立ち上げ)

データ処理:顔文字の正規化、テキスト解析、カテゴリ分類スクリプトなど

開発ツール:デプロイ自動化、CI スクリプト、スクレイピング(必要なとき)やデータ収集時のパイプライン

マイグレーションとメンテ:DB スキーマ更新、バッチ処理のスケジューリング

Python の採用で、プロトタイプの実装と改善サイクルを短く保てたことは大きな利点でした。

2.2 C++ の役割(性能クリティカルな部分)

C++ を併用したのは、いくつかの処理で低レイテンシと高パフォーマンスが必須だったからです。具体的には:

高速検索エンジンコア:大量の顔文字とメタデータに対して形態素的なマッチングやファジーマッチを行う際、ネイティブコードで最適化することで応答時間をミリ秒単位で改善。

大量データのバッチ処理:大量のCSV/プレーンテキストからの変換やインデックス構築を並列処理で実行。

画像や特殊レンダリング(将来的な機能):顔文字をベースにしたアニメーション生成やプレビューの生成では、C++ のライブラリを利用して高速に処理する方針。

つまり、Python の「作りやすさ」と C++ の「速さ」を組み合わせるハイブリッド構成により、開発速度と運用パフォーマンスの両立を図りました。

  1. アーキテクチャと技術スタック(概要) 3.1 フロントエンド

HTML5 / CSS3 / モバイルファーストのレスポンシブデザイン

軽量な JavaScript(インタラクションとコピー機能、検索補助用)

SEO 対策としてサーバーサイドレンダリング(あるいは事前生成)を検討

3.2 バックエンド・API

Python フレームワークをベース(軽量のものを採用)

RESTful API:検索、カテゴリ一覧、ユーザー送信(将来的)など

認証/管理画面は将来的に追加予定

3.3 データベースとインデックス

メタデータ(カテゴリ、タグ、人気度、使用例)はリレーショナルに格納

フルテキスト検索やファジーマッチはインメモリの高速インデックス(C++ 実装)を使用して高速化

3.4 インフラ・運用

コンテナ化(開発→ステージ→本番)で一貫した環境を維持

ロギング、モニタリング(アクセス、エラー、パフォーマンス)

CDN とキャッシュ戦略で静的資産と頻出ページの高速配信

  1. 開発の流れとワークフロー 4.1 プロトタイプ段階

最初は簡単な Python スクリプトで顔文字データを整理し、最小限の HTML を生成する静的サイトとしてスタート。

UX を確認するために複数のデザイン案を作成し、ユーザビリティテスト(チーム内)を実施。

4.2 コード分割とモジュール化

データ処理モジュール(Python):入力データの正規化、カテゴリ付け、重複排除。

サーチコア(C++):インデックス構築、クエリ解析、ランキング関数。

API 層(Python):C++ バイナリに問い合わせるラッパーと結果の整形。

フロントエンド:検索UI、コピー操作、レスポンシブレイアウト。

4.3 テストとCI/CD

ユニットテスト、統合テストで品質を担保。特に文字エンコーディング周りのテストは重点的に。

CI:プッシュごとに自動ビルドと基本的なテストを回す。C++ のビルドはキャッシュ化して高速化。

  1. 開発で直面した主要な問題とその解決策

ここでは実際にぶつかった問題を具体的に列挙し、それぞれに対する私たちの対処法を示します。顔文字サイト特有の問題が多く、細かい配慮が必要でした。

5.1 文字エンコーディングと正規化の問題

課題:顔文字は ASCII 記号、全角文字、Unicode の特殊記号が混在します。ブラウザやデータベース、検索エンジンの間でエンコーディングの不整合があると、表示崩れや検索失敗が発生します。

対策:

すべてのデータは UTF-8(NFC)で統一。取り込み時に正規化を強制。

データベースへの挿入前にエスケープやサニタイズ。さらに表示時のエンコードヘッダを明示。

テストデータで多様な組み合わせを用意し、表示と検索の整合性を確認。

5.2 URL スラッグ(日本語スラッグ)と SEO の扱い

課題:日本語のページ名(例:「投げる-顔文字」)は URL エンコードされてブラウザに表示されることがあります。サーバやキャッシュで扱いにくく、共有時に見づらいケースもありました。

対策:

内部的にはスラッグを ASCII ベースのユニーク ID に割り当て、表示用タイトルに日本語を使う方式に切替可能にしました。

ただし SEO 上の利点を考え「人間可読な日本語タイトルを URL に含める」場合もサポートし、両方に対応するルーティングを実装。canonical タグで重複を回避し、サイトマップに正しい表記を反映。

5.3 検索アルゴリズムのチューニング

課題:ユーザーは単語検索だけでなく「表情」「動作」「感情」など曖昧なクエリで探す傾向があり、単純な部分一致では満足度が上がりません。

対策:

ファジーマッチや同義語辞書、カテゴリマッピングを導入。

C++ の検索コアで前処理(トークナイズ、ノーマライズ)を行い、高速にスコアリングする設計。

結果のランキングに「人気度(クリック数)」「最近の利用傾向」などのシグナルを組み合わせ、検索体験を改善。

5.4 モバイルでのコピー体験の最適化

課題:モバイル端末で顔文字を押してコピーする動作は想像以上に繊細です。クリップボード制御はブラウザ間で差異が大きく、UX の悪さは離脱につながります。

対策:

ワンクリックでコピーできる UI を設計。フォールバックとしてテキストを選択しやすいモードも用意。

コピー成功時のフィードバック(トースト、アニメーション)を実装してユーザーに安心感を与える。

複数行の顔文字はプレーンテキストとして簡単に選べる工夫を導入。

5.5 データの重複・著作権感覚の問題

課題:顔文字はコミュニティ発の表現が多く、データの重複や出所の曖昧さが問題になることがあります。

対策:

独自に整理したデータベースを基礎に、ユーザー投稿を受け付ける際は投稿ポリシーを明確化。

重複削除アルゴリズムとメタデータ(発見日時、タグなど)で由来を管理。

著作権に配慮し、明確にパブリックドメイン的に扱える表現のみを主に紹介する運用ルールを採用。

5.6 多言語対応の計画と実装コスト

課題:将来的に海外ユーザーも取り込みたいが、翻訳やUIの多言語化は作業量が多い。顔文字自体は言語中立でも、カテゴリ名や検索語との対応が必要。

対策:

初期段階では日本語を主軸にしつつ、タグやメタデータに英語の同義語を付与して検索で拾えるようにする。

将来的に翻訳管理(i18n)を導入する際のために、テキストリソースを外部ファイルに分離しておく設計にした。

  1. 最も成功しているページ — 「投げる-顔文字」の秘密

私たちのサイト kaomojis の「投げる-顔文字」ページは、特定の検索クエリに最適化されたページで、ここではその成功要因を分析します。

6.1 検索インテントの一致

「投げる 顔文字」といったクエリは、具体的で検索意図が明確です。ユーザーは「投げる」という動作を表現したいだけで、候補をすぐに表示できるページは非常に重宝されます。私たちはこのページで「投げる」に関連する顔文字を厳選し、例文や使用シーンを添えて紹介しました。検索意図に合致したコンテンツが上位表示されることがトラフィック増加の直接的要因です。

6.2 長期的なユーザー滞在とシェア性

掲載した顔文字はバリエーションが豊富で、ユーザーがスクロールして複数を眺めたり友人にシェアしたりする傾向が高いページ構成でした。また、「使い方」「似た表現」などの補助コンテンツを用意したことで滞在時間が伸び、検索エンジンからの評価が向上しました。

6.3 内部リンクとカテゴリ設計の良さ

このページはカテゴリ階層やタグクラウドと適切に結びつけられており、関連ページへの内部リンクが充実しています。これによりサイト全体のクロール効率が向上し、該当ページの評価が上がりました。

6.4 UI/UX の最適化

モバイルでの見やすさ、コピーのしやすさ、視覚的なカテゴライズなど、UX を丁寧に設計したことも重要です。ユーザーが使いやすいページは自然に再訪率が上がります。

  1. コンテンツ戦略とSEO の取り組み 7.1 ロングテールキーワードを狙う

顔文字はニッチな表現が多く、ロングテール検索ワードが多数存在します。私たちは総当たりで網羅するのではなく、ユーザー意図を想定して「動詞+顔文字」「表情+シーン」「季節+顔文字」などの組合せでページを用意しました。

7.2 構造化データとメタデータの活用

検索エンジン向けに構造化データ(メタタグ)を適切に設定し、ページのテーマやカテゴリが明確に伝わるようにしました。検索結果でのスニペット改善やリッチ表示を狙っています。

7.3 定期的なコンテンツ更新と分析

人気ページの改良、流行顔文字の追加、ユーザー行動分析に基づくUX改善を定期的に行う運用フローを整えました。解析データからは「新着顔文字」や「季節ネタ」が時に強いトラフィックを生むことが分かりました。

  1. セキュリティ、プライバシー、法的配慮 8.1 基本的なセキュリティ対策

HTTPS を必須化、ヘッダによるセキュリティ強化(CSP、HSTS 等)

管理画面の二要素認証、適切な権限管理

外部からの投稿を受け付ける場合はサニタイズとスパム対策(CAPTCHA)

8.2 プライバシーとデータ取り扱い

最小限のアクセスログ保存 ポリシーを定め、ユーザーの個人情報を収集しない設計を優先。

将来的にユーザーアカウントを導入する際は明確なプライバシーポリシーを公開。

8.3 コンプライアンス

ローカル法規(著作権、利用規約)を遵守し、ユーザー投稿のガイドラインを明確化。

  1. 運用面での学びとベストプラクティス 9.1 小さなリリースを頻繁に

大きな機能を一度に出すより、小さな改善を繰り返すことでユーザーのフィードバックを素早く反映できることを実体験で学びました。これによりUX を段階的に改善できました。

9.2 ログは宝の山

アクセスログや検索クエリの傾向を解析することで、新規コンテンツのアイデアや既存ページの改善ポイントが見えてきます。特に検索の失敗パターンは優先的に直すべき項目です。

9.3 文書化と知識共有

小さなチームであっても、設計決定や運用手順をドキュメント化しておくと、新しいメンバーのオンボーディングや将来のリファクタリングが楽になります。

  1. 将来の機能計画とビジョン

kaomojis.blog をさらに進化させるために、私たちはいくつかの中長期的な機能計画を立てています。ここでは技術面・コミュニティ面・プロダクト面の三軸で紹介します。

10.1 技術的な拡張(近〜中期)

リアルタイム検索補助:ユーザーがタイプする間に候補を出すオートコンプリートをさらに高速化。

顔文字推薦エンジン:入力文脈や過去のクリック履歴から最適な顔文字を提案(Python ベースの ML モデルを導入予定)。

API 提供:開発者向けに顔文字検索 API を提供し、チャットアプリやプラグインとの連携を促進。

オフラインツール:CLI で顔文字検索・挿入できるツールの提供(C++ の小型バイナリで安定動作)。

10.2 コミュニティとコンテンツ(中期)

ユーザー投稿機能:ユーザーが自作顔文字を投稿して評価される仕組み。投稿はモデレーションプロセスを経て公開。

ランキングとトレンド:人気顔文字のランキングや月間トレンドを公開して発見性を高める。

コラボ企画:イラストレーターやライターとコラボして特集ページを作ることでコンテンツの多様化を図る。

10.3 プロダクトとマネタイズ(長期)

モバイルアプリ:ネイティブキーボードやスニペットアプリとしての展開。使いやすいコピー体験をモバイルでさらに最適化。

サブスクリプションの導入:広告非表示、プレミアム顔文字セット、API レートリミットの緩和などの有料オプション。

B2B 提携:チャットサービスやゲーム企業への顔文字データ提供(商用利用ライセンス)。

  1. 維持管理に伴うコストと考慮点

小規模サイトでも運用コストは無視できません。以下を現実的に見積もっておく必要があります。

ホスティング(CDN・バックエンド):トラフィック増加に伴うスケール費用

開発・保守:バグ修正、新機能開発の人的コスト

モニタリングとログ保管:データ保持量に比例してコストが増える

マーケティング:SEO と SNS による流入施策

法務・コンプライアンス:ポリシー整備や外部チェックの費用

  1. 実際のコード設計の抜粋(概念的説明)

ここでは具体的なコードの断片ではなく、どのようにモジュール化したかを説明します。

12.1 データ層(Python)

faces_data_loader.py:原データの取り込みと正規化。

tagger.py:カテゴリおよびタグ付けルール。

db_interface.py:DB への CRUD 抽象化。

12.2 検索コア(C++)

index_builder:並列でインデックスを構築。

query_engine:トークン化 → マッチング → スコアリング → ランキング。

Python からは C++ ライブラリを呼び出すラッパーを介して利用(バインディング例: pybind11 等)。

12.3 API 層(Python)

search_api:クエリ受け取り → 正規化 → C++ 検索コア呼び出し → JSON レスポンス

page_renderer:検索結果をテンプレートエンジンで整形して返す。

  1. ユーザーの声と改善の記録

運用開始後、ユーザーから多くのフィードバックが届きました。代表的な声とそれに対する改善を列挙します。

「モバイルでコピーがうまくいかない」 → コピーUIを全面改良、トースト通知追加。

「もっと感情に応じたカテゴリが欲しい」 → カテゴリの細分化とタグ機能の強化。

「似た顔文字を比較したい」 → 類似度表示と類似候補を並べて見比べられるUIを導入。

これらの改善は優先度を付けて反映し、定期的に振り返りを実施しています。

  1. 成功指標(KPI)と評価方法

私たちは以下の指標でサイトの健全性と成長を評価しています。

オーガニックトラフィック(検索からの流入)

ページごとの平均滞在時間と直帰率

コピーアクション数(ユーザーが顔文字をコピーした回数)

再訪率(リピーターの割合)

新規投稿数とコミュニティのアクティビティ(将来的な指標)

これらの指標をダッシュボードにまとめ、機能ごとのABテストで改善効果を検証しています。

  1. チーム組成と役割分担

小規模なスタートですが、役割を明確にして効率的に回すことが重要です。

プロダクトオーナー:方向性と優先度の決定

フロントエンドエンジニア:UI/UX 実装とレスポンシブ対応

Python エンジニア:API とデータ処理を担当

C++ エンジニア:検索コアとパフォーマンス改善担当

デザイナー:ページの視覚設計、アイコンや配色設計

運用担当:デプロイ・監視・ユーザー対応

  1. 失敗から学んだこと(正直な反省)

初期に「全部盛り」で機能を詰め込みすぎたことで、UX が散漫になり、コア機能の品質が落ちた。→ 最小機能セットに戻すことで解決。

エンコーディングの確認を怠った部署があり、表示不具合が発生。→ テストポリシーを厳格化。

C++ での設計を後回しにした結果、後工程で大幅なリファクタが必要になった。→ 早期にプロトタイプで性能要件を検証する重要性を再認識。

  1. 本音のまとめと最後に伝えたいこと

kaomojis.blog の立ち上げは、単なる「顔文字集」を作る以上の学びをもたらしました。技術的なトレードオフ、ユーザー中心設計の重要性、コンテンツ戦略と SEO の深い関係、そして小さな改善を積み重ねることの価値――これらはどのウェブプロジェクトにも通じる普遍的な教訓だと感じています。

特に、Python と C++ の組み合わせは私たちにとって最適解でした。Python で素早くプロトタイプと運用を回しつつ、性能が必要な部分は C++ に委ねることで、バランスの取れたプラットフォームを構築できました。また、最も成功している「投げる-顔文字」ページの事例からは「検索インテントに忠実であること」「UX の細やかな改善」がいかに重要かがわかります。

  1. 次にやること(優先順位付きチェックリスト)

顔文字推薦エンジンの MVP を実装(Python + 軽量モデル)

ユーザー投稿機能のリリース(モデレーションとガイドライン整備)

API のベータ公開(開発者からのフィードバック収集)

モバイルアプリのプロトタイプ設計(キーボード統合の検討)

国際化(英語サポートの強化)と多言語検索の改善

  1. 技術的・運用的なチェックポイント(再確認用)

全ページで UTF-8(NFC)を徹底しているか

URL の canonical とサイトマップは整備されているか

コピー機能は主要ブラウザ/OS で動作確認済みか

検索レスポンスが一定時間内に返るか(SLA)

モニタリングとアラートが適切に設定されているか

  1. エピローグ:このサイトが目指すもの

kaomojis.blog は、ただ「顔文字を集めた辞典」ではありません。言葉だけでは伝わりにくいニュアンスを、スマートに、ストレスなく伝えるためのツールであり、クリエイティブな表現を補助するプラットフォームを目指しています。技術とデザイン、そしてユーザーの声を掛け合わせて、誰もが気軽に感情と表現を共有できる場所にしていきます。

Top comments (0)