SlideShare uma empresa Scribd logo
1 de 49
Rails Under The Knife
Jacob Harris
The New York Times
http://open.nytimes.com/
http://www.nimblecode.com/
harrisj@nytimes.com
harrisj@schizopolis.net
harrisj on Flickr / Twitter / Del.icio.us /
43whatever / NYC.rb / Last.fm / etc.
Things You Might Know
• basic Ruby syntax
• object-oriented programming
• has_many
:talks
• <%=
for
t
in
@talks
%>
 • and that it’s really @talks.each
do
|t|
• validates_presence_of
:name
• def
before_save(talk)
The Stuff of Magic
• Three things you
  might kinda know:
 • Blocks
 • Reflection
 • Metaprogramming
• Commonly called
  magic, but...
Code can and should be
 manipulated like data
Blocks

<%
@talks.each
do
|t|
%>

 <%=
render_partial
'talk',
t
%>
<%
end
%>
Blocks

@talks.any?
{
|t|
t.title
=~
/rails/i
}

@talks.select
{|t|
sounds_cool?
t
}

@talks.inject
{|mins,
t|
mins
+=
t.minutes
}
Reflection
irb>
(3.public_methods
‐
Object.public_methods).sort
#
=>
[quot;%quot;,
quot;&quot;,
quot;*quot;,
quot;**quot;,
quot;+quot;,
quot;+@quot;,
quot;‐quot;,
quot;‐@quot;,
quot;/quot;,
quot;<<quot;,
quot;>>quot;,
quot;[]quot;,

quot;^quot;,
quot;absquot;,
quot;between?quot;,
quot;ceilquot;,
quot;chrquot;,
quot;coercequot;,
quot;denominatorquot;,
quot;divquot;,

quot;divmodquot;,
quot;downtoquot;,
quot;floorquot;,
quot;gcdquot;,
quot;gcdlcmquot;,
quot;id2namequot;,
quot;integer?quot;,
quot;lcmquot;,

quot;moduloquot;,
quot;nextquot;,
quot;nonzero?quot;,
quot;numeratorquot;,
quot;power!quot;,
quot;precquot;,
quot;prec_fquot;,

quot;prec_iquot;,
quot;quoquot;,
quot;rdivquot;,
quot;remainderquot;,
quot;roundquot;,
quot;rpowerquot;,

quot;singleton_method_addedquot;,
quot;sizequot;,
quot;stepquot;,
quot;succquot;,
quot;timesquot;,
quot;to_bnquot;,
quot;to_fquot;,

quot;to_iquot;,
quot;to_intquot;,
quot;to_rquot;,
quot;to_symquot;,
quot;truncatequot;,
quot;uptoquot;,
quot;zero?quot;,
quot;|quot;,
quot;~quot;]
Metaprogramming
console>>
(3.public_methods
‐
Object.public_methods).sort
#
=>
[quot;%quot;,
quot;&quot;,
quot;*quot;,
quot;**quot;,
quot;+quot;,
quot;+@quot;,
quot;‐quot;,
quot;‐@quot;,
quot;/quot;,
quot;<<quot;,
quot;>>quot;,
quot;[]quot;,

quot;^quot;,
quot;absquot;,
quot;agoquot;,
quot;between?quot;,
quot;bytequot;,
quot;bytesquot;,
quot;ceilquot;,
quot;chrquot;,
quot;coercequot;,

quot;dayquot;,
quot;daysquot;,
quot;denominatorquot;,
quot;divquot;,
quot;divmodquot;,
quot;downtoquot;,
quot;even?quot;,

quot;exabytequot;,
quot;exabytesquot;,
quot;floorquot;,
quot;fortnightquot;,
quot;fortnightsquot;,
quot;from_nowquot;,

quot;gcdquot;,
quot;gcdlcmquot;,
quot;gigabytequot;,
quot;gigabytesquot;,
quot;hourquot;,
quot;hoursquot;,
quot;id2namequot;,

quot;integer?quot;,
quot;kilobytequot;,
quot;kilobytesquot;,
quot;lcmquot;,
quot;megabytequot;,
quot;megabytesquot;,

quot;minutequot;,
quot;minutesquot;,
quot;moduloquot;,
quot;monthquot;,
quot;monthsquot;,
quot;multiple_of?quot;,
quot;nextquot;,

quot;nonzero?quot;,
quot;numeratorquot;,
quot;odd?quot;,
quot;ordinalizequot;,
quot;petabytequot;,
quot;petabytesquot;,

quot;power!quot;,
quot;precquot;,
quot;prec_fquot;,
quot;prec_iquot;,
quot;quoquot;,
quot;rdivquot;,
quot;remainderquot;,
quot;roundquot;,

quot;rpowerquot;,
quot;secondquot;,
quot;secondsquot;,
quot;sincequot;,
quot;singleton_method_addedquot;,
quot;sizequot;,

quot;stepquot;,
quot;succquot;,
quot;terabytequot;,
quot;terabytesquot;,
quot;timesquot;,
quot;to_bnquot;,
quot;to_fquot;,
quot;to_iquot;,

quot;to_intquot;,
quot;to_rquot;,
quot;to_symquot;,
quot;truncatequot;,
quot;untilquot;,
quot;uptoquot;,
quot;weekquot;,
quot;weeksquot;,

quot;xchrquot;,
quot;yearquot;,
quot;yearsquot;,
quot;zero?quot;,
quot;|quot;,
quot;~quot;]


                               Even base classes are modifiable
Metaprogramming
• Or add new code as your program runs
 • define_method - specify new methods for
    your classes as needed
 • method_missing - catch-all method that
    can support infinite methods
 • eval - evaluate any Ruby code (be careful)
 • send - dynamically invoke methods by name.
photo from Flickr user procsilas
Active Record

class
Conference
<
ActiveRecord::Base

 has_many
:talks
end
AR Associations
class
Conference
<
ActiveRecord::Base

 has_many
:talks
end

adds to the class these methods (among others):
	 c.talks

 c.talks
<<

 c.talks.find

 c.talks.empty?

 c.talks.create

 ...
ActiveRecord
@talks
=
@conference.talks




SELECT
*
FROM
talks
WHERE

(talks.conference_id
=
1)
has_many

def
has_many(association_id,
options
=
{},
&extension)

 reflection
=
create_has_many_reflection(association_id,


 
 
 
 
 
 
 
 
 
 
 
 

options,
&extension)

 ...

 collection_accessor_methods(reflection,


 
 
 
 
 
 
 
 
 
 
 
 

HasManyAssociation)
end
define_method
def
collection_reader_method(reflection,
association_proxy_class)

 define_method(reflection.name)
do
|*params|

 
 association
=
instance_variable_get(quot;@#{reflection.name}quot;)


   
   unless
association.respond_to?(:loaded?)

   
   
 association
=
association_proxy_class.new(self,
reflection)

   
   
 instance_variable_set(quot;@#{reflection.name}quot;,
association)

   
   end




 association

 end
end
All Together Now
def
collection_reader_method(reflection,
association_proxy_class)

 define_method(reflection.name)
do
|*params|

 
 association
=
instance_variable_get(quot;@#{reflection.name}quot;)


   
   unless
association.respond_to?(:loaded?)

   
   
 association
=
association_proxy_class.new(self,
reflection)

   
   
 instance_variable_set(quot;@#{reflection.name}quot;,
association)

   
   end

                                                   Metaprogramming



 association
                                                   Blocks

 end
                                                   Reflection
end
defines methods
class
Conference

 def
talks(*params)

 
 association
=
instance_variable_get(quot;@#{reflection.name}quot;)


 
 unless
association.respond_to?(:loaded?)

 
 
 association
=
HasManyAssociation.new(self,
reflection)

 
 
 instance_variable_set(quot;@#{reflection.name}quot;,

association)

 
 end
                                                    closure

 
 association

 end
end
About That SQL
class
HasManyAssociation
<
AssociationCollection

 def
initialize

 
 construct_sql

 end


 def
construct_sql

 
 ...

 
 @finder_sql
=
quot;#{@reflection.klass.table_name}.#
{@reflection.primary_key_name}
=
#{@owner.quoted_id}quot;

 
 @finder_sql
<<
quot;
AND
(#{conditions})quot;
if

conditions

 end
end
method_missing
Conference.find_all
Conference.find_by_id
Talk.find_all_by_name
Talk.find_all_by_track
Talk.find_by_day_and_track
Speaker.find_by_name_and_hobby
Speaker.find_all_by_zipcode
Where Are Those From?
• class
Talk
<
ActiveRecord::Base
  

belongs_to
:conference
  end
• No find methods added by script/generate
• Nothing being added by define_to.
• It even finds new columns right when I add
  them to the DB (cue spooky theremin music here)
method_missing
irb>
3.foo
NoMethodError:
undefined
method

`foo'
for
Fixnum:Class








from
(irb):2

class
Object

 def
method_missing(method_id,
*arguments)

 
 throw
NoMethodError
...

 end
end
method_missing
class
ActiveRecord::Base
def
method_missing(method_id,
*arguments)

 if
match
=
/^find_(all_by|by)_([_a‐zA‐Z]w*)$/.match

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 (method_id.to_s)


 
 finder
=
determine_finder(match)

 
 attribute_names
=
extract_attribute_names_from_match(match)

 
 super
unless
all_attributes_exists?(attribute_names)


 
 attributes
=
construct_attributes_from_arguments

(attribute_names,
arguments)


 
 send(finder,
finder_options)

 else

 
 super

 end
end
method_missing
def
method_missing(method_id,
*arguments)

 if
match
=
/^find_(all_by|by)_([_a‐zA‐Z]w*)$/.match

 
 
 
 
 
 
 
 
is 
 
 
 
 
 
 (method_id.to_s)
    if method name find_*

 
 finder
=
determine_finder(match) find all
    see if we should find one or

 
 attribute_names
=
extract_attribute_names_from_match(match)

 
 super
unless
all_attributes_exists?(attribute_names)
    extract columns to find by from
    name or extra arguments

 
 attributes
=
construct_attributes_from_arguments

(attribute_names,
arguments)
    call the finder with options,

 
 send(finder,
finder_options)
    return results

 else

 
 super

 end
end else super ⇌ call Object's MM     ⇌ NoMethodError
Reflection
Observers

class
LocationObserver
<
ActiveRecord::Observer

 def
before_save(location)


   res
=
MultiGeocoder.geocode(location.address)


   lat
=
res.lat


   lng
=
res.lng


   true

 end
end
Calling My Observers
#
when
your
app
calls
Location.save
def
create_or_update_with_callbacks

 return
false
if
callback(:before_save)
==
false

 result
=
create_or_update_without_callbacks

 callback(:after_save)

 result
end
                                saves to the DB
Doing The Callback
                         :before_save
def
callback(method)

 callbacks_for(method).each
do
|callback|

 
 ...

 
 if
callback.respond_to?(method)

 
 
 callback.send(method,
self)

 
 end


...
end
                 Callback is an
                 object of some type
Doing The Callback

def
callback(:before_save)

 callbacks_for(:before_save).each
do
|callback|

 
 ...

 
 if
callback.respond_to?(:before_save)

 
 
 callback.send(:before_save,
self)

 
 end


...
end
                Callback is your Observer
Type Is Irrelevant

Notice it's

if
callback.respond_to?(:before_save)

NOT

if
callback.kind_of?(ActiveRecord::Observer)
photo from Flickr user selva
GarbageTruck acts_as_plow




                            photo from Flickr user phrenologist
Where Classic OOP Fails
class
GarbageTruck
<
SnowPlow
                                  No Way!
end

class
GarbageTruck

 include
Plowing               No Better!
end

class
Plow
<
AbstractFrontAttachment
class
Truck
                                     WTF?

 def
add_attachment(attach_object)
end
class
GarbageTruck
<
Truck
The Ruby Way
class
GarbageTruck

 acts_as_plow_maybe
end

def
acts_as_plow_maybe

 if
snowing?

 
 define_method('plow!')
do
|*params|

 
 
...

 
 end

 end
end
Blocks
λ
aka
Managing Resources

transaction
do

talk.add_attendee('Jake')

conference.recalc_ranking!
end
def
transaction(start_db_transaction
=
true)

 transaction_open
=
false

 begin

 
 if
block_given?

 
 
 if
start_db_transaction

 
 
 
 begin_db_transaction


 
 
 
 transaction_open
=
true

 
 
 end
                         executes your block

 
 
 yield

 
 end

 rescue
Exception
=>
database_transaction_rollback

 
 if
transaction_open

 
 
 transaction_open
=
false

 
 
 rollback_db_transaction

 
 end

 
 raise

 end

 ensure

 
 commit_db_transaction
if
transaction_open
end
RESTful Responding

respond_to
do
|format|

format.html
#
index.rhtml

format.xml
{
render
:xml


 
 
 
 
 
 =>
@users.to_xml
}
end
RESTful Responding
• Rails 1.2 allows you specify different actions
  for different formats requested by the caller
  (eg, page for HTML, feed for XML, etc.)
• Response behavior based on complex logic:
 • Caller may explicitly specify in URL
 • Your app may have implicit priorities
    specified (eg, Atom before XML)
  • Rails may also have to decide on one
    based on client HTTP request headers
RESTful Responding
/talks
	 => return the rendered index.rhtml
/talks.xml
	 => return XML format
/talks.jpg

 => return HTTP Error 406 - “Not Acceptable”
Content Negotation
 Accept:
 text/xml,application/xml,application/
 xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/
 png,*/*;q=0.5

HTTP/1.1 includes the following request-header fields for enabling
server-driven negotiation through description of user agent capabilities
and user preferences: Accept (section 14.1), Accept-Charset (section
14.2), Accept-Encoding (section 14.3), Accept- Language (section 14.4),
and User-Agent (section 14.43). However, an origin server is not
limited to these dimensions and MAY vary the response based on any
aspect of the request, including information outside the request-
header fields or within extension header fields not defined by this
specification.
Why Not A Case?

case
format

 when
:html

 
 render
:html

 when
:xml

 
 render
:xml
=>
@users.to_xml
end
respond_to
do
|format|

format.html
#
index.rhtml

format.xml
{
render
:xml


 
 
 
 
 
 =>
@users.to_xml
}
end
               Outer Block - yields registry
               Inner Block - mime/type handler
Registering a Handler
format.xml
{
render
:xml
=>
@users.to_xml
}
                :xml            { render :xml ... }
class
ActionController::MimeResponds::Responder

 def
method_missing(symbol,
&block)

 
 mime_constant
=
symbol.to_s.upcase










 
 if
Mime::SET.include?(Mime.const_get
(mime_constant))

 
 
 custom(Mime.const_get(mime_constant),
&block)

 
 else



 
 super
                    stores your block to

 
 end
                    execute for MIME match

 end
end
Responding
                               priority list of acceptable
                               response MIME types
def
respond

 for
priority
in
@mime_type_priority

 
 if
priority
===
@order         find in your list of

 
 
 @responses[priority].call
                                   blocks to respond_to

 
 
 return


 
 
 #
mime
type
match
found,
be
happy
and
return

 
 end

 end


 eval
'render(:nothing
=>
true,
:status
=>
quot;406
Not

Acceptablequot;)',
@block_binding
end
                       error if no handlers
Thank You
www.nimblecode.com

Mais conteúdo relacionado

Mais procurados

Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27
Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27
Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27Horacio Gonzalez
 
Secrets of JavaScript Libraries
Secrets of JavaScript LibrariesSecrets of JavaScript Libraries
Secrets of JavaScript Librariesjeresig
 
CSS in React - Will Change Transform
CSS in React - Will Change TransformCSS in React - Will Change Transform
CSS in React - Will Change TransformJoe Seifi
 
Effecient javascript
Effecient javascriptEffecient javascript
Effecient javascriptmpnkhan
 
Javaslang Talk @ Javaland 2017
Javaslang Talk @ Javaland 2017Javaslang Talk @ Javaland 2017
Javaslang Talk @ Javaland 2017David Schmitz
 
Seaside - Web Development As You Like It
Seaside - Web Development As You Like ItSeaside - Web Development As You Like It
Seaside - Web Development As You Like ItLukas Renggli
 
New methods for exploiting ORM injections in Java applications
New methods for exploiting ORM injections in Java applicationsNew methods for exploiting ORM injections in Java applications
New methods for exploiting ORM injections in Java applicationsMikhail Egorov
 
ALPHA Script - XML Model
ALPHA Script - XML ModelALPHA Script - XML Model
ALPHA Script - XML ModelPROBOTEK
 
[DSBW Spring 2009] Unit 07: WebApp Design Patterns & Frameworks (3/3)
[DSBW Spring 2009] Unit 07: WebApp Design Patterns & Frameworks (3/3)[DSBW Spring 2009] Unit 07: WebApp Design Patterns & Frameworks (3/3)
[DSBW Spring 2009] Unit 07: WebApp Design Patterns & Frameworks (3/3)Carles Farré
 
Introduction to web programming with JavaScript
Introduction to web programming with JavaScriptIntroduction to web programming with JavaScript
Introduction to web programming with JavaScriptT11 Sessions
 
Basics of Java Script (JS)
Basics of Java Script (JS)Basics of Java Script (JS)
Basics of Java Script (JS)Ajay Khatri
 
Angular JS2 Training Session #1
Angular JS2 Training Session #1Angular JS2 Training Session #1
Angular JS2 Training Session #1Paras Mendiratta
 
Unit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxUnit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxMichelangelo van Dam
 

Mais procurados (17)

Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27
Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27
Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27
 
Secrets of JavaScript Libraries
Secrets of JavaScript LibrariesSecrets of JavaScript Libraries
Secrets of JavaScript Libraries
 
CSS in React - Will Change Transform
CSS in React - Will Change TransformCSS in React - Will Change Transform
CSS in React - Will Change Transform
 
Effecient javascript
Effecient javascriptEffecient javascript
Effecient javascript
 
Javaslang Talk @ Javaland 2017
Javaslang Talk @ Javaland 2017Javaslang Talk @ Javaland 2017
Javaslang Talk @ Javaland 2017
 
Seaside - Web Development As You Like It
Seaside - Web Development As You Like ItSeaside - Web Development As You Like It
Seaside - Web Development As You Like It
 
New methods for exploiting ORM injections in Java applications
New methods for exploiting ORM injections in Java applicationsNew methods for exploiting ORM injections in Java applications
New methods for exploiting ORM injections in Java applications
 
Javaslang @ Devoxx
Javaslang @ DevoxxJavaslang @ Devoxx
Javaslang @ Devoxx
 
Data Validation models
Data Validation modelsData Validation models
Data Validation models
 
ALPHA Script - XML Model
ALPHA Script - XML ModelALPHA Script - XML Model
ALPHA Script - XML Model
 
[DSBW Spring 2009] Unit 07: WebApp Design Patterns & Frameworks (3/3)
[DSBW Spring 2009] Unit 07: WebApp Design Patterns & Frameworks (3/3)[DSBW Spring 2009] Unit 07: WebApp Design Patterns & Frameworks (3/3)
[DSBW Spring 2009] Unit 07: WebApp Design Patterns & Frameworks (3/3)
 
Introduction to web programming with JavaScript
Introduction to web programming with JavaScriptIntroduction to web programming with JavaScript
Introduction to web programming with JavaScript
 
Dsl
DslDsl
Dsl
 
Theme
ThemeTheme
Theme
 
Basics of Java Script (JS)
Basics of Java Script (JS)Basics of Java Script (JS)
Basics of Java Script (JS)
 
Angular JS2 Training Session #1
Angular JS2 Training Session #1Angular JS2 Training Session #1
Angular JS2 Training Session #1
 
Unit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxUnit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBenelux
 

Destaque

Misión Comercial a México
Misión Comercial  a MéxicoMisión Comercial  a México
Misión Comercial a Méxicopymesaldia
 
E223539
E223539E223539
E223539irjes
 
Putting Medical Officer of Health Reports on the map - Natalie Pollecutt, Wel...
Putting Medical Officer of Health Reports on the map - Natalie Pollecutt, Wel...Putting Medical Officer of Health Reports on the map - Natalie Pollecutt, Wel...
Putting Medical Officer of Health Reports on the map - Natalie Pollecutt, Wel...JISC GECO
 
De normalised london aggregation framework overview
De normalised london  aggregation framework overview De normalised london  aggregation framework overview
De normalised london aggregation framework overview Chris Harris
 
Blogging4Good @ BlogCamp Mumbai 2010 - Ads4Good.org
Blogging4Good @ BlogCamp Mumbai 2010 - Ads4Good.orgBlogging4Good @ BlogCamp Mumbai 2010 - Ads4Good.org
Blogging4Good @ BlogCamp Mumbai 2010 - Ads4Good.org★ Akshay Surve
 

Destaque (7)

Misión Comercial a México
Misión Comercial  a MéxicoMisión Comercial  a México
Misión Comercial a México
 
E223539
E223539E223539
E223539
 
Putting Medical Officer of Health Reports on the map - Natalie Pollecutt, Wel...
Putting Medical Officer of Health Reports on the map - Natalie Pollecutt, Wel...Putting Medical Officer of Health Reports on the map - Natalie Pollecutt, Wel...
Putting Medical Officer of Health Reports on the map - Natalie Pollecutt, Wel...
 
De normalised london aggregation framework overview
De normalised london  aggregation framework overview De normalised london  aggregation framework overview
De normalised london aggregation framework overview
 
Proyecto tabletas
Proyecto tabletasProyecto tabletas
Proyecto tabletas
 
Blogging4Good @ BlogCamp Mumbai 2010 - Ads4Good.org
Blogging4Good @ BlogCamp Mumbai 2010 - Ads4Good.orgBlogging4Good @ BlogCamp Mumbai 2010 - Ads4Good.org
Blogging4Good @ BlogCamp Mumbai 2010 - Ads4Good.org
 
seguridad
seguridadseguridad
seguridad
 

Semelhante a Os Harris

Rails2 Pr
Rails2 PrRails2 Pr
Rails2 Prxibbar
 
The Dom Scripting Toolkit J Query
The Dom Scripting Toolkit J QueryThe Dom Scripting Toolkit J Query
The Dom Scripting Toolkit J QueryQConLondon2008
 
Automated Frontend Testing
Automated Frontend TestingAutomated Frontend Testing
Automated Frontend TestingNeil Crosby
 
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 FrameworkBen Scofield
 
Blocks by Lachs Cox
Blocks by Lachs CoxBlocks by Lachs Cox
Blocks by Lachs Coxlachie
 
Remy Sharp The DOM scripting toolkit jQuery
Remy Sharp The DOM scripting toolkit jQueryRemy Sharp The DOM scripting toolkit jQuery
Remy Sharp The DOM scripting toolkit jQuerydeimos
 
Introduction to Active Record at MySQL Conference 2007
Introduction to Active Record at MySQL Conference 2007Introduction to Active Record at MySQL Conference 2007
Introduction to Active Record at MySQL Conference 2007Rabble .
 
RubyEnRails2007 - Dr Nic Williams - DIY Syntax
RubyEnRails2007 - Dr Nic Williams - DIY SyntaxRubyEnRails2007 - Dr Nic Williams - DIY Syntax
RubyEnRails2007 - Dr Nic Williams - DIY SyntaxDr Nic Williams
 
High Performance Django 1
High Performance Django 1High Performance Django 1
High Performance Django 1DjangoCon2008
 
High Performance Django
High Performance DjangoHigh Performance Django
High Performance DjangoDjangoCon2008
 
What's up with Prototype and script.aculo.us?
What's up with Prototype and script.aculo.us?What's up with Prototype and script.aculo.us?
What's up with Prototype and script.aculo.us?Christophe Porteneuve
 
Forumwarz and RJS: A Love/Hate Affair
Forumwarz and RJS: A Love/Hate AffairForumwarz and RJS: A Love/Hate Affair
Forumwarz and RJS: A Love/Hate Affairguest06ed72
 
Efficient JavaScript Development
Efficient JavaScript DevelopmentEfficient JavaScript Development
Efficient JavaScript Developmentwolframkriesing
 
Ruby Topic Maps Tutorial (2007-10-10)
Ruby Topic Maps Tutorial (2007-10-10)Ruby Topic Maps Tutorial (2007-10-10)
Ruby Topic Maps Tutorial (2007-10-10)Benjamin Bock
 
jQuery and Ruby Web Frameworks
jQuery and Ruby Web FrameworksjQuery and Ruby Web Frameworks
jQuery and Ruby Web FrameworksYehuda Katz
 
DOSUG Intro to JQuery JavaScript Framework
DOSUG Intro to JQuery JavaScript FrameworkDOSUG Intro to JQuery JavaScript Framework
DOSUG Intro to JQuery JavaScript FrameworkMatthew McCullough
 
DOM Scripting Toolkit - jQuery
DOM Scripting Toolkit - jQueryDOM Scripting Toolkit - jQuery
DOM Scripting Toolkit - jQueryRemy Sharp
 

Semelhante a Os Harris (20)

Rails2 Pr
Rails2 PrRails2 Pr
Rails2 Pr
 
The Dom Scripting Toolkit J Query
The Dom Scripting Toolkit J QueryThe Dom Scripting Toolkit J Query
The Dom Scripting Toolkit J Query
 
Automated Frontend Testing
Automated Frontend TestingAutomated Frontend Testing
Automated Frontend Testing
 
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
 
Blocks by Lachs Cox
Blocks by Lachs CoxBlocks by Lachs Cox
Blocks by Lachs Cox
 
DataMapper
DataMapperDataMapper
DataMapper
 
Remy Sharp The DOM scripting toolkit jQuery
Remy Sharp The DOM scripting toolkit jQueryRemy Sharp The DOM scripting toolkit jQuery
Remy Sharp The DOM scripting toolkit jQuery
 
Introduction to Active Record at MySQL Conference 2007
Introduction to Active Record at MySQL Conference 2007Introduction to Active Record at MySQL Conference 2007
Introduction to Active Record at MySQL Conference 2007
 
RubyEnRails2007 - Dr Nic Williams - DIY Syntax
RubyEnRails2007 - Dr Nic Williams - DIY SyntaxRubyEnRails2007 - Dr Nic Williams - DIY Syntax
RubyEnRails2007 - Dr Nic Williams - DIY Syntax
 
High Performance Django 1
High Performance Django 1High Performance Django 1
High Performance Django 1
 
High Performance Django
High Performance DjangoHigh Performance Django
High Performance Django
 
What's up with Prototype and script.aculo.us?
What's up with Prototype and script.aculo.us?What's up with Prototype and script.aculo.us?
What's up with Prototype and script.aculo.us?
 
Forumwarz and RJS: A Love/Hate Affair
Forumwarz and RJS: A Love/Hate AffairForumwarz and RJS: A Love/Hate Affair
Forumwarz and RJS: A Love/Hate Affair
 
Os Furlong
Os FurlongOs Furlong
Os Furlong
 
Efficient JavaScript Development
Efficient JavaScript DevelopmentEfficient JavaScript Development
Efficient JavaScript Development
 
Ruby Topic Maps Tutorial (2007-10-10)
Ruby Topic Maps Tutorial (2007-10-10)Ruby Topic Maps Tutorial (2007-10-10)
Ruby Topic Maps Tutorial (2007-10-10)
 
jQuery and Ruby Web Frameworks
jQuery and Ruby Web FrameworksjQuery and Ruby Web Frameworks
jQuery and Ruby Web Frameworks
 
DOSUG Intro to JQuery JavaScript Framework
DOSUG Intro to JQuery JavaScript FrameworkDOSUG Intro to JQuery JavaScript Framework
DOSUG Intro to JQuery JavaScript Framework
 
DOM Scripting Toolkit - jQuery
DOM Scripting Toolkit - jQueryDOM Scripting Toolkit - jQuery
DOM Scripting Toolkit - jQuery
 
Rack Middleware
Rack MiddlewareRack Middleware
Rack Middleware
 

Mais de oscon2007

J Ruby Whirlwind Tour
J Ruby Whirlwind TourJ Ruby Whirlwind Tour
J Ruby Whirlwind Touroscon2007
 
Solr Presentation5
Solr Presentation5Solr Presentation5
Solr Presentation5oscon2007
 
Os Fitzpatrick Sussman Wiifm
Os Fitzpatrick Sussman WiifmOs Fitzpatrick Sussman Wiifm
Os Fitzpatrick Sussman Wiifmoscon2007
 
Performance Whack A Mole
Performance Whack A MolePerformance Whack A Mole
Performance Whack A Moleoscon2007
 
Os Lanphier Brashears
Os Lanphier BrashearsOs Lanphier Brashears
Os Lanphier Brashearsoscon2007
 
Os Fitzpatrick Sussman Swp
Os Fitzpatrick Sussman SwpOs Fitzpatrick Sussman Swp
Os Fitzpatrick Sussman Swposcon2007
 
Os Berlin Dispelling Myths
Os Berlin Dispelling MythsOs Berlin Dispelling Myths
Os Berlin Dispelling Mythsoscon2007
 
Os Keysholistic
Os KeysholisticOs Keysholistic
Os Keysholisticoscon2007
 
Os Jonphillips
Os JonphillipsOs Jonphillips
Os Jonphillipsoscon2007
 
Os Urnerupdated
Os UrnerupdatedOs Urnerupdated
Os Urnerupdatedoscon2007
 
Adventures In Copyright Reform
Adventures In Copyright ReformAdventures In Copyright Reform
Adventures In Copyright Reformoscon2007
 

Mais de oscon2007 (20)

J Ruby Whirlwind Tour
J Ruby Whirlwind TourJ Ruby Whirlwind Tour
J Ruby Whirlwind Tour
 
Solr Presentation5
Solr Presentation5Solr Presentation5
Solr Presentation5
 
Os Borger
Os BorgerOs Borger
Os Borger
 
Os Harkins
Os HarkinsOs Harkins
Os Harkins
 
Os Fitzpatrick Sussman Wiifm
Os Fitzpatrick Sussman WiifmOs Fitzpatrick Sussman Wiifm
Os Fitzpatrick Sussman Wiifm
 
Os Bunce
Os BunceOs Bunce
Os Bunce
 
Yuicss R7
Yuicss R7Yuicss R7
Yuicss R7
 
Performance Whack A Mole
Performance Whack A MolePerformance Whack A Mole
Performance Whack A Mole
 
Os Fogel
Os FogelOs Fogel
Os Fogel
 
Os Lanphier Brashears
Os Lanphier BrashearsOs Lanphier Brashears
Os Lanphier Brashears
 
Os Tucker
Os TuckerOs Tucker
Os Tucker
 
Os Fitzpatrick Sussman Swp
Os Fitzpatrick Sussman SwpOs Fitzpatrick Sussman Swp
Os Fitzpatrick Sussman Swp
 
Os Berlin Dispelling Myths
Os Berlin Dispelling MythsOs Berlin Dispelling Myths
Os Berlin Dispelling Myths
 
Os Kimsal
Os KimsalOs Kimsal
Os Kimsal
 
Os Pruett
Os PruettOs Pruett
Os Pruett
 
Os Alrubaie
Os AlrubaieOs Alrubaie
Os Alrubaie
 
Os Keysholistic
Os KeysholisticOs Keysholistic
Os Keysholistic
 
Os Jonphillips
Os JonphillipsOs Jonphillips
Os Jonphillips
 
Os Urnerupdated
Os UrnerupdatedOs Urnerupdated
Os Urnerupdated
 
Adventures In Copyright Reform
Adventures In Copyright ReformAdventures In Copyright Reform
Adventures In Copyright Reform
 

Último

Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAndikSusilo4
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
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.pptxKatpro Technologies
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 

Último (20)

Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & Application
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
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
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 

Os Harris