SlideShare ist ein Scribd-Unternehmen logo
1 von 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 modiable
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 innite 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
dene_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
denes 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 nd_*

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

 
 attribute_names
=
extract_attribute_names_from_match(match)

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

 
 attributes
=
construct_attributes_from_arguments

(attribute_names,
arguments)
    call the nder 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
    specied (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 elds 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 elds or within extension header elds not dened by this
specication.
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

Weitere ähnliche Inhalte

Was ist angesagt?

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
 
Javaslang @ Devoxx
Javaslang @ DevoxxJavaslang @ Devoxx
Javaslang @ DevoxxDavid Schmitz
 
Data Validation models
Data Validation modelsData Validation models
Data Validation modelsMarcin Czarnecki
 
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
 
Dsl
DslDsl
Dslphoet
 
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
 

Was ist angesagt? (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
 

Andere mochten auch

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
 
Proyecto tabletas
Proyecto tabletasProyecto tabletas
Proyecto tabletasFabian Roldan
 
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
 
seguridad
seguridadseguridad
seguridadphunziker
 

Andere mochten auch (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
 

Ähnlich wie 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
 
DataMapper
DataMapperDataMapper
DataMapperYehuda Katz
 
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
High Performance DjangoHigh Performance Django
High Performance DjangoDjangoCon2008
 
High Performance Django 1
High Performance Django 1High Performance Django 1
High Performance Django 1DjangoCon2008
 
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
 
Os Furlong
Os FurlongOs Furlong
Os Furlongoscon2007
 
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
 
Rack Middleware
Rack MiddlewareRack Middleware
Rack MiddlewareLittleBIGRuby
 

Ähnlich wie 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
High Performance DjangoHigh Performance Django
High Performance Django
 
High Performance Django 1
High Performance Django 1High Performance Django 1
High Performance Django 1
 
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
 

Mehr von oscon2007

J Ruby Whirlwind Tour
J Ruby Whirlwind TourJ Ruby Whirlwind Tour
J Ruby Whirlwind Touroscon2007
 
Solr Presentation5
Solr Presentation5Solr Presentation5
Solr Presentation5oscon2007
 
Os Borger
Os BorgerOs Borger
Os Borgeroscon2007
 
Os Harkins
Os HarkinsOs Harkins
Os Harkinsoscon2007
 
Os Fitzpatrick Sussman Wiifm
Os Fitzpatrick Sussman WiifmOs Fitzpatrick Sussman Wiifm
Os Fitzpatrick Sussman Wiifmoscon2007
 
Os Bunce
Os BunceOs Bunce
Os Bunceoscon2007
 
Yuicss R7
Yuicss R7Yuicss R7
Yuicss R7oscon2007
 
Performance Whack A Mole
Performance Whack A MolePerformance Whack A Mole
Performance Whack A Moleoscon2007
 
Os Fogel
Os FogelOs Fogel
Os Fogeloscon2007
 
Os Lanphier Brashears
Os Lanphier BrashearsOs Lanphier Brashears
Os Lanphier Brashearsoscon2007
 
Os Tucker
Os TuckerOs Tucker
Os Tuckeroscon2007
 
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 Kimsal
Os KimsalOs Kimsal
Os Kimsaloscon2007
 
Os Pruett
Os PruettOs Pruett
Os Pruettoscon2007
 
Os Alrubaie
Os AlrubaieOs Alrubaie
Os Alrubaieoscon2007
 
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
 

Mehr von 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
 

KĂźrzlich hochgeladen

Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
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 BusinessPixlogix Infotech
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
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 2024The Digital Insurer
 
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...Neo4j
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
[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
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesBoston Institute of Analytics
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
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.pptxHampshireHUG
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 

KĂźrzlich hochgeladen (20)

Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
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
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
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
 
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...
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
[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
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
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
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 

Os Harris