Upgrade to Pro — share decks privately, control downloads, hide ads and more …

gems, executáveis e configurações

5a90a67fa1a92e6a4b605cfd8da5e375?s=47 Lucas Mazza
September 18, 2015

gems, executáveis e configurações

5a90a67fa1a92e6a4b605cfd8da5e375?s=128

Lucas Mazza

September 18, 2015
Tweet

Transcript

  1. gems, executáveis e configurações

  2. @lucasmazza

  3. https:/ /sp.femug.com https:/ /github.com/braziljs/femug

  4. None
  5. None
  6. Funcionalidades

  7. Ferramental Funcionalidades

  8. Ninguém sabe ¯\_( Ferramental Funcionalidades

  9. Ninguém sabe ¯\_( Ferramental Funcionalidades #SCIENCE

  10. Ninguém sabe ¯\_( Ferramental Funcionalidades #SCIENCE

  11. Frameworks Gems CLIs Provisionadores Versionamento Servers de build Linters e

    analisadores de sintaxe Performance …
  12. “A carpenter is only as good as their tools.”

  13. None
  14. None
  15. None
  16. gems

  17. executáveis

  18. configurações

  19. gems

  20. Você sabe o que a sua aplicação está fazendo agora?

  21. None
  22. GET /orders

  23. GET /orders SELECT * FROM orders WHERE user_id = ?

  24. GET /orders orders/index.html.erb SELECT * FROM orders WHERE user_id =

    ?
  25. None
  26. GET /orders

  27. GET /orders GET /oauth/tokens

  28. GET /orders SELECT * FROM orders WHERE user_id = ?

    GET /oauth/tokens
  29. GET /orders SELECT * FROM orders WHERE user_id = ?

    GET /oauth/tokens redis GET cache/orders/12893128739
  30. GET /orders SELECT * FROM orders WHERE user_id = ?

    GET /oauth/tokens redis SADD queues:default ‘{job: “…”}’ redis GET cache/orders/12893128739
  31. GET /orders SELECT * FROM orders WHERE user_id = ?

    GET /oauth/tokens redis SADD queues:default ‘{job: “…”}’ ☕☕☕ redis GET cache/orders/12893128739
  32. GET /orders orders/index.html.erb SELECT * FROM orders WHERE user_id =

    ? GET /oauth/tokens redis SADD queues:default ‘{job: “…”}’ ☕☕☕ redis GET cache/orders/12893128739
  33. Completed 200 OK in 6791ms (Views: 3.4ms | ActiveRecord: 5.2ms)

    ಠ_ಠ
  34. “Reality doesn’t exist until we measure it*” *at least on

    a very small scale http:/ /www.sciencealert.com/reality-doesn-t-exist-until-we-measure-it-quantum-experiment-confirms
  35. • Quais recursos externos a aplicação depende?

  36. • Quais recursos externos a aplicação depende? • Quanto tempo/memória

    é gasto em cada operação?
  37. • Quais recursos externos a aplicação depende? • Quanto tempo/memória

    é gasto em cada operação? • O que deu certo e o que deu errado?
  38. • Logs

  39. • Logs • Métricas

  40. • Logs • Métricas • Detalhes

  41. • Logs • Métricas • Detalhes • E mais logs

  42. plataformatec/faraday-log-subscriber

  43. Article.first # Article Load (0.4ms) SELECT * from "articles.*" ...

    Article.where(published: true).count # SELECT COUNT(*) from "articles.*" ...
  44. APIClient.get('articles/1') # ????? APIClient.get('articles', published: true) # ?????

  45. gem 'faraday-log-subscriber' gem 'faraday_middleware' client = Faraday.new('https://api.github.com') do |builder| builder.use

    :instrumentation # ... end client.get('repos/plataformatec/devise')
  46. Faraday HTTP Cache [store] https://api.github.com/user/repos/plataformatec/devise Faraday GET [200] (530.0ms) https://api.github.com/user/repos/plataformatec/devise

    Completed 200 OK in 900ms (Views: 339.0ms | Faraday: 530.0ms | ActiveRecord: 11.6ms)
  47. Faraday HTTP Cache [store] https://api.github.com/user/repos/plataformatec/devise Faraday GET [200] (530.0ms) https://api.github.com/user/repos/plataformatec/devise

    Completed 200 OK in 900ms (Views: 339.0ms | Faraday: 530.0ms | ActiveRecord: 11.6ms)
  48. Faraday HTTP Cache [store] https://api.github.com/user/repos/plataformatec/devise Faraday GET [200] (530.0ms) https://api.github.com/user/repos/plataformatec/devise

    Completed 200 OK in 900ms (Views: 339.0ms | Faraday: 530.0ms | ActiveRecord: 11.6ms)
  49. Faraday HTTP Cache [store] https://api.github.com/user/repos/plataformatec/devise Faraday GET [200] (530.0ms) https://api.github.com/user/repos/plataformatec/devise

    Completed 200 OK in 900ms (Views: 339.0ms | Faraday: 530.0ms | ActiveRecord: 11.6ms)
  50. ❤❤❤ ActiveSupport::Notifications ❤❤❤

  51. module Faraday class LogSubscriber < ActiveSupport::LogSubscriber def request(event) # ...

    end attach_to :faraday end end ActiveSupport::Notifications.instrument 'faraday.request' do # ... end
  52. module attach_to end ActiveSupport end An Instrumented Library in ~

    30 minutes http:/ /www.railstips.org/blog/archives/2013/01/23/an-instrumented-library-in-30-lines/
  53. • plugável no seu statsd/graphite/etc

  54. • plugável no seu statsd/graphite/etc • baixo custo de implementação

  55. • plugável no seu statsd/graphite/etc • baixo custo de implementação

    • compatível com outros serviços e gems
  56. peek/peek

  57. None
  58. peek-gc

  59. peek-dalli peek-gc

  60. peek-pg peek-dalli peek-gc

  61. peek-pg peek-dalli peek-faraday peek-gc

  62. peek-pg peek-performance-bar peek-dalli peek-faraday peek-gc

  63. • métricas em desenvolvimento

  64. • métricas em desenvolvimento • páginas/registros específicos

  65. • métricas em desenvolvimento • páginas/registros específicos • usável em

    produção
  66. • métricas em desenvolvimento • páginas/registros específicos • usável em

    produção • API pequena para criar plugins
  67. schneems/derailed_benchmarks

  68. $ derailed bundle:mem TOP: 53.043 MiB rails/all: 17.7539 MiB active_record/railtie:

    8.7227 MiB active_record: 7.5273 MiB arel: 3.2109 MiB arel/nodes: 1.2539 MiB arel/visitors: 1.1172 MiB arel/visitors/to_sql: 0.4648 MiB active_record/type: 0.8867 MiB
  69. derailed bundle:objects Measuring objects created by gems in groups [:default,

    "production"] Total allocated: 14388737 bytes (94532 objects) Total retained: 5009330 bytes (14661 objects) allocated memory by gem ----------------------------------- 4572996 activesupport-4.2.4 2832576 actionpack-4.2.4 1370497 therubyracer-0.12.2 957367 commonjs-0.2.7 572490 2.2.2/lib 463779 bundler-1.10.6
  70. @schneems - Speed Science https:/ /www.youtube.com/watch?v=m2nj5sUE3hg

  71. NewRelic AppSignal Skylight etc

  72. configurações

  73. ✂ ✂ ✂

  74. # Gemfile gem 'rails', '4.2.4'

  75. # Gemfile gem 'rails', '4.2.4' # Gemfile gem 'actionmailer', '4.2.4'

    gem 'actionpack', '4.2.4' gem 'actionview', '4.2.4' gem 'activejob', '4.2.4' gem 'activemodel', '4.2.4' gem 'activerecord', '4.2.4' gem 'activesupport', '4.2.4' gem 'railties', '4.2.1' gem 'sprockets-rails'
  76. # config/application.rb require 'rails/all'

  77. # config/application.rb require 'rails/all' # config/application.rb require 'active_record/railtie' require 'action_controller/railtie'

    require 'action_view/railtie' require 'action_mailer/railtie' require 'active_job/railtie' require 'rails/test_unit/railtie' require 'sprockets/railtie'
  78. # config/application.rb require 'rails/all' # config/application.rb require 'active_record/railtie' require 'action_controller/railtie'

    require 'action_view/railtie' require 'action_mailer/railtie' require 'active_job/railtie' require 'rails/test_unit/railtie' require 'sprockets/railtie'
  79. A. Sem CSS/JavaScript?

  80. A. Sem CSS/JavaScript? B. Sem banco relacional?

  81. A. Sem CSS/JavaScript? B. Sem banco relacional? C. Sem background

    jobs?
  82. A. Sem CSS/JavaScript? B. Sem banco relacional? C. Sem background

    jobs? D. Sem envio de emails?
  83. A. Sem CSS/JavaScript? B. Sem banco relacional? C. Sem background

    jobs? D. Sem envio de emails? E. Todos as anteriores.
  84. # config/application.rb require 'rails' require 'action_controller/railtie' # Gemfile gem 'railties',

    '4.2.4' gem 'actionpack', '4.2.4'
  85. ✂ gems e requires

  86. ✂ gems e requires ✂ Rails.application.config.something

  87. ✂ gems e requires ✂ Rails.application.config.something ✂ ActiveSupport.on_load(:something) { }

  88. ✂ gems e requires ✂ Rails.application.config.something ✂ ActiveSupport.on_load(:something) { }

    ✏ config/initializers/*.rb
  89. # config/application.rb require 'rails' require ‘action_controller/railtie' require ‘active_record/railtie’ # Gemfile

    gem 'railties', '4.2.4' gem 'actionpack', '4.2.4' gem 'activerecord', '4.2.4'
  90. • Reduz o tempo de boot e instalação

  91. • Reduz o tempo de boot e instalação • Pode

    reduzir o uso de memória
  92. • Reduz o tempo de boot e instalação • Pode

    reduzir o uso de memória • Simplifica a árvore de dependências
  93. $ ls -1 config/*.yml

  94. $ ls -1 config/*.yml config/appsignal.yml config/database.yml config/secrets.yml config/sidekiq.yml config/skylight.yml config/aws.yml

    config/settings.yml config/omgwtfbbq.yml
  95. None
  96. bkeepers/dotenv

  97. # .env DATABASE_URL='' SECRET_KEY_BASE='' CDN_URL='' MEMCACHE_SERVERS='qa.memcache.foo-bar.com:11211' REDIS_URL='redis://qa.redis.foo-bar.com:6379/0' CACHE_DEFAULT_TTL='300' STORAGE_ACCESS_KEY_ID='f95eac983815617738676de5d56fe6eb' STORAGE_ACCESS_KEY_KEY='9d2e141a547a7c7f27bb40e836f9f9a2'

  98. config.cache_store = :dalli_store, ENV['MEMCACHIER_SERVERS'].to_s.split(','), { username: ENV['MEMCACHIER_USERNAME'], password: ENV['MEMCACHIER_PASSWORD'], failover:

    true, socket_timeout: 1.5, socket_failure_delay: 0.2 }
  99. # config/application.rb %w( DATABASE_URL MEMCACHE_SERVERS STORAGE_ACCESS_KEY_ID STORAGE_SECRET_ACCESS_KEY ).each do |key|

    raise "Missing env variable: #{key}." if ENV[key].blank? end
  100. • Todas as configurações em um arquivo só

  101. • Todas as configurações em um arquivo só • Configuração

    auto documentável
  102. • Todas as configurações em um arquivo só • Configuração

    auto documentável • Portabilidade entre ambientes
  103. executáveis

  104. binstubs

  105. You have already activated activesupport 4.2.4, but your Gemfile requires

    activesupport 4.2.3. Prepending `bundle exec` to your command may solve this. (╯°□°)╯︵ ┻━┻
  106. bundle exec rspec

  107. bundle exec rspec ✗

  108. bundle binstub rspec-core bin/rspec

  109. $ ls -1 bin/ cap* foreman* puma* rails* rake* sidekiq*

    sidekiqctl* whenever*
  110. bin/setup

  111. • Como eu instalo “X” ?

  112. • Como eu instalo “X” ? • Diferença de versões

  113. • Como eu instalo “X” ? • Diferença de versões

    • Configurações e dependências externas
  114. • Como eu instalo “X” ? • Diferença de versões

    • Configurações e dependências externas • bin/setup && bin/rake = ,
  115. ✓ versão do ruby

  116. ✓ versão do ruby ✓ pg, redis, memcache

  117. ✓ versão do ruby ✓ pg, redis, memcache ✓ arquivos

    de configuração
  118. ✓ versão do ruby ✓ pg, redis, memcache ✓ arquivos

    de configuração ✓ bundle/bower/npm install
  119. ✓ versão do ruby ✓ pg, redis, memcache ✓ arquivos

    de configuração ✓ bundle/bower/npm install ✓ APIs, sandboxes, etc
  120. #!/usr/bin/env ruby require 'pathname' APP_ROOT = Pathname.new File.expand_path('..', __dir__) Dir.chdir

    APP_ROOT do puts '== Installing dependencies ==' system 'gem install bundler --conservative' system('bundle check') or system('bundle install') puts "\n== Preparing database ==" system 'ruby bin/rake db:setup' system 'RAILS_ENV=test ruby bin/rake db:create' puts "\n== Removing old logs and tempfiles ==" system 'ruby bin/rake log:clear tmp:clear' end
  121. #!/usr/bin/env bash echo "Setting up your environment..." # ... check_ruby

    "$(cat .ruby-version)" test_dependency "psql" "PostgreSQL" "brew install postgresql" test_dependency "redis-cli" "Redis" "brew install redis" test_dependency "docker" "docker" "brew cask install dockertoolbox" install_bundler # ... download_phantomjs_2 bundle_install copy_dotenv torba_install setup_db echo "Done!"
  122. ✓ vagrant up

  123. ¯\_(ツ)_/¯

  124. bin/deploy

  125. • capistrano

  126. • capistrano • mina

  127. • capistrano • mina • docker

  128. • capistrano • mina • docker • heroku

  129. • capistrano • mina • docker • heroku • RPM

  130. • capistrano • mina • docker • heroku • RPM

    • intervenção divina
  131. #!/usr/bin/env bash # USAGE: deploy [ENVIRONMENT] # # This program

    check for all deployment prerequisites before running the # Capistrano deployment task. # We currently check for the following dependencies: # # * Current ruby version. # * The gem dependencies listed in the Gemfile. bundle check &> /dev/null || bundle install --quiet exec bin/cap ${1:-"production"} deploy
  132. bin/qualquer-coisa

  133. • dump/restore de bancos

  134. • dump/restore de bancos • CRUDs sem UIs

  135. • dump/restore de bancos • CRUDs sem UIs • troubleshooting

    geral
  136. # bin/push-notifications #!/usr/bin/env ruby require_relative '../config/application' require 'thor' class PushNotifications

    < Thor # ... end PushNotifications.start(ARGV)
  137. # bin/pull-db #!/usr/bin/env bash set -e timestamp=$(date +%s) ssh deploy@stage.foobar.com

    "pg_dump -U DB_USER -W DB_NAME -Fc > ~/dump-$timestamp.dump" scp deploy@stage.foobar.com:"dump-$timestamp.dump" "/tmp/dump-$timestamp.dump" pg_restore --verbose --clean --no-acl --no-owner -h localhost -U \ $USER -d DB_DEV_NAME "/tmp/dump-$timestamp.dump"
  138. https:/ /github.com/github/scripts-to-rule-them-all

  139. · · ·

  140. Conheça suas ferramentas

  141. Entenda o contexto da sua aplicação

  142. Automatize trabalho braçal e falhas bestas

  143. Faça as ferramentas trabalharem para você E não o contrário

  144. ❄ Não pense que o seu projeto é um floco

    de neve ❄
  145. “Certeza que alguém já resolveu essa #^%#$&@!^” Lucas Mazza Quase

    todo santo dia
  146. Gostamos mais de ter escolhas do que ter que escolher

  147. ➖ tempo em escolhas ➕ tempo desenvolvendo software

  148. Esse código / projeto / módulo / repositório não é

    para você
  149. Converse com o seu time

  150. gem install trololol ❓

  151. gem install trololol ❓ ✗

  152. Conhecimento & informação

  153. Conhecimento & informação Disseminação & educação

  154. Conhecimento & informação Disseminação & educação Uso & benefícios

  155. Conhecimento & informação Disseminação & educação Uso & benefícios ((╯°□°)╯︵

    ┻━┻ e voltar ao passo 1)
  156. None
  157. Obrigado! @lucasmazza