web技術勉強会 第33回

38
Web技術勉強会 第33回 Web application by Sinatra+iPhone Ryuichi TANAKA.

Upload: ryuichi-tanaka

Post on 12-Nov-2014

1.715 views

Category:

Technology


2 download

DESCRIPTION

Web技術勉強会 第33回

TRANSCRIPT

Page 1: Web技術勉強会 第33回

Web技術勉強会 第33回Web application by Sinatra+iPhone

Ryuichi TANAKA.

Page 2: Web技術勉強会 第33回

Thema.

何かアプリケーションが作りたい最近は迷走気味…。

iPhoneを買ったので、使いたいでもiPhoneアプリは作らない

新しい技術テーマを取り入れたいJavaかRuby?

Page 3: Web技術勉強会 第33回

Thema!

何かアプリケーションが作りたい

自分で買ったもの(本とかCDとか)を管理するアプリ 

iPhoneを買ったので、使いたい

バーコード(1次元)を撮ると買ったもの(JANコード)を取得できるアプリ発見。しかもHTTP経由で送信可能。

Page 4: Web技術勉強会 第33回

Thema!

新しい技術テーマを取り入れたい

今のお気に入りである「Ruby」か「Java」で作りたい。Ruby

RailsかSinatra、ある程度自前でRubyをしっかり書きたい。

JavaWicket+Maven。フレームワークを使いたい。

Page 5: Web技術勉強会 第33回

QuickMark

iPhoneで撮影したバーコードを管理

「QuickMark」台湾製iPhoneアプリ有料版のほうが機能が豊富3GSでないとオートフォーカスがうまくいかない撮影したバーコードをHTTP GETで送信できる

Page 6: Web技術勉強会 第33回

MediaMarker

http://mediamarker.net/QuickMarkと連携可能。書籍などの情報を登録できる。というか、作りたいものはこのシステムが全てやってる気が…。…否!

Page 7: Web技術勉強会 第33回

Do it myself

自分でないと実現できないこともある管理するデータ定義I/Fなによりスキルアップ

「すでにあるからやらない」ではだめ商用ではなく趣味なのだからOKそれを考えると動けないそれでも少しはオリジナリティを出すべき

Page 8: Web技術勉強会 第33回

Technical Themaでは、何で作るか。

言語候補PHP

何度となく使用してきた経験あり。ある程度規模が大きくても平気。

Perl頻繁に使用。ただ、規模が大きくなると不安。

Java最近使ってる。ちゃんとしたWebアプリ未経験。

RubyRailsのみ。Ruby自身はほとんど経験なし。

Page 9: Web技術勉強会 第33回

Technical Themaでは、何で作るか。

言語候補PHP

何度となく使用してきた経験あり。ある程度規模が大きくても平気。

Perl頻繁に使用。ただ、規模が大きくなると不安。

Java最近使ってる。ちゃんとしたWebアプリ未経験。

RubyRailsのみ。Ruby自身はほとんど経験なし。

これに決定!

Page 10: Web技術勉強会 第33回

Choice Reason

コードが短く書けるPerl or Ruby (not Java、PHP?)

ライブラリが豊富Perl or Ruby (or Java with Maven) (not PHP)

学ぶ要素が多い(未知のことが多い)Ruby or Java (or Perl with PSGI, Plack)

フレームワークがあるRuby(Rails,Sinatra) or Java(Wicket(not Struts)) or PHP(CakePHP, Rhaco) (not Perl(Catalyst))

Page 11: Web技術勉強会 第33回

System Summary

きわめてシンプル

Page 12: Web技術勉強会 第33回

Technical Effort

今回はシステムの目新しさより技術的に新しいことを取り入れることを重視

設計(拡張MVC)共通化と依存性の排除各レイヤでの明確な役割分担

Page 13: Web技術勉強会 第33回

Past Failure

これまで作ってきたシステムの設計上の問題点

役割分担(MVC)があいまい(除くRails)各機能の依存度が高い異常系の作りこみが甘い

今回はこれを出来る限りなんとかしたい。これを全てRubyだけで実装する縛り

Page 14: Web技術勉強会 第33回

System Design

システムは「登録部」と「表示部」に分ける登録部:iPhoneから送信したバーコードの商品をServerに保存表示部:登録部で保存した商品を表示するポータル

Page 15: Web技術勉強会 第33回

System Design

システムは「登録部」と「表示部」に分ける登録部:iPhoneから送信したバーコードの商品をServerに保存表示部:登録部で保存した商品を表示するポータル

今回は「登録部」について

Page 16: Web技術勉強会 第33回

Sinatra

登録部にはSinatraを採用登録部は機能がシンプルでUIを作りこむ必要がないため、Railsでは手に余る。

自分で設計できるMVCなどを自分でやる必要があるその分自由度は高いRubyをがりがり書く必要があるためスキルアップにはもってこい 

Page 17: Web技術勉強会 第33回

What's "Sinatra"?

Sinatra はRubyで下記のような最小労力で手早くウェブアプリケーションを作成するためのDSL

http://www.sinatrarb.com/intro-jp.html

require 'rubygems'require 'sinatra'get '/' do'Hello world!'end

Page 18: Web技術勉強会 第33回

Sinatra's Feature

MVCのような階層定義はない自分でつくるしかないRailsのような決め事はない。規模が大きくなると設計をしっかりやらないと厳しい

Railsよりはるかに簡単Railsは覚えることがとにかく多いがSinatraはほとんどない。Rubyの習得には向いている

Page 19: Web技術勉強会 第33回

MVC's Problems

Page 20: Web技術勉強会 第33回

MVC's Problems

これを実現するには「C」を極力小さくしないと(5行は微妙だが)いけない。だが、インスタンス作ったりするとすぐ10、20行いく。Controllerは「イベント」を受け取って、「Model」に投げることしかしてはいけない。Modelに投げる前の前処理もすべきではない。

となると、MVCじゃ無理。

Page 21: Web技術勉強会 第33回

Extension MVC

とにかくControllerは最小最低限。 もう1層必要になるので用意した。拡張MVC

ちょっとまえにRails界隈で話題に。

Service層を新たに定義MとCの間に配置

Page 22: Web技術勉強会 第33回

Service Layerサービスクラスをレイヤレベルに拡張したもの(と俺は定義)サービスクラスはI/Fを単純化する役割を持つ

例えば、「ログイン処理」ログイン処理はいくつもの「手続き」が必要だが、使う側は「ログインする」という手続きだけ知っていればいい。つまり、こまけえことは(ry

Controllerで必要ないくもの「手続き」をシンプルにするためにサービス層を定義することでModelへのI/Fが非常に簡単ですむ

Page 23: Web技術勉強会 第33回

Extension MVC sequence

View

Controller Model

Service

Page 24: Web技術勉強会 第33回

Development Env.

SinatraアプリはそのままRubyコマンドで起動 > ruby server.rb

開発環境(Windows)ではRackupが使えない別に開発環境ならそのまま実行しても問題ない

ログもそのまま見れるし。

http://localhost:4567/0000000000000(000...000はJANコード13桁)

Page 25: Web技術勉強会 第33回

Production Env.

本番環境では「rack+thin+mongrel」でデーモン起動

rackupを使うため、config.ruを用意thinはmongrelのラッパAPサーバmongrelより約15%ほどメモリが節約され高速に動作するしかもデーモン起動可能

Page 26: Web技術勉強会 第33回

Production Env.(Caution)

本番環境のサーバ設定でつまづいたところrackup単独のデーモン起動の動作がおかしいrackup config.ru → OK(ただしデーモンにならない)rackup -D config.ru → NG(確実にバグだと思う)

どうやらプログラム内で参照するパスのルートがおかしくなっている模様。なぜか/usr/local/binがルートになる-D をつけただけでルートパスが変わるのはあきらかにバグといえる。 停止コマンドがなく、killするしかないって…。

Page 27: Web技術勉強会 第33回

Production Env.(Caution)

thinを導入することであっさり解決設定ファイルを用意し、ログへのパス、ポート、実行するファイル(config.ru)、などを書く(mongrel_clusterと同じ感じ)sinatraルートで

thin start -C (設定ファイルのパス) start停止コマンドもある

thin stop -C (設定ファイルのパス) stop

Page 28: Web技術勉強会 第33回

Class Fig.

Page 29: Web技術勉強会 第33回

server.rb, config.ru

サーバ起動スクリプトSinatraの構文 get '/' do ... end を記述server.rbはWindows開発時に直接実行config.ruはサーバ環境でthin経由で実行

Page 30: Web技術勉強会 第33回

Controller

main.rb(Tmarker::Main)HTTPリクエストを受け取るServiceを呼び出すModelを呼び出す(DB処理)Service、ModelからのレスポンスをViewに渡す

Page 31: Web技術勉強会 第33回

Service

bridge.rb(Tmarker::Bridge)Controllerからのリクエストを加工し、Modelへ中継する

notice.rb(Tmarker::Notice)Modelから受け取ったメッセージを保持する(Singleton)

Page 32: Web技術勉強会 第33回

Modeldb.rb(Tmarker::Common::DB)

DB処理(Singleton) log.rb(Tmarker::Common::Log)

ログ出力(Singleton) user.rb(Tmarker::Common::User)

ユーザ認証(未実装) mail.rb(Tmarker::Common::Mail)

メール送信 util.rb(Tmarker::Common::Util)

共通処理 amazon.rb(Tmarker::Service::Amazon)

Amazon問い合わせ

Page 33: Web技術勉強会 第33回

Let's register to tmaker

←手元にあった本

Page 34: Web技術勉強会 第33回

Let's register to tmaker

←QuickMarkで撮影+送信

Page 35: Web技術勉強会 第33回

Let's register to tmaker

←登録成功

Page 36: Web技術勉強会 第33回

Let's register to tmaker

←登録失敗(重複はNG)

Page 37: Web技術勉強会 第33回

Let's register to tmaker

←iPhone以外のアクセスはNG

Page 38: Web技術勉強会 第33回

Result

表示部を作成するRails2.3ベースで作成予定

今回のノウハウを他のシステムにも展開Sinatra/Railsの組み合わせは悪くない

Sinatraは初心者でも使えるPHPくらい導入しやすい自由度が高いので設計しがいがある