SlideShare a Scribd company logo
Ruby on Rails
          Innovation and Security



Tillmann Bielefeld   1
In 2001
2 Rails - Innovation and Security
"01a4" != "001a4"
                    "01e4" == "001e4"




I started hacking
3 Rails - Innovation and Security
"01a4" != "001a4"
                    "01e4" == "001e4"

                "01e4" == "10000"




I started hacking
3 Rails - Innovation and Security
4 Rails - Innovation and Security
2006 - 2008
5 Rails - Innovation and Security
Too many...
6 Rails - Innovation and Security
Layers
7 Rails - Innovation and Security
Discussions
8 Rails - Innovation and Security
Stack Traces
9 Rails - Innovation and Security
!     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716]
!     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1001) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716]
!     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:129) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716]
!     at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716]
!     at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716]
!     at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716]
!     at org.eclipse.jetty.server.Server.handle(Server.java:360) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716]
!     at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:454) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716]
!     at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:890) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716]
!     at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:944) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716
!     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:630) [jetty-http-8.1.5.v20120716.jar:8.1.5.v20120716]
!     at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230) [jetty-http-8.1.5.v20120716.jar:8.1.5.v20120716]
!     at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716]
!     at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:622) [jetty-io-8.1.5.v20120716.jar:8.1.5.v20120716]
!     at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46) [jetty-io-8.1.5.v20120716.jar:8.1.5.v20120716]
!     at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603) [jetty-util-8.1.5.v20120716.jar:8.1.5.v20120716]
!     at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538) [jetty-util-8.1.5.v20120716.jar:8.1.5.v20120716]
!     at java.lang.Thread.run(Thread.java:680) [na:1.6.0_31]
Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: [Assertion failed] - this argument is required; it must not be null; nested exception is java.lan
failed] - this argument is required; it must not be null
!     at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:301) ~[spring-orm-3.1.2.RELEASE.jar:3.1
!     at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:106) ~[spring-orm-3.1.2.RELEASE.jar:3.1.2.RELEASE]
!     at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:58) ~[spring-tx-3.
!     at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213) ~[spring-tx-3.1.2.RELEASE.jar:3.1.2.RELEASE]
!     at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:163) ~[spring-tx-3.1.2.RELEASE
!     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
!     at org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor$LockModePopulatingMethodIntercceptor.invoke(LockModeRepositoryPostProcessor.java
jpa-1.2.0.M1.jar:na]
!     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
!     at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
!     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
!     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
!     at $Proxy44.findByNameStartsWith(Unknown Source) ~[na:na]
!     ... 46 common frames omitted
Caused by: java.lang.IllegalArgumentException: [Assertion failed] - this argument is required; it must not be null
!     at org.springframework.util.Assert.notNull(Assert.java:112) ~[spring-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
!     at org.springframework.util.Assert.notNull(Assert.java:123) ~[spring-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
!     at org.springframework.data.jpa.repository.query.ParameterMetadataProvider$ParameterMetadata.prepare(ParameterMetadataProvider.java:156) ~[spring-data-jpa-1.2.0.M1
!     at org.springframework.data.jpa.repository.query.CriteriaQueryParameterBinder.bind(CriteriaQueryParameterBinder.java:68) ~[spring-data-jpa-1.2.0.M1.jar:na]
!     at org.springframework.data.jpa.repository.query.ParameterBinder.bind(ParameterBinder.java:108) ~[spring-data-jpa-1.2.0.M1.jar:na]
!     at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$CountQueryPreparer.invokeBinding(PartTreeJpaQuery.java:196) ~[spring-data-jpa-1.2.0.M1.jar:na]
!     at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$QueryPreparer.createQuery(PartTreeJpaQuery.java:121) ~[spring-data-jpa-1.2.0.M1.jar:na]
!     at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.doCreateCountQuery(PartTreeJpaQuery.java:82) ~[spring-data-jpa-1.2.0.M1.jar:na]
!     at org.springframework.data.jpa.repository.query.AbstractJpaQuery.createCountQuery(AbstractJpaQuery.java:148) ~[spring-data-jpa-1.2.0.M1.jar:na]
!     at org.springframework.data.jpa.repository.query.JpaQueryExecution$PagedExecution.doExecute(JpaQueryExecution.java:99) ~[spring-data-jpa-1.2.0.M1.jar:na]
!     at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:55) ~[spring-data-jpa-1.2.0.M1.jar:na]
!     at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:95) ~[spring-data-jpa-1.2.0.M1.jar:na]
!     at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:85) ~[spring-data-jpa-1.2.0.M1.jar:na]
!     at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:313) ~[spring-data
!     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
!     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) ~[spring-tx-3.1.2.RELEASE.jar:3.1.2.RELEASE]
!     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
!     at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155) ~[spring-tx-3.1.2.RELEASE




Stack Traces
!     ... 53 common frames omitted




 9 Rails - Innovation and Security
$ irb
   > a
   ruby-1.9.3-p0 :045 >   a
   NameError: undefined local variable or method `a' for main:Object

   ruby-1.9.3-p0 :046 > b
   NameError: undefined local variable or method `b' for main:Object

   ruby-1.9.3-p0 :047 > a = b
   NameError: undefined local variable or method `b' for main:Object

   ruby-1.9.3-p0 :048 > a   = a

     ... ?




2004
10 Rails - Innovation and Security
$ irb
   > a
   ruby-1.9.3-p0 :045 >   a
   NameError: undefined local variable or method `a' for main:Object

   ruby-1.9.3-p0 :046 > b
   NameError: undefined local variable or method `b' for main:Object

   ruby-1.9.3-p0 :047 > a = b
   NameError: undefined local variable or method `b' for main:Object

   ruby-1.9.3-p0 :048 > a   = a

     ... ?
    => nil




2004
10 Rails - Innovation and Security
2004
11 Rails - Innovation and Security
page.replace_html('tasks',
                     Task.completed_count)

   page.visual_effect(:highlight,
                      'tasks',
                      :duration => 1.0)




          .rjs

Remote Javascript
12 Rails - Innovation and Security
class	
  Role	
  <	
  ActiveRecord::Base
   	
  	
  attr_accessor	
  :name
   	
  	
  has_and_belongs_to_many	
  :clients
   end


   class	
  Client	
  <	
  ActiveRecord::Base
   	
  	
  has_and_belongs_to_many	
  :roles
   end




Active Record
13 Rails - Innovation and Security
class	
  Role	
  <	
  ActiveRecord::Base
   	
  	
  attr_accessor	
  :name
   	
  	
  has_and_belongs_to_many	
  :clients
   end


   class	
  Client	
  <	
  ActiveRecord::Base
   	
  	
  has_and_belongs_to_many	
  :roles
   end
                                 client_roles
                   1     0..* client_id         0..*   1
       Client                 role_id                      Role
                              name




Active Record
13 Rails - Innovation and Security
class	
  Role	
  <	
  ActiveRecord::Base
   	
  	
  attr_accessor	
  :name
   	
  	
  has_and_belongs_to_many	
  :clients
   end


   class	
  Client	
  <	
  ActiveRecord::Base
   	
  	
  has_and_belongs_to_many	
  :roles
   end
                                 client_roles
                   1     0..* client_id         0..*   1
       Client                 role_id                      Role
                                        Magic!
                              name




Active Record
13 Rails - Innovation and Security
class	
  Role	
  <	
  ActiveRecord::Base
   	
  	
  attr_accessor	
  :name
   	
  	
  has_and_belongs_to_many	
  :clients
   end




Metaprogramming
14 Rails - Innovation and Security
class	
  Role	
  <	
  ActiveRecord::Base
   	
  	
  attr_accessor	
  :name
   	
  	
  has_and_belongs_to_many	
  :clients
   end

   Role.find_or_create_by_name("admin")




Metaprogramming
14 Rails - Innovation and Security
class	
  Role	
  <	
  ActiveRecord::Base
   	
  	
  attr_accessor	
  :name
   	
  	
  has_and_belongs_to_many	
  :clients
   end

   Role.find_or_create_by_name("admin")

   def	
  method_missing(m,	
  *args,	
  &block)	
  
   	
  	
  #	
  magic
   end	
  




Metaprogramming
14 Rails - Innovation and Security
class	
  Role	
  <	
  ActiveRecord::Base
   	
  	
  attr_accessor	
  :name
   	
  	
  has_and_belongs_to_many	
  :clients
   end

   Role.find_or_create_by_name("admin")

   def	
  method_missing(m,	
  *args,	
  &block)	
  
   	
  	
  #	
  magic
   end	
    Magic!


Metaprogramming
14 Rails - Innovation and Security
2008                                 , Kiel
15 Rails - Innovation and Security
2009
16 Rails - Innovation and Security
2013
17 Rails - Innovation and Security
Innovation



18 Rails - Innovation and Security
Packet Management
19 Rails - Innovation and Security
$	
  gem	
  install	
  rails
              $	
  rails	
  server




20 Rails - Innovation and Security
source	
  "http://rubygems.org"
                                gem	
  "json"
                                gem	
  "rails"
 Gemfile                        gem	
  "empuxa-­‐deploy"




                                $	
  bundle	
  install
                                $	
  bundle	
  exec	
  script/rails




Dependency Management
21 Rails - Innovation and Security
en_EN.yml




i18n
22 Rails - Innovation and Security
launch.slogan1
 en_EN.yml




i18n
22 Rails - Innovation and Security
i18n_viz Gem
23 Rails - Innovation and Security
$	
  cap	
  deploy
                                     <code>




Capistrano Deployment
24 Rails - Innovation and Security
$	
  cap	
  deploy
                                     <code>




 $	
  cap	
  staging	
  deploy                staging




Capistrano Deployment
24 Rails - Innovation and Security
$	
  cap	
  deploy
                                     <code>




 $	
  cap	
  staging	
  deploy                staging
 $	
  cap	
  production	
  deploy


                                              production




Capistrano Deployment
24 Rails - Innovation and Security
$	
  cap	
  deploy:migrations

                                     v1	
  -­‐>	
  v2




Capistrano Deployment
25 Rails - Innovation and Security
$	
  cap	
  deploy:migrations

                                                  v1	
  -­‐>	
  v2



               current
               shared
               releases
               	
  	
  20130128231601
               	
  	
  20130129231801
               	
  	
  20130129161601   current




Capistrano Deployment
25 Rails - Innovation and Security
$	
  cap	
  deploy:migrations

                                                         v1	
  -­‐>	
  v2


                                        $	
  cap	
  deploy	
  rollback
               current
               shared
               releases
               	
  	
  20130128231601
               	
  	
  20130129231801       current
               	
  	
  20130129161601       current




Capistrano Deployment
25 Rails - Innovation and Security
class	
  User	
  <	
  ActiveRecord::Base	
  	
  	
  	
  
   	
  	
  devise	
  :database_authenticatable,	
  
   	
  	
  	
  	
  	
  	
  	
  	
  	
  :registerable,	
  :recoverable,	
  
   	
  	
  	
  	
  	
  	
  	
  	
  	
  :rememberable,	
  :trackable,	
  :validatable
   end




Devise
26 Rails - Innovation and Security
<div	
  id='content'>
   	
  	
  <div	
  class='left	
  column'>
   	
  	
  	
  	
  <h2>Welcome	
  to	
  our	
  site!</h2>
   	
  	
  	
  	
  <p><%=	
  print_information	
  %></p>
   	
  	
  </div>
   	
  	
  <div	
  class="right	
  column">Right</div>
   </div>




HAML Views
27 Rails - Innovation and Security
<div	
  id='content'>
   	
  	
  <div	
  class='left	
  column'>
   	
  	
  	
  	
  <h2>Welcome	
  to	
  our	
  site!</h2>
   	
  	
  	
  	
  <p><%=	
  print_information	
  %></p>
   	
  	
  </div>
   	
  	
  <div	
  class="right	
  column">Right</div>
   </div>

   #content
   	
  	
  .left.column
   	
  	
  	
  	
  %h2	
  Welcome	
  to	
  our	
  site!
   	
  	
  	
  	
  %p=	
  print_information
   	
  	
  .right.column
   	
  	
  	
  	
  Right



HAML Views
27 Rails - Innovation and Security
link_to_remote	
  "delete",
   	
  	
  :confirm	
  =>	
  :true
   	
  	
  :url	
  =>	
  delete_post(post.id)




Ajax
28 Rails - Innovation and Security
link_to_remote	
  "delete",
   	
  	
  :confirm	
  =>	
  :true
   	
  	
  :url	
  =>	
  delete_post(post.id)


   unobstrusive
   <a	
  href="/posts/2"	
  class="delete_post"	
  data-­‐
   confirm="Are	
  you	
  sure?"	
  data-­‐
   method="delete"	
  data-­‐
   remote="true"	
  rel="nofollow">Delete</a>	
  	
  




Ajax
28 Rails - Innovation and Security
Admin Interfaces
29 Rails - Innovation and Security
def	
  index	
  
  	
   fancygrid_for	
  :users	
  do	
  |g|
  	
   	
   g.attributes	
  :id,	
  :username,	
  :email	
  
  	
   	
   g.ajax_url	
  =	
  users_path
  	
   	
   g.find	
  
  	
   end	
  
  end




Frontend Ajax Tables
30 Rails - Innovation and Security
RESTful APIs
31 Rails - Innovation and Security
Security



32 Rails - Innovation and Security
SQL Injection?
33 Rails - Innovation and Security
class	
  Role	
  <	
  ActiveRecord::Base
   	
  	
  attr_accessor	
  :name
   end

   User.find_by_name(
   	
  	
  	
  	
  "Robert');	
  DROP	
  TABLE	
  Students;	
  -­‐-­‐")




SQL Injection. Solved.
34 Rails - Innovation and Security
class	
  Role	
  <	
  ActiveRecord::Base
   	
  	
  attr_accessor	
  :name
   end

   User.find_by_name(
   	
  	
  	
  	
  "Robert');	
  DROP	
  TABLE	
  Students;	
  -­‐-­‐")




SQL Injection. Solved.
34 Rails - Innovation and Security
<script	
  language="javascript">
  document.write("<script	
  src='malware.js'></script>");
  </script>




Cross Site Scripting
35 Rails - Innovation and Security
Cross Site Request Forgery
36 Rails - Innovation and Security
- RSpec
   - Jenkins
   - Minitest




Automated Tests
37 Rails - Innovation and Security
Quality Assurance
38 Rails - Innovation and Security
$	
  cd	
  my_rails_app
   $	
  gem	
  install	
  brakeman
   $	
  brakeman	
  -­‐o	
  report.html




brakeman
39 Rails - Innovation and Security
Fast Patching
40 Rails - Innovation and Security
User.find_by_id(
   {:select	
  =>"*	
  from	
  users	
  limit	
  1	
  -­‐-­‐"})

   SELECT	
  *	
  from	
  users	
  limit	
  1	
  -­‐-­‐	
  FROM	
  "users"	
  WHERE	
  
   "users"."id"	
  IS	
  NULL	
  LIMIT	
  1

   	
  =>	
  #<User	
  id:	
  1,	
  all	
  other	
  attributes




Security Leak, Jan 3rd
41 Rails - Innovation and Security
Email from Heroku
42 Rails - Innovation and Security
This	
  
                                     Morning!




Email from Heroku
42 Rails - Innovation and Security
The Community



43 Rails - Innovation and Security
Number
               of
       Developers




                    Low              High


Programming Experience
44 Rails - Innovation and Security
Number
        of
Developers




             Low                     High




Programmers
45 Rails - Innovation and Security
Number
        of
Developers




             Low                     High




PHP
46 Rails - Innovation and Security
Number
        of
Developers

                                     Entry Barriers?!




             Low                                    High




Ruby
47 Rails - Innovation and Security
• Strong community




Asking Developers
48 Rails - Innovation and Security
• Strong community
          • Simple magic
          • Eats resources
          • Enterprise ready
          • Hosting is either hard or expensive
          • Open + Innovative + Secure


Asking Developers
48 Rails - Innovation and Security
MIT	
  Licence
Openness + Connectivity
49 Rails - Innovation and Security
•   Longest Stack Trace ever: https://gist.github.com/1078370

          •   Burger Picture: Epic Mealtime

          •   http://brakemanscanner.org/

          •   http://www.railshosting.org/

          •   capistrano.org

          •   http://www.globalnerdy.com/2012/01/28/wat-a-funny-
              look-at-ruby-and-javascript-oddities/

          •   http://www.optimum7.com/internet-marketing




References
50 Rails - Innovation and Security

More Related Content

What's hot

Composable and streamable Play apps
Composable and streamable Play appsComposable and streamable Play apps
Composable and streamable Play apps
Yevgeniy Brikman
 
Internal Hive
Internal HiveInternal Hive
Internal Hive
Recruit Technologies
 
Testing Javascript with Jasmine
Testing Javascript with JasmineTesting Javascript with Jasmine
Testing Javascript with Jasmine
Tim Tyrrell
 
With a Mighty Hammer
With a Mighty HammerWith a Mighty Hammer
With a Mighty Hammer
Ben Scofield
 
Lazy vs. Eager Loading Strategies in JPA 2.1
Lazy vs. Eager Loading Strategies in JPA 2.1Lazy vs. Eager Loading Strategies in JPA 2.1
Lazy vs. Eager Loading Strategies in JPA 2.1
Patrycja Wegrzynowicz
 
Why is My Spark Job Failing? by Sandy Ryza of Cloudera
Why is My Spark Job Failing? by Sandy Ryza of ClouderaWhy is My Spark Job Failing? by Sandy Ryza of Cloudera
Why is My Spark Job Failing? by Sandy Ryza of Cloudera
Data Con LA
 
Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015
Konstantin Kudryashov
 
Vuejs testing
Vuejs testingVuejs testing
Vuejs testing
Greg TAPPERO
 
Scala ActiveRecord
Scala ActiveRecordScala ActiveRecord
Scala ActiveRecordscalaconfjp
 
The JavaFX Ecosystem
The JavaFX EcosystemThe JavaFX Ecosystem
The JavaFX Ecosystem
Andres Almiray
 
All I Need to Know I Learned by Writing My Own Web Framework
All I Need to Know I Learned by Writing My Own Web FrameworkAll I Need to Know I Learned by Writing My Own Web Framework
All I Need to Know I Learned by Writing My Own Web Framework
Ben Scofield
 
Akka and the Zen of Reactive System Design
Akka and the Zen of Reactive System DesignAkka and the Zen of Reactive System Design
Akka and the Zen of Reactive System Design
Lightbend
 
Practical PHP 5.3
Practical PHP 5.3Practical PHP 5.3
Practical PHP 5.3
Nate Abele
 
Java Play Restful JPA
Java Play Restful JPAJava Play Restful JPA
Java Play Restful JPA
Faren faren
 
Rich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 ApplicationRich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 Application
Kirill Chebunin
 
Java Play RESTful ebean
Java Play RESTful ebeanJava Play RESTful ebean
Java Play RESTful ebean
Faren faren
 
JavaScript Unit Testing with Jasmine
JavaScript Unit Testing with JasmineJavaScript Unit Testing with Jasmine
JavaScript Unit Testing with Jasmine
Raimonds Simanovskis
 
Introducing Assetic: Asset Management for PHP 5.3
Introducing Assetic: Asset Management for PHP 5.3Introducing Assetic: Asset Management for PHP 5.3
Introducing Assetic: Asset Management for PHP 5.3
Kris Wallsmith
 
Integrating React.js with PHP projects
Integrating React.js with PHP projectsIntegrating React.js with PHP projects
Integrating React.js with PHP projects
Ignacio Martín
 
Django - 次の一歩 gumiStudy#3
Django - 次の一歩 gumiStudy#3Django - 次の一歩 gumiStudy#3
Django - 次の一歩 gumiStudy#3
makoto tsuyuki
 

What's hot (20)

Composable and streamable Play apps
Composable and streamable Play appsComposable and streamable Play apps
Composable and streamable Play apps
 
Internal Hive
Internal HiveInternal Hive
Internal Hive
 
Testing Javascript with Jasmine
Testing Javascript with JasmineTesting Javascript with Jasmine
Testing Javascript with Jasmine
 
With a Mighty Hammer
With a Mighty HammerWith a Mighty Hammer
With a Mighty Hammer
 
Lazy vs. Eager Loading Strategies in JPA 2.1
Lazy vs. Eager Loading Strategies in JPA 2.1Lazy vs. Eager Loading Strategies in JPA 2.1
Lazy vs. Eager Loading Strategies in JPA 2.1
 
Why is My Spark Job Failing? by Sandy Ryza of Cloudera
Why is My Spark Job Failing? by Sandy Ryza of ClouderaWhy is My Spark Job Failing? by Sandy Ryza of Cloudera
Why is My Spark Job Failing? by Sandy Ryza of Cloudera
 
Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015
 
Vuejs testing
Vuejs testingVuejs testing
Vuejs testing
 
Scala ActiveRecord
Scala ActiveRecordScala ActiveRecord
Scala ActiveRecord
 
The JavaFX Ecosystem
The JavaFX EcosystemThe JavaFX Ecosystem
The JavaFX Ecosystem
 
All I Need to Know I Learned by Writing My Own Web Framework
All I Need to Know I Learned by Writing My Own Web FrameworkAll I Need to Know I Learned by Writing My Own Web Framework
All I Need to Know I Learned by Writing My Own Web Framework
 
Akka and the Zen of Reactive System Design
Akka and the Zen of Reactive System DesignAkka and the Zen of Reactive System Design
Akka and the Zen of Reactive System Design
 
Practical PHP 5.3
Practical PHP 5.3Practical PHP 5.3
Practical PHP 5.3
 
Java Play Restful JPA
Java Play Restful JPAJava Play Restful JPA
Java Play Restful JPA
 
Rich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 ApplicationRich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 Application
 
Java Play RESTful ebean
Java Play RESTful ebeanJava Play RESTful ebean
Java Play RESTful ebean
 
JavaScript Unit Testing with Jasmine
JavaScript Unit Testing with JasmineJavaScript Unit Testing with Jasmine
JavaScript Unit Testing with Jasmine
 
Introducing Assetic: Asset Management for PHP 5.3
Introducing Assetic: Asset Management for PHP 5.3Introducing Assetic: Asset Management for PHP 5.3
Introducing Assetic: Asset Management for PHP 5.3
 
Integrating React.js with PHP projects
Integrating React.js with PHP projectsIntegrating React.js with PHP projects
Integrating React.js with PHP projects
 
Django - 次の一歩 gumiStudy#3
Django - 次の一歩 gumiStudy#3Django - 次の一歩 gumiStudy#3
Django - 次の一歩 gumiStudy#3
 

Viewers also liked

Tik bab 4
Tik bab 4Tik bab 4
Tik bab 4
AlmaAlmo
 
Power point bab 2
Power point bab 2Power point bab 2
Power point bab 2
AlmaAlmo
 
Edited conventions of soap opera's powerpoint
Edited conventions of soap opera's powerpointEdited conventions of soap opera's powerpoint
Edited conventions of soap opera's powerpointLukeclements
 
Power Point Tik bab 4
Power Point Tik bab 4Power Point Tik bab 4
Power Point Tik bab 4
AlmaAlmo
 
Powerpoint TIK BAB I
Powerpoint TIK BAB IPowerpoint TIK BAB I
Powerpoint TIK BAB I
AlmaAlmo
 
Conventions of soap opera's powerpoint
Conventions of soap opera's powerpointConventions of soap opera's powerpoint
Conventions of soap opera's powerpointLukeclements
 
Power Point Tik bab 3
Power Point Tik bab 3Power Point Tik bab 3
Power Point Tik bab 3
AlmaAlmo
 
Consoles history timeline 1
Consoles history timeline 1Consoles history timeline 1
Consoles history timeline 1
Lukeclements
 
Childbirth presentation
Childbirth presentationChildbirth presentation
Childbirth presentationcynsalazar27
 

Viewers also liked (9)

Tik bab 4
Tik bab 4Tik bab 4
Tik bab 4
 
Power point bab 2
Power point bab 2Power point bab 2
Power point bab 2
 
Edited conventions of soap opera's powerpoint
Edited conventions of soap opera's powerpointEdited conventions of soap opera's powerpoint
Edited conventions of soap opera's powerpoint
 
Power Point Tik bab 4
Power Point Tik bab 4Power Point Tik bab 4
Power Point Tik bab 4
 
Powerpoint TIK BAB I
Powerpoint TIK BAB IPowerpoint TIK BAB I
Powerpoint TIK BAB I
 
Conventions of soap opera's powerpoint
Conventions of soap opera's powerpointConventions of soap opera's powerpoint
Conventions of soap opera's powerpoint
 
Power Point Tik bab 3
Power Point Tik bab 3Power Point Tik bab 3
Power Point Tik bab 3
 
Consoles history timeline 1
Consoles history timeline 1Consoles history timeline 1
Consoles history timeline 1
 
Childbirth presentation
Childbirth presentationChildbirth presentation
Childbirth presentation
 

Similar to Innovation and Security in Ruby on Rails

Rack
RackRack
Rack
shen liu
 
Socket applications
Socket applicationsSocket applications
Socket applicationsJoão Moura
 
Spring into rails
Spring into railsSpring into rails
Spring into rails
Hiro Asari
 
Speedy TDD with Rails
Speedy TDD with RailsSpeedy TDD with Rails
Speedy TDD with Rails
PatchSpace Ltd
 
Ecossistema Ruby - versão SCTI UNF 2013
Ecossistema Ruby - versão SCTI UNF 2013Ecossistema Ruby - versão SCTI UNF 2013
Ecossistema Ruby - versão SCTI UNF 2013
Fabio Akita
 
JRuby on Rails Deployment: What They Didn't Tell You
JRuby on Rails Deployment: What They Didn't Tell YouJRuby on Rails Deployment: What They Didn't Tell You
JRuby on Rails Deployment: What They Didn't Tell Youelliando dias
 
AngularJS Tips&Tricks
AngularJS Tips&TricksAngularJS Tips&Tricks
AngularJS Tips&Tricks
Petr Bela
 
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011Nick Sieger
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websites
Lindsay Holmwood
 
Fisl - Deployment
Fisl - DeploymentFisl - Deployment
Fisl - Deployment
Fabio Akita
 
Ruby on Rails survival guide of an aged Java developer
Ruby on Rails survival guide of an aged Java developerRuby on Rails survival guide of an aged Java developer
Ruby on Rails survival guide of an aged Java developer
gicappa
 
Fast Web Applications Development with Ruby on Rails on Oracle
Fast Web Applications Development with Ruby on Rails on OracleFast Web Applications Development with Ruby on Rails on Oracle
Fast Web Applications Development with Ruby on Rails on OracleRaimonds Simanovskis
 
Terraform at Scale
Terraform at ScaleTerraform at Scale
Terraform at Scale
Calvin French-Owen
 
Kickin' Ass with Cache-Fu (without notes)
Kickin' Ass with Cache-Fu (without notes)Kickin' Ass with Cache-Fu (without notes)
Kickin' Ass with Cache-Fu (without notes)
err
 
Symfony: Your Next Microframework (SymfonyCon 2015)
Symfony: Your Next Microframework (SymfonyCon 2015)Symfony: Your Next Microframework (SymfonyCon 2015)
Symfony: Your Next Microframework (SymfonyCon 2015)
Ryan Weaver
 
High Performance Django
High Performance DjangoHigh Performance Django
High Performance DjangoDjangoCon2008
 
High Performance Django 1
High Performance Django 1High Performance Django 1
High Performance Django 1DjangoCon2008
 
Breaking SAP portal (DeepSec)
Breaking SAP portal (DeepSec)Breaking SAP portal (DeepSec)
Breaking SAP portal (DeepSec)
ERPScan
 

Similar to Innovation and Security in Ruby on Rails (20)

Rack
RackRack
Rack
 
Socket applications
Socket applicationsSocket applications
Socket applications
 
Spring into rails
Spring into railsSpring into rails
Spring into rails
 
Speedy TDD with Rails
Speedy TDD with RailsSpeedy TDD with Rails
Speedy TDD with Rails
 
Intro to Rack
Intro to RackIntro to Rack
Intro to Rack
 
Ecossistema Ruby - versão SCTI UNF 2013
Ecossistema Ruby - versão SCTI UNF 2013Ecossistema Ruby - versão SCTI UNF 2013
Ecossistema Ruby - versão SCTI UNF 2013
 
JRuby on Rails Deployment: What They Didn't Tell You
JRuby on Rails Deployment: What They Didn't Tell YouJRuby on Rails Deployment: What They Didn't Tell You
JRuby on Rails Deployment: What They Didn't Tell You
 
AngularJS Tips&Tricks
AngularJS Tips&TricksAngularJS Tips&Tricks
AngularJS Tips&Tricks
 
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websites
 
Fisl - Deployment
Fisl - DeploymentFisl - Deployment
Fisl - Deployment
 
Deployment de Rails
Deployment de RailsDeployment de Rails
Deployment de Rails
 
Ruby on Rails survival guide of an aged Java developer
Ruby on Rails survival guide of an aged Java developerRuby on Rails survival guide of an aged Java developer
Ruby on Rails survival guide of an aged Java developer
 
Fast Web Applications Development with Ruby on Rails on Oracle
Fast Web Applications Development with Ruby on Rails on OracleFast Web Applications Development with Ruby on Rails on Oracle
Fast Web Applications Development with Ruby on Rails on Oracle
 
Terraform at Scale
Terraform at ScaleTerraform at Scale
Terraform at Scale
 
Kickin' Ass with Cache-Fu (without notes)
Kickin' Ass with Cache-Fu (without notes)Kickin' Ass with Cache-Fu (without notes)
Kickin' Ass with Cache-Fu (without notes)
 
Symfony: Your Next Microframework (SymfonyCon 2015)
Symfony: Your Next Microframework (SymfonyCon 2015)Symfony: Your Next Microframework (SymfonyCon 2015)
Symfony: Your Next Microframework (SymfonyCon 2015)
 
High Performance Django
High Performance DjangoHigh Performance Django
High Performance Django
 
High Performance Django 1
High Performance Django 1High Performance Django 1
High Performance Django 1
 
Breaking SAP portal (DeepSec)
Breaking SAP portal (DeepSec)Breaking SAP portal (DeepSec)
Breaking SAP portal (DeepSec)
 

Recently uploaded

JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
RTTS
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Tobias Schneck
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
Product School
 
"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor Turskyi"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor Turskyi
Fwdays
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
Guy Korland
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Inflectra
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
Product School
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
Product School
 
Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
Thijs Feryn
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Thierry Lestable
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
Cheryl Hung
 
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
Product School
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance
 
Knowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and backKnowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and back
Elena Simperl
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
Ralf Eggert
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
Jemma Hussein Allen
 

Recently uploaded (20)

JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
 
"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor Turskyi"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor Turskyi
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
 
Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
 
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
 
Knowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and backKnowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and back
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
 

Innovation and Security in Ruby on Rails

  • 1. Ruby on Rails Innovation and Security Tillmann Bielefeld 1
  • 2. In 2001 2 Rails - Innovation and Security
  • 3. "01a4" != "001a4" "01e4" == "001e4" I started hacking 3 Rails - Innovation and Security
  • 4. "01a4" != "001a4" "01e4" == "001e4" "01e4" == "10000" I started hacking 3 Rails - Innovation and Security
  • 5. 4 Rails - Innovation and Security
  • 6. 2006 - 2008 5 Rails - Innovation and Security
  • 7. Too many... 6 Rails - Innovation and Security
  • 8. Layers 7 Rails - Innovation and Security
  • 9. Discussions 8 Rails - Innovation and Security
  • 10. Stack Traces 9 Rails - Innovation and Security
  • 11. ! at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716] ! at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1001) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716] ! at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:129) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716] ! at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716] ! at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716] ! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716] ! at org.eclipse.jetty.server.Server.handle(Server.java:360) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716] ! at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:454) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716] ! at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:890) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716] ! at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:944) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716 ! at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:630) [jetty-http-8.1.5.v20120716.jar:8.1.5.v20120716] ! at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230) [jetty-http-8.1.5.v20120716.jar:8.1.5.v20120716] ! at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77) [jetty-server-8.1.5.v20120716.jar:8.1.5.v20120716] ! at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:622) [jetty-io-8.1.5.v20120716.jar:8.1.5.v20120716] ! at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46) [jetty-io-8.1.5.v20120716.jar:8.1.5.v20120716] ! at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603) [jetty-util-8.1.5.v20120716.jar:8.1.5.v20120716] ! at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538) [jetty-util-8.1.5.v20120716.jar:8.1.5.v20120716] ! at java.lang.Thread.run(Thread.java:680) [na:1.6.0_31] Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: [Assertion failed] - this argument is required; it must not be null; nested exception is java.lan failed] - this argument is required; it must not be null ! at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:301) ~[spring-orm-3.1.2.RELEASE.jar:3.1 ! at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:106) ~[spring-orm-3.1.2.RELEASE.jar:3.1.2.RELEASE] ! at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:58) ~[spring-tx-3. ! at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213) ~[spring-tx-3.1.2.RELEASE.jar:3.1.2.RELEASE] ! at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:163) ~[spring-tx-3.1.2.RELEASE ! at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE] ! at org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor$LockModePopulatingMethodIntercceptor.invoke(LockModeRepositoryPostProcessor.java jpa-1.2.0.M1.jar:na] ! at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE] ! at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE] ! at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE] ! at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE] ! at $Proxy44.findByNameStartsWith(Unknown Source) ~[na:na] ! ... 46 common frames omitted Caused by: java.lang.IllegalArgumentException: [Assertion failed] - this argument is required; it must not be null ! at org.springframework.util.Assert.notNull(Assert.java:112) ~[spring-core-3.1.2.RELEASE.jar:3.1.2.RELEASE] ! at org.springframework.util.Assert.notNull(Assert.java:123) ~[spring-core-3.1.2.RELEASE.jar:3.1.2.RELEASE] ! at org.springframework.data.jpa.repository.query.ParameterMetadataProvider$ParameterMetadata.prepare(ParameterMetadataProvider.java:156) ~[spring-data-jpa-1.2.0.M1 ! at org.springframework.data.jpa.repository.query.CriteriaQueryParameterBinder.bind(CriteriaQueryParameterBinder.java:68) ~[spring-data-jpa-1.2.0.M1.jar:na] ! at org.springframework.data.jpa.repository.query.ParameterBinder.bind(ParameterBinder.java:108) ~[spring-data-jpa-1.2.0.M1.jar:na] ! at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$CountQueryPreparer.invokeBinding(PartTreeJpaQuery.java:196) ~[spring-data-jpa-1.2.0.M1.jar:na] ! at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$QueryPreparer.createQuery(PartTreeJpaQuery.java:121) ~[spring-data-jpa-1.2.0.M1.jar:na] ! at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.doCreateCountQuery(PartTreeJpaQuery.java:82) ~[spring-data-jpa-1.2.0.M1.jar:na] ! at org.springframework.data.jpa.repository.query.AbstractJpaQuery.createCountQuery(AbstractJpaQuery.java:148) ~[spring-data-jpa-1.2.0.M1.jar:na] ! at org.springframework.data.jpa.repository.query.JpaQueryExecution$PagedExecution.doExecute(JpaQueryExecution.java:99) ~[spring-data-jpa-1.2.0.M1.jar:na] ! at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:55) ~[spring-data-jpa-1.2.0.M1.jar:na] ! at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:95) ~[spring-data-jpa-1.2.0.M1.jar:na] ! at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:85) ~[spring-data-jpa-1.2.0.M1.jar:na] ! at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:313) ~[spring-data ! at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE] ! at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) ~[spring-tx-3.1.2.RELEASE.jar:3.1.2.RELEASE] ! at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE] ! at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155) ~[spring-tx-3.1.2.RELEASE Stack Traces ! ... 53 common frames omitted 9 Rails - Innovation and Security
  • 12. $ irb > a ruby-1.9.3-p0 :045 > a NameError: undefined local variable or method `a' for main:Object ruby-1.9.3-p0 :046 > b NameError: undefined local variable or method `b' for main:Object ruby-1.9.3-p0 :047 > a = b NameError: undefined local variable or method `b' for main:Object ruby-1.9.3-p0 :048 > a = a ... ? 2004 10 Rails - Innovation and Security
  • 13. $ irb > a ruby-1.9.3-p0 :045 > a NameError: undefined local variable or method `a' for main:Object ruby-1.9.3-p0 :046 > b NameError: undefined local variable or method `b' for main:Object ruby-1.9.3-p0 :047 > a = b NameError: undefined local variable or method `b' for main:Object ruby-1.9.3-p0 :048 > a = a ... ? => nil 2004 10 Rails - Innovation and Security
  • 14. 2004 11 Rails - Innovation and Security
  • 15. page.replace_html('tasks', Task.completed_count) page.visual_effect(:highlight, 'tasks', :duration => 1.0) .rjs Remote Javascript 12 Rails - Innovation and Security
  • 16. class  Role  <  ActiveRecord::Base    attr_accessor  :name    has_and_belongs_to_many  :clients end class  Client  <  ActiveRecord::Base    has_and_belongs_to_many  :roles end Active Record 13 Rails - Innovation and Security
  • 17. class  Role  <  ActiveRecord::Base    attr_accessor  :name    has_and_belongs_to_many  :clients end class  Client  <  ActiveRecord::Base    has_and_belongs_to_many  :roles end client_roles 1 0..* client_id 0..* 1 Client role_id Role name Active Record 13 Rails - Innovation and Security
  • 18. class  Role  <  ActiveRecord::Base    attr_accessor  :name    has_and_belongs_to_many  :clients end class  Client  <  ActiveRecord::Base    has_and_belongs_to_many  :roles end client_roles 1 0..* client_id 0..* 1 Client role_id Role Magic! name Active Record 13 Rails - Innovation and Security
  • 19. class  Role  <  ActiveRecord::Base    attr_accessor  :name    has_and_belongs_to_many  :clients end Metaprogramming 14 Rails - Innovation and Security
  • 20. class  Role  <  ActiveRecord::Base    attr_accessor  :name    has_and_belongs_to_many  :clients end Role.find_or_create_by_name("admin") Metaprogramming 14 Rails - Innovation and Security
  • 21. class  Role  <  ActiveRecord::Base    attr_accessor  :name    has_and_belongs_to_many  :clients end Role.find_or_create_by_name("admin") def  method_missing(m,  *args,  &block)      #  magic end   Metaprogramming 14 Rails - Innovation and Security
  • 22. class  Role  <  ActiveRecord::Base    attr_accessor  :name    has_and_belongs_to_many  :clients end Role.find_or_create_by_name("admin") def  method_missing(m,  *args,  &block)      #  magic end   Magic! Metaprogramming 14 Rails - Innovation and Security
  • 23. 2008 , Kiel 15 Rails - Innovation and Security
  • 24. 2009 16 Rails - Innovation and Security
  • 25. 2013 17 Rails - Innovation and Security
  • 26. Innovation 18 Rails - Innovation and Security
  • 27. Packet Management 19 Rails - Innovation and Security
  • 28. $  gem  install  rails $  rails  server 20 Rails - Innovation and Security
  • 29. source  "http://rubygems.org" gem  "json" gem  "rails" Gemfile gem  "empuxa-­‐deploy" $  bundle  install $  bundle  exec  script/rails Dependency Management 21 Rails - Innovation and Security
  • 30. en_EN.yml i18n 22 Rails - Innovation and Security
  • 31. launch.slogan1 en_EN.yml i18n 22 Rails - Innovation and Security
  • 32. i18n_viz Gem 23 Rails - Innovation and Security
  • 33. $  cap  deploy <code> Capistrano Deployment 24 Rails - Innovation and Security
  • 34. $  cap  deploy <code> $  cap  staging  deploy staging Capistrano Deployment 24 Rails - Innovation and Security
  • 35. $  cap  deploy <code> $  cap  staging  deploy staging $  cap  production  deploy production Capistrano Deployment 24 Rails - Innovation and Security
  • 36. $  cap  deploy:migrations v1  -­‐>  v2 Capistrano Deployment 25 Rails - Innovation and Security
  • 37. $  cap  deploy:migrations v1  -­‐>  v2 current shared releases    20130128231601    20130129231801    20130129161601 current Capistrano Deployment 25 Rails - Innovation and Security
  • 38. $  cap  deploy:migrations v1  -­‐>  v2 $  cap  deploy  rollback current shared releases    20130128231601    20130129231801 current    20130129161601 current Capistrano Deployment 25 Rails - Innovation and Security
  • 39. class  User  <  ActiveRecord::Base            devise  :database_authenticatable,                    :registerable,  :recoverable,                    :rememberable,  :trackable,  :validatable end Devise 26 Rails - Innovation and Security
  • 40. <div  id='content'>    <div  class='left  column'>        <h2>Welcome  to  our  site!</h2>        <p><%=  print_information  %></p>    </div>    <div  class="right  column">Right</div> </div> HAML Views 27 Rails - Innovation and Security
  • 41. <div  id='content'>    <div  class='left  column'>        <h2>Welcome  to  our  site!</h2>        <p><%=  print_information  %></p>    </div>    <div  class="right  column">Right</div> </div> #content    .left.column        %h2  Welcome  to  our  site!        %p=  print_information    .right.column        Right HAML Views 27 Rails - Innovation and Security
  • 42. link_to_remote  "delete",    :confirm  =>  :true    :url  =>  delete_post(post.id) Ajax 28 Rails - Innovation and Security
  • 43. link_to_remote  "delete",    :confirm  =>  :true    :url  =>  delete_post(post.id) unobstrusive <a  href="/posts/2"  class="delete_post"  data-­‐ confirm="Are  you  sure?"  data-­‐ method="delete"  data-­‐ remote="true"  rel="nofollow">Delete</a>     Ajax 28 Rails - Innovation and Security
  • 44. Admin Interfaces 29 Rails - Innovation and Security
  • 45. def  index     fancygrid_for  :users  do  |g|     g.attributes  :id,  :username,  :email       g.ajax_url  =  users_path     g.find     end   end Frontend Ajax Tables 30 Rails - Innovation and Security
  • 46. RESTful APIs 31 Rails - Innovation and Security
  • 47. Security 32 Rails - Innovation and Security
  • 48. SQL Injection? 33 Rails - Innovation and Security
  • 49. class  Role  <  ActiveRecord::Base    attr_accessor  :name end User.find_by_name(        "Robert');  DROP  TABLE  Students;  -­‐-­‐") SQL Injection. Solved. 34 Rails - Innovation and Security
  • 50. class  Role  <  ActiveRecord::Base    attr_accessor  :name end User.find_by_name(        "Robert');  DROP  TABLE  Students;  -­‐-­‐") SQL Injection. Solved. 34 Rails - Innovation and Security
  • 51. <script  language="javascript"> document.write("<script  src='malware.js'></script>"); </script> Cross Site Scripting 35 Rails - Innovation and Security
  • 52. Cross Site Request Forgery 36 Rails - Innovation and Security
  • 53. - RSpec - Jenkins - Minitest Automated Tests 37 Rails - Innovation and Security
  • 54. Quality Assurance 38 Rails - Innovation and Security
  • 55. $  cd  my_rails_app $  gem  install  brakeman $  brakeman  -­‐o  report.html brakeman 39 Rails - Innovation and Security
  • 56. Fast Patching 40 Rails - Innovation and Security
  • 57. User.find_by_id( {:select  =>"*  from  users  limit  1  -­‐-­‐"}) SELECT  *  from  users  limit  1  -­‐-­‐  FROM  "users"  WHERE   "users"."id"  IS  NULL  LIMIT  1  =>  #<User  id:  1,  all  other  attributes Security Leak, Jan 3rd 41 Rails - Innovation and Security
  • 58. Email from Heroku 42 Rails - Innovation and Security
  • 59. This   Morning! Email from Heroku 42 Rails - Innovation and Security
  • 60. The Community 43 Rails - Innovation and Security
  • 61. Number of Developers Low High Programming Experience 44 Rails - Innovation and Security
  • 62. Number of Developers Low High Programmers 45 Rails - Innovation and Security
  • 63. Number of Developers Low High PHP 46 Rails - Innovation and Security
  • 64. Number of Developers Entry Barriers?! Low High Ruby 47 Rails - Innovation and Security
  • 65. • Strong community Asking Developers 48 Rails - Innovation and Security
  • 66. • Strong community • Simple magic • Eats resources • Enterprise ready • Hosting is either hard or expensive • Open + Innovative + Secure Asking Developers 48 Rails - Innovation and Security
  • 67. MIT  Licence Openness + Connectivity 49 Rails - Innovation and Security
  • 68. Longest Stack Trace ever: https://gist.github.com/1078370 • Burger Picture: Epic Mealtime • http://brakemanscanner.org/ • http://www.railshosting.org/ • capistrano.org • http://www.globalnerdy.com/2012/01/28/wat-a-funny- look-at-ruby-and-javascript-oddities/ • http://www.optimum7.com/internet-marketing References 50 Rails - Innovation and Security