Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
pixivコミックで作品が公開されるってどういうこと?
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
imadoki
October 05, 2023
Programming
1.6k
1
Share
pixivコミックで作品が公開されるってどういうこと?
PIXIV MEETUP2023のLTで発表した際の資料です
imadoki
October 05, 2023
More Decks by imadoki
See All by imadoki
Multiple Databasesを用いて2つのRailsプロジェクトを統合する
imadoki
1
1.9k
Other Decks in Programming
See All in Programming
要はバランスからの卒業 #yumemi_grow
kajitack
0
200
Moments When Things Go Wrong
aurimas
3
120
Claspは野良GASの夢をみるか
takter00
0
130
The Arts and Crafts of Work in the AI Era — Toward Mastery in Software Development
kuranuki
1
630
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
170
ReactとSvelteのその先、Ripple-TS / Beyond React and Svelte: Ripple-TS
ssssota
3
1.3k
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
2.9k
OCRを使ってゲームのアイテムをデータ化する
kishikawakatsumi
0
120
Technical Debt: Understanding it Rightly, Engaging it Rightly #LaravelLiveJP
shogogg
0
160
AIエージェントと協働するCLI開発 — BunとOpenClawで学んだこと
yoshikouki
1
220
inferと仲良くなる10分間
ryokatsuse
1
260
自動レビューエンジンの実装と運用 ~レビューのない世界へ~
kurukuru1999
2
280
Featured
See All Featured
Designing for Performance
lara
611
70k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
180
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
270
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
450
First, design no harm
axbom
PRO
2
1.2k
The Language of Interfaces
destraynor
162
26k
The agentic SEO stack - context over prompts
schlessera
0
790
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
580
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
It's Worth the Effort
3n
188
29k
Transcript
pixiv Inc. pixivコミックで作品が公開 されるってどういうこと? @ikumin
Profile ikumin エンジニア 2016年入社 コミック事業部 pixivコミック部 業務では主にバックエンドを担当し ていてRailsを書いています
• 2012年から始まったマンガ サービス • ブラウザ/Android/iOS • 商業作品の連載 • 電子書籍の販売 •
pixivに投稿された作品の閲覧
• 期間中、無料で何度も読める • 購入すると読める 連載エピソードの形態
エピソードの公開設定
基本のデータ
エピソードの公開設定 • 公開期間 • 種類 • (種類によっては)価格
エピソードの公開設定 # 公開設定 class PublishingSetting < ApplicationRecord ## typeによってどの公開設定化を判別する def
free? type == 'PublishingSetting::Free' end def sell? type == 'PublishingSetting::Sell' end end
全話開放キャンペーン
公開中のエピソードを取得するには • 各種公開フラグがONかどうか? • 期間内の公開設定はあるか? • 全話開放キャンペーン対象かどうか? を確認する必要がある
普通にやってみる SELECT `stories`.* FROM `stories` INNER JOIN `works` `work` ON
`work`.`id` = `stories`.`work_id` INNER JOIN `magazines` `magazine` ON `magazine`.`id` = `work`.`magazine_id` INNER JOIN `publish_all_story_campaign_works` ON `publish_all_story_campaign_works`.`work_id` = `work`.`id` INNER JOIN `publishing_settings` ON `publishing_settings`.`story_id` = `stories`.`id` WHERE `work`.`is_public` = 1 AND `magazine`.`is_public` = 1 AND ( (`publishing_settings`.`start_at` <= :now) AND (`publishing_settings`.`finish_at` < :now OR `publishing_settings`.`finish_at` IS NULL) OR `publish_all_story_campaigns`.`approved` = 1 )
他にも… • レーティングの問題でアプリでは表示できない作品がある • 販売中のエピソードをは購入しなければ読めない • 公開中の作品の最新話を取得したい • 最新話の公開日順に作品を並べ替えたい
• 公開中のエピソードへの関連と 最新話の公開日を持つキャッ シュ代わりのテーブルを用意 • 毎日12時に更新 キャッシュテーブルの用意
• 一括で取得した情報をモデルのインスタンスに紐づけて くれるgem • https://github.com/walf443/bulk_loader BulkLoaderの利用
購入情報を一括で取得する class Story < ApplicationRecord #... bulk_loader, :purchased? do |ids,
user_id| next {} if user_id.nil? # APIで購入の有無を問い合わせ purchased_story_ids = Store::App::OrderedEpisodes.get(user_id, ids) # {id => purchased?} という形式のHashに変換 ids.index_with {|id| purchased_story_ids.include?(id) } end end
購入情報を一括で取得する # ログインユーザーがstoriesを購入しているかどうかを調べる Story.bulk_loader.load(:purchased?, stories, current_user) stories.each do |story| story.purchased?
# bulk_loaderでAPIから取得したエピソードごとの購入 有無を引ける end
• エピソードが購入済みか • エピソードが無料公開中か • エピソードが販売中か • 作品が全話開放キャンペーン中か これを利用して
まとめ • 複雑な要件に対応するため、いろんなところに公開に関 わるデータが散らばっている • 複数のテーブルに絡んだ条件をキャッシュして緩和 • BulkLoaderを使ってデータの取得を簡便化
ご清聴ありがとうござい ました!