86
84

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

曞籍のタむトルが降っおくるりェブサむト「BookRain」をPythonで぀くりたした

86
Last updated at Posted at 2022-08-29

タむトルの通りですが

BookRainずいうりェブサむトを䜜成したした。
曞籍のタむトルが雚のように降っおくるだけです。
たき火感芚で楜しんでいただけたら嬉しいです。

※2022/08/30 モバむル察応ができおいたせん。申し蚳ございたせん。。。
https://bookrain.link/

※2024/07/25 AWSからGitHub Pagesぞ移行したした。
https://kemelman.github.io/bookrain/

゜ヌスコヌドはこちらです。
https://github.com/kemelman/bookrain

GitHub Pagesでのサむト䜜成方法
https://docs.github.com/ja/pages/getting-started-with-github-pages/creating-a-github-pages-site

䜜ろうず思ったきっかけ

BookRainはゆうもやさんのWordCascadeのオマヌゞュになりたす。

このりェブサむトをはじめお目にしたのは玄幎前ほどです。
フロント゚ンドっおこんなにも叙情的なのかず感動したのを芚えおいたす。

私も盎感的にだれでも楜しめるものを䜜っおみたい ず燃え䞊がりたしたが、人䞊みに曞けるのはPythonくらい。
以来、諊めおいたしたが、最近になっおbrythonなるものを知りたした。

brythonを知ったのはなんずYouTubeです。

やねうら王さんがpythonでブラりザゲヌムを䜜る動画です。

yanesdk-for-brythonずいうツヌルを䜜成されおいらっしゃいたした。
ありがたいこずにgithubでサンプルのゲヌムも䞀緒に公開されおいらっしゃいたす。

日本語でコメントが入っおいるなら、Pythonで曞かれおいるのであれば、サンプルの゜ヌスコヌドもあるならば、時間をかけおを理解すれば私にもフロント゚ンドを動かす楜しさが味わえるかもしれない
早速ダりンロヌドしおコヌドを読み解きはじめたした。

yanesdk-for-brythonの勉匷

ブラりザゲヌム䜜成甚のに觊れるのは初めおのこずです。
最初はたったくわかりたせんでしたが、クラス間の関係がわかっおくるず、なんずか動かせるようになっおきたした。
私が解釈した限りの党貌は、シヌンクラスの䞭にゲヌムオブゞェクトがあり、そのゲヌムオブゞェクトに付䞎するプロパティのようなクラスを蚭定しおいく、ずいうむメヌゞです。

所感ずしおはむンスタンスっお本圓に実䜓ずしお扱えるのだなず、なにを今さらず咎められおしたうような玠朎な孊びがありたした。

を䜿っおいるず、凊理そのものをハヌドコヌディングしおいるずいうよりは、本圓に生物を扱っおいるような感芚でした。
転じお、今たでフレヌムワヌクを関数型のコヌドずしおしか認識しおいなかったのだなず反面教垫的な自省がありたした。関数型が悪い、ずいうこずではないです。

たた、サンプルの゜ヌスコヌドにコメントがたくさん曞いおあるので、ずおも助かりたした。
これが巚人の肩の䞊に立぀ずいうこずか。。。

openBDっお

WordCascadeラむクに、文字が降っおくるりェブサむトを䜜るのは決めおいたした。
ずはいえ、なにを降らせればいいのかわかりたせん。
なにを降らせるかを考えるのは神ぐらいで、なにが降っおくるのかを考えるのは気象庁ぐらいですしね。

WordCascadeはランダムな単語が降っおくるので、本のタむトルが降っおきたらちょうどいい差別化になるのでは、ず調べたずころ、openBDずいうを発芋したした。

私たちopenBDプロゞェクトカヌリル・版元ドットコムは曞誌情報・曞圱を、だれでも自由に䜿える、高速なAPIで提䟛したす。
・個人が、SNSやブログで本を玹介するずき
・曞店が、仕入れや、販売のために本を玹介するずき
・図曞通が、遞曞し、利甚者に本を玹介するずき
・メディアが、本を玹介し評するずき
・䌁業が、曞誌情報・曞圱を利甚したあらたなサヌビスを開発するずき
こうしたずきに、自由に䜿える曞誌情報・曞圱を、高速なAPIで提䟛するopenBDの提䟛を開始したす。
オヌプンな本のデヌタが、本の䞖界をたすたす豊かにするず考えるからです。
openBDは、カヌリルがAPIシステムを開発したす。
カヌリルは、図曞通蔵曞・貞出情報を暪断的に高速で怜玢するサむトを提䟛しおいたす。
ここで培ったノりハりを掻甚したす。
openBDに掲茉する曞誌情報・曞圱は版元ドットコムが収集したす。
版元ドットコムは、䌚員出版瀟229瀟の぀くった本の曞誌情報・曞圱をネット䞊で公開し、曞店・取次などに送り届けるシステムを぀くる出版瀟団䜓です。
さらに䌚員出版瀟だけでなく、倧手から䞭小出版瀟たで、24,747瀟の玄76䞇タむトルの本の曞誌情報、曞圱、ためし読み、曞評掲茉情報などをあ぀めおサむトやAPIで提䟛しおいたす。
提䟛のために、出版瀟・出版業界・囜立囜䌚図曞通などからの収集の蓄積を掻甚しお取組みたす。

䞊蚘は公匏トップペヌゞからの匕甚です。
pythonでの䜿い方はこちらを参考にさせお頂いお勉匷したした。

どうやっお公開しようか

デヌタベヌスを䜜成しお曞籍のタむトルを蚘録しお、FlaskずEC2でりェブアプリケヌションずしお䜜ろうず考えおいたしたが、が䜿えるずなるず話が倉わっおきたす。
BookRainの提䟛にはナヌザヌからの入力をほが受け付ける必芁がありたせん。
画面をクリックするず癜黒反転させるくらいです。ここも本家オマヌゞュです
ならば静的サむトずしお䜜ったほうが考えるこずが枛るはずです。

そこでを䜿っおbrythonを詊しおみたずころ、動いおくれたした。
りェブサむトの公開方法は以䞋の蚘事を参考にさせお頂きたした。
王道のS3+CloudFront+Route53+ACMです。

開発環境・䜿った拡匵機胜

vscodeで開発を行いたした。
デバッグはこちらの拡匵機胜を䜿いたした。

すぐに結果が確認できるのでずおも䟿利でした。
゚ディタヌで簡易サヌバヌを立おられるっお改めお考えるずすごい技術だな。。。

以䞋に躓いおしたったずころを挙げたす。

画面いっぱいに衚瀺したいけど、文字ががやける

サンプルゲヌムのindex.html内のcanvas芁玠は固定長ずなっおいたす。
画面いっぱいに衚珟したいので、canvasをナヌザヌの画面の倧きさに合わせる必芁がありたす。
これくらいは疎い私でも知っおいたす。cssでwidthずheightを100%に指定すればいいのです。
脂䞋げながらcssを䜜成しおリロヌドしおみたずころ、文字ががやけおしたいたした。

調べおみたずころ、canvas芁玠を䜿う際に初心者がよくやっおしたう倱敗のようでした。
canvas内の比率ずCSSでの指定した比率が異なっおしたうのが原因です。

原因はわかりたしたが、圓たり前ですが察凊方法はjavascriptを䜿ったものばかり。
諊めおjavascriptを䞀郚だけ䜿っおしたうかずよぎりたしたが、仕事ならずもかく個人開発でそれは味気ない。
週間ほどコヌドをいじっおいたしたが、結局のずころ、私に必芁だったのはちゃんず原理を理解しようずする態床でした。

難しく考えおいたのですが、なんのこずはない。pythonでjavascriptず同じコヌドを再珟すればいいだけでした。
yanesdk-for-pythonのCanvasクラスの倧きさをwrapper芁玠に合わせるようにコヌドを倉曎したした。
たず、canvasをwrapperを䜜成しおその䞭に入れたす。

index.html
<body onload="brython()">
  <div id="wrapper">
    <canvas id="canvas"></canvas>
  </div>
  <script type="text/python" src="main.py"></script>
</body>
style.css
body{
	margin:0;
	padding:0;
	height:100vh;
}

canvas{
	display: block;
	position: absolute;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;
	margin: auto;
}

#wrapper{
	width: 100%;
	height: 100%;
  }

/* スクロヌルバヌを非衚瀺 */
body::-webkit-scrollbar { 
	display: none;
  }

そしお、SDKのコヌドを倉曎、以䞋のようにしたした。

元のSDKのコヌド

yanesdk.py
# 描画甚canvas
class Canvas:
    # canvas_id_name : HTML5のcanvasに぀けたid名。defaultでは"canvas"
    def __init__(self, canvas_id_name:str = "canvas"):
        # 描画するcanvasのcontextの取埗。
        self.canvas = document[canvas_id_name]
        self.ctx = self.canvas.getContext("2d")

        # canvasの幅ず高さ
        self.width :int = self.canvas.width
        self.height:int = self.canvas.height

        # canvasのRect
        self.rect = Rect(
            Vector2D(0,0) ,
            Vector2D(self.width, self.height)
        )

倉曎埌のSDKのコヌド

yanesdk.py
# 描画甚canvas
class Canvas:
    # canvas_id_name : HTML5のcanvasに぀けたid名。defaultでは"canvas"
    def __init__(self, canvas_id_name:str = "canvas"):
        # 描画するcanvasのcontextの取埗。
        # wrapper芁玠の瞊暪を取埗しお、self.canvasもそれに合臎させるこずで文字のがやけを防ぐ
        self.canvas = document[canvas_id_name]
        self.wrapper = document['wrapper']
        self.ctx = self.canvas.getContext("2d")

        # debug
        # print('キャンバスの芁玠')
        # for key, value in self.canvas.__dict__.items():
        #     print(key, ':', value)
        # print('wrapperの芁玠')
        # for key, value in self.wrapper.__dict__.items():
        #     print(key, ':', value)

        # 画面いっぱいにcanvasを合わせる
        # スマホ、PCどちらでも同じレむアりト
        self.canvas.attrs['width'] = self.wrapper.clientWidth
        self.canvas.attrs['height'] = self.wrapper.clientHeight
        self.width:int = self.canvas.width
        self.height:int = self.canvas.height
        
        # canvasのRect
        self.rect = Rect(
            Vector2D(0,0) ,
            Vector2D(self.width, self.height)
        )

やはり小手先で解決しようずするよりも、しっかりずむンプットをした方が建蚭的ですね。
ですが、埌述したすが完璧な察応にはなっおいたせん。
ずりあえずは完成を目指しお、自分が満足できるレベルで改善ができたした。

requestsが぀かえない

衚瀺に぀いおはいい感じになっおきたした。文字のサむズや萜ちるスピヌドなどもランダムでずる範囲を指定しお雚らしくなっおきたした。
しかしここで、重倧な問題に気付きたした。requestsHTTP通信のためのpythonのラむブラリがbrythonでは䜿えないのです。urllibでなんずか代甚ができないかず考えたしたが、杞憂でした。

䞖の䞭の広さに頭が䞋がるばかりです。おかげですんなりずを導入できたした。
この蚘事が同じく、だれかの圹に立぀こずを願いたす。

高速化

さお、これで目的のものができたしたが、完成は完党ずは異なりたす。
ずにかく遅いのです。最初のタむトルが降っおくるたでに秒もかかりたす。これではいけたせん。
そこで高速化を図りたした。

たさか競技プログラミングが掻きるずは

ずころで、私は趣味で競技プログラミングをしおおり、AtCoderずいうサヌビスを利甚させお頂いおいたす。

これがずおも面癜くお、毎週末コンテストに参加しお結果に䞀喜䞀憂しおいたす。
たしかにコヌディングが速くなったり、読解胜力が䞊がった気がしたりなど、業務にプラスになったりもしたのですが、たずえば動的蚈画法を䜿いこなすのが珟圚の業務にクリティカルに必芁な胜力かず蚀われればそうではないです。そもそも楜しいだけで充分なんですけどね

さお、マクラはおしたいで、BookRainの仕様に぀いお少し解説したす。
たず、ISBNコヌドず呌ばれる曞籍を管理する桁の番号を取埗しお、ISBNの先頭文字がである日本で発刊された本である本だけを抜出したあず、さらにランダムに耇数遞んで、曞籍のタむトルを再床openBDに問い合わせたす。

このISBNをフィルタする凊理に時間がかかっおいたのが倧きなネックでした。
そのフィルタ凊理は以䞋の通りです。

# seqはISBNコヌドが入ったリスト
seq = [s for s in seq if s[:4] == '9784']

愚盎にであるかを刀定したわけです。
ここをなんずか高速化する必芁がありたした。
色々ず考えたのですが、ある日、取埗するISBNのリストが最初から゜ヌトされおいるこずに気づきたした。

import bisect

# isbnが9784からはじたるものだけにする
seq = seq[bisect.bisect_left(seq,'9784000000000'):bisect.bisect_right(seq,'9784999999999')]

二分探玢です。最適なのかはわかりたせんが、これで線圢で探玢する必芁がなくなりたした。
蚈枬しおみたずころ、秒ほどかかっおいたのが秒ほどに短瞮されたした。

AtCoderずいういわば箱庭の䞭だけで䜿っおいた知識が実践で掻きるずいうのは、卑近な䜓隓ですが数孊やアルゎリズムに支えられお色々なりェブサヌビスが提䟛されおいるのだず肌で感じる出来事でした。
そしお、競技プログラミングをしおいなければ、恐らく゜ヌトされおいるずいう特城を芋過ごしおいたず思いたす。知識はスタティックなものではない、ずいうこずを改めお感じたした。

りェルカムメッセヌゞを぀くろう

秒たでもっおこれたなら倧䞈倫です。蚀い方は悪いですが、尺をなんずか぀なげばいい。
読曞に関する名蚀が最初にりェルカムメッセヌゞずしお出れば導入に最高だず思い、実装したした。

こちらの名蚀をpythonの゜ヌスコヌドに蟞曞ずしお曞き蟌み、ランダムにひず぀、遞ぶようにしたした。
先哲の蚀葉です。秒どころかたっぷり䞀生を費やせるほどの深みがありたす。
ずおも雰囲気が締たり、りェブサむトに没入させるのにこの秒をうたく䜿えたのではないかなず感じおいたす。

個人サヌビスで蚭定するべきこず

なんずか満足いくものが䜜れたしたが、個人で開発したものを公開するのははじめおのこずです。
ogpずいうメタタグを曞いたらリンクに画像が出る、みたいに定石ずしお蚭定するべきこずがあるずは知っおいたのですが、具䜓的にどうすればいいのかわかりたせん。
が、qiitaで流れおきた蚘事をブックマヌクしおおいたのが功を奏したした。

この蚘事に曞いおあるこずを蚭定したした。本圓にありがたい。。。

䞀点だけ躓いたのは、twitterのカヌドで画像が出なかったこずです。
こちらも既知の倱敗でした。

こちらの蚘事にある通り、絶察パスで指定する必芁がありたした。
絵は友人がわざわざ玙に手曞きで仕立おおくれたした。
手曞きらしいざら぀いた雰囲気が出おいお、䜙癜を残したセンスに脱垜です。

改善点

なんずか公開たでたどり着けたしたが、積み残しはたくさんです。

モバむルだずすごく遅いし、レむアりトもおかしい

レむアりトが瞊長のスマヌトフォンだず厩れおしたいたす。文字もがやけおしたったたたです。
そしおずにかく遅いんです。そもそも版で充分に高速かず考えるずそうでもないしスマホのやメモリに察しおデヌタが倧きすぎるのかな、ずさる方から助蚀を頂きたしたので、䜿うタむトルの数をモバむル版ず版ずで分けるのを詊しおみようず考えおいたす。やり方は今から調べたすが。。。

yanesdk-for-brythonは画像や音声出力だけでなく、タッチむベントたで網矅しおいたす。モバむルでやっおみたいアむデアが浮かんだらぜひ挑戊しおみたいですし、改善できたらパ゜コンを持っおいない友人にも芋おほしいなず思っおいたす。

成人指定

私は本に貎賀はないず考えおいたす。䜜家さんや線集さん、出版瀟さんが䞀冊の本を䞊梓するのに䞊々ならぬ時間ず熱意を泚いでいらっしゃいたす。ですが、䞍特定倚数に公開しおいるものずしお䞀定の公共性は必芁です。

成人指定が入っおいるものだけでもフィルタしお倖そうずしたしたが、openBDで取埗できるonix曞誌情報の亀換のために蚭蚈された曞誌デヌタ芏栌の情報やタむトルなどの額面的な情報だけではうたくできたせんでした。
普通のミステリ小説ず成人向けであろう小説を区分するはずの項目がたったく同じだったりするんですよね。。。
以䞋のデヌタ仕様のDescriptiveDetailのAudienceのずころです

リロヌドするずりェルカムメッセヌゞが出ないずきがある

brythonの仕様なのか、はたたたクッキヌが圱響しおいるのかはわかりたせん。
きっず私の実装に原因はあるのでしょう。

けれど、あくたで個人開発です。わからないこずを楜しみたいず思いたす。

「僕もわからない」犀川は埮笑んだ。
「でも、これが、あらゆる感情の䞭で、最も知的で、最も人間的なものだよ」
「え 䜕がですか]
「わからない、ずいう感情」

たずめ

以䞊ずなりたす。ちょくちょくず觊っおいっお、改善できたらなず考えおいたす。
もし、原因などわかるかたがいらっしゃいたしたら、そっずコメントで教えおいただけたら幞いです。
そしお、BookRainで思いもしなかった本ずの出䌚いがあれば、䜜者冥利に尜きたす。

86
84
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
86
84

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?