電書部技術班,電子書籍配信サーバーに挑む

第3回 文学フリマ版電書サーバーの考え方,構成,運用

この記事を読むのに必要な時間:およそ 2.5 分

文学フリマ版電書サーバー

前回述べたように,ホストをGoogle App ServerからHerokuに移行し,Heroku移行後はさまざまな要望に応じて機能を追加しました。今回は,文学フリマ版電書サーバーでは,どのような考えで新機能を追加していったのかを解説します。

sinatraによるアプリ開発

sinatraはDSLによるWebプログラミングを可能にするライブラリです。Ruby on Railsに比較すると,小フットプリント,軽量,シンプルなプログラミングなどが特徴です。

例えば,⁠ドキュメントルートにアクセスがあればindex.erbを表示する」という場合は,以下のように記述します。

sinatraのDSL

get '/' do
    erb :index
end

getがDSLです。Railsでいうroutesとコントローラが一体になった感じですね。ただし,Railsにあるような,ActiveRecordからFormHelperまできれいに連携するような機能はありません。

また,電書サーバーを構築した経験から言えば,十画面ぐらいまでのWebアプリではsinatraのシンプルさが生きます。これを越えた場合は,全体の構造を把握するのが難しくなってくるため,Railsなどに移行を考えるべきでしょう。

販売画面

図1 文学フリマ版電書サーバーの販売画面

図1 文学フリマ版電書サーバーの販売画面

認証

販売画面のURLが広まってしまうと,自由に電書をダウンロードされてしまいます。そこで簡単な認証を導入しました。サイトを使うのは電書部のメンバーだけなので,あまり凝った仕掛けは必要ありません。sinatraのBASIC認証プラグインsinatra-authorization gemを使いました。インストールして,以下の2つのメソッドを定義しします。

追加するメソッド

def authorize(login, password)
    login == "name" && password == "passwd"
end
def authorization_realm 
   'Densho Baiten'
end

authorizeメソッドでは,有効なidとパスワードの組み合わせでtrueが返るようにします。あとは認証が必要なところに「login_required」を記述するだけでBASIC認証が使えるようになります。

認証付き画面

get '/' do 
    login_required
    erb :index 
end 

合計金額表示

電書を選択中に合計金額を表示するにはJavaScriptを使っています。実際の販売では,注文をきき,電書を選び(ここで合計を表示)⁠価格を告げ,サーバーに注文を送り,お金をもらう,という流れになっていたようです。

まとめ買い

さらに販促のツールとして「まとめ買い」を導入しました。⁠まとめ買い」は,一度に10冊以上購入すると電書が一冊100円になるというものです。割引ではなく一冊100円なのは,電書の作者のみなさんへのお金の分配を簡単にするためです。

まとめ買いは,経済的に得するのはもちろんですが,⁠何冊買ってもかさばらないし,重くもない」という電子書籍の特徴をフルに生かしたサービスになっていることに,後から気づきました。まとめて全部購入された方は非常に多かったです。文学フリマ当日は雨模様でしたからなおさらです。

電書ナンバー

図2 電書ナンバー登録画面

図2 電書ナンバー登録画面

前回も触れた販売シミュレーションで判明した,メールアドレス入力時のトラブル(入力ミスや手間)の対策として,⁠電書ナンバー」を導入しました。そして,あらかじめ誰でもアクセスできる電書ナンバー画面を用意しました。ここでメールアドレスを入力してもらい,1~3桁の数字を発行します。これがメールアドレスの代わりになります。

販売画面では,電書ナンバーからメールアドレスをひく機能を追加したので,メールアドレスの代わりに電書ナンバーですむようになりました。ただ,電書ナンバーを活用するには,前もって登録してもらう必要があるので,事前の広報活動が重要になります。

メアド埋め込み

電書の注文がサーバーに送信されると,電書のマスターデータを取り出して,購入者のメールアドレスを埋め込み,購入者用の電書を生成します。heroku上にはファイルは置けないため,電書には一意のIDを割り振って,AmazonのストレージサービスであるS3に保存しています。

メール送信

前回述べたように,メール送信にはSendgridをつかっています。Sendgridはプラグインで,free,pro,premiumの3つのバージョンがあり,違いは送信できる通数と料金です。herokuコマンドで簡単に切り替えられるため,開発中はfree(無料のfreeでも200通/日まで送信できます)⁠本番ではproを使いました。同じ設定がすべてのバージョンで使え,freeからproに切り替えても設定を変える必要がないことを重要視しました。本番でトラブルは困りますから。

ダウンロード

販売した電書はAmazon S3に保存されています。S3から直接ダウンロードするようにした場合,そのURLが広まれば誰でもダウンロードできてしまいます。そこで,一度電書サーバー側でリクエストを受けて,電書サーバーがS3からダウンロード,そのデータをレスポンスとして返すようにしています。

この方法の利点は,ダウンロード期間や回数を電書サーバーで管理できることです。

ダウンロードのURL

ダウンロードのURLは購入者毎に異なります。しかし,⁠http://densho.heroku.com/dl/epub/1/sample_book」のように単純に数字のidで区別すると,id部分だけ書き換えて他の人の電書がダウンロードされてしまうかもしれません。これを防ぐため,数値ではなくランダムな英数字を含めるようにしています。URLは「http://densho.heroku.com/dl/epub/5CBV7N/sample_book」のようになります。

著者プロフィール

松永肇一(まつながけいいち)

株式会社ライフメディア 開発部マネージャ。東京都出身。"GNU for Towns"のためにリチャード・ストールマンに会いにいったり,ビル・アトキンソンとアンディ・ハーツフェルドの開発した"MagicCap"の日本語化を担当したり,よく分からない仕事を経て現在はWebアプリのエンジニア。Rubyon Rails(ときどきSinatra)を使って開発する毎日。スマートフォンアプリのレビューとランキングサイトであるスマートワールドでは電子書籍レビューも担当中。Twitterはma2

コメント

コメントの記入