Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
MERHABA “SİNATRA”
Uğur Özyılmazel
http://ugur.ozyilmazel.com

|

@ugurozyilmazel
FRANK SINATRA
Sinatra ?
Ruby ile hızlı ve kolay bir
şekilde web uygulaması
geliştirmek için hazırlanmış bir
DSL’dir.
http://www.sinatrar...
DSL ?
Belirli bir problemi çözmek ya da işlemi
yapmak için geliştirilmiş / hazırlanmış
dil.
Genel Özellikler
•
•
•
•
•
•

RACK Application *
Küçük ölçekli web uygulamaları
Saniyede 2000 request kapasite
Hız ve düşü...
Kullanım Alanları
•
•
•

Hızlıca Prototip hazırlamak
API sunmak / yapmak
Herhangi bir ilave framework
kullanmadan Web Uygu...
Dan Benjamin

“RACK’den fazla
RAILS’den az!”
Peepcode - Meet Sinatra

“More than RACK, Less than RAILS”
Kurulum

$ gem install sinatra

* Mart 2013 itibariyle son sürüm : 1.4.2
Yardımcı Araçlar
•
•

shotgun
thin

$ gem install shotgun thin
$ shotgun server.rb
== Shotgun/Thin on http://127.0.0.1:939...
“Merhaba Dünya”
# application.rb
require 'rubygems'
require 'sinatra'
get '/' do
"Merhaba Dünya! saat: #{Time.now}"
end
$ ...
HTTP Metodları
GET

PATCH

POST

OPTIONS

PUT

LINK

DELETE

UNLINK
Yakalayıcılar (Handlers)
get '/merhaba/:user_name' do
"Merhaba #{params[:user_name]}!"
end
http://127.0.0.1:9393/merhaba/j...
Params, Splat ve RegExp Kullanımı
http://127.0.0.1:9393/indir/resim.jpg

get '/indir/*.*' do |file, ext|
"Dosya: #{file}, ...
Duruma Bağlı Yakalama (Conditions)
:agent
# AppleWebKit/536.28.10
# Sadece AppleWebKit tarayıcıları için
get '/ajan', :age...
Kendi Durumumuz Oluşturalım
set(:ihtimal) { |value| condition { rand <= value } }
get '/piyango', :ihtimal => 0.1 do
"Tebr...
Sayfalar (Views)
# views/sayfa.erb
<h1>Merhaba</h1>
<div>
Saat <%= @saat %>
</div>

# server.rb
get '/sayfa/?' do
@saat = ...
Post İşlemi
# application.rb
get '/post/test/?' do
erb :post_form, :layout => :genel
end
post '/post/test/?' do
@username ...
Statik Dosyalar
# application.rb
get '/sayfa/3/?' do
@saat = Time.now.strftime("%I:%M:%S")
@page_title = "Bu sayfa :layout...
Şablonlar (Templates)
•
•
•
•
•
•
•
•

Haml
Erb
Builder
Nokogiri
Liquid
Markdown
Textile
Rdoc

•
•
•
•

Sass / SCSS
Less
C...
Mizanpaj (Layout)
# application.rb
get '/sayfa/2/?' do
@saat = Time.now.strftime("%I:%M:%S")
@page_title = "Bu sayfa :layo...
Şablonlar (Templates)
Sass ve Markdown
# sass/*.sass yakalamak için
get '/sass/*.sass' do
content_type 'text/css', :charse...
Şablonlar (Templates)
Sass ve Markdown
# views/genel3.erb
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<...
Şablonlar (Templates)
Sass ve Markdown
# views/sayfa.markdown

# Bu H1
## Bu H2
Bu pre ...
Bu paragraf...
def foo(user)
"#...
Filtreler
before
Request’den önce çalışır.
before do
headers "Content-Type" => "text/html; charset=utf-8"
end

after
Reque...
Filtreler

after ve before’da set edilen değişkenler
tüm “route”larda kullanılabiliyor.
Filtreler
before '/sayfa/3/?' do
@before_param = "Bu değişken -before- da set edildi"
end

get '/sayfa/3/?' do
@saat = Tim...
Yardımcı Fonksiyonlar (Helpers)
View ve Handler’larda kullanılır.
# application.rb
helpers do
def h(text)
Rack::Utils.esca...
pass ve halt
pass
Uygun olan bir sonraki route’a geç
halt
Tamamen dur!
pass ve halt
http://127.0.0.1:9393/tahmin/vigo/
get '/tahmin/:kim/?' do
pass unless params[:kim] == 'vigo'
"Doğru cevap!"
...
Diğer halt durumları
Hata kodu ve ilave mesaj belirtmek
get '/konferans2/:hangisi/?' do
halt 404 unless params[:hangisi] =...
Özelleştirilmiş 404
not_found do
"Aradığınız sayfa bulunamadı!"
end

Tamamen özelleştirmek...
not_found do
erb :ozel_404
e...
Yönlerdirmek: redirect
redirect URL, StatusCode

get '/google' do
redirect "http://google.com"
# redirect "/foo", 301
end
Hata Yakalamak
error 403 do
"Giriş Yasak"
end
get '/gizli' do
403
end

error 400..510 do
"Pek çok hatayı yakaladık"
end
Özelleştirilmiş Hatalar
disable :show_exceptions
error do
mesaj = env['sinatra.error'].message
"Hata mesajı: <strong>#{mes...
Özelleştirilmiş Hatalar
get '/ozel-hata/1/' do
raise StandardError, "StandardError raise ettik"
end
get '/ozel-hata/2/' do...
Konfigürasyon
:test
:development
:production

configure do
# set :option, 'value'
# enable :option
# disable :option
enabl...
Session
Konfigürasyon seviyesinde
enable :sessions

session['key'] = "value"
get('/') {
"Merhaba #{session['user_name']}."...
Session
Pooling
use Rack::Session::Pool, :expire_after => 2592000

Cookie
use Rack::Session::Cookie, :key => 'rack.session...
Test
# Gemfile
group :test do
gem 'rack-test'
end
# tests.rb
OUTER_APP = Rack::Builder.parse_file('config.ru').first
class...
Test
Rack::Test::Methods
:request
:get
:post
:put
:delete
:options
:head
:follow_redirect!

:header
:set_cookie
:clear_coo...
Deployment
Phusion Passenger
•
•
•

Apache

$ sudo gem install passenger

Nginx
Standalone

Heroku
https://toolbelt.heroku...
Deployment
# config.ru
# encoding: utf-8
require "./application.rb"
run MyApp

# application.rb
# encoding: utf-8
require ...
Deployment
Apache
$ (sudo) passenger-install-apache2-module
<VirtualHost *:80>
ServerName example.com
DocumentRoot /path/t...
Daha Fazla...
•
•
•
•
•
•

sinatra-contrib
DataMapper (Veritabanı Entegrasyonu)
Modüler Uygulamalar
Streaming / Long Polli...
DataMapper
$ gem install data_mapper
$ gem install dm-sqlite-adapter
$ gem install dm-mysql-adapter
$ gem install dm-postg...
DataMapper

sqlite3

require 'sqlite3'
require 'dm-core'
require 'dm-timestamps'
configure :development do
DataMapper::set...
DataMapper
class Post
has n, :comments
end
class Comment
belongs_to :post
end
DataMapper.auto_migrate!
Kimler Kullanıyor?
•
•
•
•
•

Heroku
Github
Apple
BBC
Linkedin

•
•
•
•
•

Engine Yard
Stanford
Red Hat
Travis CI
Songbird
Kaynaklar
•
•
•
•
•
•
•

http://www.sinatrarb.com/
http://recipes.sinatrarb.com/
http://sinatra-book.gittr.com/
http://mod...
Kaynak Kod
https://github.com/vigo/jspy2013-sinatra
http://jspy2013-sinatra.herokuapp.com
Teşekkürler
@ugurozyilmazel
@vigobronx
http://ugur.ozyilmazel.com
Merhaba Sinatra
Merhaba Sinatra
Upcoming SlideShare
Loading in …5
×

Merhaba Sinatra

736 views

Published on

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

Published in: Technology
  • Be the first to comment

Merhaba Sinatra

  1. 1. MERHABA “SİNATRA” Uğur Özyılmazel http://ugur.ozyilmazel.com | @ugurozyilmazel
  2. 2. FRANK SINATRA
  3. 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. 4. DSL ? Belirli bir problemi çözmek ya da işlemi yapmak için geliştirilmiş / hazırlanmış dil.
  5. 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. 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. 7. Dan Benjamin “RACK’den fazla RAILS’den az!” Peepcode - Meet Sinatra “More than RACK, Less than RAILS”
  8. 8. Kurulum $ gem install sinatra * Mart 2013 itibariyle son sürüm : 1.4.2
  9. 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. 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. 11. HTTP Metodları GET PATCH POST OPTIONS PUT LINK DELETE UNLINK
  12. 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. 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. 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. 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. 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. 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. 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. 19. Şablonlar (Templates) • • • • • • • • Haml Erb Builder Nokogiri Liquid Markdown Textile Rdoc • • • • Sass / SCSS Less Coffe Stylus
  20. 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. 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. 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. 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. 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. 25. Filtreler after ve before’da set edilen değişkenler tüm “route”larda kullanılabiliyor.
  26. 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. 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. 28. pass ve halt pass Uygun olan bir sonraki route’a geç halt Tamamen dur!
  29. 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. 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. 31. Özelleştirilmiş 404 not_found do "Aradığınız sayfa bulunamadı!" end Tamamen özelleştirmek... not_found do erb :ozel_404 end
  32. 32. Yönlerdirmek: redirect redirect URL, StatusCode get '/google' do redirect "http://google.com" # redirect "/foo", 301 end
  33. 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. 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. 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. 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. 37. Session Konfigürasyon seviyesinde enable :sessions session['key'] = "value" get('/') { "Merhaba #{session['user_name']}." }
  38. 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. 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. 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. 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. 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. 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. 44. Daha Fazla... • • • • • • sinatra-contrib DataMapper (Veritabanı Entegrasyonu) Modüler Uygulamalar Streaming / Long Polling Middleware Geliştirmek Extension Geliştirmek
  45. 45. DataMapper $ gem install data_mapper $ gem install dm-sqlite-adapter $ gem install dm-mysql-adapter $ gem install dm-postgres-adapter
  46. 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. 47. DataMapper class Post has n, :comments end class Comment belongs_to :post end DataMapper.auto_migrate!
  48. 48. Kimler Kullanıyor? • • • • • Heroku Github Apple BBC Linkedin • • • • • Engine Yard Stanford Red Hat Travis CI Songbird
  49. 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. 50. Kaynak Kod https://github.com/vigo/jspy2013-sinatra http://jspy2013-sinatra.herokuapp.com
  51. 51. Teşekkürler @ugurozyilmazel @vigobronx http://ugur.ozyilmazel.com

×