merb day keynote
TRANSCRIPT
![Page 1: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/1.jpg)
Merb 2.0
The long march into the future
![Page 2: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/2.jpg)
Core Merb Principles
![Page 3: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/3.jpg)
In Depth
![Page 4: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/4.jpg)
Performance
![Page 5: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/5.jpg)
Requests Per Second
![Page 6: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/6.jpg)
Thin Mongrel
![Page 7: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/7.jpg)
run proc do |env| [ 200, {"Content-Type" => "text/html"}, "Hello from rack" ]end
![Page 8: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/8.jpg)
class QuickApp def call(env) [ 200, {"Content-Type" => "text/html"}, "Hello from rack" ] endend
run QuickApp.new
![Page 9: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/9.jpg)
class QuickApp def call(env) [ 200, {"Content-Type" => "text/html"}, "Hello from rack" ] endend
run QuickApp.new
![Page 10: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/10.jpg)
Thin Mongrel
![Page 11: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/11.jpg)
match("/router").defer_to do |req, res| [ 200, {"Content-Type" => "text/html"}, "Hello" ]end
![Page 12: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/12.jpg)
Thin Mongrel
![Page 13: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/13.jpg)
class MyApp < Application def string "String" end end
![Page 14: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/14.jpg)
class MyApp < Application def string "String" end end
![Page 15: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/15.jpg)
Thin Mongrel
![Page 16: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/16.jpg)
class MyApp < Application
def index render end def string "String" end end
![Page 17: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/17.jpg)
class MyApp < Application
def index render end def string "String" end end
![Page 18: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/18.jpg)
Close to the metal as possible
![Page 19: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/19.jpg)
Close to the metal as you want
![Page 20: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/20.jpg)
Performance Testing
![Page 21: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/21.jpg)
KCacheGrind
![Page 22: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/22.jpg)
use Merb::Rack::Profile
![Page 23: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/23.jpg)
profile/url/callgrind.out.time
![Page 24: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/24.jpg)
5% or greater
![Page 25: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/25.jpg)
10% or greater
![Page 26: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/26.jpg)
Merb::RenderMixin::_get_layout10.05 %
10% or greater
![Page 27: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/27.jpg)
Mini-demo
![Page 28: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/28.jpg)
Concurrency
![Page 29: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/29.jpg)
0
4
8
12
16
20
1 2 4 8 16 32
Ideal concurrency curve
![Page 30: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/30.jpg)
1 request in 16ms (16ms/req)
![Page 31: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/31.jpg)
2 requests in 16ms (8ms/req)
![Page 32: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/32.jpg)
4 requests in 16ms (4ms/req)
![Page 33: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/33.jpg)
8 requests in 16ms (2ms/req)
![Page 34: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/34.jpg)
16 requests in 16ms (1ms/req)
![Page 35: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/35.jpg)
32 requests in 16ms (2req/ms)
![Page 36: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/36.jpg)
0
4
8
12
16
20
1 2 4 8 16 32
Ideal concurrency curve
![Page 37: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/37.jpg)
0
3.75
7.50
11.25
15.00
1 2 4 8 16 32
Chart 10
Merb MRI concurrency curve
![Page 38: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/38.jpg)
0
3.75
7.50
11.25
15.00
1 2 4 8 16 32
Chart 12
Merb JRuby (Mongrel) concurrency curve
![Page 39: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/39.jpg)
0
3.75
7.50
11.25
15.00
1 2 4 8 16 32 64 128 256
Chart 13
Merb Glassfish concurrency curve
![Page 40: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/40.jpg)
0
3.75
7.50
11.25
15.00
1 2 4 8 16 32 64 128 256
Chart 13
Not ideal
![Page 41: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/41.jpg)
0
3.75
7.50
11.25
15.00
1 2 4 8 16 32 64 128 256
Chart 13
Not ideal
![Page 42: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/42.jpg)
0
3.75
7.50
11.25
15.00
1 2 4 8 16 32 64 128 256
Chart 13
Not ideal (but it works)
![Page 43: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/43.jpg)
0
3.75
7.50
11.25
15.00
1 2 4 8 16 32 64 128 256
Chart 13
Not ideal (but it works)
![Page 44: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/44.jpg)
Threadsafety
![Page 45: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/45.jpg)
Merb::Config[:use_mutex]
![Page 46: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/46.jpg)
class User cattr_accessor :currentend
class Foo < Merb::Controller before do User.current = session.user endend
![Page 47: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/47.jpg)
class User cattr_accessor :currentend
class Foo < Merb::Controller before do User.current = session.user endend
FAIL
![Page 48: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/48.jpg)
Shared state hurts puppies
![Page 49: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/49.jpg)
Solutions
![Page 50: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/50.jpg)
Thread-local
![Page 51: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/51.jpg)
class User def self.current=(user) Thread.current[:user] = user end def self.current Thread.current[:user] endend
class Foo < Merb::Controller before do User.current = session.user endend
![Page 52: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/52.jpg)
Using a Hash across threads
![Page 53: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/53.jpg)
Hash {:x => 5}
![Page 54: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/54.jpg)
Thread 1 Thread 2
Hash {:x => 5}
![Page 55: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/55.jpg)
Thread 1 Thread 2
Hash {:x => 5}
![Page 56: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/56.jpg)
Thread 1 Thread 2
Read x
Hash {:x => 5}
![Page 57: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/57.jpg)
Thread 1 Thread 2
Read x Write x=”1”
Hash {:x => 5}
![Page 58: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/58.jpg)
Thread 1 Thread 2
Read x Write x=”1”
clear x
Hash {:x => 5}
![Page 59: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/59.jpg)
Thread 1 Thread 2
Read x Write x=”1”
clear x
is there an x?
Hash {:x => 5}
![Page 60: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/60.jpg)
Thread 1 Thread 2
Read x Write x=”1”
clear x
is there an x?
x = 1no? return nil
Hash {:x => 5}
![Page 61: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/61.jpg)
Mutex
![Page 62: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/62.jpg)
Hash {:x => 5}
![Page 63: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/63.jpg)
Thread 1 Thread 2
Hash {:x => 5}
![Page 64: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/64.jpg)
Thread 1 Thread 2
Read x
is there an x?
yes? return 5
Hash {:x => 5}
![Page 65: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/65.jpg)
Thread 1 Thread 2
Write x=”1”
clear x
x = 1
Read x
is there an x?
yes? return 5
Hash {:x => 5}
![Page 66: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/66.jpg)
Hash {:x => 5}
![Page 67: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/67.jpg)
Thread 1 Thread 2
Hash {:x => 5}
![Page 68: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/68.jpg)
Thread 1 Thread 2
Write x=”1”
clear x
x = 1
Hash {:x => 5}
![Page 69: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/69.jpg)
Thread 1 Thread 2
Write x=”1”
clear x
x = 1
Read x
is there an x?
yes? return 1
Hash {:x => 5}
![Page 70: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/70.jpg)
Mutexes make non-atomic operations atomic
![Page 71: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/71.jpg)
Modularity
![Page 72: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/72.jpg)
merb_gems_version = "1.0.4"dm_gems_version = "0.9.7"
dependency "merb-action-args", merb_gems_versiondependency "merb-assets", merb_gems_version dependency "merb-cache", merb_gems_version dependency "merb-helpers", merb_gems_version dependency "merb-mailer", merb_gems_version dependency "merb-slices", merb_gems_version dependency "merb-auth-core", merb_gems_versiondependency "merb-auth-more", merb_gems_versiondependency "merb-auth-slice-password", merb_gems_versiondependency "merb-param-protection", merb_gems_versiondependency "merb-exceptions", merb_gems_version dependency "dm-core", dm_gems_version dependency "dm-aggregates", dm_gems_version dependency "dm-migrations", dm_gems_version dependency "dm-timestamps", dm_gems_version dependency "dm-types", dm_gems_version dependency "dm-validations", dm_gems_version
![Page 73: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/73.jpg)
merb_gems_version = "1.0.4"dm_gems_version = "0.9.7"
dependency "merb-action-args", merb_gems_versiondependency "merb-assets", merb_gems_version dependency "merb-cache", merb_gems_version dependency "merb-helpers", merb_gems_version dependency "merb-mailer", merb_gems_version dependency "merb-slices", merb_gems_version dependency "merb-auth-core", merb_gems_versiondependency "merb-auth-more", merb_gems_versiondependency "merb-auth-slice-password", merb_gems_versiondependency "merb-param-protection", merb_gems_versiondependency "merb-exceptions", merb_gems_version dependency "dm-core", dm_gems_version dependency "dm-aggregates", dm_gems_version dependency "dm-migrations", dm_gems_version dependency "dm-timestamps", dm_gems_version dependency "dm-types", dm_gems_version dependency "dm-validations", dm_gems_version
![Page 74: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/74.jpg)
merb_gems_version = "1.0.4"dm_gems_version = "0.9.7"
dependency "merb-action-args", merb_gems_versiondependency "merb-assets", merb_gems_version dependency "merb-cache", merb_gems_version dependency "merb-helpers", merb_gems_version dependency "merb-mailer", merb_gems_version dependency "merb-slices", merb_gems_version dependency "merb-auth-core", merb_gems_versiondependency "merb-auth-more", merb_gems_versiondependency "merb-auth-slice-password", merb_gems_versiondependency "merb-param-protection", merb_gems_versiondependency "merb-exceptions", merb_gems_version dependency "dm-core", dm_gems_version dependency "dm-aggregates", dm_gems_version dependency "dm-migrations", dm_gems_version dependency "dm-timestamps", dm_gems_version dependency "dm-types", dm_gems_version dependency "dm-validations", dm_gems_version
![Page 75: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/75.jpg)
merb_gems_version = "1.0.4"dm_gems_version = "0.9.7"
dependency "merb-action-args", merb_gems_versiondependency "merb-assets", merb_gems_version dependency "merb-cache", merb_gems_version dependency "merb-helpers", merb_gems_version dependency "merb-mailer", merb_gems_version dependency "merb-slices", merb_gems_version dependency "merb-auth-core", merb_gems_versiondependency "merb-auth-more", merb_gems_versiondependency "merb-auth-slice-password", merb_gems_versiondependency "merb-param-protection", merb_gems_versiondependency "merb-exceptions", merb_gems_version dependency "dm-core", dm_gems_version dependency "dm-aggregates", dm_gems_version dependency "dm-migrations", dm_gems_version dependency "dm-timestamps", dm_gems_version dependency "dm-types", dm_gems_version dependency "dm-validations", dm_gems_version
JRuby 1.1.4
![Page 76: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/76.jpg)
merb_gems_version = "1.0.4"dm_gems_version = "0.9.7"
dependency "merb-action-args", merb_gems_versiondependency "merb-assets", merb_gems_version dependency "merb-cache", merb_gems_version dependency "merb-helpers", merb_gems_version dependency "merb-mailer", merb_gems_version dependency "merb-slices", merb_gems_version dependency "merb-auth-core", merb_gems_versiondependency "merb-auth-more", merb_gems_versiondependency "merb-auth-slice-password", merb_gems_versiondependency "merb-param-protection", merb_gems_versiondependency "merb-exceptions", merb_gems_version dependency "dm-core", dm_gems_version dependency "dm-aggregates", dm_gems_version dependency "dm-migrations", dm_gems_version dependency "dm-timestamps", dm_gems_version dependency "dm-types", dm_gems_version dependency "dm-validations", dm_gems_version
![Page 77: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/77.jpg)
merb_gems_version = "1.0.4"dm_gems_version = "0.9.7"
dependency "merb-action-args", merb_gems_versiondependency "merb-assets", merb_gems_version dependency "merb-cache", merb_gems_version dependency "merb-helpers", merb_gems_version dependency "merb-mailer", merb_gems_version dependency "merb-slices", merb_gems_version dependency "merb-auth-core", merb_gems_versiondependency "merb-auth-more", merb_gems_versiondependency "merb-auth-slice-password", merb_gems_versiondependency "merb-param-protection", merb_gems_versiondependency "merb-exceptions", merb_gems_version dependency "dm-core", dm_gems_version dependency "dm-aggregates", dm_gems_version dependency "dm-migrations", dm_gems_version dependency "dm-timestamps", dm_gems_version dependency "dm-types", dm_gems_version dependency "dm-validations", dm_gems_version
JRuby 1.1.5+
![Page 78: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/78.jpg)
@overridable
![Page 79: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/79.jpg)
# This is a stub method so plugins can # implement param filtering if they want.## ==== Parameters# params<Hash{Symbol => String}>:: # A list of params## ==== Returns# Hash{Symbol => String}:: # A new list of params, filtered as desired# # :api: plugin# @overridabledef self._filter_params(params) paramsend
![Page 80: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/80.jpg)
class Articles < Application params_accessible :article => [:title, :body]end
![Page 81: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/81.jpg)
class Articles < Application params_accessible :article => [:title, :body]end
![Page 82: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/82.jpg)
class Articles < Application def self._filter_params(params) # deep_clone ret = Marshal.load(Marshal.dump(params))
ret[:post].reject! do |k,v| !k.in?(:title, :body) end endend
![Page 83: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/83.jpg)
class Articles < Application def self._filter_params(params) # deep_clone ret = Marshal.load(Marshal.dump(params))
ret[:post].reject! do |k,v| !k.in?(:title, :body) end endend
![Page 84: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/84.jpg)
# :api: public# @overridabledef _template_location(ctx, type, ctrlr) _conditionally_append_extension( ctrlr ? "#{ctrlr}/#{ctx}" : "#{ctx}", type)end
![Page 85: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/85.jpg)
class Articles < Application def self._template_location( ctx, type, ctrlr)
"#{ctrlr}.#{ctx}.#{type}" endend
![Page 86: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/86.jpg)
class Articles < Application def self._template_location( ctx, type, ctrlr)
"#{ctrlr}.#{ctx}.#{type}" endend
![Page 87: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/87.jpg)
class Articles < Application def self._template_location( ctx, type, ctrlr)
"#{ctrlr}.#{ctx}.#{type}" endend
controller = “layout”
![Page 88: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/88.jpg)
class Articles < Application self.template_roots = [ [ Merb.root / "app" / "views", :_template_location ], [ Merb.root / "my_views", :_my_template_location ] ]end
![Page 89: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/89.jpg)
>> MerbAuthSlicePassword::Sessions.template_roots#=> [["/Users/wycats/Code/wycats/test/awesome/app/views", :_template_location], ["/Library/Ruby/Gems/1.8/gems/merb-auth-slice-password-1.0.4/app/views", :_slice_template_location], ["/Users/wycats/Code/wycats/test/awesome/slices/merb-auth-slice-password/app/views", :_slice_template_location]]
![Page 90: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/90.jpg)
>> MerbAuthSlicePassword::Sessions.template_roots#=> [["/Users/wycats/Code/wycats/test/awesome/app/views", :_template_location], ["/Library/Ruby/Gems/1.8/gems/merb-auth-slice-password-1.0.4/app/views", :_slice_template_location], ["/Users/wycats/Code/wycats/test/awesome/slices/merb-auth-slice-password/app/views", :_slice_template_location]]
![Page 91: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/91.jpg)
>> MerbAuthSlicePassword::Sessions.template_roots#=> [["/Users/wycats/Code/wycats/test/awesome/app/views", :_template_location], ["/Library/Ruby/Gems/1.8/gems/merb-auth-slice-password-1.0.4/app/views", :_slice_template_location], ["/Users/wycats/Code/wycats/test/awesome/slices/merb-auth-slice-password/app/views", :_slice_template_location]]
![Page 92: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/92.jpg)
>> MerbAuthSlicePassword::Sessions.template_roots#=> [["/Users/wycats/Code/wycats/test/awesome/app/views", :_template_location], ["/Library/Ruby/Gems/1.8/gems/merb-auth-slice-password-1.0.4/app/views", :_slice_template_location], ["/Users/wycats/Code/wycats/test/awesome/slices/merb-auth-slice-password/app/views", :_slice_template_location]]
![Page 93: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/93.jpg)
>> MerbAuthSlicePassword::Sessions.template_roots#=> [["/Users/wycats/Code/wycats/test/awesome/app/views", :_template_location], ["/Library/Ruby/Gems/1.8/gems/merb-auth-slice-password-1.0.4/app/views", :_slice_template_location], ["/Users/wycats/Code/wycats/test/awesome/slices/merb-auth-slice-password/app/views", :_slice_template_location]]
![Page 94: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/94.jpg)
>> MerbAuthSlicePassword::Sessions.template_roots#=> [["/Users/wycats/Code/wycats/test/awesome/app/views", :_template_location], ["/Library/Ruby/Gems/1.8/gems/merb-auth-slice-password-1.0.4/app/views", :_slice_template_location], ["/Users/wycats/Code/wycats/test/awesome/slices/merb-auth-slice-password/app/views", :_slice_template_location]]
![Page 95: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/95.jpg)
>> MerbAuthSlicePassword::Sessions.template_roots#=> [["/Users/wycats/Code/wycats/test/awesome/app/views", :_template_location], ["/Library/Ruby/Gems/1.8/gems/merb-auth-slice-password-1.0.4/app/views", :_slice_template_location], ["/Users/wycats/Code/wycats/test/awesome/slices/merb-auth-slice-password/app/views", :_slice_template_location]]
![Page 96: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/96.jpg)
def _slice_template_location(ctx, type, ctrlr) if ctrlr && ctrlr.include?('/') # skip first segment if given (which is the module name) segments = ctrlr.split('/') "#{segments[1,segments.length-1].join('/')}/#{ctx}.#{type}" else # default template location logic _template_location(ctx, type, ctrlr) endend
![Page 97: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/97.jpg)
Templates
![Page 98: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/98.jpg)
def load_template_io(path) file = Dir[ "#{path}.{#{template_extensions.join(',')}}" ].first File.open(file, "r") if fileend
![Page 99: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/99.jpg)
def load_template_io(path) templates = { Merb.root / "app" / "views" / "template_io" / "index.html.erb" => "Hello world", Merb.root / "app" / "views" / "template_io" / "two.html.erb" => "Two" }
if templates[path + ".erb"] VirtualFile.new(templates[path + ".erb"], path + ".erb") else file = Dir[ "#{path}.{#{template_extensions.join(',')}}" ].first File.open(file, "r") if file endend
![Page 100: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/100.jpg)
Merb::Router.prepare {default_routes}
class TemplateIo < Merb::Controller def index render end def two render endend
![Page 101: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/101.jpg)
Quick demo
![Page 102: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/102.jpg)
Good Ruby citizen
![Page 103: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/103.jpg)
Rubygems
![Page 104: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/104.jpg)
Rubygems :(
![Page 105: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/105.jpg)
Rubygems -- but getting :)
![Page 106: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/106.jpg)
Working with community == helping the community
![Page 107: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/107.jpg)
Rack
![Page 108: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/108.jpg)
Rack middleware
![Page 109: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/109.jpg)
Where is this going?
![Page 110: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/110.jpg)
Apps as a first-class concept
![Page 111: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/111.jpg)
module MyApp class TemplateIo < Application def index render end def two render end endend
![Page 112: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/112.jpg)
module MyApp class TemplateIo < Application def index render end def two render end endend
![Page 113: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/113.jpg)
module MyApp class TemplateIo < Application def index render end def two render end endend
MyApp::Application
![Page 114: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/114.jpg)
module MyApp extend Merb::App mount ::Blog, :at => "/blog" Config[:framework] = flatend
![Page 115: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/115.jpg)
Blog::Config[:log_delimiter] = "BLOG: "
![Page 116: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/116.jpg)
Admin Application/Framework
![Page 117: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/117.jpg)
CMS Application
![Page 118: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/118.jpg)
DB Admin Application
![Page 119: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/119.jpg)
Slices on Steroids
![Page 120: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/120.jpg)
Resources as a first-class concept
![Page 121: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/121.jpg)
module MyApp class Resource < Merb::Resource def list(klass) klass.all end def get(klass, ids) klass.get(ids) end def authorized?(namespace, *args) user == "wycats" end
def user request.session.user end endend
![Page 122: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/122.jpg)
![Page 123: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/123.jpg)
Why?
![Page 124: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/124.jpg)
DRYing up common idioms
![Page 125: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/125.jpg)
Increasing flexibility (where needed)
![Page 126: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/126.jpg)
Core principle:Simple cases can’t get harder
![Page 127: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/127.jpg)
Further improve merb server
![Page 128: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/128.jpg)
Short term
![Page 129: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/129.jpg)
Long term
![Page 130: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/130.jpg)
Dynamic worker pools
![Page 131: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/131.jpg)
Remove need for nginx
![Page 132: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/132.jpg)
Self-managing cluster
![Page 133: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/133.jpg)
Additional modules
![Page 134: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/134.jpg)
i18n
![Page 135: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/135.jpg)
l10n
![Page 136: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/136.jpg)
Feed syndication
![Page 137: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/137.jpg)
Flat pages
![Page 138: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/138.jpg)
More powerful router
![Page 139: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/139.jpg)
Router directly to a view
![Page 140: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/140.jpg)
even better resource()
![Page 141: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/141.jpg)
Framework for OSS Apps
![Page 142: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/142.jpg)
Authentication
![Page 143: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/143.jpg)
User Management
![Page 144: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/144.jpg)
Authorization
![Page 145: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/145.jpg)
Note:Communication primitives
![Page 146: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/146.jpg)
Tailored stacks
![Page 147: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/147.jpg)
Designers
![Page 148: Merb Day Keynote](https://reader035.vdocument.in/reader035/viewer/2022081400/55592f9fd8b42a543d8b4898/html5/thumbnails/148.jpg)
Web shops