Merb
description
Transcript of Merb
![Page 1: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/1.jpg)
MerbDesenvolvimento Web com Ruby sem Rails
Danilo SatoThoughtWorks UKwww.dtsato.com
![Page 2: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/2.jpg)
Merb?
![Page 3: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/3.jpg)
Rails não escala!
![Page 4: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/4.jpg)
![Page 5: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/5.jpg)
Aviso:Eu sou fã de Rails
![Page 6: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/6.jpg)
Lembram?
![Page 7: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/7.jpg)
Não é bem
assim…
![Page 8: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/8.jpg)
Rails = Revolução• Mudou a forma de encarar o desenvolvimento
Web• Opinionated:– Testes– Migrations– Convention over Configuration– DRY
![Page 9: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/9.jpg)
Opinião forte• Estrutura da aplicação
![Page 10: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/10.jpg)
Opinião forte• Estrutura da aplicação• MVC
![Page 11: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/11.jpg)
Opinião forte• Estrutura da aplicação• MVC• AJAX: Script.aculo.us / Prototype
![Page 12: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/12.jpg)
Opinião forte• Estrutura da aplicação• MVC• AJAX: Script.aculo.us / Prototype• ORM: ActiveRecord
![Page 13: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/13.jpg)
Opinião forte• Estrutura da aplicação• MVC• AJAX: Script.aculo.us / Prototype• ORM: ActiveRecord• Testes: Test::Unit– unit / functional / integration
![Page 14: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/14.jpg)
Opinião forte• Estrutura da aplicação• MVC• AJAX: Script.aculo.us / Prototype• ORM: ActiveRecord• Testes: Test::Unit– unit / functional / integration
• Mailer/ActiveResource/ActiveSupport/…
![Page 15: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/15.jpg)
Perfeito para Iniciantes• Modelo de Dreyfus:– Iniciante Práticas e Regras independentes de
contexto
![Page 16: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/16.jpg)
Perfeito para Iniciantes• Modelo de Dreyfus:– Iniciante Práticas e Regras independentes de
contexto – Competente Contexto é importante, mas sem prioridade
![Page 17: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/17.jpg)
Perfeito para Iniciantes• Modelo de Dreyfus:– Iniciante Práticas e Regras independentes de
contexto – Competente Contexto é importante, mas sem prioridade
– Proficiente Contexto interpretado de forma holística
![Page 18: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/18.jpg)
Perfeito para Iniciantes• Modelo de Dreyfus:– Iniciante Práticas e Regras independentes de
contexto – Competente Contexto é importante, mas sem prioridade
– Proficiente Contexto interpretado de forma holística
– Expert Decisões baseadas na intuição
![Page 19: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/19.jpg)
Perfeito para Iniciantes• Modelo de Dreyfus:– Iniciante Práticas e Regras independentes de
contexto – Competente Contexto é importante, mas sem prioridade
– Proficiente Contexto interpretado de forma holística
– Expert Decisões baseadas na intuição
– Mestre Ações sem prestar atenção na consciência
![Page 20: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/20.jpg)
Mas e se quero algo diferente?
Fugir do padrão é difícil, mas não impossível
![Page 21: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/21.jpg)
Merb• Framework web MVC em Ruby• Desenvolvido pelo Ezra– EngineYard– Brincando com Mongrel Handlers
• Mongrel + Erb
![Page 22: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/22.jpg)
Menos mágica×Symbol.to_proc (&:color)
![Page 23: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/23.jpg)
Menos mágica×Symbol.to_proc (&:color)×returning {}
![Page 24: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/24.jpg)
Menos mágica×Symbol.to_proc (&:color)×returning {}×Active Support:
![Page 25: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/25.jpg)
Menos mágica×Symbol.to_proc (&:color)×returning {}×Active Support:
×distance_of_time_in_words_to_now
![Page 26: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/26.jpg)
Menos mágica×Symbol.to_proc (&:color)×returning {}×Active Support:
×distance_of_time_in_words_to_now×auto_link_email_addresses
![Page 27: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/27.jpg)
Menos mágica×Symbol.to_proc (&:color)×returning {}×Active Support:
×distance_of_time_in_words_to_now×auto_link_email_addresses×cycle
![Page 28: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/28.jpg)
Flexível• merb-core
![Page 29: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/29.jpg)
Flexível• merb-core• merb-more–merb-action-args /merb-assets–merb-builder / merb-cache–merb-freezer / merb-gen–merb-haml / merb-mailer–merb-parts / merb-slices
![Page 30: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/30.jpg)
Rack• Ebb• Evented Mongrel• FastCGI• Mongrel• Thin• Webrick
![Page 31: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/31.jpg)
Leve
Rails Merb Core Merb MoreLOC LOC (Testes)
OBS:•Linhas de Código desconsiderando comentários e linhas em branco•Rails 2.1.0 vs. Merb-0.9.3•Script adaptado de code_statistics.rb (usado no Rails para fazer rake:stats)
![Page 32: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/32.jpg)
Leve
Rails Merb Core Merb MoreLOC 55393
LOC (Testes) 37639
OBS:•Linhas de Código desconsiderando comentários e linhas em branco•Rails 2.1.0 vs. Merb-0.9.3•Script adaptado de code_statistics.rb (usado no Rails para fazer rake:stats)
![Page 33: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/33.jpg)
Leve
Rails Merb Core Merb MoreLOC 55393 5406 1774
LOC (Testes) 37639 4529 1184
OBS:•Linhas de Código desconsiderando comentários e linhas em branco•Rails 2.1.0 vs. Merb-0.9.3•Script adaptado de code_statistics.rb (usado no Rails para fazer rake:stats)
![Page 34: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/34.jpg)
Rápido• Thread-safe
![Page 35: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/35.jpg)
Rápido• Thread-safe• Consegue atender requisições sem bloquear
![Page 36: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/36.jpg)
Rápido• Thread-safe• Consegue atender requisições sem bloquear• “Benchmark” (replies/s):
Fonte: http://www.trawlr.com/items/5757847-rails-or-merb-what-s-best-for-you
Mínimo Média Máximo D.P.
Rails
Merb
![Page 37: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/37.jpg)
Rápido• Thread-safe• Consegue atender requisições sem bloquear• “Benchmark” (replies/s):
Fonte: http://www.trawlr.com/items/5757847-rails-or-merb-what-s-best-for-you
Mínimo Média Máximo D.P.
Rails 0.0 43.4 75.2 30.8
Merb
![Page 38: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/38.jpg)
Rápido• Thread-safe• Consegue atender requisições sem bloquear• “Benchmark” (replies/s):
Fonte: http://www.trawlr.com/items/5757847-rails-or-merb-what-s-best-for-you
Mínimo Média Máximo D.P.
Rails 0.0 43.4 75.2 30.8
Merb 0.0 73.3 143.0 65.8
![Page 39: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/39.jpg)
A vida fora do Mutex
![Page 40: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/40.jpg)
O famoso exemplo• Upload de arquivo:– Operação demorada– Rails padrão bloqueia até terminar de responder
![Page 41: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/41.jpg)
O famoso exemplo• Upload de arquivo:– Operação demorada– Rails padrão bloqueia até terminar de responder– Isso significa:• Mongrel não responde mais nenhuma requisição!
![Page 42: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/42.jpg)
O famoso exemplo• Upload de arquivo:– Operação demorada– Rails padrão bloqueia até terminar de responder– Isso significa:
• Mongrel não responde mais nenhuma requisição!– Soluções:
• BackgroundDb• Custom Mongrel Handler• …
![Page 43: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/43.jpg)
LockRails (dispatcher.rb)
![Page 44: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/44.jpg)
LockRails (dispatcher.rb)
![Page 45: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/45.jpg)
Lock• Rails segura o mutex antes de:– Determinar o roteamento– Atender a requisição
![Page 46: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/46.jpg)
Lock• Rails segura o mutex antes de:– Determinar o roteamento– Atender a requisição
• Algoritmo de rotas no Rails:– Não thread-safe– ~ 1100 linhas de código complexo
![Page 47: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/47.jpg)
Lock• Rails segura o mutex antes de:– Determinar o roteamento– Atender a requisição
• Algoritmo de rotas no Rails:– Não thread-safe– ~ 1100 linhas de código complexo
• ActiveRecord
![Page 48: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/48.jpg)
Lock• Algoritmo de rotas no Merb:– ~ 600 linhas de código complexo– Thread-safe• Não é executado dentro do mutex
![Page 49: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/49.jpg)
Lock• Algoritmo de rotas no Merb:– ~ 600 linhas de código complexo– Thread-safe• Não é executado dentro do mutex
• Não acoplado ao ActiveRecord
![Page 50: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/50.jpg)
Lock• Algoritmo de rotas no Merb:– ~ 600 linhas de código complexo– Thread-safe• Não é executado dentro do mutex
• Não acoplado ao ActiveRecord
![Page 51: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/51.jpg)
Coisas legais no Merb
![Page 52: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/52.jpg)
Retorno da action flexível• render:– String– Template (formato, status_code, layout)
• redirect• proc:– Libera o mutex e continua executando o bloco
![Page 53: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/53.jpg)
Exemplo
![Page 54: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/54.jpg)
render_deferred• Recebe um bloco que será executado fora do
mutex
![Page 55: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/55.jpg)
render_then_call• Renderiza a String e executa o bloco for a do
mutex
![Page 56: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/56.jpg)
render_chunked• Um bloco que enviará pedaços de dados cada
vez que for chamado
Teste no Firefox para ver os “pedaços” chegando aos poucos
![Page 57: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/57.jpg)
Rotas Flexíveis• Padrão
![Page 58: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/58.jpg)
Rotas Flexíveis• Padrão• Subdomains
![Page 59: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/59.jpg)
Rotas Flexíveis• Padrão• Subdomains• RESTful
![Page 60: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/60.jpg)
Rotas Flexíveis• Padrão• Subdomains• RESTful• Aninhadas
![Page 61: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/61.jpg)
Rotas Flexíveis• Padrão• Subdomains• RESTful• Aninhadas• Regex
![Page 62: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/62.jpg)
Rotas Flexíveis• Padrão• Subdomains• RESTful• Aninhadas• Regex• Ver rotas
![Page 63: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/63.jpg)
Plugins são Gems!– merb_activerecord / merb_datamapper / merb_sequel– merb_helpers– merb_param_protection– merb_stories / merb_test_unit– merb_has_flash– merb-auth / merbful_authentication– merb_paginate– …– http://wiki.merbivore.com/pages/plugins
![Page 64: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/64.jpg)
Estrutura da Aplicação• Padrão
![Page 65: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/65.jpg)
Estrutura da Aplicação• Padrão• Flat
![Page 66: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/66.jpg)
Estrutura da Aplicação• Padrão• Flat• Very Flat
![Page 67: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/67.jpg)
Migrar do Rails é fácil
![Page 68: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/68.jpg)
Coisas não tão legais no Merb
![Page 69: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/69.jpg)
Lembram?
![Page 70: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/70.jpg)
Merb??
![Page 71: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/71.jpg)
Mas…• O código é legível• Documentação está crescendo:– http://www.merbivore.org– http://www.merbunity.com– http://wiki.merbivore.com
• Livros:– http://peepcode.com/products/meet-merb-pdf-draft – http://manning.com/ivey (em breve) – http://merb.4ninjas.org (online - em desenvolvimento)
![Page 72: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/72.jpg)
Imaturo• Ainda não chegou na versão 1.0• Menos tempo de vida• Comunidade menor• Bem menos plugins
![Page 73: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/73.jpg)
Conclusão
![Page 74: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/74.jpg)
Resumo• Merb:– Menos mágica– Flexível– Leve– Rápido– Familiar para quem conhece Rails– Em desenvolvimento…
![Page 75: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/75.jpg)
Rails ou Merb?• Depende • Rails é melhor para iniciantes• Merb é para quem gosta de “brincar” com
coisas novas
![Page 76: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/76.jpg)
Use a ferramenta certa!• Tem muito mais (só em Ruby):– Ramaze– Sinatra– Camping– Nitro– IOWA– …
![Page 77: Merb](https://reader035.fdocuments.net/reader035/viewer/2022070417/5681557b550346895dc341c8/html5/thumbnails/77.jpg)
MerbDesenvolvimento Web com Ruby sem Rails
Danilo SatoThoughtWorks UKwww.dtsato.com