74
Sinatra Past, Present and Future Konstantin Haase

Sinatra: прошлое, будущее и настоящее

  • Upload
    toster

  • View
    1.979

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Sinatra: прошлое, будущее и настоящее

SinatraPast, Present and Future

Konstantin Haase

Page 2: Sinatra: прошлое, будущее и настоящее

Hi!

I'm Konstantin.

I write code.

Page 3: Sinatra: прошлое, будущее и настоящее
Page 4: Sinatra: прошлое, будущее и настоящее
Page 5: Sinatra: прошлое, будущее и настоящее
Page 6: Sinatra: прошлое, будущее и настоящее

Back in the internet, I'm aka'ed as

@konstantinhaase on Titter

rkh on GitHub

khaase on IRC

rkh.im on DNS

Page 7: Sinatra: прошлое, будущее и настоящее
Page 8: Sinatra: прошлое, будущее и настоящее

"The big lesson in life, baby, is neverbe scared of anyone or anything."

Frank Sinatra

Page 9: Sinatra: прошлое, будущее и настоящее

"Outlines are great, quotes areterrible."

Ben Orenstein (Speaking For Hackers)

Page 10: Sinatra: прошлое, будущее и настоящее

Outline

The Past

The Present

The Future

Page 11: Sinatra: прошлое, будущее и настоящее

Let's pretend you don'tknow a thing...

... about Sinatra

... about Rails

... about Rack

Page 12: Sinatra: прошлое, будущее и настоящее

The PastOr: "How We Do HTTP"

Page 13: Sinatra: прошлое, будущее и настоящее

1993

CGI

Page 14: Sinatra: прошлое, будущее и настоящее

#!/usr/bin/env perlprint "Content-type: text/html\n";if ($ENV{"REQUEST_METHOD"} != "HEAD") { print "\n<h1>Hello Perl!</h1>\n"}

Page 15: Sinatra: прошлое, будущее и настоящее

No structure (Hello, inline SQL!)

Enormous performance overhead

No asynchronous/streaming API

Perl? Seriously?

Page 16: Sinatra: прошлое, будущее и настоящее
Page 17: Sinatra: прошлое, будущее и настоящее

December 21, 1995

Ruby 0.95

Page 18: Sinatra: прошлое, будущее и настоящее

#!/usr/bin/env rubyputs "Content-Type: text/html"if ENV["REQUEST_METHOD"] != "HEAD" puts "", "<h1>Hello Ruby!</h1>"end

Page 19: Sinatra: прошлое, будущее и настоящее

Servlets

Page 20: Sinatra: прошлое, будущее и настоящее

require 'webrick'class Simple < WEBrick::HTTPServlet def do_GET(req, res) res.status = 200 res['Content-Type'] = "text/html" res.body = "<h1>Hello Ruby!</h1>" endend

Page 21: Sinatra: прошлое, будущее и настоящее

Not web server independent

No asynchronous/streaming API

Limited eco system

Page 22: Sinatra: прошлое, будущее и настоящее

July 2004

Ruby On Rails

Page 23: Sinatra: прошлое, будущее и настоящее

Oh

My

God!

Page 24: Sinatra: прошлое, будущее и настоящее

Convention Over Configuration�

Do Not Repeat Yourself

Model - View - Controler

Testing

The eco system, oh my!

Page 25: Sinatra: прошлое, будущее и настоящее

Did not play well with others

Framework, not a library

No asynchronous/streaming API

Page 26: Sinatra: прошлое, будущее и настоящее

Summer 2005

I discover Ruby!Woohoo!

Page 27: Sinatra: прошлое, будущее и настоящее

December 13, 2005

Rails 1.0

Page 28: Sinatra: прошлое, будущее и настоящее

March 2007

Rack 0.1

Page 29: Sinatra: прошлое, будущее и настоящее

proc do |env| [200, {"Content-Type" => "text/html"}, ["<h1>Hello Ruby!</h1>"]]end

Page 30: Sinatra: прошлое, будущее и настоящее

The simplest thing possible

Zero dependency applications

Great middleware/router infrastrucutre

Server independent applications

Easy testing

Page 31: Sinatra: прошлое, будущее и настоящее

Near unusable directly

Rails didn't use it

No asynchronous/streaming API

Page 32: Sinatra: прошлое, будущее и настоящее

September 9, 2007

Sinatra 0.0.1

Page 33: Sinatra: прошлое, будущее и настоящее

get('/') { body "Hello World!" }post('/') { erb :posted }

Page 34: Sinatra: прошлое, будущее и настоящее

Simple and clean DSL for writing Rackapplication.

Library, not framework

Plays well with anything Rack

No hidden magic

Page 35: Sinatra: прошлое, будущее и настоящее

Pollutes Object

Uses instance_eval (slow)

No asynchronous/streaming API

One application per process

Page 36: Sinatra: прошлое, будущее и настоящее

October 7, 2007

Sinatra 0.1.0

Page 37: Sinatra: прошлое, будущее и настоящее

October 8, 2007

Sinatra 0.1.5

Page 38: Sinatra: прошлое, будущее и настоящее

before { puts "starting" }get('/') { "Hello World!" }delete('/') { haml :deleted }after { puts "done" }

Page 39: Sinatra: прошлое, будущее и настоящее

November 21, 2007

rm -Rf sinatra

Page 40: Sinatra: прошлое, будущее и настоящее

April 12, 2008

Sinatra 0.2.0(Complete Rewrite)

Page 41: Sinatra: прошлое, будущее и настоящее

before { halt 404 if path !~ /css/ }error(404) { "page not found" }get '/:name.css', :agent => /Firefox/ do sass :firefoxend

Page 42: Sinatra: прошлое, будущее и настоящее

April 14, 2008

rm -Rf sinatra

Page 43: Sinatra: прошлое, будущее и настоящее

September 8, 2008

Sinatra 0.3.0

Page 44: Sinatra: прошлое, будущее и настоящее

use Rack::Lintconfigure { enable :lock }get('/*.css') { sass :style }__END__@@ stylebody color: red

Page 45: Sinatra: прошлое, будущее и настоящее

# config.ruuse SomeMiddlewaremap('/a') { run Sinatra::Application }map('/b') { run Merb::Application }

Page 46: Sinatra: прошлое, будущее и настоящее

December 13, 2008

rm -Rf sinatra

Page 47: Sinatra: прошлое, будущее и настоящее

January 18, 2009

Sinatra 0.9.0

Page 48: Sinatra: прошлое, будущее и настоящее

class MyApp < Sinatra::Base get /js(on)?/, :provides => "json" do pass unless params[:pwd] == "foo" "Hello World".to_json end get "*" do "wrong password, probably" endend

Page 49: Sinatra: прошлое, будущее и настоящее

No more instance_eval for routes

More than one application per process

Page 50: Sinatra: прошлое, будущее и настоящее

March 23, 2010

Sinatra 1.0Major Refactorings since 0.9.0

Page 51: Sinatra: прошлое, будущее и настоящее

Tilt has been extracted

A ton of new helper methods

Semantic Versioning

Page 52: Sinatra: прошлое, будущее и настоящее

April - September 2010

Maintainance crisis

Page 53: Sinatra: прошлое, будущее и настоящее

October 24, 2010

1.1.0

Page 54: Sinatra: прошлое, будущее и настоящее

before agent: /Firefox/ do headers['X-Is-Firefox'] = "yes"endget('/') { markdown "# Hello World!" }

Page 55: Sinatra: прошлое, будущее и настоящее

March 3, 2011

1.2.0Major Refactoring

Page 56: Sinatra: прошлое, будущее и настоящее

Live release at Ruby Use Group Berlin

Better extension API

Better security

Long term support

Page 57: Sinatra: прошлое, будущее и настоящее

September 30, 2011

1.3.0

Page 58: Sinatra: прошлое, будущее и настоящее

Live release at RubyConf in New Orleans

Better HTTP compatibility

Better security (rack-protection)

Stream/asynchronous API, finally!�

Page 59: Sinatra: прошлое, будущее и настоящее

get '/' do stream do |out| out << "It's gonna be legen -\n" sleep 0.5 out << " (wait for it) \n" sleep 1 out << "- dary!\n" endend

Page 60: Sinatra: прошлое, будущее и настоящее

connections = []get '/' do stream(:keep_open) do |out| connections << out endendpost '/' do connections.each do |out| out << params[:message] end "message sent"end

Page 61: Sinatra: прошлое, будущее и настоящее

The Present

Page 62: Sinatra: прошлое, будущее и настоящее

Who's using it?

Travis CI, Integrity, CI Joe

Picky, Resque, Gollum

Heroku, Github, Engine Yard

Songbird, University of Lausanne, Stanford

Apple, LinkedIn, British Government, BBC

...

Page 63: Sinatra: прошлое, будущее и настоящее

It inspired a lot of otherprojects!

Ruby: Almost Sinatra, Astaire, Cuba, Padrino (based on Sinatra), Pakyow,Renee PHP: Fat-Free, Fitzgerald, Glue, klein, Laravel, Limonade,

MiMViC, Silex, Slim JavaScript: Express, Picard, Roundabout, SammyCoffeeScript: Zappa Python: Bottle, Denied, Flask, itty, Juno Erlang:

Fresh, Spooky Groovy: Graffiti, Ratpack �Scala: Scalatra, BlueEyes.NET: Martin, Nancy, Nina Perl: Dancer, Mojolicious Java: Spark,

Napalm, Htmleasy Haskell: Bird, Loli Fancy: Sinatra.fy Bash: Astley,sh.inatra C: Bogart F#: Frank Lua: Mercury, Orbit Mirah: Shatner

Objective-C: RCRouter Vala: Valatra Smalltalk: RatPack

That's 52 projects in 20 languages.

Page 64: Sinatra: прошлое, будущее и настоящее

The Future

Page 65: Sinatra: прошлое, будущее и настоящее

2012

Sinatra 1.4.0

Page 66: Sinatra: прошлое, будущее и настоящее

No longer pollute Object

Page 67: Sinatra: прошлое, будущее и настоящее

# Sinatra since 0.9.0include Sinatra::Delegator10.send(:get, '/') do "this works, but it shouldn't"end

Page 68: Sinatra: прошлое, будущее и настоящее

def foo 42endfoo # => 42"hi there".foo # => 42

Page 69: Sinatra: прошлое, будущее и настоящее

self # => maindef self.foo 42endfoo # => 42"hi there".foo # NoMethodError

Page 70: Sinatra: прошлое, будущее и настоящее

class << self include Sinatra::Delegatorend10.send(:get, '/') do "Now this raises a NoMethodError"end

Page 71: Sinatra: прошлое, будущее и настоящее

extend Sinatra::Delegator10.send(:get, '/') do "Now this raises a NoMethodError"end

Page 72: Sinatra: прошлое, будущее и настоящее

some day

Sinatra 2.0

Page 73: Sinatra: прошлое, будущее и настоящее

Use successor of Rack (code name Ponies)

rm -Rf sinatra?

Page 74: Sinatra: прошлое, будущее и настоящее

Thanks!github.com / rkh / presentations