Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Merhaba "Sinatra"

Merhaba "Sinatra"

Ruby web framework'ü Sinatra'yı tanıyalım!

Avatar for Uğur Özyılmazel

Uğur Özyılmazel

March 31, 2013
Tweet

More Decks by Uğur Özyılmazel

Other Decks in Programming

Transcript

  1. Sinatra ? Ruby ile hızlı ve kolay bir şekilde web

    uygulaması geliştirmek için hazırlanmış bir DSL’dir. http://www.sinatrarb.com/
  2. DSL ? Belirli bir problemi çözmek ya da işlemi yapmak

    için geliştirilmiş / hazırlanmış dil.
  3. Genel Özellikler • RACK Application * • Küçük ölçekli web

    uygulamaları • Saniyede 2000 request kapasite • Hız ve düşük hafıza kullanımı • Kolay kurulum ve deployment • “1 file app” * RACK : Ruby ve Ruby Framework’leri için Web Sunucusu Blake Mizerany
  4. Kullanım Alanları • Hızlıca Prototip hazırlamak • API sunmak /

    yapmak • Herhangi bir ilave framework kullanmadan Web Uygulaması yapmak • Apache+PHP’nin Ruby yansıması
  5. Yardımcı Araçlar $ gem install shotgun thin $ shotgun server.rb

    == Shotgun/Thin on http://127.0.0.1:9393/ >> Thin web server (v1.5.0 codename Knife) >> Maximum connections set to 1024 >> Listening on 127.0.0.1:9393, CTRL+C to stop • shotgun • thin
  6. “Merhaba Dünya” require 'rubygems' require 'sinatra' get '/' do "Merhaba

    Dünya! saat: #{Time.now}" end # application.rb $ ruby application.rb # default http://localhost:4567 $ shotgun application.rb # http://127.0.0.1:9393
  7. Yakalayıcılar (Handlers) get '/merhaba/:user_name' do "Merhaba #{params[:user_name]}!" end get '/merhaba/*/numaran/*'

    do "#{params[:splat][0]}, #{params[:splat][1]}" end http://127.0.0.1:9393/merhaba/vigo/numaran/11 http://127.0.0.1:9393/merhaba/jspyconf
  8. Params, Splat ve RegExp Kullanımı get '/indir/*.*' do |file, ext|

    "Dosya: #{file}, Tipi: #{ext}" end http://127.0.0.1:9393/indir/resim.jpg get %r{/kullanici/([\w]+)/?(\d+)?} do "Yakalananlar: #{params[:captures]}" end http://127.0.0.1:9393/kullanici/vigo http://127.0.0.1:9393/kullanici/vigo/1 get '/kazanan/:user/?:id?' do "Kazanan #{params[:user]}, id var mı? #{!params[:id].nil?}" end http://127.0.0.1:9393/kazanan/vigo http://127.0.0.1:9393/kazanan/vigo/1
  9. Duruma Bağlı Yakalama (Conditions) :agent # AppleWebKit/536.28.10 # Sadece AppleWebKit

    tarayıcıları için get '/ajan', :agent => /AppleWebKit\/(\d+)/ do mversion = @params[:agent].first "AppleWebKit major sürümü: #{mversion}" end get '/ajan' do "Tüm tarayıcılar için..." end :host_name # http://localhost:9393/admin yakalar # http://127.0.0.1:9393/admin çalışmaz get '/admin', :host_name => /^local/ do "Sadece adminler girebilir!" end :provides get '/test_provide', :provides => :json do pass unless request.accept? 'application/json' { :username => 'vigo', :email => '[email protected]' }.to_json end
  10. Kendi Durumumuz Oluşturalım set(:ihtimal) { |value| condition { rand <=

    value } } get '/piyango', :ihtimal => 0.1 do "Tebrikler kazandınız!" end get '/piyango' do "Kaybettiniz ):" end set(:test_auth) do |*roles| condition do unless roles.any? {|role| current_test_user.in_role? role } redirect "/sistem/giris", 303 end end end get "/sistem/giris/?" do "Bu sayfaları görüntülemek için sisteme giriş yapmanız gerekiyor!" end get "/sistem/profil/?", :test_auth => [:user, :guest] do "Profil bilgileri" end get "/sistem/admin/?", :test_auth => :admin do "Sadece admin olanlar görebiliyor" end
  11. Sayfalar (Views) # views/sayfa.erb <h1>Merhaba</h1> <div> Saat <%= @saat %>

    </div> # server.rb get '/sayfa/?' do @saat = Time.now.strftime("%I:%M:%S") erb :sayfa end
  12. Post İşlemi # application.rb get '/post/test/?' do erb :post_form, :layout

    => :genel end post '/post/test/?' do @username = params[:username] erb :post_form, :layout => :genel end <form action="?" method="post" accept-charset="utf-8"> <p><strong>Kullanıcı adı girin</strong><br/> <input type="test" name="username" value=""/></p> <p><input type="submit" value="Gönder &rarr;"/></p> <% if @username %> <p>Göndermiş olduğunuz kullanıcı adı: <strong><%= h @username %></strong></p> <% end %> </form> # views/post_form.erb Helper
  13. Statik Dosyalar # application.rb get '/sayfa/3/?' do @saat = Time.now.strftime("%I:%M:%S")

    @page_title = "Bu sayfa :layout ve css kullanıyor" erb :sayfa, :layout => :genel2 end # public/css/base.css body { background: #555; color: #ff0; font-family: Helvetica, Arial; margin: 20px; padding: 0; } h1 { color: #fff; } <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title><%= @page_title %></title> <link href="/css/base.css" rel="stylesheet" /> </head> <body> <h1>genel.erb</h1> <%= yield %> </body> </html> # views/genel2.erb
  14. Şablonlar (Templates) • Haml • Erb • Builder • Nokogiri

    • Liquid • Markdown • Textile • Rdoc • Sass / SCSS • Less • Coffe • Stylus
  15. Mizanpaj (Layout) # application.rb get '/sayfa/2/?' do @saat = Time.now.strftime("%I:%M:%S")

    @page_title = "Bu sayfa :layout kullanıyor" erb :sayfa, :layout => :genel end # views/genel.erb <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title><%= @page_title %></title> </head> <body> <h1>genel.erb</h1> <%= yield %> </body> </html>
  16. Şablonlar (Templates) Sass ve Markdown get '/sass/*.sass' do content_type 'text/css',

    :charset => 'utf-8' sass params[:splat].first.to_sym, :style => :expanded, :views => "#{settings.root}/sass" end # sass/*.sass yakalamak için get '/sayfa/ornek/markdown/?' do markdown :sayfa, :layout_engine => :erb, :layout => :genel3 end # render için erb motorunu kullanıyoruz
  17. Şablonlar (Templates) Sass ve Markdown # views/genel3.erb <!DOCTYPE html> <html

    lang="en"> <head> <meta charset="utf-8"> <title><%= @page_title %></title> <link href="/sass/stil.sass" rel="stylesheet" /> </head> <body> <h1>genel.erb</h1> <%= yield %> </body> </html>
  18. Şablonlar (Templates) Sass ve Markdown # views/sayfa.markdown # Bu H1

    ## Bu H2 Bu pre ... Bu paragraf... def foo(user) "#{user}" end # sass/stil.sass $color: #00f $h1_color: adjust-hue($color, 270deg) $fonts: Helvetica, Arial body background-color: adjust-hue($color, 20deg) color: darken($h1_color, 20%) font-family: $fonts margin: 40px h1 color: $h1_color pre border: 1px solid darken($color, 20) padding: 20px background-color: darken($color, 24) code line-height: 1.5em color: darken($h1_color, 10%)
  19. Filtreler before '/sayfa/3/?' do @before_param = "Bu değişken -before- da

    set edildi" end get '/sayfa/3/?' do @saat = Time.now.strftime("%I:%M:%S") @page_title = "Bu sayfa :layout ve css kullanıyor" erb :sayfa, :layout => :genel2 end
  20. Yardımcı Fonksiyonlar (Helpers) View ve Handler’larda kullanılır. helpers do def

    h(text) Rack::Utils.escape_html(text) end end # application.rb <strong><%= h @username %></strong></p> # view/erb
  21. pass ve halt get '/tahmin/:kim/?' do pass unless params[:kim] ==

    'vigo' "Doğru cevap!" end get '/tahmin/*/?' do "Hayır bilemedin!" end http://127.0.0.1:9393/tahmin/vigo/ get '/konferans1/:hangisi/?' do halt unless params[:hangisi] == 'jspyconf' "Evet doğru konferans!" end http://127.0.0.1:9393/konferans1/jspyconf
  22. Diğer halt durumları get '/konferans2/:hangisi/?' do halt 404 unless params[:hangisi]

    == 'jspyconf' "Evet doğru konferans!" end get '/konferans3/:hangisi/?' do halt [403, "Yetkiniz yok"] unless params[:hangisi] == 'jspyconf' "Evet doğru konferans!" end Hata kodu ve ilave mesaj belirtmek
  23. Hata Yakalamak error 403 do "Giriş Yasak" end get '/gizli'

    do 403 end error 400..510 do "Pek çok hatayı yakaladık" end
  24. Özelleştirilmiş Hatalar disable :show_exceptions error do mesaj = env['sinatra.error'].message "Hata

    mesajı: <strong>#{mesaj}</strong>" end class CustomError < StandardError; end error CustomError do mesaj = env['sinatra.error'].message "Bu <strong>CustomError</strong>, mesajı da <strong>#{mesaj}</strong>" end
  25. Özelleştirilmiş Hatalar get '/ozel-hata/1/' do raise StandardError, "StandardError raise ettik"

    end get '/ozel-hata/2/' do raise CustomError, "CustomError raise ettik" end
  26. Konfigürasyon :test :development :production # http://www.sinatrarb.com/intro.html#Configuration configure do # set

    :option, 'value' # enable :option # disable :option enable :logging disable :show_exceptions end configure :development, :test do enable :logging end
  27. Session Pooling Cookie use Rack::Session::Cookie, :key => 'rack.session', :domain =>

    'foo.com', :path => '/', :expire_after => 2592000, # Saniye :secret => 'burayı_düzenle' use Rack::Session::Pool, :expire_after => 2592000
  28. Test group :test do gem 'rack-test' end # Gemfile OUTER_APP

    = Rack::Builder.parse_file('config.ru').first class TestApp < Test::Unit::TestCase include Rack::Test::Methods def app OUTER_APP end def test_sample_page get '/test/amacli/1/' assert last_response.ok? assert_equal "JsPyConf çok güzel!", last_response.body end end # tests.rb
  29. Test Rack::Test::Methods :request :get :post :put :delete :options :head :follow_redirect!

    :header :set_cookie :clear_cookies :authorize :basic_authorize :digest_authorize :last_response :last_request
  30. Deployment • Apache • Nginx • Standalone Phusion Passenger Heroku

    $ sudo gem install passenger https://toolbelt.heroku.com/ git push heroku https://devcenter.heroku.com/articles/rack#frameworks
  31. Deployment # config.ru # application.rb # encoding: utf-8 require "./application.rb"

    run MyApp # encoding: utf-8 require 'rubygems' require 'bundler' Bundler.require # gerekli diğer require'lar... class MyApp < Sinatra::Base get '/' do "Merhaba" end run! if app_file == $0 end # encoding: utf-8 source "https://rubygems.org" ruby "1.9.3" group :development do gem 'thin' gem 'shotgun' end group :test do gem 'rack-test' end gem 'sinatra' gem 'sass' gem 'rdiscount' # Gemfile
  32. Deployment Apache $ (sudo) passenger-install-apache2-module <VirtualHost *:80> ServerName example.com DocumentRoot

    /path/to/example.com/public <Directory /path/to/example.com/public> AllowOverride all Options -MultiViews </Directory> </VirtualHost>
  33. Daha Fazla... • sinatra-contrib • DataMapper (Veritabanı Entegrasyonu) • Modüler

    Uygulamalar • Streaming / Long Polling • Middleware Geliştirmek • Extension Geliştirmek
  34. DataMapper $ gem install data_mapper $ gem install dm-sqlite-adapter $

    gem install dm-mysql-adapter $ gem install dm-postgres-adapter
  35. DataMapper require 'sqlite3' require 'dm-core' require 'dm-timestamps' configure :development do

    DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/my_database.db") end class Blog include DataMapper::Resource property :id, Serial property :title, String property :content, Text property :url, String property :is_active, Boolean property :created_at, DateTime property :updated_at, DateTime end get '/blog/:post_id' do @post = Blog.get(params[:post_id]) erb :post_detail end sqlite3
  36. Kimler Kullanıyor? • Heroku • Github • Apple • BBC

    • Linkedin • Engine Yard • Stanford • Red Hat • Travis CI • Songbird
  37. Kaynaklar • http://www.sinatrarb.com/ • http://recipes.sinatrarb.com/ • http://sinatra-book.gittr.com/ • http://modrails.com •

    http://datamapper.org/getting-started.html • https://peepcode.com/products/sinatra * • https://tutsplus.com/course/simple-sinatra/ * * Ücretli servisler