Your SlideShare is downloading. ×
Merhaba Sinatra
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Merhaba Sinatra

240
views

Published on

Ruby ile geliştirilmiş mikro webframework'ü Sinatra ile tanışmak! Kurulumu, kullanım ve diğer özellikleri.

Ruby ile geliştirilmiş mikro webframework'ü Sinatra ile tanışmak! Kurulumu, kullanım ve diğer özellikleri.

Published in: Technology

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
240
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. MERHABA “SİNATRA” Uğur Özyılmazel http://ugur.ozyilmazel.com | @ugurozyilmazel
  • 2. FRANK SINATRA
  • 3. Sinatra ? Ruby ile hızlı ve kolay bir şekilde web uygulaması geliştirmek için hazırlanmış bir DSL’dir. http://www.sinatrarb.com/
  • 4. DSL ? Belirli bir problemi çözmek ya da işlemi yapmak için geliştirilmiş / hazırlanmış dil.
  • 5. 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 Mizera ny
  • 6. 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ı
  • 7. Dan Benjamin “RACK’den fazla RAILS’den az!” Peepcode - Meet Sinatra “More than RACK, Less than RAILS”
  • 8. Kurulum $ gem install sinatra * Mart 2013 itibariyle son sürüm : 1.4.2
  • 9. Yardımcı Araçlar • • shotgun thin $ 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
  • 10. “Merhaba Dünya” # application.rb require 'rubygems' require 'sinatra' get '/' do "Merhaba Dünya! saat: #{Time.now}" end $ ruby application.rb # default http://localhost:4567 $ shotgun application.rb # http://127.0.0.1:9393
  • 11. HTTP Metodları GET PATCH POST OPTIONS PUT LINK DELETE UNLINK
  • 12. Yakalayıcılar (Handlers) get '/merhaba/:user_name' do "Merhaba #{params[:user_name]}!" end http://127.0.0.1:9393/merhaba/jspyconf http://127.0.0.1:9393/merhaba/vigo/numaran/11 get '/merhaba/*/numaran/*' do "#{params[:splat][0]}, #{params[:splat][1]}" end
  • 13. Params, Splat ve RegExp Kullanımı http://127.0.0.1:9393/indir/resim.jpg get '/indir/*.*' do |file, ext| "Dosya: #{file}, Tipi: #{ext}" end http://127.0.0.1:9393/kazanan/vigo http://127.0.0.1:9393/kazanan/vigo/1 get '/kazanan/:user/?:id?' do "Kazanan #{params[:user]}, id var mı? #{!params[:id].nil?}" end http://127.0.0.1:9393/kullanici/vigo http://127.0.0.1:9393/kullanici/vigo/1 get %r{/kullanici/([w]+)/?(d+)?} do "Yakalananlar: #{params[:captures]}" end
  • 14. 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 => 'hello@jspyconf.org' }.to_json end
  • 15. 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
  • 16. 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
  • 17. 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 # views/post_form.erb <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> Helper
  • 18. 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; } # views/genel2.erb <!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>
  • 19. Şablonlar (Templates) • • • • • • • • Haml Erb Builder Nokogiri Liquid Markdown Textile Rdoc • • • • Sass / SCSS Less Coffe Stylus
  • 20. 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>
  • 21. Şablonlar (Templates) Sass ve Markdown # sass/*.sass yakalamak için get '/sass/*.sass' do content_type 'text/css', :charset => 'utf-8' sass params[:splat].first.to_sym, :style => :expanded, :views => "#{settings.root}/sass" end # render için erb motorunu kullanıyoruz get '/sayfa/ornek/markdown/?' do markdown :sayfa, :layout_engine => :erb, :layout => :genel3 end
  • 22. Ş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>
  • 23. Ş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%)
  • 24. Filtreler before Request’den önce çalışır. before do headers "Content-Type" => "text/html; charset=utf-8" end after Request’den sonra çalışır.
  • 25. Filtreler after ve before’da set edilen değişkenler tüm “route”larda kullanılabiliyor.
  • 26. 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
  • 27. Yardımcı Fonksiyonlar (Helpers) View ve Handler’larda kullanılır. # application.rb helpers do def h(text) Rack::Utils.escape_html(text) end end # view/erb <strong><%= h @username %></strong></p>
  • 28. pass ve halt pass Uygun olan bir sonraki route’a geç halt Tamamen dur!
  • 29. pass ve halt http://127.0.0.1:9393/tahmin/vigo/ 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/konferans1/jspyconf get '/konferans1/:hangisi/?' do halt unless params[:hangisi] == 'jspyconf' "Evet doğru konferans!" end
  • 30. Diğer halt durumları Hata kodu ve ilave mesaj belirtmek 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
  • 31. Özelleştirilmiş 404 not_found do "Aradığınız sayfa bulunamadı!" end Tamamen özelleştirmek... not_found do erb :ozel_404 end
  • 32. Yönlerdirmek: redirect redirect URL, StatusCode get '/google' do redirect "http://google.com" # redirect "/foo", 301 end
  • 33. Hata Yakalamak error 403 do "Giriş Yasak" end get '/gizli' do 403 end error 400..510 do "Pek çok hatayı yakaladık" end
  • 34. Ö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
  • 35. Ö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
  • 36. Konfigürasyon :test :development :production configure do # set :option, 'value' # enable :option # disable :option enable :logging disable :show_exceptions end configure :development, :test do enable :logging end # http://www.sinatrarb.com/intro.html#Configuration
  • 37. Session Konfigürasyon seviyesinde enable :sessions session['key'] = "value" get('/') { "Merhaba #{session['user_name']}." }
  • 38. Session Pooling use Rack::Session::Pool, :expire_after => 2592000 Cookie use Rack::Session::Cookie, :key => 'rack.session', :domain => 'foo.com', :path => '/', :expire_after => 2592000, # Saniye :secret => 'burayı_düzenle'
  • 39. Test # Gemfile group :test do gem 'rack-test' end # tests.rb 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
  • 40. 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
  • 41. Deployment Phusion Passenger • • • Apache $ sudo gem install passenger Nginx Standalone Heroku https://toolbelt.heroku.com/ https://devcenter.heroku.com/articles/rack#frameworks git push heroku
  • 42. Deployment # config.ru # encoding: utf-8 require "./application.rb" run MyApp # application.rb # 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 # Gemfile # 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'
  • 43. 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>
  • 44. Daha Fazla... • • • • • • sinatra-contrib DataMapper (Veritabanı Entegrasyonu) Modüler Uygulamalar Streaming / Long Polling Middleware Geliştirmek Extension Geliştirmek
  • 45. DataMapper $ gem install data_mapper $ gem install dm-sqlite-adapter $ gem install dm-mysql-adapter $ gem install dm-postgres-adapter
  • 46. DataMapper sqlite3 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
  • 47. DataMapper class Post has n, :comments end class Comment belongs_to :post end DataMapper.auto_migrate!
  • 48. Kimler Kullanıyor? • • • • • Heroku Github Apple BBC Linkedin • • • • • Engine Yard Stanford Red Hat Travis CI Songbird
  • 49. 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
  • 50. Kaynak Kod https://github.com/vigo/jspy2013-sinatra http://jspy2013-sinatra.herokuapp.com
  • 51. Teşekkürler @ugurozyilmazel @vigobronx http://ugur.ozyilmazel.com