SlideShare una empresa de Scribd logo
1 de 53
Descargar para leer sin conexión
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.sinatrarb.com/
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üşü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
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ı
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: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
“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
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/jspyconf

http://127.0.0.1:9393/merhaba/vigo/numaran/11
get '/merhaba/*/numaran/*' do
"#{params[:splat][0]}, #{params[:splat][1]}"
end
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
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
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
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
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
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>
Şablonlar (Templates)
•
•
•
•
•
•
•
•

Haml
Erb
Builder
Nokogiri
Liquid
Markdown
Textile
Rdoc

•
•
•
•

Sass / SCSS
Less
Coffe
Stylus
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>
Ş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
Ş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>
Ş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%)
Filtreler
before
Request’den önce çalışır.
before do
headers "Content-Type" => "text/html; charset=utf-8"
end

after
Request’den sonra çalışır.
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 = Time.now.strftime("%I:%M:%S")
@page_title = "Bu sayfa :layout ve css kullanıyor"
erb :sayfa, :layout => :genel2
end
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>
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!"
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
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
Özelleştirilmiş 404
not_found do
"Aradığınız sayfa bulunamadı!"
end

Tamamen özelleştirmek...
not_found do
erb :ozel_404
end
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>#{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
Ö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
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
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',
:domain => 'foo.com',
:path => '/',
:expire_after => 2592000, # Saniye
:secret => 'burayı_düzenle'
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
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
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
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'
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>
Daha Fazla...
•
•
•
•
•
•

sinatra-contrib
DataMapper (Veritabanı Entegrasyonu)
Modüler Uygulamalar
Streaming / Long Polling
Middleware Geliştirmek
Extension Geliştirmek
DataMapper
$ gem install data_mapper
$ gem install dm-sqlite-adapter
$ gem install dm-mysql-adapter
$ gem install dm-postgres-adapter
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
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://modrails.com
http://datamapper.org/getting-started.html
https://peepcode.com/products/sinatra *
https://tutsplus.com/course/simple-sinatra/ *

* Ücretli servisler
Kaynak Kod
https://github.com/vigo/jspy2013-sinatra
http://jspy2013-sinatra.herokuapp.com
Teşekkürler
@ugurozyilmazel
@vigobronx
http://ugur.ozyilmazel.com

Más contenido relacionado

Similar a Merhaba Sinatra

Web Uygulamalarında Kaynak Kod Analizi - 1
Web Uygulamalarında Kaynak Kod Analizi - 1Web Uygulamalarında Kaynak Kod Analizi - 1
Web Uygulamalarında Kaynak Kod Analizi - 1
Mehmet Ince
 
Joomla kursu-eskisehir
Joomla kursu-eskisehirJoomla kursu-eskisehir
Joomla kursu-eskisehir
sersld62
 
Joomla kursu-atasehir
Joomla kursu-atasehirJoomla kursu-atasehir
Joomla kursu-atasehir
sersld62
 
ESRI Turkey User Conf 2009
ESRI Turkey User Conf 2009ESRI Turkey User Conf 2009
ESRI Turkey User Conf 2009
metalalp
 
agem_intern_report
agem_intern_reportagem_intern_report
agem_intern_report
Meliz Ersoy
 

Similar a Merhaba Sinatra (20)

Ajax
AjaxAjax
Ajax
 
Web Onyuzu Nasil Olmali
Web Onyuzu Nasil OlmaliWeb Onyuzu Nasil Olmali
Web Onyuzu Nasil Olmali
 
Mutant Web Applications
Mutant Web ApplicationsMutant Web Applications
Mutant Web Applications
 
Web Uygulamalarında Kaynak Kod Analizi - 1
Web Uygulamalarında Kaynak Kod Analizi - 1Web Uygulamalarında Kaynak Kod Analizi - 1
Web Uygulamalarında Kaynak Kod Analizi - 1
 
Ports and Adapters: Separating concerns in your architecture
Ports and Adapters: Separating concerns in your architecturePorts and Adapters: Separating concerns in your architecture
Ports and Adapters: Separating concerns in your architecture
 
PAROLA KIRMA SALDIRILARI
PAROLA KIRMA SALDIRILARIPAROLA KIRMA SALDIRILARI
PAROLA KIRMA SALDIRILARI
 
Dspace 5.5 Kurulum
Dspace 5.5 KurulumDspace 5.5 Kurulum
Dspace 5.5 Kurulum
 
Java EE Struts
Java EE StrutsJava EE Struts
Java EE Struts
 
Ajax
AjaxAjax
Ajax
 
Joomla kursu-eskisehir
Joomla kursu-eskisehirJoomla kursu-eskisehir
Joomla kursu-eskisehir
 
Richfaces
RichfacesRichfaces
Richfaces
 
Java Web Uygulama Geliştirme
Java Web Uygulama GeliştirmeJava Web Uygulama Geliştirme
Java Web Uygulama Geliştirme
 
Joomla kursu-atasehir
Joomla kursu-atasehirJoomla kursu-atasehir
Joomla kursu-atasehir
 
ESRI Turkey User Conf 2009
ESRI Turkey User Conf 2009ESRI Turkey User Conf 2009
ESRI Turkey User Conf 2009
 
Web
WebWeb
Web
 
agem_intern_report
agem_intern_reportagem_intern_report
agem_intern_report
 
JavaScript sunumu
JavaScript sunumuJavaScript sunumu
JavaScript sunumu
 
Yeni başlayanlar için Laravel
Yeni başlayanlar için Laravel Yeni başlayanlar için Laravel
Yeni başlayanlar için Laravel
 
Ozgur Web Catilari Mobil Uygulama Gelistirme
Ozgur Web Catilari Mobil Uygulama GelistirmeOzgur Web Catilari Mobil Uygulama Gelistirme
Ozgur Web Catilari Mobil Uygulama Gelistirme
 
Seo 101
Seo 101Seo 101
Seo 101
 

Más de Uğur Özyılmazel (6)

Test'le Yürüyen Geliştirme (TDD)
Test'le Yürüyen Geliştirme (TDD)Test'le Yürüyen Geliştirme (TDD)
Test'le Yürüyen Geliştirme (TDD)
 
Vagrant 101
Vagrant 101Vagrant 101
Vagrant 101
 
Yazilimci kimdir?
Yazilimci kimdir?Yazilimci kimdir?
Yazilimci kimdir?
 
Ruby ile tanışma!
Ruby ile tanışma!Ruby ile tanışma!
Ruby ile tanışma!
 
İnsanlar için GIT
İnsanlar için GITİnsanlar için GIT
İnsanlar için GIT
 
Python ve Django'da Test'le Yürüyen Geliştirme
Python ve Django'da Test'le Yürüyen GeliştirmePython ve Django'da Test'le Yürüyen Geliştirme
Python ve Django'da Test'le Yürüyen Geliştirme
 

Merhaba Sinatra