SlideShare a Scribd company logo
1 of 38
Download to read offline
Web技術勉強会 第33回
Web application by Sinatra+iPhone

         Ryuichi TANAKA.
Thema.

 何かアプリケーションが作りたい
   最近は迷走気味…。
 iPhoneを買ったので、使いたい
   でもiPhoneアプリは作らない
 新しい技術テーマを取り入れたい
   JavaかRuby?
Thema!

 何かアプリケーションが作りたい
   自分で買ったもの(本とかCDとか)を管理す
   るアプリ 
 iPhoneを買ったので、使いたい
   バーコード(1次元)を撮ると買ったもの(JAN
   コード)を取得できるアプリ発見。しかも
   HTTP経由で送信可能。
Thema!

 新しい技術テーマを取り入れたい
   今のお気に入りである「Ruby」か「Java」で
   作りたい。
   Ruby
     RailsかSinatra、ある程度自前でRubyをしっか
     り書きたい。
   Java
     Wicket+Maven。フレームワークを使いたい。
QuickMark

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

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

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

  自分でないと実現できないこともある
    管理するデータ定義
    I/F
    なによりスキルアップ
  「すでにあるからやらない」ではだめ
    商用ではなく趣味なのだからOK
    それを考えると動けない
    それでも少しはオリジナリティを出すべき
Technical Thema
 では、何で作るか。
 言語候補
  PHP
     何度となく使用してきた経験あり。ある程度規模が大
     きくても平気。
  Perl
     頻繁に使用。ただ、規模が大きくなると不安。
  Java
     最近使ってる。ちゃんとしたWebアプリ未経験。
  Ruby
     Railsのみ。Ruby自身はほとんど経験なし。
Technical Thema
 では、何で作るか。
 言語候補
  PHP
     何度となく使用してきた経験あり。ある程度規模が大
     きくても平気。
  Perl
     頻繁に使用。ただ、規模が大きくなると不安。
  Java
     最近使ってる。ちゃんとしたWebアプリ未経験。
  Ruby               これに決定!
     Railsのみ。Ruby自身はほとんど経験なし。
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))
System Summary

きわめてシンプル
Technical Effort

  今回はシステムの目新しさより技術的に新しいこ
  とを取り入れることを重視
    設計(拡張MVC)
    共通化と依存性の排除
    各レイヤでの明確な役割分担
Past Failure

  これまで作ってきたシステムの設計上の問題
  点
    役割分担(MVC)があいまい(除くRails)
    各機能の依存度が高い
    異常系の作りこみが甘い
  今回はこれを出来る限りなんとかしたい。これ
  を全てRubyだけで実装する縛り
System Design

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

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




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

  登録部にはSinatraを採用
   登録部は機能がシンプルでUIを作りこむ必要
   がないため、Railsでは手に余る。
  自分で設計できる
   MVCなどを自分でやる必要がある
   その分自由度は高い
   Rubyをがりがり書く必要があるためスキル
   アップにはもってこい 
What's "Sinatra"?

Sinatra はRubyで下記のような最小労力で手早くウェブア
プリケーションを作成するためのDSL
                http://www.sinatrarb.com/intro-jp.html

      require 'rubygems'
      require 'sinatra'
      get '/' do
      'Hello world!'
      end
Sinatra's Feature

  MVCのような階層定義はない
    自分でつくるしかない
    Railsのような決め事はない。
    規模が大きくなると設計をしっかりやらないと厳しい
  Railsよりはるかに簡単
    Railsは覚えることがとにかく多いがSinatraはほとんどない。
    Rubyの習得には向いている
MVC's Problems
MVC's Problems

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

 とにかくControllerは最小最低限。
 もう1層必要になるので用意した。
 拡張MVC
  ちょっとまえにRails界隈で話題に。
 Service層を新たに定義
  MとCの間に配置
Service Layer
  サービスクラスをレイヤレベルに拡張したもの(と俺は
  定義)
  サービスクラスはI/Fを単純化する役割を持つ
   例えば、「ログイン処理」
   ログイン処理はいくつもの「手続き」が必要
   だが、使う側は「ログインする」という手続きだけ知っていれ
   ばいい。つまり、こまけえことは(ry
  Controllerで必要ないくもの「手続き」をシンプルにす
  るためにサービス層を定義することでModelへのI/F
  が非常に簡単ですむ
Extension MVC sequence
      Controller             Model



                   Service

   View
Development Env.

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

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

  開発環境(Windows)ではRackupが使えない
  別に開発環境ならそのまま実行しても問題ない
   ログもそのまま見れるし。
Production Env.

 本番環境では「rack+thin+mongrel」でデーモ
 ン起動
   rackupを使うため、config.ruを用意
   thinはmongrelのラッパAPサーバ
   mongrelより約15%ほどメモリが節約され高速
   に動作する
   しかもデーモン起動可能
Production Env.(Caution)

  本番環境のサーバ設定でつまづいたところ
    rackup単独のデーモン起動の動作がおかしい
    rackup config.ru → OK(ただしデーモンにならない)
    rackup -D config.ru → NG(確実にバグだと思う)
        どうやらプログラム内で参照するパスのルートがおかしく
       なっている模様。なぜか/usr/local/binがルートになる
       -D をつけただけでルートパスが変わるのはあきらかにバ
       グといえる。 
       停止コマンドがなく、killするしかないって…。
Production Env.(Caution)

  thinを導入することであっさり解決
    設定ファイルを用意し、ログへのパス、ポート、実行するファ
    イル(config.ru)、などを書く(mongrel_clusterと同じ感じ)
    sinatraルートで
       thin start -C (設定ファイルのパス) start
    停止コマンドもある
       thin stop -C (設定ファイルのパス) stop
Class Fig.
server.rb, config.ru

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

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

 bridge.rb(Tmarker::Bridge)
   Controllerからのリクエストを加工し、Modelへ中継
   する
 notice.rb(Tmarker::Notice)
   Modelから受け取ったメッセージを保持する
   (Singleton)
Model
 db.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問い合わせ
Let's register to tmaker




                           ←手元に
                           あった本
Let's register to tmaker




                           ←QuickMark
                           で撮影+送信
Let's register to tmaker




                           ←登録成功
Let's register to tmaker




                           ←登録失敗(重
                           複はNG)
Let's register to tmaker




                           ←iPhone以外
                           のアクセスは
                           NG
Result

 表示部を作成する
   Rails2.3ベースで作成予定
 今回のノウハウを他のシステムにも展開
   Sinatra/Railsの組み合わせは悪くない
 Sinatraは初心者でも使える
   PHPくらい導入しやすい
   自由度が高いので設計しがいがある

More Related Content

What's hot

JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
y torazuka
 

What's hot (11)

WebAssemblyの紹介
WebAssemblyの紹介WebAssemblyの紹介
WebAssemblyの紹介
 
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
 
SignalRブートキャンプ
SignalRブートキャンプSignalRブートキャンプ
SignalRブートキャンプ
 
World plonedaylt
World plonedayltWorld plonedaylt
World plonedaylt
 
こじらせVBA
こじらせVBAこじらせVBA
こじらせVBA
 
[LT] インフラの人がChefやServerspec(ほか)が Rubyだったおかげですこし プログラムをするようになった話
[LT] インフラの人がChefやServerspec(ほか)が Rubyだったおかげですこし プログラムをするようになった話[LT] インフラの人がChefやServerspec(ほか)が Rubyだったおかげですこし プログラムをするようになった話
[LT] インフラの人がChefやServerspec(ほか)が Rubyだったおかげですこし プログラムをするようになった話
 
WagtailとPelicanでJAMstack環境作ってみた
WagtailとPelicanでJAMstack環境作ってみたWagtailとPelicanでJAMstack環境作ってみた
WagtailとPelicanでJAMstack環境作ってみた
 
Jvm言語とJava、切っても切れないその関係
Jvm言語とJava、切っても切れないその関係Jvm言語とJava、切っても切れないその関係
Jvm言語とJava、切っても切れないその関係
 
Rustの最初の難関を超えるための第一の技
Rustの最初の難関を超えるための第一の技Rustの最初の難関を超えるための第一の技
Rustの最初の難関を超えるための第一の技
 
Ember コミュニティとわたし
Ember コミュニティとわたしEmber コミュニティとわたし
Ember コミュニティとわたし
 
Rubyコミッタのいる開発いい話
Rubyコミッタのいる開発いい話Rubyコミッタのいる開発いい話
Rubyコミッタのいる開発いい話
 

Viewers also liked

Web技術勉強会9回目2(Slideshare用)
Web技術勉強会9回目2(Slideshare用)Web技術勉強会9回目2(Slideshare用)
Web技術勉強会9回目2(Slideshare用)
龍一 田中
 
Web技術勉強会12回目
Web技術勉強会12回目Web技術勉強会12回目
Web技術勉強会12回目
龍一 田中
 
Web技術勉強会 20110723
Web技術勉強会 20110723Web技術勉強会 20110723
Web技術勉強会 20110723
龍一 田中
 
Web技術勉強会 20100925
Web技術勉強会 20100925Web技術勉強会 20100925
Web技術勉強会 20100925
龍一 田中
 
Web技術勉強会9回目(Slideshare用)
Web技術勉強会9回目(Slideshare用)Web技術勉強会9回目(Slideshare用)
Web技術勉強会9回目(Slideshare用)
龍一 田中
 

Viewers also liked (18)

Web技術勉強会 第25回
Web技術勉強会 第25回Web技術勉強会 第25回
Web技術勉強会 第25回
 
Web技術勉強会10回目(Slideshare用)
Web技術勉強会10回目(Slideshare用)Web技術勉強会10回目(Slideshare用)
Web技術勉強会10回目(Slideshare用)
 
Web技術勉強会9回目2(Slideshare用)
Web技術勉強会9回目2(Slideshare用)Web技術勉強会9回目2(Slideshare用)
Web技術勉強会9回目2(Slideshare用)
 
Web技術勉強会 20100424
Web技術勉強会 20100424Web技術勉強会 20100424
Web技術勉強会 20100424
 
Test Driven Development and Quality Improvement
Test Driven Development and Quality ImprovementTest Driven Development and Quality Improvement
Test Driven Development and Quality Improvement
 
Web技術勉強会6回目
Web技術勉強会6回目Web技術勉強会6回目
Web技術勉強会6回目
 
Web技術勉強会12回目
Web技術勉強会12回目Web技術勉強会12回目
Web技術勉強会12回目
 
Web技術勉強会6回目
Web技術勉強会6回目Web技術勉強会6回目
Web技術勉強会6回目
 
Web技術勉強会 20110723
Web技術勉強会 20110723Web技術勉強会 20110723
Web技術勉強会 20110723
 
Web技術勉強会 第29回
Web技術勉強会 第29回Web技術勉強会 第29回
Web技術勉強会 第29回
 
Web技術勉強会 20110514
Web技術勉強会 20110514Web技術勉強会 20110514
Web技術勉強会 20110514
 
Web技術勉強会 20100925
Web技術勉強会 20100925Web技術勉強会 20100925
Web技術勉強会 20100925
 
Web技術勉強会 第28回
Web技術勉強会 第28回Web技術勉強会 第28回
Web技術勉強会 第28回
 
Web技術勉強会 第19回
Web技術勉強会 第19回Web技術勉強会 第19回
Web技術勉強会 第19回
 
Web技術勉強会 第26回
Web技術勉強会 第26回Web技術勉強会 第26回
Web技術勉強会 第26回
 
Web技術勉強会9回目(Slideshare用)
Web技術勉強会9回目(Slideshare用)Web技術勉強会9回目(Slideshare用)
Web技術勉強会9回目(Slideshare用)
 
Web技術勉強会 第34回
Web技術勉強会 第34回Web技術勉強会 第34回
Web技術勉強会 第34回
 
WebSocketでリアルタイム処理をする
WebSocketでリアルタイム処理をするWebSocketでリアルタイム処理をする
WebSocketでリアルタイム処理をする
 

Similar to Web技術勉強会 第33回

20091119_sinatraを使ってみた
20091119_sinatraを使ってみた20091119_sinatraを使ってみた
20091119_sinatraを使ってみた
ngi group.
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
Akihiro Kuwano
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミング
terurou
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd edition
Goh Matsumoto
 
パフォーマンス計測Ciサービスを作って得た知見を共有したい
パフォーマンス計測Ciサービスを作って得た知見を共有したいパフォーマンス計測Ciサービスを作って得た知見を共有したい
パフォーマンス計測Ciサービスを作って得た知見を共有したい
zaru sakuraba
 

Similar to Web技術勉強会 第33回 (20)

Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
Start-padrino
Start-padrinoStart-padrino
Start-padrino
 
20091119_sinatraを使ってみた
20091119_sinatraを使ってみた20091119_sinatraを使ってみた
20091119_sinatraを使ってみた
 
Real world rails
Real world railsReal world rails
Real world rails
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
 
NanoA
NanoANanoA
NanoA
 
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
 
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せます
 
2015年GMOペパボ新卒エンジニア研修 Webオペレーション研修イントロダクション
2015年GMOペパボ新卒エンジニア研修 Webオペレーション研修イントロダクション2015年GMOペパボ新卒エンジニア研修 Webオペレーション研修イントロダクション
2015年GMOペパボ新卒エンジニア研修 Webオペレーション研修イントロダクション
 
超高速アプリ開発法
超高速アプリ開発法超高速アプリ開発法
超高速アプリ開発法
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミング
 
ゼロからのプログラミングRails講座 Codeanywhere版
ゼロからのプログラミングRails講座 Codeanywhere版ゼロからのプログラミングRails講座 Codeanywhere版
ゼロからのプログラミングRails講座 Codeanywhere版
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd edition
 
Zynga
ZyngaZynga
Zynga
 
Aws privte20110406 arai
Aws privte20110406 araiAws privte20110406 arai
Aws privte20110406 arai
 
Skinny Framework 進捗どうですか? #fud_scala
Skinny Framework 進捗どうですか? #fud_scalaSkinny Framework 進捗どうですか? #fud_scala
Skinny Framework 進捗どうですか? #fud_scala
 
パフォーマンス計測Ciサービスを作って得た知見を共有したい
パフォーマンス計測Ciサービスを作って得た知見を共有したいパフォーマンス計測Ciサービスを作って得た知見を共有したい
パフォーマンス計測Ciサービスを作って得た知見を共有したい
 
地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイント地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイント
 
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 

More from 龍一 田中

Web技術勉強会 20111112
Web技術勉強会 20111112Web技術勉強会 20111112
Web技術勉強会 20111112
龍一 田中
 
Web技術勉強会11回目
Web技術勉強会11回目Web技術勉強会11回目
Web技術勉強会11回目
龍一 田中
 

More from 龍一 田中 (14)

Web技術勉強会 20130525 - Google Cloud Messaging入門
Web技術勉強会 20130525 - Google Cloud Messaging入門Web技術勉強会 20130525 - Google Cloud Messaging入門
Web技術勉強会 20130525 - Google Cloud Messaging入門
 
Web技術勉強会 20120728
Web技術勉強会 20120728Web技術勉強会 20120728
Web技術勉強会 20120728
 
Web技術勉強会 20120609
Web技術勉強会 20120609Web技術勉強会 20120609
Web技術勉強会 20120609
 
Web技術勉強会 20120114 - JenkinsでJava/PHP/Ruby/JavaScriptをビルドする
Web技術勉強会 20120114 - JenkinsでJava/PHP/Ruby/JavaScriptをビルドするWeb技術勉強会 20120114 - JenkinsでJava/PHP/Ruby/JavaScriptをビルドする
Web技術勉強会 20120114 - JenkinsでJava/PHP/Ruby/JavaScriptをビルドする
 
Web技術勉強会 20111112
Web技術勉強会 20111112Web技術勉強会 20111112
Web技術勉強会 20111112
 
Web技術勉強会 20110611
Web技術勉強会 20110611Web技術勉強会 20110611
Web技術勉強会 20110611
 
Web技術勉強会 20110528
Web技術勉強会 20110528Web技術勉強会 20110528
Web技術勉強会 20110528
 
Web技術勉強会 第38回
Web技術勉強会 第38回Web技術勉強会 第38回
Web技術勉強会 第38回
 
Web技術勉強会 第37回
Web技術勉強会 第37回Web技術勉強会 第37回
Web技術勉強会 第37回
 
Web技術勉強会 第31回
Web技術勉強会 第31回Web技術勉強会 第31回
Web技術勉強会 第31回
 
Web技術勉強会 第30回
Web技術勉強会 第30回Web技術勉強会 第30回
Web技術勉強会 第30回
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目
 
Web技術勉強会 第18回
Web技術勉強会 第18回Web技術勉強会 第18回
Web技術勉強会 第18回
 
Web技術勉強会11回目
Web技術勉強会11回目Web技術勉強会11回目
Web技術勉強会11回目
 

Recently uploaded

Recently uploaded (10)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 

Web技術勉強会 第33回

  • 1. Web技術勉強会 第33回 Web application by Sinatra+iPhone Ryuichi TANAKA.
  • 2. Thema. 何かアプリケーションが作りたい 最近は迷走気味…。 iPhoneを買ったので、使いたい でもiPhoneアプリは作らない 新しい技術テーマを取り入れたい JavaかRuby?
  • 3. Thema! 何かアプリケーションが作りたい 自分で買ったもの(本とかCDとか)を管理す るアプリ  iPhoneを買ったので、使いたい バーコード(1次元)を撮ると買ったもの(JAN コード)を取得できるアプリ発見。しかも HTTP経由で送信可能。
  • 4. Thema! 新しい技術テーマを取り入れたい 今のお気に入りである「Ruby」か「Java」で 作りたい。 Ruby RailsかSinatra、ある程度自前でRubyをしっか り書きたい。 Java Wicket+Maven。フレームワークを使いたい。
  • 5. QuickMark iPhoneで撮影したバーコードを管理 「QuickMark」 台湾製iPhoneアプリ 有料版のほうが機能が豊富 3GSでないとオートフォーカスがうまく いかない 撮影したバーコードをHTTP GETで送 信できる
  • 6. MediaMarker http://mediamarker.net/ QuickMarkと連携可能。書籍などの情報を登 録できる。 というか、作りたいものはこのシステムが全て やってる気が…。 …否!
  • 7. Do it myself 自分でないと実現できないこともある 管理するデータ定義 I/F なによりスキルアップ 「すでにあるからやらない」ではだめ 商用ではなく趣味なのだからOK それを考えると動けない それでも少しはオリジナリティを出すべき
  • 8. Technical Thema では、何で作るか。 言語候補 PHP 何度となく使用してきた経験あり。ある程度規模が大 きくても平気。 Perl 頻繁に使用。ただ、規模が大きくなると不安。 Java 最近使ってる。ちゃんとしたWebアプリ未経験。 Ruby Railsのみ。Ruby自身はほとんど経験なし。
  • 9. Technical Thema では、何で作るか。 言語候補 PHP 何度となく使用してきた経験あり。ある程度規模が大 きくても平気。 Perl 頻繁に使用。ただ、規模が大きくなると不安。 Java 最近使ってる。ちゃんとしたWebアプリ未経験。 Ruby これに決定! Railsのみ。Ruby自身はほとんど経験なし。
  • 10. 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))
  • 12. Technical Effort 今回はシステムの目新しさより技術的に新しいこ とを取り入れることを重視 設計(拡張MVC) 共通化と依存性の排除 各レイヤでの明確な役割分担
  • 13. Past Failure これまで作ってきたシステムの設計上の問題 点 役割分担(MVC)があいまい(除くRails) 各機能の依存度が高い 異常系の作りこみが甘い 今回はこれを出来る限りなんとかしたい。これ を全てRubyだけで実装する縛り
  • 14. System Design システムは「登録部」と「表示部」に分ける 登録部:iPhoneから送信したバーコードの 商品をServerに保存 表示部:登録部で保存した商品を表示する ポータル
  • 15. System Design システムは「登録部」と「表示部」に分ける 登録部:iPhoneから送信したバーコードの 商品をServerに保存 表示部:登録部で保存した商品を表示する ポータル 今回は「登録部」について
  • 16. Sinatra 登録部にはSinatraを採用 登録部は機能がシンプルでUIを作りこむ必要 がないため、Railsでは手に余る。 自分で設計できる MVCなどを自分でやる必要がある その分自由度は高い Rubyをがりがり書く必要があるためスキル アップにはもってこい 
  • 17. What's "Sinatra"? Sinatra はRubyで下記のような最小労力で手早くウェブア プリケーションを作成するためのDSL http://www.sinatrarb.com/intro-jp.html require 'rubygems' require 'sinatra' get '/' do 'Hello world!' end
  • 18. Sinatra's Feature MVCのような階層定義はない 自分でつくるしかない Railsのような決め事はない。 規模が大きくなると設計をしっかりやらないと厳しい Railsよりはるかに簡単 Railsは覚えることがとにかく多いがSinatraはほとんどない。 Rubyの習得には向いている
  • 20. MVC's Problems これを実現するには「C」を極力小さくしないと(5行は 微妙だが)いけない。 だが、インスタンス作ったりするとすぐ10、20行いく。 Controllerは「イベント」を受け取って、「Model」に投げ ることしかしてはいけない。 Modelに投げる前の前処理もすべきではない。 となると、MVCじゃ無理。
  • 21. Extension MVC とにかくControllerは最小最低限。 もう1層必要になるので用意した。 拡張MVC ちょっとまえにRails界隈で話題に。 Service層を新たに定義 MとCの間に配置
  • 22. Service Layer サービスクラスをレイヤレベルに拡張したもの(と俺は 定義) サービスクラスはI/Fを単純化する役割を持つ 例えば、「ログイン処理」 ログイン処理はいくつもの「手続き」が必要 だが、使う側は「ログインする」という手続きだけ知っていれ ばいい。つまり、こまけえことは(ry Controllerで必要ないくもの「手続き」をシンプルにす るためにサービス層を定義することでModelへのI/F が非常に簡単ですむ
  • 23. Extension MVC sequence Controller Model Service View
  • 24. Development Env. SinatraアプリはそのままRubyコマンドで起動 > ruby server.rb http://localhost:4567/0000000000000 (000...000はJANコード13桁) 開発環境(Windows)ではRackupが使えない 別に開発環境ならそのまま実行しても問題ない ログもそのまま見れるし。
  • 25. Production Env. 本番環境では「rack+thin+mongrel」でデーモ ン起動 rackupを使うため、config.ruを用意 thinはmongrelのラッパAPサーバ mongrelより約15%ほどメモリが節約され高速 に動作する しかもデーモン起動可能
  • 26. Production Env.(Caution) 本番環境のサーバ設定でつまづいたところ rackup単独のデーモン起動の動作がおかしい rackup config.ru → OK(ただしデーモンにならない) rackup -D config.ru → NG(確実にバグだと思う) どうやらプログラム内で参照するパスのルートがおかしく なっている模様。なぜか/usr/local/binがルートになる -D をつけただけでルートパスが変わるのはあきらかにバ グといえる。  停止コマンドがなく、killするしかないって…。
  • 27. Production Env.(Caution) thinを導入することであっさり解決 設定ファイルを用意し、ログへのパス、ポート、実行するファ イル(config.ru)、などを書く(mongrel_clusterと同じ感じ) sinatraルートで thin start -C (設定ファイルのパス) start 停止コマンドもある thin stop -C (設定ファイルのパス) stop
  • 29. server.rb, config.ru サーバ起動スクリプト Sinatraの構文 get '/' do ... end を記述 server.rbはWindows開発時に直接実行 config.ruはサーバ環境でthin経由で実行
  • 30. Controller main.rb(Tmarker::Main) HTTPリクエストを受け取る Serviceを呼び出す Modelを呼び出す(DB処理) Service、ModelからのレスポンスをViewに渡 す
  • 31. Service bridge.rb(Tmarker::Bridge) Controllerからのリクエストを加工し、Modelへ中継 する notice.rb(Tmarker::Notice) Modelから受け取ったメッセージを保持する (Singleton)
  • 32. Model db.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問い合わせ
  • 33. Let's register to tmaker ←手元に あった本
  • 34. Let's register to tmaker ←QuickMark で撮影+送信
  • 35. Let's register to tmaker ←登録成功
  • 36. Let's register to tmaker ←登録失敗(重 複はNG)
  • 37. Let's register to tmaker ←iPhone以外 のアクセスは NG
  • 38. Result 表示部を作成する Rails2.3ベースで作成予定 今回のノウハウを他のシステムにも展開 Sinatra/Railsの組み合わせは悪くない Sinatraは初心者でも使える PHPくらい導入しやすい 自由度が高いので設計しがいがある