tag:crieit.net,2005:https://crieit.net/users/jindotjp/feed Jinの投稿 - Crieit CrieitでユーザーJinによる最近の投稿 2020-04-14T13:52:22+09:00 https://crieit.net/users/jindotjp/feed tag:crieit.net,2005:PublicArticle/15826 2020-04-14T13:52:22+09:00 2020-04-14T13:52:22+09:00 https://crieit.net/posts/Google 独学初心者がGoogle風の書籍検索サービスを作ってみた【個人開発】 <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436810/670938fb-e2c7-aed0-1def-f1c2cce69233.png" alt="GeekleDesktop.png" /><br /> 独学でプログラミングを学習しています。<br /> 「作りながら学ぶのがいい」ということでGoogle風の技術書検索サービスを開発しました。</p> <p>アイデア的に似ているサービスはありますが、自分が欲しいものとは少し違っていたので作りました。</p> <p>初学者なりに試行錯誤したので、アプリの仕組みや作った方法をまとめます。</p> <p>プログラミング学習中の人や個人開発を考えている人のモチベUPに貢献できたらいいなと思います。</p> <h1 id="作ったサービス「技術書検索サービス」"><a href="#%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%80%8C%E6%8A%80%E8%A1%93%E6%9B%B8%E6%A4%9C%E7%B4%A2%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%80%8D">作ったサービス「技術書検索サービス」</a></h1> <p>作ったのは「Geekle(ギークル)」という技術書検索サービス。</p> <p>-> <a target="_blank" rel="nofollow noopener" href="https://geekle.jp/"> Geekle(ギークル) | 技術書検索サービス</a><br /> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436810/b77cdf01-e3c8-f3b4-6440-37640986c44e.png" alt="Geekle___エンジニア向けの技術書検索サイト.png" /></p> <h3 id="サービス概要"><a href="#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E6%A6%82%E8%A6%81">サービス概要</a></h3> <p>Geekleは、<strong>評価の高い技術書を検索できる</strong>サービスです。</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436810/c8b9a26b-86c0-4e4e-5a82-016182b53434.png" alt="Geekle全体.png" /></p> <p>例えば、「Pythonを勉強したい!どの書籍がいんだろうか!」ってなったときに「Python」というキーワード(キーワードはQiitaのタグにあるものに限定されます:サジェストで表示される)で検索すると、</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436810/f118bf6b-2d83-42d6-8bc2-74f776c50a79.png" alt="Geekle___エンジニア向けの技術書検索サイト.png" /></p> <p>その技術キーワードに対する「評価の高い書籍リスト」が検索結果として表示されます。検索結果の並びはQiitaでの言及記事数をはじめ、複数の要素から総合的に算出。</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436810/4954cc89-6397-45c6-840e-d513cb7ea4e1.png" alt="Pythonのおすすめ本568冊___Geekle.png" /></p> <p>学びたい技術がある時に購入候補となる書籍を絞り込むのに使えます!</p> <h2 id="開発の動機"><a href="#%E9%96%8B%E7%99%BA%E3%81%AE%E5%8B%95%E6%A9%9F">開発の動機</a></h2> <p>プログラミングを学習する中で、たくさんの書籍を購入してきました。</p> <p>そのときに候補となる本をピックアップして、一つずつ評判を確認し、本屋で立ち読みして買ってたので、「○○という技術を学ぼう→その技術の評判の良い技術書がすぐわかるサービスがあったらなー」と思っていました。</p> <p>Qiita上の書籍情報を見られるサービスはすでにいくつもありますが、既存のモノは「Qiita上の書籍情報を可視化すると面白い」というコンセプトであるため、キーワード(タグ)に対して関連性が薄い書籍も多く表示される仕様となっていました(それが書籍との偶発的な出会いになって面白いというコンセプト)。</p> <p>自分の希望は「今、学ぶのに適した書籍の候補」をストレートに見つけられるサービスだったので、関連性の薄い書籍はない方がよかったし、なるべく情報が新しい評価の高い書籍が表示されて欲しかった。</p> <p>そこで、自分の希望を実現したモノを作ってみました。</p> <h2 id="どう作ったか"><a href="#%E3%81%A9%E3%81%86%E4%BD%9C%E3%81%A3%E3%81%9F%E3%81%8B">どう作ったか</a></h2> <p>使った技術とか</p> <ul> <li>アプリ:Laravel + Vue.js</li> <li>バッチ(DB作成):生PHP</li> <li>インフラ:AWS(EC2・RDS・Rout53・ALB)</li> <li>制作期間:4ヶ月ちょっと</li> </ul> <p>裏側の仕組みをどう作ったのか解説します。</p> <p>自分なりに色々と考えて作りましたが、独学初心者なので生暖かく読んでください...。あと、「もっとこうすればいいのに!」とかあればアドバイスして頂けると嬉しいです。</p> <h3 id="書籍DBについて"><a href="#%E6%9B%B8%E7%B1%8DDB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">書籍DBについて</a></h3> <p>書籍のDBは、QiitaのAPIで記事データを取得して、書籍へのリンクらしきURLを解析し、そこから書籍の識別番号(ISBN・ASIN)を抽出後、番号を使ってopneBDやGoogleBookApiなどで書籍データを取得して構築しています。</p> <p>これらの方法は</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/jabba/items/edefda09121877b79760">技術書ランキングサイトをQiita記事の集計から作ったら、約4000冊の技術本がいい感じに並んだ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/Yuhsak/items/03967437b8a6438eb625">【個人開発】 技術書籍のレビューや「読みたい」を記録するサービスを作った</a></li> </ul> <p>の記事を参考にさせていただきました。</p> <p>独学の自分がサービス開発できたのはこういったノウハウが公開・共有されていたからです。先人の皆様ありがとうございます。僕もこの記事でやったことを共有します( ̄^ ̄)ゞ</p> <h3 id="書籍の順位付けを工夫"><a href="#%E6%9B%B8%E7%B1%8D%E3%81%AE%E9%A0%86%E4%BD%8D%E4%BB%98%E3%81%91%E3%82%92%E5%B7%A5%E5%A4%AB">書籍の順位付けを工夫</a></h3> <p>Qiitaの記事についているタグをそのまま書籍のタグとして、Qiitaで言及されている記事数をカウントすることでタグごとに書籍の順位づけを行っています。</p> <p>しかし、Qiitaの記事数のみで順位付けを行うと、普遍的な名著(リーダブルコードなど)が多くのタグで上位を独占してしまるというデメリットがありました。</p> <p>検索ワードが「PHP」でも「Ruby」でもリーダブルコードが一番上になってしまう。</p> <p>また、出版から時間が経過している書籍の方が言及される記事数が多く、新しい書籍は言及される記事数が少ないため、新しい良本が上位に表示できなかったり、PHPとLaravelのように「言語」と「フレームワーク」の検索結果がほぼ同じになるという問題点がありました。</p> <p>僕が作りたいのは「学習したい技術ごとに今選ぶべき良書がわかるサービス」だったため、なるべく情報の新しい良本が上位表示されて欲しいし、PHPなら生PHPの書籍が上位、LaravelならLaravelの書籍が上位という結果になって欲しかった。</p> <p>そこで、Qiitaの記事数に加えて</p> <p>・検索ワード(タグ)の文字が書籍のタイトルに含まれる場合はプラス点<br /> ・出版日時が古くなればなるほどマイナス点</p> <p>などを加えて傾斜配点をかける事で検索結果を調整しています。</p> <p>試行錯誤の結果、悪くない結果がでるようになりました。<br /> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436810/f5a9e246-bae2-76ae-62b9-a4f90cec3403.png" alt="PHPLaravel.png" /><br /> (言語とフレームワークも異なる検索結果になってる)</p> <p>今後も改良して精度を上げていきます。</p> <h3 id="デザインとか"><a href="#%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%A8%E3%81%8B">デザインとか</a></h3> <p>デザインは、最初にカラー(紫・黒・白)を決めました。</p> <p>柱となる色は紫をにしたのは、「プログラミングって現在の魔法っぽい→魔法は紫っぽい」という発想から。技術書を読んで勉強することを魔法を学んでる感じだと捉えると学習が楽しくなる気がします(中二心)。</p> <p>レイアウトは、たくさんのサービスを並べて特徴を抽象化し、取り入れていくというやり方で考えました。</p> <p>具体的に説明すると、書籍検索サービスは画像付きでコンテンツを表示するサービスになるよね→Amazonプライムビデオやネットフリックスなど画像付きでコンテンツを大量に並べてる有名サイトをいくつもみる→あ、横並びにしてスライドするUIがデフォルトっぽいなー(これが抽象化)→自分のサービスに取り入れるという流れ。</p> <p>「基本となっている型を探す」という感じ。</p> <h3 id="今後の改良/グロース"><a href="#%E4%BB%8A%E5%BE%8C%E3%81%AE%E6%94%B9%E8%89%AF%2F%E3%82%B0%E3%83%AD%E3%83%BC%E3%82%B9">今後の改良/グロース</a></h3> <p>やりたいことはたくさんあります。</p> <p>・SEOに強い構成にする<br /> ・SPA化<br /> ・レビューを集める仕組み構築<br /> ・技術書のセール情報の掲載</p> <p>などなど。自分の技術力向上やサービスグロースの実験の場としても使っていきたい。</p> <h3 id="振り返り"><a href="#%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A">振り返り</a></h3> <p>当初、2ヶ月くらいで作れるだろうと思っていたのですが、DBを作るのに時間がかかってしまい、想定の倍以上の時間がかかってしまいました。</p> <p>開発中はわからないことだらけで苦しい時もりましたが、やっぱりプログラミングは楽しいですね!今回のアプリ開発を通してエンジニアになりたいという気持ちがより強くなりました。</p> <p>もっともっと勉強して色々なアプリ作っていきたいです。</p> <p>ここまで読んでくれた方ありがとうございます!<br /> ぜひ試しに使ってみてください(≧∀≦)</p> <p><a target="_blank" rel="nofollow noopener" href="https://geekle.jp/">Geekle(ギークル) | 技術書検索サービス</a></p> Jin