SlideShare une entreprise Scribd logo
1  sur  184
Télécharger pour lire hors ligne
Testing This


                           TESTING     TESTING



                           TESTING     TESTING



Thursday, April 21, 2011
ZOMG!



Thursday, April 21, 2011
GOOD MORNING!



Thursday, April 21, 2011
Aaron Patterson



Thursday, April 21, 2011
@tenderlove



Thursday, April 21, 2011
WWFMD?
Thursday, April 21, 2011
ITWFMWD?
Thursday, April 21, 2011
Thursday, April 21, 2011
AT&T, AT&T logo and all AT&T related marks are trademarks of AT&T Intellectual Property and/or AT&T affiliated companies.
Thursday, April 21, 2011
Miami Vice Principal
                    Señor Facebook
                       Integration
                  Engineering Manager

Thursday, April 21, 2011
Elect



Thursday, April 21, 2011
Our Time Together

                                               12% 2%
                                                          24%




                                              61%




                           Inspirational   Entertaining   Informative   Wasted


Thursday, April 21, 2011
Thursday, April 21, 2011
KEYNOTE

Thursday, April 21, 2011
Our Time Together
                                                 10%
                                                          20%




                                                                20%
                                           50%




                           Inspirational   Entertaining     Informative   Wasted


Thursday, April 21, 2011
Thursday, April 21, 2011
20% More
                           Transitions


Thursday, April 21, 2011
I enjoy dealing
         with behinds
         the scenes
         information




                           Living Behind
                            the Curtain    6 subjects, less
                                           than 10
                                           minutes on each
                                           of them




Thursday, April 21, 2011
DATABASE



                           APPLICATION



                             CLIENT
Thursday, April 21, 2011
DATABASE



                           APPLICATION



                             CLIENT
Thursday, April 21, 2011
DATABASE



                           APPLICATION



                             CLIENT
Thursday, April 21, 2011
DATABASE



                           APPLICATION



                             CLIENT
Thursday, April 21, 2011
Code as Data



Thursday, April 21, 2011
Politics



Thursday, April 21, 2011
We don't vote on
                                        commits. It
                                        would be too
                                        inefficient.




                             "Open Source
                           is a Democracy"


Thursday, April 21, 2011
OSS is an Oligarchy



Thursday, April 21, 2011
Benevolent Dictator



Thursday, April 21, 2011
Small projects       Large projects have
                           have few people,     too many people so
                           so it is efficient   it becomes
                                                inefficient to
                                                individually consider
                                                all feedback




                            Tyrannical Leader



Thursday, April 21, 2011
Thursday, April 21, 2011
Care and Feeding of
                      Your Tyrant


Thursday, April 21, 2011
Cheetos



Thursday, April 21, 2011
Good
                            reproduction
                            steps




                           Feed them Quality
                                 Bugs


Thursday, April 21, 2011
Feed them Patches
                               with Tests


Thursday, April 21, 2011
Gemspec,
                                         Jewler
                                         Hoe,
                                         etc




                           leave build systems



Thursday, April 21, 2011
leave test
                           frameworks


Thursday, April 21, 2011
Use +1's Carefully



Thursday, April 21, 2011
Thursday, April 21, 2011
Thursday, April 21, 2011
320 comments



Thursday, April 21, 2011
210 plus one



Thursday, April 21, 2011
Thursday, April 21, 2011
FFFFFFFUUUUU
                 UUUUUUU




Thursday, April 21, 2011
Thursday, April 21, 2011
Superficial



Thursday, April 21, 2011
Merit



Thursday, April 21, 2011
Quality



Thursday, April 21, 2011
We'll discuss
                                        this in closing.




                           How to fix?



Thursday, April 21, 2011
Encodings
                            the silent killer




Thursday, April 21, 2011
Data goes in, Data goes out




                  Never a miscommunication
Thursday, April 21, 2011
Until there is



Thursday, April 21, 2011
`encode': "xE9" from ASCII-8BIT to UTF-8
                (Encoding::UndefinedConversionError)




Thursday, April 21, 2011
Encoding Error?




                           You can't explain that
Thursday, April 21, 2011
String Tagging



Thursday, April 21, 2011
Strings with
                                               unknown
                                               encoding are
                                               marked as binary.




                "hello! <3".encoding # => #<Encoding:UTF-8>




Thursday, April 21, 2011
socket.read(4).encoding
                   # => #<Encoding:ASCII-8BIT>




Thursday, April 21, 2011
To understand
                                    these bugs, we
                                    must find
                                    boundaries




                           Boundaries



Thursday, April 21, 2011
App Code




Thursday, April 21, 2011
Sadness
                           Web Server
                                          Belt


                  NoSQL    App Code     File System



                           Database




Thursday, April 21, 2011
Databases         Post contains
                           know the          encoding /
                           stored encoding   spec declares
                                             default




                  #<Encoding:ASCII-8BIT>
                     is usually a bug!



Thursday, April 21, 2011
# encoding: utf-8

                name = '            '
                user = User.create!(:name => name)
                user.reload
                user.name + name




Thursday, April 21, 2011
# encoding: utf-8

                name = '            '
                user = User.create!(:name => name)
                user.reload
                user.name + name


   incompatible character encodings: ASCII-8BIT
     and UTF-8 (Encoding::CompatibilityError)

Thursday, April 21, 2011
>>         name = "Aaron Patterson"
                >>         name.encoding
                =>         #<Encoding:UTF-8>
                >>         User.create!(:name => name)
                >>         u = User.find :first
                >>         u.name.encoding
                =>         #<Encoding:ASCII-8BIT>




Thursday, April 21, 2011
>>         name = "Aaron Patterson"
                >>         name.encoding
                =>         #<Encoding:UTF-8>
                >>         User.create!(:name => name)
                >>         u = User.find :first
                >>         u.name.encoding
                =>         #<Encoding:ASCII-8BIT>




Thursday, April 21, 2011
Ruby attempts
                                       to convert the
                                       binary for you




                name = 'aaron patterson'
                user = User.create!(:name => name)
                user.reload
                user.name + name




Thursday, April 21, 2011
Ruby attempts
                                         to convert the
                                         binary for you




                name = 'aaron patterson'
                user = User.create!(:name => name)
                user.reload
                user.name + name


                              no error


Thursday, April 21, 2011
ASCII-8BIT + other
                             should raise


Thursday, April 21, 2011
Aaro
                                          Opin  n's
                                               ion
                                          Cor
                                              ner!


                           ASCII-8BIT + other
                             should raise


Thursday, April 21, 2011
Resources Know
                              Encoding


Thursday, April 21, 2011
Prepared Statements



Thursday, April 21, 2011
SELECT * FROM "users" WHERE id = 1




Thursday, April 21, 2011
Normal Queries

                           Parse the Query
                           Formulate an Execution Plan
                           Return results




Thursday, April 21, 2011
Application




                            Database


Thursday, April 21, 2011
Application

                           Result Set




                            Database


Thursday, April 21, 2011
Application




                            Database


Thursday, April 21, 2011
Application

                           query: 1234




                            Database


Thursday, April 21, 2011
Application




                            Database


Thursday, April 21, 2011
Application

                           Result Set




                            Database


Thursday, April 21, 2011
Preparation


                           Parse the Query
                           Formulate an Execution Plan




Thursday, April 21, 2011
Execution


                           Return Results




Thursday, April 21, 2011
Data transfer
                            decreases


Thursday, April 21, 2011
Query Planner
                             Improves


Thursday, April 21, 2011
Security



Thursday, April 21, 2011
Talk about
                                       problem
                                       inserting rows
                                       with session
                                       data




                           SQLite3 Issues :'(
                                       Could insert
                                       session data,
                                       but could not
                                       find it




Thursday, April 21, 2011
INSERT INTO "sessions"
                ("data", "session_id")
                VALUES (?, ?)

                ['data',
                'BAh7BjoIZm9vSSIIYmF6BjoGRUY=']
                ['session_id',
                'dae0fb8a9c34e6980c9d0fae33a8fff6']




Thursday, April 21, 2011
db = SQLite3::Database.new ':memory:'
                db.trace { |sql| puts sql }




Thursday, April 21, 2011
INSERT INTO "sessions"
                ("data", "session_id")

                VALUES (

                'BAh7BjoIZm9vSSIIYmF6BjoGRUY=',

                x'3633303337623066376536613130343132343
                765623763626631616439303631')



Thursday, April 21, 2011
INSERT INTO "sessions"
                ("data", "session_id")

                VALUES (

                'BAh7BjoIZm9vSSIIYmF6BjoGRUY=',

                x'3633303337623066376536613130343132343
                765623763626631616439303631')



Thursday, April 21, 2011
Made a sample
                                              program to
                                              reproduce the
                db.trace { |sql| puts sql }   problem


                stmt = db.prepare(
                'INSERT INTO "sessions"
                (session_id)
                VALUES (?)')

                stmt.bind_param 1, 'fuu'
                stmt.execute



Thursday, April 21, 2011
Resulting
                                              Query




                INSERT INTO "sessions"
                (session_id) VALUES ('fuu')




Thursday, April 21, 2011
stmt.bind_param 1, 'fuu'.encode('BINARY')
                stmt.execute




Thursday, April 21, 2011
INSERT INTO "sessions" (session_id)
                VALUES (x'667575')




Thursday, April 21, 2011
Why did sqlite3 do
                                            this?

                                            Talk about column
                                            affinity




                INSERT INTO "sessions" (session_id)
                VALUES (x'667575')




Thursday, April 21, 2011
Why is it stored as
                                Binary?


Thursday, April 21, 2011
Why is the session id
                     tagged binary?


Thursday, April 21, 2011
>>         x = OpenSSL::Random.random_bytes(10)
                =>         "Gx93xFCxB2xCExC0xECxBBxA7W"
                >>         x.encoding
                =>         #<Encoding:ASCII-8BIT>




Thursday, April 21, 2011
>>         y = x.unpack('H*')
                =>         ["4793fcb2cec0ecbba757"]
                >>         y.first.encoding
                =>         #<Encoding:ASCII-8BIT>




Thursday, April 21, 2011
def generate_sid
                  ActiveSupport::SecureRandom.hex(16)
                end




Thursday, April 21, 2011
Should hex have tagged
                                             it?

                                             Should have generate_sid
                                             tagged it?


                def generate_sid
                  sid = ActiveSupport::SecureRandom.hex(16)
                  if sid.respond_to?(:encode!)
                    sid.encode!('UTF-8')
                  end
                  sid
                end




Thursday, April 21, 2011
Find the Source



Thursday, April 21, 2011
ARel and
                           ActiveRecord


Thursday, April 21, 2011
Fear of SQL



Thursday, April 21, 2011
Why?



Thursday, April 21, 2011
But not
                                        specifically SQL

                                        Working with
                                        sets




                           We must learn SQL
                                        Can fetch
                                        correct data.




Thursday, April 21, 2011
We must learn to
                            work with Sets


Thursday, April 21, 2011
Avoid SQL for:



Thursday, April 21, 2011
code reuse



Thursday, April 21, 2011
security



Thursday, April 21, 2011
from databases




                           independence



Thursday, April 21, 2011
What is ARel?



Thursday, April 21, 2011
Represents SQL
                       as a Tree




                                        AST   Represents the
                                              IDEA of a SQL
                                              statement




Thursday, April 21, 2011
SQL Compiler



Thursday, April 21, 2011
Only until we
                           invoke the
                           compiler, does the
                           AST become a
                           query




                                            Represents
                                             an IDEA


Thursday, April 21, 2011
Relationship to
                           ActiveRecord


Thursday, April 21, 2011
User.where('something')




Thursday, April 21, 2011
class User
                  scope :heart where(:name => '<3')
                end

                User.heart.select('name')




Thursday, April 21, 2011
Our Application




                                   ActiveRecord




                           ARel                     Database


Thursday, April 21, 2011
Our Application


                                      .to_a
                                   ActiveRecord




                           ARel                     Database


Thursday, April 21, 2011
Our Application




                                     ActiveRecord


                           to_sql
                           ARel                       Database


Thursday, April 21, 2011
Our Application




                                   ActiveRecord


                                               SELECT * ...

                           ARel                     Database


Thursday, April 21, 2011
Our Application




                                    ActiveRecord

                                  [{: name => '<3'}]


                           ARel                      Database


Thursday, April 21, 2011
ActiveRecord::Relation



Thursday, April 21, 2011
shortens to...



Thursday, April 21, 2011
ARel



Thursday, April 21, 2011
ARel != ARel



Thursday, April 21, 2011
:'(



Thursday, April 21, 2011
Future we can
                                          have
                                          optimizers,
                                          compiler cache,
                                          etc




                           SQL Compiler



Thursday, April 21, 2011
Interpreter?



Thursday, April 21, 2011
module Arel
       module Visitors
         class Mongo < Arel::Visitors::Visitor
           attr_reader :db

            def initialize db; @db = db; end
            Query = Struct.new(:collection_name, :fields, :conditions)

            private

            def visit_Arel_Nodes_SelectStatement o
              o.cores.map { |c| visit_Arel_Nodes_SelectCore c }.map { |query|
                collection = db.collection query.collection_name
                fields    = query.fields
                selector = Hash[query.conditions]
                opts = {}
                opts[:fields] = fields unless fields.empty?
                opts[:limit] = o.limit.expr.to_i if o.limit
                collection.find(selector, opts).to_a
              }.flatten
            end

            def visit_Arel_Nodes_SelectCore o
              fields     = o.projections.map { |proj| visit(proj) }.compact
              conditions = o.wheres.map { |condition| visit(condition) }.flatten(1)
              Query.new(visit(o.source), fields, conditions)
            end

            def visit_Arel_Nodes_And o
              o.children.map { |child| visit child }
            end

            def visit_Arel_Nodes_Equality o
              [visit(o.left), visit(o.right)]
            end

            def visit_Arel_Attributes_Attribute o
              return if o.name == '*'; o.name
            end

            def visit_Arel_Nodes_JoinSource o
              visit o.left
            end

          def visit_Arel_Table o
            o.name
          end
          def literal o; o; end
          alias :visit_String :literal
          alias :visit_Fixnum :literal
        end
      end
    end

Thursday, April 21, 2011
module Arel
       module Visitors
         class Mongo < Arel::Visitors::Visitor
           attr_reader :db

            def initialize db; @db = db; end
            Query = Struct.new(:collection_name, :fields, :conditions)

            private

            def visit_Arel_Nodes_SelectStatement o
              o.cores.map { |c| visit_Arel_Nodes_SelectCore c }.map { |query|
                collection = db.collection query.collection_name
                fields    = query.fields
                selector = Hash[query.conditions]
                opts = {}
                opts[:fields] = fields unless fields.empty?
                opts[:limit] = o.limit.expr.to_i if o.limit
                collection.find(selector, opts).to_a
              }.flatten
            end




                           Mongo Interpreter
            def visit_Arel_Nodes_SelectCore o
              fields     = o.projections.map { |proj| visit(proj) }.compact
              conditions = o.wheres.map { |condition| visit(condition) }.flatten(1)
              Query.new(visit(o.source), fields, conditions)
            end




                               64 loc
            def visit_Arel_Nodes_And o
              o.children.map { |child| visit child }
            end

            def visit_Arel_Nodes_Equality o
              [visit(o.left), visit(o.right)]
            end

            def visit_Arel_Attributes_Attribute o
              return if o.name == '*'; o.name
            end

            def visit_Arel_Nodes_JoinSource o
              visit o.left
            end

          def visit_Arel_Table o
            o.name
          end
          def literal o; o; end
          alias :visit_String :literal
          alias :visit_Fixnum :literal
        end
      end
    end

Thursday, April 21, 2011
Thursday, April 21, 2011
gist.github.com/845782




Thursday, April 21, 2011
Custom DSL



Thursday, April 21, 2011
Responds to *

                 class Select < Struct.new(:columns)
                   def self.* other
                     other.select = new(Arel.sql('*'))
                     other
                   end
                 end




Thursday, April 21, 2011
Responds to WHERE

                 class From < Struct.new(:table, :conditions)
                   def WHERE conditions
                     self.conditions = conditions
                     Where.new(self)
                   end
                 end




Thursday, April 21, 2011
Responds to to_s

                 class Where < Struct.new(:from, :select)
                   def to_s
                     Arel::Table.engine = Arel::Sql::Engine.new(
                       FakeRecord::Base.new)
                     table = Arel::Table.new from.table
                     table.project(select.columns).where(
                       from.conditions.map { |k,v| table[k].eq v }).to_sql
                   end
                 end




Thursday, April 21, 2011
Bootstrap Methods

                 SELECT = Select
                 def FROM table
                   From.new table
                 end




Thursday, April 21, 2011
x = SELECT * FROM("users") .WHERE(:id => 10)
                puts x




Thursday, April 21, 2011
Thursday, April 21, 2011
Write SQL Ruby
                            to avoid SQL


Thursday, April 21, 2011
Talked about
                                       data from the
                                       back end, talk a
                                       bit about data to
                                       the front end




                           Streaming



Thursday, April 21, 2011
Twitter Streaming API



Thursday, April 21, 2011
Needed for
                                 persistent
                                 connections




                    Chunked Responses



Thursday, April 21, 2011
Normal Timeline
                                        Buffers data,
                                        then sends a
                                        response




Thursday, April 21, 2011
Normal Timeline
                                        Buffers data,
                                        then sends a
                                        response


                    Processing ERb




Thursday, April 21, 2011
Normal Timeline
                                              Buffers data,
                                              then sends a
                                              response


                    Processing ERb

                                     Download Asset

                                      Download Asset




Thursday, April 21, 2011
Chunked Timeline
                                        Send data as
                                        soon as it is
                                        available




Thursday, April 21, 2011
Chunked Timeline
                                        Send data as
                                        soon as it is
                                        available
                    Processing ERb




Thursday, April 21, 2011
Chunked Timeline
                                             Send data as
                                             soon as it is
                                             available
                    Processing ERb

                           Download Asset

                            Download Asset




Thursday, April 21, 2011
Implementation



Thursday, April 21, 2011
Rack API



Thursday, April 21, 2011
status, headers, body = app.call(env)




Thursday, April 21, 2011
status.to_i



Thursday, April 21, 2011
headers.is_a?(Hash)



Thursday, April 21, 2011
body.responds_to?(:each)




Thursday, April 21, 2011
Inside Rack
                                         Calls each,

                                         possibly calls
                                         close
                 body.each do |chunk|
                   output(chunk)
                 end
                 body.close rescue nil




Thursday, April 21, 2011
Sample Application
                 class MyApp
                   def call(env)
                     # some computation
                     body = 'hello'
                     # more computation
                     body << ' world'

                     [200, { 'X-Hello' => 'World' }, [body]]
                   end
                 end


Thursday, April 21, 2011
Delay work until each
                 class FooBody
                   def each
                     yield "hello "
                     sleep(10) # simulate work
                     yield "world!"
                   end
                 end



Thursday, April 21, 2011
Database
                                        connections
                                        were lost




                           Problems ☹



Thursday, April 21, 2011
Database
                                        connections are
                                        managed in
                                        middleware




                           Middleware



Thursday, April 21, 2011
"There are two hard problems
                    in CS: cache invalidation
                        and naming things"
                            -- Phil Karlton




Thursday, April 21, 2011
class DbCache < Struct.new(:app)
                  def call(env)
                    # init cache
                    status, headers, body = app.call(env)
                    # clear cache
                    [status, headers, body]
                  end
                end




Thursday, April 21, 2011
class BodyProxy < Struct.new(:delegate)
                  def each
                    delegate.each { |x| yield x }
                  end

                  def close
                    delegate.close rescue nil
                    # clear cache
                  end
                end



Thursday, April 21, 2011
Update Middleware,
                       Database Works! ☺


Thursday, April 21, 2011
Same problem in
                                        query cache as
                                        the database
                                        handle cache.




                           But Query Cache
                            was broken. ☹


Thursday, April 21, 2011
Middleware is
                           coupled to the
                           callstack




Thursday, April 21, 2011
~ 24 middleware



Thursday, April 21, 2011
~ 5 required a proxy



Thursday, April 21, 2011
Types of Middleware

                           Generators           Rack jams these to
                                                one API.

                           Filters              Approach seems
                                                naive when
                                                examining usage
                           Lifecycle Handlers
                                                Tied to
                                                callstack




Thursday, April 21, 2011
Solutions!



Thursday, April 21, 2011
Embrace The
                           Differences!


Thursday, April 21, 2011
Lifecycle Listeners

                 class Listener
                   def created(event)
                   end

                   def destroyed(event)
                   end
                 end



Thursday, April 21, 2011
Generators                   Synchronous or
                                                         Asynchronous



                 class Resource
                   def service(request, response)
                     10.times { |i|
                       response.body.write "hello #{i}"
                     }
                     response.body.close
                                                  Return value is
                   end                            ignored
                 end


Thursday, April 21, 2011
Filters

                 class Filter
                   def filter(request, response, chain)
                     chain.filter(request, response)
                   end
                 end




Thursday, April 21, 2011
Synchronous

                           Asynchronous

                           Freedom from the Callstack

                           Thread Safety




Thursday, April 21, 2011
I stole this API.



Thursday, April 21, 2011
TEE HEE!!!!!



Thursday, April 21, 2011
fixing our tyrants



Thursday, April 21, 2011
Facebook + Github



Thursday, April 21, 2011
Get Involved



Thursday, April 21, 2011
Only fix the
                                        immediate
                                        problem




                           Gain Trust



Thursday, April 21, 2011
Then Persuade



Thursday, April 21, 2011
Thursday, April 21, 2011
Thursday, April 21, 2011
Questions?

Thursday, April 21, 2011

Contenu connexe

Similaire à Behind the Curtain

Social media and stuff
Social media and stuffSocial media and stuff
Social media and stuff
MikeKSmith
 

Similaire à Behind the Curtain (20)

What is your job at your ruby club?
What is your job at your ruby club?What is your job at your ruby club?
What is your job at your ruby club?
 
Building Community: Lessons Learned from Social Media Club
Building Community: Lessons Learned from Social Media ClubBuilding Community: Lessons Learned from Social Media Club
Building Community: Lessons Learned from Social Media Club
 
Guy Kawasaki's Enchantment
Guy Kawasaki's EnchantmentGuy Kawasaki's Enchantment
Guy Kawasaki's Enchantment
 
OpenData, Web Semântica e afins.
OpenData, Web Semântica e afins.OpenData, Web Semântica e afins.
OpenData, Web Semântica e afins.
 
Introduction to NeighborLink Fort Wayne
Introduction to NeighborLink Fort WayneIntroduction to NeighborLink Fort Wayne
Introduction to NeighborLink Fort Wayne
 
April 7 Kaba Rebecca Ryan Presentation
April 7 Kaba Rebecca Ryan PresentationApril 7 Kaba Rebecca Ryan Presentation
April 7 Kaba Rebecca Ryan Presentation
 
April 7 Kenosha Rebecca Ryan Presentation
April 7 Kenosha Rebecca Ryan PresentationApril 7 Kenosha Rebecca Ryan Presentation
April 7 Kenosha Rebecca Ryan Presentation
 
Innovation and Disruption in the Real Estate Industry by David Eaves
Innovation and Disruption in the Real Estate Industry by David EavesInnovation and Disruption in the Real Estate Industry by David Eaves
Innovation and Disruption in the Real Estate Industry by David Eaves
 
Rump - making Puppetmaster-less Puppet meaty
Rump - making Puppetmaster-less Puppet meatyRump - making Puppetmaster-less Puppet meaty
Rump - making Puppetmaster-less Puppet meaty
 
Social media and stuff
Social media and stuffSocial media and stuff
Social media and stuff
 
Startups2011
Startups2011Startups2011
Startups2011
 
Ayen tran
Ayen tranAyen tran
Ayen tran
 
Digital citizenshipv4 ist-ewebinar2010
Digital citizenshipv4 ist-ewebinar2010Digital citizenshipv4 ist-ewebinar2010
Digital citizenshipv4 ist-ewebinar2010
 
How to speed-code a success story
How to speed-code a success storyHow to speed-code a success story
How to speed-code a success story
 
Technobabble or Technobrilliance
Technobabble or TechnobrillianceTechnobabble or Technobrilliance
Technobabble or Technobrilliance
 
Behind The Brandtag
Behind The BrandtagBehind The Brandtag
Behind The Brandtag
 
Spectrum of IT BPO Services in the Philippines
Spectrum of IT BPO Services in the PhilippinesSpectrum of IT BPO Services in the Philippines
Spectrum of IT BPO Services in the Philippines
 
Events+Me
Events+MeEvents+Me
Events+Me
 
Micro-participation
Micro-participationMicro-participation
Micro-participation
 
Giving goodpresentations
Giving goodpresentationsGiving goodpresentations
Giving goodpresentations
 

Plus de Aaron Patterson (9)

RubyConf Argentina 2011
RubyConf Argentina 2011RubyConf Argentina 2011
RubyConf Argentina 2011
 
Nordic Ruby 2011
Nordic Ruby 2011Nordic Ruby 2011
Nordic Ruby 2011
 
RailsConf 2011 Keynote
RailsConf 2011 KeynoteRailsConf 2011 Keynote
RailsConf 2011 Keynote
 
ZOMG WHY IS THIS CODE SO SLOW
ZOMG WHY IS THIS CODE SO SLOWZOMG WHY IS THIS CODE SO SLOW
ZOMG WHY IS THIS CODE SO SLOW
 
RubyConf Brazil 2010
RubyConf Brazil 2010RubyConf Brazil 2010
RubyConf Brazil 2010
 
Hidden Gems of Ruby 1.9
Hidden Gems of Ruby 1.9Hidden Gems of Ruby 1.9
Hidden Gems of Ruby 1.9
 
Having Fun Programming!
Having Fun Programming!Having Fun Programming!
Having Fun Programming!
 
Ruby on Rails: Tasty Burgers
Ruby on Rails: Tasty BurgersRuby on Rails: Tasty Burgers
Ruby on Rails: Tasty Burgers
 
Worst. Ideas. Ever.
Worst. Ideas. Ever.Worst. Ideas. Ever.
Worst. Ideas. Ever.
 

Dernier

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 

Dernier (20)

04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 

Behind the Curtain