Caelum dicas web 2010

Preview:

DESCRIPTION

Palestra sobre Dicas de desenvolvimento Web na Caelum, em Abril de 2010.

Citation preview

A apresentação já vai começar ...

Friday, April 16, 2010

AkitaOnRails.com

Friday, April 16, 2010

~ 50 min~ 85 slides

Friday, April 16, 2010

www.slideshare.net/akitaonrails

fabioakita@gmail.com

http://dl.dropbox.com/u/1732133/dicas-de-desenvolvimento-web-com-rails.zip

Friday, April 16, 2010

Entendendo a WebDicas sobre Desenvolvimento Web com Ruby

Fabio Akita

Friday, April 16, 2010

Friday, April 16, 2010

Recapitulando ...

Friday, April 16, 2010

Rails não Escala

Friday, April 16, 2010

Rails não Escala(TM)

Friday, April 16, 2010

Friday, April 16, 2010

Friday, April 16, 2010

Para colocar as coisas em perspectiva, o Friendster foi

escrito em Java e eles mudaram para PHP. MySpace foi escrito

em ColdFusion e eles mudaram para ASP.NET.

Blaine Cook

http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter

Friday, April 16, 2010

Para colocar as coisas em perspectiva, o Friendster foi

escrito em Java e eles mudaram para PHP. MySpace foi escrito

em ColdFusion e eles mudaram para ASP.NET.

Blaine Cook

http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter

Quando as pessoas caem em problemas de escalabilidade, normalmente acham que a

linguagem é o problema, mas eu acho que isso raramente é a

realidade.

Friday, April 16, 2010

http://www.computerworld.com.au/article/268003/ruby_rails_rolls_into_enterprise?fp=16&fpid=1

“O The New York Times usou Ruby on Rails para agregar, analizar e mostrar os resultados das

eleições em quase tempo real em um de seus sites mais acessados de todos os tempos.”

Friday, April 16, 2010

http://www.computerworld.com.au/article/268003/ruby_rails_rolls_into_enterprise?fp=16&fpid=1

“O The New York Times usou Ruby on Rails para agregar, analizar e mostrar os resultados das

eleições em quase tempo real em um de seus sites mais acessados de todos os tempos.”

Friday, April 16, 2010

Web Server

MySQL

Browser

Friday, April 16, 2010

Web Server

MySQL

Browser

Varnish/HAProxy

Friday, April 16, 2010

Web Server

MySQL

Browser

Varnish/HAProxy

Memcached

Friday, April 16, 2010

Web Server

MySQL

Browser

Varnish/HAProxy

Memcached

CouchDB/MongoDB

Friday, April 16, 2010

Ruby é Lento

Friday, April 16, 2010

Ruby é Lento(TM)

Friday, April 16, 2010

Existem mentiras, mentiras malditas e

estatísticas.

Friday, April 16, 2010

Existem mentiras, mentiras malditas e

estatísticas.

Friday, April 16, 2010

Existem mentiras, mentiras malditas e

estatísticas.

Friday, April 16, 2010

Friday, April 16, 2010

x mais lento que C++

Friday, April 16, 2010

0 32.5 65 97.5 130

Python 2

Ruby 1.9

JRuby

Perl

Python 3

PHP

Ruby 1.8

x mais lento que C++

Friday, April 16, 2010

Homepage: 331 ms

Friday, April 16, 2010

Homepage: 331 ms

Total: 5.45 s

Friday, April 16, 2010

Performance!=

Escalabilidade

Friday, April 16, 2010

Exemplo

Friday, April 16, 2010

Friday, April 16, 2010

Friday, April 16, 2010

Friday, April 16, 2010

Friday, April 16, 2010

Friday, April 16, 2010

Friday, April 16, 2010

Friday, April 16, 2010

Friday, April 16, 2010

Friday, April 16, 2010

6Técnicas

Friday, April 16, 2010

Menos Requisições

Friday, April 16, 2010

Mini!que CSS e Javascript

Friday, April 16, 2010

Juicerhttp://github.com/cjohansen/juicer/

Friday, April 16, 2010

gem install juicer

script/plugin install git://github.com/ktheory/juicer-rails.git

Friday, April 16, 2010

gem install juicer

script/plugin install git://github.com/ktheory/juicer-rails.git

Friday, April 16, 2010

juicer install yuicompressor

juicer install jslint

juicer install closure_compiler

Friday, April 16, 2010

juicer install yuicompressor

juicer install jslint

juicer install closure_compiler

Friday, April 16, 2010

juicer install yuicompressor

juicer install jslint

juicer install closure_compiler

Friday, April 16, 2010

<%= juiced_tag '/stylesheets/application.css' %> <%= yield(:head) %>

</head><body>

... <%= juiced_tag '/javascripts/application.js' %>

</body>

/app/views/layouts/application.html.erb

Friday, April 16, 2010

<%= juiced_tag '/stylesheets/application.css' %> <%= yield(:head) %>

</head><body>

... <%= juiced_tag '/javascripts/application.js' %>

</body>

/app/views/layouts/application.html.erb

Friday, April 16, 2010

@import url("reset.css");@import url("base.css");@import url("fonts.css");

...

/* @depends jquery-1.4.min.js @depends jquery.edit_in_place.js @depends jqueryamail.js*/

...

/public/stylesheets/application.css

/public/javascripts/application.js

Friday, April 16, 2010

@import url("reset.css");@import url("base.css");@import url("fonts.css");

...

/* @depends jquery-1.4.min.js @depends jquery.edit_in_place.js @depends jqueryamail.js*/

...

/public/stylesheets/application.css

/public/javascripts/application.js

Friday, April 16, 2010

juicer merge public/stylesheets/application.css

public/stylesheets/application.min.css

juicer merge -i public/javascripts/application.js

public/javascripts/application.min.js

Friday, April 16, 2010

juicer merge public/stylesheets/application.css

public/stylesheets/application.min.css

juicer merge -i public/javascripts/application.js

public/javascripts/application.min.js

Friday, April 16, 2010

juicer merge public/stylesheets/application.css

public/stylesheets/application.min.css

juicer merge -i public/javascripts/application.js

public/javascripts/application.min.js

Friday, April 16, 2010

juicer merge public/stylesheets/application.css

public/stylesheets/application.min.css

juicer merge -i public/javascripts/application.js

public/javascripts/application.min.js

Friday, April 16, 2010

DEVELOPMENT

Friday, April 16, 2010

PRODUCTION

Friday, April 16, 2010

Asset HostsNavegadores abrem poucas conexões

simultâneas por domínio

Friday, April 16, 2010

Friday, April 16, 2010

def gallery gallery_path = File.join(Rails.root, "public/images/gallery/")

@images = Dir.glob(gallery_path + "*").map{ |f| f.gsub(gallery_path, "") }

end

/app/controllers/hello_controller.rb

Friday, April 16, 2010

def gallery gallery_path = File.join(Rails.root, "public/images/gallery/")

@images = Dir.glob(gallery_path + "*").map{ |f| f.gsub(gallery_path, "") }

end

/app/controllers/hello_controller.rb

/app/views/hello/gallery.html.erb

<% title "Gallery" %>

<% @images.each do |image| -%> <%= image_tag "gallery/#{image}" %>

<% end -%>

Friday, April 16, 2010

def gallery gallery_path = File.join(Rails.root, "public/images/gallery/")

@images = Dir.glob(gallery_path + "*").map{ |f| f.gsub(gallery_path, "") }

end

/app/controllers/hello_controller.rb

/app/views/hello/gallery.html.erb

<% title "Gallery" %>

<% @images.each do |image| -%> <%= image_tag "gallery/#{image}" %>

<% end -%>

Friday, April 16, 2010

DEVELOPMENT

Friday, April 16, 2010

DEVELOPMENT

Friday, April 16, 2010

/con!g/environments/production.rb

config.action_controller.asset_host = Proc.new do |source, request| protocol = if request.ssl?

request.headers["USER_AGENT"] =~ /(Safari)/ ? "http" : "https" else

"http" end

"#{protocol}://asset#{rand(6) + 1}.akitaonrails.local:3000"end

Friday, April 16, 2010

/con!g/environments/production.rb

config.action_controller.asset_host = Proc.new do |source, request| protocol = if request.ssl?

request.headers["USER_AGENT"] =~ /(Safari)/ ? "http" : "https" else

"http" end

"#{protocol}://asset#{rand(6) + 1}.akitaonrails.local:3000"end

Friday, April 16, 2010

### Host Database## localhost is used to configure the loopback interface# when the system is booting. Do not change this entry.##127.0.0.1 localhost255.255.255.255 broadcasthost::1 localhost fe80::1%lo0 localhost127.0.0.1 asset1.akitaonrails.local asset2.akitaonrails.local asset3.akitaonrails.local asset4.akitaonrails.local asset5.akitaonrails.local asset6.akitaonrails.local www.akitaonrails.local

/etc/hosts

Friday, April 16, 2010

PRODUCTION

Friday, April 16, 2010

PRODUCTION

Friday, April 16, 2010

Javascript embaixo!

Friday, April 16, 2010

<head> <title><%= h(yield(:title) || "Untitled") %></title> <%= stylesheet_link_tag 'application' %> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js" type="text/javascript"></script> <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js" type="text/javascript"></script> <script src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js" type="text/javascript"></script> <script src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1.0.2/CFInstall.min.js" type="text/javascript"></script> <%= yield(:head) %></head><body>...

/app/views/layouts/application.html.erb

Friday, April 16, 2010

<head> <title><%= h(yield(:title) || "Untitled") %></title> <%= stylesheet_link_tag 'application' %> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js" type="text/javascript"></script> <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js" type="text/javascript"></script> <script src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js" type="text/javascript"></script> <script src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1.0.2/CFInstall.min.js" type="text/javascript"></script> <%= yield(:head) %></head><body>...

/app/views/layouts/application.html.erb

Friday, April 16, 2010

... <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js" type="text/javascript"></script> <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js" type="text/javascript"></script> <script src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js" type="text/javascript"></script> <script src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1.0.2/CFInstall.min.js" type="text/javascript"></script> <script type="text/javascript"> // meu javascript customizado ... </script> </body></html>

/app/views/layouts/application.html.erb

Friday, April 16, 2010

... <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js" type="text/javascript"></script> <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js" type="text/javascript"></script> <script src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js" type="text/javascript"></script> <script src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1.0.2/CFInstall.min.js" type="text/javascript"></script> <script type="text/javascript"> // meu javascript customizado ... </script> </body></html>

/app/views/layouts/application.html.erb

Friday, April 16, 2010

Gzip

Friday, April 16, 2010

a2enmod de"ate

editar/etc/apache2/mods-available/de"ate.conf

Friday, April 16, 2010

a2enmod de"ate

editar/etc/apache2/mods-available/de"ate.conf

Friday, April 16, 2010

<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE image/svg+xml AddOutputFilterByType DEFLATE image/x-icon AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/x-javascript

AddOutputFilterByType DEFLATE application/x-httpd-php AddOutputFilterByType DEFLATE application/x-httpd-fastphp AddOutputFilterByType DEFLATE application/x-httpd-eruby

DeflateCompressionLevel 9

# Netscape 4.X has some problems BrowserMatch ^Mozilla/4 gzip-only-text/html

# Netscape 4.06-4.08 have some more problems BrowserMatch ^Mozilla/4\.0[678] no-gzip

# MSIE masquerades as Netscape, but it is fine BrowserMatch \bMSIE !no-gzip !gzip-only-text/html</IfModule>

/etc/apache2/mods-available/de"ate.conf

Friday, April 16, 2010

Cabeçalhos de Expiração

Friday, April 16, 2010

a2enmod expires

editar/etc/apache2/mods-available/expires.conf

Friday, April 16, 2010

a2enmod expires

editar/etc/apache2/mods-available/expires.conf

Friday, April 16, 2010

<IfModule mod_expires.c> ExpiresByType image/x-icon "access plus 1 year" ExpiresByType image/png "access plus 1 year" ExpiresByType image/jpg "access plus 1 year" ExpiresByType image/gif "access plus 1 year" ExpiresByType image/jpeg "access plus 1 year" ExpiresByType application/pdf "access plus 1 year" ExpiresByType audio/x-wav "access plus 1 year" ExpiresByType audio/mpeg "access plus 1 year" ExpiresByType video/mpeg "access plus 1 year" ExpiresByType video/mp4 "access plus 1 year" ExpiresByType video/quicktime "access plus 1 year" ExpiresByType video/x-ms-wmv "access plus 1 year" ExpiresByType application/x-shockwave-flash "access 1 month" ExpiresByType text/css "access plus 1 year" ExpiresByType text/javascript "access plus 1 year"</IfModule>

/etc/apache2/mods-available/expires.conf

Friday, April 16, 2010

Cache Busters

Friday, April 16, 2010

<%= stylesheet_link_tag 'application' %>

<%= javascript_include_tag 'application' %>

<%= image_tag "logo.png" %>

/app/views/layouts/application.html.erb

Friday, April 16, 2010

<link href="/stylesheets/application.css?1264345891" media="screen" rel="stylesheet" type="text/css" />

<script src="/javascripts/application.js?1264345058"

type="text/javascript"></script>

<img alt="Logo" src="/images/logo.png?1268943058" />

/app/views/layouts/application.html.erb

Friday, April 16, 2010

<link href="/stylesheets/application.css?1264345891" media="screen" rel="stylesheet" type="text/css" />

<script src="/javascripts/application.js?1264345058"

type="text/javascript"></script>

<img alt="Logo" src="/images/logo.png?1268943058" />

/app/views/layouts/application.html.erb

Friday, April 16, 2010

Use CDNs

Friday, April 16, 2010

<script src="/javascripts/jquery-1.4.min.js" type="text/javascript"></script><script src="/javascripts/jquery-ui-1.7.2.min.js" type="text/javascript"></script><script src="/javascripts/swfobject-2.2.js" type="text/javascript"></script><script src="/javascripts/CFInstall-1.0.2.min.js" type="text/javascript"></script>

/app/views/layouts/application.html.erb

Friday, April 16, 2010

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js" type="text/javascript"></script><script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js" type="text/javascript"></script><script src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js" type="text/javascript"></script><script src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1.0.2/CFInstall.min.js" type="text/javascript"></script>

/app/views/layouts/application.html.erb

Friday, April 16, 2010

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js" type="text/javascript"></script><script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js" type="text/javascript"></script><script src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js" type="text/javascript"></script><script src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1.0.2/CFInstall.min.js" type="text/javascript"></script>

/app/views/layouts/application.html.erb

Friday, April 16, 2010

Search

Friday, April 16, 2010

select * from ... where ... like “%...%”

Friday, April 16, 2010

select * from ... where ... like “%...%”

or ... like “%...%”or ... like “%...%”or ... like “%...%”or ... like “%...%”

Friday, April 16, 2010

select * from ... where ... like “%...%”

or ... like “%...%”or ... like “%...%”or ... like “%...%”or ... like “%...%”

Friday, April 16, 2010

Friday, April 16, 2010

Open Source Enterprise Search Platform

Baseado no famoso Lucene

Full Text Search, com relevância

Indexa documentos (Word, PDF, etc)

Interface REST

Roda em containers de Servlet (Tomcat)

Friday, April 16, 2010

Open Source Enterprise Search Platform

Baseado no famoso Lucene

Full Text Search, com relevância

Indexa documentos (Word, PDF, etc)

Interface REST

Roda em containers de Servlet (Tomcat)

Friday, April 16, 2010

Open Source Enterprise Search Platform

Baseado no famoso Lucene

Full Text Search, com relevância

Indexa documentos (Word, PDF, etc)

Interface REST

Roda em containers de Servlet (Tomcat)

Friday, April 16, 2010

Open Source Enterprise Search Platform

Baseado no famoso Lucene

Full Text Search, com relevância

Indexa documentos (Word, PDF, etc)

Interface REST

Roda em containers de Servlet (Tomcat)

Friday, April 16, 2010

Open Source Enterprise Search Platform

Baseado no famoso Lucene

Full Text Search, com relevância

Indexa documentos (Word, PDF, etc)

Interface REST

Roda em containers de Servlet (Tomcat)

Friday, April 16, 2010

Open Source Enterprise Search Platform

Baseado no famoso Lucene

Full Text Search, com relevância

Indexa documentos (Word, PDF, etc)

Interface REST

Roda em containers de Servlet (Tomcat)

Friday, April 16, 2010

Friday, April 16, 2010

Friday, April 16, 2010

select * from ... where ... like “%...%”

or ... like “%...%”or ... like “%...%”or ... like “%...%”or ... like “%...%”

Friday, April 16, 2010

select * from ... where ... like “%...%”

or ... like “%...%”or ... like “%...%”or ... like “%...%”or ... like “%...%”

Friday, April 16, 2010

Tarefas Assíncronas

Friday, April 16, 2010

Friday, April 16, 2010

Requisição

Friday, April 16, 2010

ProcessamentoRequisição

Friday, April 16, 2010

Resposta

ProcessamentoRequisição

Friday, April 16, 2010

Crontab

Friday, April 16, 2010

Friday, April 16, 2010

RMagick

Friday, April 16, 2010

Friday, April 16, 2010

Friday, April 16, 2010

RedisWorkers

Resque-Web

Friday, April 16, 2010

Friday, April 16, 2010

Friday, April 16, 2010

ProcessamentoRequisição

291 s

Friday, April 16, 2010

Resposta

Processamento

Requisição

32 s

Worker

Friday, April 16, 2010

Friday, April 16, 2010

Imagens

Relatórios

Web Services

Transações

Friday, April 16, 2010

Imagens

Relatórios

Web Services

Transações

Friday, April 16, 2010

Imagens

Relatórios

Web Services

Transações

Friday, April 16, 2010

Imagens

Relatórios

Web Services

Transações

Friday, April 16, 2010

Aprendendo Mais

Friday, April 16, 2010

RAILS LABS

Friday, April 16, 2010

RAILSCASTS.com

Friday, April 16, 2010

caelum.com.br

Friday, April 16, 2010

egenial.com.br

Friday, April 16, 2010

Friday, April 16, 2010

Entenda os browsers

Entenda HTTP

Arquiteturas

Mundo Assíncrono

Mundo não Relacional

Friday, April 16, 2010

Entenda os browsers

Entenda HTTP

Arquiteturas

Mundo Assíncrono

Mundo não Relacional

Friday, April 16, 2010

Entenda os browsers

Entenda HTTP

Arquiteturas

Mundo Assíncrono

Mundo não Relacional

Friday, April 16, 2010

Entenda os browsers

Entenda HTTP

Arquiteturas

Mundo Assíncrono

Mundo não Relacional

Friday, April 16, 2010

Entenda os browsers

Entenda HTTP

Arquiteturas

Mundo Assíncrono

Mundo não Relacional

Friday, April 16, 2010

Friday, April 16, 2010

Thx!www.slideshare.net/akitaonrails

fabioakita@gmail.com

http://dl.dropbox.com/u/1732133/dicas-de-desenvolvimento-web-com-rails.zip

Friday, April 16, 2010