36
Sinatra TwitterBootstrap MongoDB で書籍管理Webシステム 13819日月曜日

社内勉強会 - 書籍管理Webシステム

Embed Size (px)

DESCRIPTION

社内勉強会用資料

Citation preview

Page 1: 社内勉強会 - 書籍管理Webシステム

SinatraTwitterBootstrapMongoDB

で書籍管理Webシステム

13年8月19日月曜日

Page 2: 社内勉強会 - 書籍管理Webシステム

書籍管理システム

• 所持している書籍を管理

• 借りたい本・欲しい本を共有

• 誰がどのスキルを有しているか共有

13年8月19日月曜日

Page 3: 社内勉強会 - 書籍管理Webシステム

ベース技術

• Sinatra

• Twitter Bootstrap

• MongoDB

13年8月19日月曜日

Page 4: 社内勉強会 - 書籍管理Webシステム

Sinatra

• Ruby製Webフレームワーク

• MCモデル

• ちょー簡単

• 第1回で発表

13年8月19日月曜日

Page 5: 社内勉強会 - 書籍管理Webシステム

Hello World

require ‘sinatra’

get ‘/’ do

p ‘Hello World!’

end

13年8月19日月曜日

Page 6: 社内勉強会 - 書籍管理Webシステム

Ruby : Web Server

• WEBrick

• Mongrel -> thin (<= Heroku推奨)

• Phusion Passenger (Standalone)

• Unicorn

old

new

13年8月19日月曜日

Page 7: 社内勉強会 - 書籍管理Webシステム

WSGI -> Rack

FW

server

FW

server

FW

server

13年8月19日月曜日

Page 8: 社内勉強会 - 書籍管理Webシステム

WSGI -> Rack

FW

server

FW

server

FW

server

WSGI

13年8月19日月曜日

Page 9: 社内勉強会 - 書籍管理Webシステム

Rack実装class App def call(env) case env[‘REQUEST_METHOD’] when ‘GET’ [ 200, { ‘Content-Type’ => ‘text/html’ }, [‘<html><head></head><body>hello</body></html>] ] end

endend

引数を1つ持つcallメソッドを実装

•ステータスコード•レスポンスヘッダ(Hash)

•レスポンスボディ(Array)

を返す

13年8月19日月曜日

Page 10: 社内勉強会 - 書籍管理Webシステム

Rackup

require ‘app.rb’run App.new

$ROOT

- app.rb

- config.ru

$> rackup config.ru

13年8月19日月曜日

Page 11: 社内勉強会 - 書籍管理Webシステム

Twitter Bootstrap

• 簡単に綺麗なWebサイトが作れる

• Bootstrap 3 RC 1

• レスポンシブデザイン強化

• 後方互換なし

• 没個性

13年8月19日月曜日

Page 12: 社内勉強会 - 書籍管理Webシステム

サンプル

13年8月19日月曜日

Page 13: 社内勉強会 - 書籍管理Webシステム

ドキュメント

13年8月19日月曜日

Page 14: 社内勉強会 - 書籍管理Webシステム

MongoDB

• NoSQL

• Not Only SQL != RDBMS

• MongoDBはドキュメント指向型

• JSON形式でデータを保存

• スキーマレス

13年8月19日月曜日

Page 15: 社内勉強会 - 書籍管理Webシステム

NoSQL

• Key-Value型

• Redis / Riak / Memcached

• ドキュメント指向型

• MongoDB / CouchDB

• カラム指向型

• HBase / Cassandra

13年8月19日月曜日

Page 16: 社内勉強会 - 書籍管理Webシステム

✕ テーブル◯ コレクション

{ "_id" : ObjectId("47cc67093475..."), "username" : "bob", "address" : { "street" : "123 Main Street", "city" : "Springfield", "state" : "NY" } }

> db.users.find({"address.state" : "NY"})

User collection

13年8月19日月曜日

Page 17: 社内勉強会 - 書籍管理Webシステム

ROADMAP

13年8月19日月曜日

Page 18: 社内勉強会 - 書籍管理Webシステム

開発の流れ

• サンプルHTML作成

• Sinatraで静的Webシステム化

• MongoDB連携

• Amazonとの連携

13年8月19日月曜日

Page 19: 社内勉強会 - 書籍管理Webシステム

サンプルHTML作成

• Bootstrapのサンプルをベースに

• 大まかなレイアウトを決めるレベル

13年8月19日月曜日

Page 20: 社内勉強会 - 書籍管理Webシステム

上部メニュー

サイドメニュー

メインコンテンツ

アクティビティ欲しいなぁ…

(RSS配信してみたい)

メインはこんな感じで表示?

とりあえず実装が楽なASIN使って登録する形で。

13年8月19日月曜日

Page 21: 社内勉強会 - 書籍管理Webシステム

静的Webシステム化

• Sinatra使って表示

• Webシステムの雛形を作るレベル

• bundler

• haml

• layout.haml

• git

13年8月19日月曜日

Page 22: 社内勉強会 - 書籍管理Webシステム

layout.haml %html

%head

%body

= yield

index.haml %h1

Hello World!

app.rb require ‘sinatra’

get ‘/’ do

haml :index

end

<html>

<head>

</head>

<body>

<h1>

Hello World!

</h1>

</body>

</html>

13年8月19日月曜日

Page 23: 社内勉強会 - 書籍管理Webシステム

DB連携• mongoid

• Object Document Mapper

• mongoid3の情報が少ない…

• 画像保存方法• Base64文字列として保存

• 文字列として画像表示

class Book include MongoID::Document

field :title, type: String field :author, type: String field :asin validates_uniqueness_of :asinend

13年8月19日月曜日

Page 24: 社内勉強会 - 書籍管理Webシステム

Base64

• Base64エンコード

CGI.escape(Base64.encode64(open(‘hoge.jpg’).read))

• 表示

<img src=”data:image/png;base64,IVFHODIUEE....”/>

13年8月19日月曜日

Page 25: 社内勉強会 - 書籍管理Webシステム

Amazon連携• 書籍情報をAmazonから取得

• gem ‘amazon-ecs’

• ASINコードベース

• Amazon Product Advertising API

• AWSアカウント

• Amazonアソシエイトアカウント

13年8月19日月曜日

Page 26: 社内勉強会 - 書籍管理Webシステム

デプロイ

• heroku

• vagrant / chef

13年8月19日月曜日

Page 27: 社内勉強会 - 書籍管理Webシステム

heroku

• RubyのPaaS

• 最近Javaも行けるらしい

• gitでデプロイ

• heroku toolbeltでコマンド操作

• 公式からダウンロード推奨

13年8月19日月曜日

Page 28: 社内勉強会 - 書籍管理Webシステム

herokuでハマる①

• カレントディレクトリがロードパスに含まれない

• ✕ require ‘app.rb’

• ◯ require ‘./app.rb’

13年8月19日月曜日

Page 29: 社内勉強会 - 書籍管理Webシステム

herokuでハマる②

• sinatra/reloader

• sinatra/reloaderはdev環境でのみ動くようにすべきらしい

require ‘sinatra/reloader’ if development?

configure :development do Bundler.require :development register Sinatra::Reloaderend

13年8月19日月曜日

Page 30: 社内勉強会 - 書籍管理Webシステム

herokuでハマる③• Webrick -> thin

• config.ru

• Procfile(foreman)

• modular style -> classic style

web: bundler exec config.ru -p $PORT

class App < Sinatra::Base get ‘/’ do

‘hello world’ end

end

get ‘/’ do ‘hello world’

end

• なぜかmodularだとforeman動かない…

13年8月19日月曜日

Page 31: 社内勉強会 - 書籍管理Webシステム

でけた

http://blooming-inlet-2675.herokuapp.com/index

13年8月19日月曜日

Page 32: 社内勉強会 - 書籍管理Webシステム

vagrant/chef

• 時間が…

13年8月19日月曜日

Page 33: 社内勉強会 - 書籍管理Webシステム

今後

• ログインシステム

• セション管理

• Chefレシピ

13年8月19日月曜日

Page 34: 社内勉強会 - 書籍管理Webシステム

読む

13年8月19日月曜日

Page 35: 社内勉強会 - 書籍管理Webシステム

まとめ• 色々触ってみるの大事

• 便利なものは広まる(Rack / gem)

• だるいのがどこか分かる(heroku logs)

• Google先生は偉大

• Shut the fuck up, write some code.

13年8月19日月曜日