SlideShare una empresa de Scribd logo
1 de 102
Descargar para leer sin conexión
Matthew Mongeau
halogenandtoast
goose@thoughtbot.com
The Art of Ruby
A programmer who subconsciously
views himself as an artist will enjoy
what he does and will do it better.
Donald Knuth
What is Art?
/ärt/

the expression or application of
human creative skill and
imagination, typically in a visual
form such as painting or
sculpture, producing works to be
appreciated primarily for their
beauty or emotional power.
/ärt/

the expression or application of
human creative skill and
imagination, typically in a visual
form such as painting or
sculpture, producing works to be
appreciated primarily for their
beauty or emotional power.
What is Art
What is Art
It’s beautiful.
What is Art
It’s beautiful.
It’s creative.
What is Art
It’s beautiful.
It’s creative.
It’s expressive.
What is Programming
The art of
writing code.
Code is Art
Code is Art
It’s beautiful.
Code is Art
It’s beautiful.
It’s creative.
Code is Art
It’s beautiful.
It’s creative.
It’s expressive.
Writing beautiful Code
Simplicity
Code should be clear
def play
puts "Welcome to the guessing game."
3.times do
guess = get_guess
if won? guess
@won = true
puts "You win!"
break
else
puts "Wrong!"
end
end
if !@won
puts "You lost. The actual number is #{@actual_number}."
end
end
def play
puts "Welcome to the guessing game."
3.times do
guess = get_guess
if won? guess
@won = true
puts "You win!"
break
else
puts "Wrong!"
end
end
if !@won
puts "You lost. The actual number is #{@actual_number}."
end
end
Extract
Method
Pattern

def play
puts "Welcome to the guessing game."
play_rounds
print_results
end
Single Level
of Abstraction
Principle

def play
print_header
play_rounds
print_results
end
Complexity
Balance
def play_rounds
round_count.times do
if correct_guess? get_guess
@won = true
break
else
puts "Wrong!"
end
end
end
def play_rounds
@won = round_count.times.detect { play_round }
end
def play_round
if correct_guess? get_guess
true
else
puts "Wrong!"
end
end
def play_rounds
@won = round_count.times.detect { play_round }
end
def play_round
if correct_guess? get_guess
true
else
puts "Wrong!" # this returns nil which is falsey
end
end
Constraints
The more constraints one imposes,
the more one frees one's self.
Igor Stravinsky
Code Constraints
Code Constraints
5 line methods
Code Constraints
5 line methods
100 line classes
Code Constraints
5 line methods
100 line classes
No classes in public methods
def play
puts "Welcome to the guessing game."
3.times do
guess = get_guess
if won? guess
@won = true
puts "You win!"
break
else
puts "Wrong!"
end
end
if !@won
puts "You lost. The actual number is #{@actual_number}."
end
end
def play
print_header
play_rounds
print_results
end
def play_rounds
round_count.times do
if correct_guess? get_guess
@won = true
break
else
puts "Wrong!"
end
end
end
def play_rounds
@won = round_count.times.detect { play_round }
end
def play_round
if correct_guess? get_guess
true
else
puts "Wrong!"
end
end
def play_rounds
@won = round_count.times.detect { play_round }
end
def play_round
if correct_guess? get_guess
true
else
puts "Wrong!" # this is still bothering me
end
end
Breaking the Rules
Pablo
Learn the rules like a
pro, so you can break
them like an artist.

Picasso
def play_round
if correct_guess? get_guess
true
else
puts "Wrong!"
end
end
def play_round
if correct_guess? get_guess
puts "Correct"
true
else
puts "Wrong!"
false
end
end
def play_round
if correct_guess? get_guess
correct_guess
else
incorrect_guess
end
end
def incorrect_guess
puts "Wrong!"
false
end
def correct_guess
puts "Correct"
false
end
def play_round
if correct_guess? get_guess
correct_guess
else
incorrect_guess
end
end
def incorrect_guess
puts "Wrong!"
false
end
def correct_guess
puts "Correct"
false
end
class Guess
def initialize actual_number
@actual_number = actual_number
@guess = get_guess
end

Extract
Class
Pattern

def status
if correct?
"Correct"
else
"Incorrect"
end
end
def correct?
guess == actual_number
end
private
attr_reader :guess, :actual_number
def get_guess
print "What is your guess: "
gets.to_i
end
end
Extract
Class
Pattern

def play_round
guess = Guess.new(actual_number)
puts guess.display_status
guess.correct?
end
1
Extract Method
1 2
Extract Method

Extract Class
1 2 3
Extract Method

Extract Class

Extract Gem
or App
You Win
Performance
If you’re willing to restrict the
flexibility of your approach, you can
almost always do something better.
John Carmack
module Alchemist
module Conversion
def method_missing unit_name, *args, &block
exponent, unit_name = Alchemist.parse_prefix(unit_name)
if Alchemist.has_measurement?(unit_name)
Alchemist.measurement self, unit_name, exponent
else
super( unit_name, *args, &block )
end
end
end
end
class Numeric
include Alchemist::Conversion
end
module Alchemist
module Conversion
def method_missing unit_name, *args, &block
exponent, unit_name = Alchemist.parse_prefix(unit_name)
if Alchemist.has_measurement?(unit_name)
Alchemist.measurement self, unit_name, exponent
else
super( unit_name, *args, &block )
end
end
end
end
class Numeric
include Alchemist::Conversion
end
def self.parse_prefix(unit)
matches = unit.to_s.match(prefix_matcher)
prefix, parsed_unit = matches.captures
if prefix && si_units.include?(parsed_unit)
value = prefixed_value_for(prefix.to_sym, parsed_unit)
[value, parsed_unit.to_sym]
else
[1, unit]
end
end
def self.parse_prefix(unit)
matches = unit.to_s.match(prefix_matcher)
prefix, parsed_unit = matches.captures
if prefix && si_units.include?(parsed_unit)
value = prefixed_value_for(prefix.to_sym, parsed_unit)
[value, parsed_unit.to_sym]
else
[1, unit]
end
end
def self.parse_prefix(unit)
matches = unit.to_s.match(prefix_matcher)
prefix, parsed_unit = matches.captures
if prefix && si_units.include?(parsed_unit)
value = prefixed_value_for(prefix.to_sym, parsed_unit)
[value, parsed_unit.to_sym]
else
[1, unit]
end
end
def self.prefix_matcher
keys = unit_prefixes.keys.map(&:to_s).
sort{ |a,b| b.length <=> a.length }
%r{^(#{keys.join('|')})?(.+)}
end
[:googol, :yotta, :Y, :zetta, :Z,
:exa, :E, :peta, :P, :tera, :T,
:giga, :G, :mega, :M, :kilo, :k,
:hecto, :h, :deca, :da, :deci, :d,
:centi, :c, :milli, :m, :micro, :u,
:nano, :n, :pico, :p, :femto, :f,
:atto, :a, :zepto, :z, :yocto, :y,
:kibi, :Ki, :mebi, :Mi, :gibi, :Gi,
:tebi, :Ti, :pebi, :Pi, :exbi, :Ei,
:zebi, :Zi, :yobi, :Yi]
/^(googol|yotta|femto|zetta|zepto|micro|
milli|centi|hecto|yocto|exbi|giga|tebi|
mega|pebi|kilo|atto|tera|kibi|deca|yobi|
deci|pico|nano|gibi|zebi|mebi|peta|exa|Ki|
Mi|Gi|Zi|da|Ei|Ti|Pi|Yi|z|a|y|f|p|n|m|c|d|
h|k|M|G|T|P|E|Z|Y|u)?(.+)/
Some people, when confronted
with a problem, think "I know, I'll
use regular expressions." Now
they have two problems.
Jamie Zawinski
I thought
"I know, I'll use regular expressions."
I now had two problems
but
def self.prefix_matcher
@prefix_matcher ||= begin
prefix_keys = unit_prefixes.keys.map(&:to_s).
sort{ |a,b| b.length <=> a.length }
%r{^(#{prefix_keys.join('|')})?(.+)}
end
end
2.0
1.9
Constraints
Keep existing interface
Constraints
Keep existing interface
No method_missing
Constraints
Keep existing interface
No method_missing
Increase performance
module Alchemist
def self.setup category = nil
if category
load_category category
else
load_all_categories
end
end
private
def self.load_all_categories
library.load_all_categories
end
def self.load_category category
library.load_category category
end
end
module Alchemist
class ModuleBuilder
def initialize category
@category = category
end
def build
Module.new.tap do |category_module|
category_module.class_eval %(def self.inspect()
"#<Module(#{category})>" end)
category_module.class_eval category_methods
end
end
private
attr_reader :category
def library
Alchemist.library
end
def category_methods
unit_names.map do |name|
%(define_method("#{name}") { Alchemist.measure self, :#{name} }) +
"n" + prefixed_methods(name)
end.join("n")
end
def unit_names
library.unit_names(category)
end
def prefixes_with_value(name)
if library.si_units.include?(name.to_s)
library.unit_prefixes
else
[]
end
end
def prefixed_methods(name)
prefixes_with_value(name).map do |prefix, value|
%(define_method("#{prefix}#{name}") { Alchemist.measure self, :#{name}, #{value} })
end.join("n")
end
module Alchemist
class ModuleBuilder
def initialize category
@category = category
end
def build
Module.new.tap do |category_module|
category_module.class_eval %(def self.inspect()
"#<Module(#{category})>" end)
category_module.class_eval category_methods
end
end
module Alchemist
class ModuleBuilder
def initialize category
@category = category
end
def build
build_module do |category_module|
define_inspect_method(category_module)
define_unit_methods(category_module)
end
end
[success_kid.jpg]
#include <ruby.h>
#include <string.h>

the c-level

VALUE cParenParser;
VALUE paren_parser_parse(VALUE self, VALUE str) {
const char *c_str = RSTRING_PTR(str);
char *temp = (char *)malloc(sizeof(char) * RSTRING_LEN(str) + 1);
int temp_pos = 1;
int c_str_pos = 0;
temp[0] = c_str[0];
while(c_str[c_str_pos++] != '0') {
if(temp_pos > 0 && temp[temp_pos-1] == ')' && c_str[c_str_pos] == '(') {
temp_pos--;
} else {
temp[temp_pos++] = c_str[c_str_pos];
How to be an artist
Have a toolbox
Be inspired by others
Surround yourself with
talented artists
Surround yourself with
talented artists
Use well known
techniques
Use well known
techniques
Measure improvement
PULLREVIEW
Have feelings
Know when to break
the rules
Have fun.
Prime
learn.thoughtbot.com/prime
THISISMETIS.COM
?

Más contenido relacionado

Destacado

Hellraiser’S Final Project
Hellraiser’S Final ProjectHellraiser’S Final Project
Hellraiser’S Final Projectsamanthastollard
 
Network simulator 2 a simulation tool for linux
Network simulator 2 a simulation tool for linuxNetwork simulator 2 a simulation tool for linux
Network simulator 2 a simulation tool for linuxPratik Joshi
 
Anaylsing Dp Spreads
Anaylsing Dp SpreadsAnaylsing Dp Spreads
Anaylsing Dp Spreadsguest012be8
 
Presentation on Future Mobile Networks
Presentation onFuture Mobile NetworksPresentation onFuture Mobile Networks
Presentation on Future Mobile NetworksPratik Joshi
 
3 Pillars of Universal Design
3 Pillars of Universal Design3 Pillars of Universal Design
3 Pillars of Universal Designcentralmath
 
Performance comparision 1307.4129
Performance comparision 1307.4129Performance comparision 1307.4129
Performance comparision 1307.4129Pratik Joshi
 
POWER INTERACTIVO DE MATEMATICA
POWER INTERACTIVO DE MATEMATICAPOWER INTERACTIVO DE MATEMATICA
POWER INTERACTIVO DE MATEMATICAmarita1277
 
Cs757 ns2-tutorial-exercise
Cs757 ns2-tutorial-exerciseCs757 ns2-tutorial-exercise
Cs757 ns2-tutorial-exercisePratik Joshi
 

Destacado (13)

Hellraiser’S Final Project
Hellraiser’S Final ProjectHellraiser’S Final Project
Hellraiser’S Final Project
 
Ns2pre
Ns2preNs2pre
Ns2pre
 
First One
First OneFirst One
First One
 
Network simulator 2 a simulation tool for linux
Network simulator 2 a simulation tool for linuxNetwork simulator 2 a simulation tool for linux
Network simulator 2 a simulation tool for linux
 
Anaylsing Dp Spreads
Anaylsing Dp SpreadsAnaylsing Dp Spreads
Anaylsing Dp Spreads
 
Presentation on Future Mobile Networks
Presentation onFuture Mobile NetworksPresentation onFuture Mobile Networks
Presentation on Future Mobile Networks
 
Sample Lease
Sample LeaseSample Lease
Sample Lease
 
Ns doc
Ns docNs doc
Ns doc
 
3 Pillars of Universal Design
3 Pillars of Universal Design3 Pillars of Universal Design
3 Pillars of Universal Design
 
Performance comparision 1307.4129
Performance comparision 1307.4129Performance comparision 1307.4129
Performance comparision 1307.4129
 
POWER INTERACTIVO DE MATEMATICA
POWER INTERACTIVO DE MATEMATICAPOWER INTERACTIVO DE MATEMATICA
POWER INTERACTIVO DE MATEMATICA
 
Cs757 ns2-tutorial-exercise
Cs757 ns2-tutorial-exerciseCs757 ns2-tutorial-exercise
Cs757 ns2-tutorial-exercise
 
Cygwin ug-net
Cygwin ug-netCygwin ug-net
Cygwin ug-net
 

Similar a The Art of Ruby

Sa we are all creative high school
Sa we are all creative high schoolSa we are all creative high school
Sa we are all creative high schoolRobert Alan Black
 
Sa we are all creative elementary
Sa we are all creative elementarySa we are all creative elementary
Sa we are all creative elementaryRobert Alan Black
 
Teaching the Principles of Computer Science to Primary-Aged Children
Teaching the Principles of Computer Science to Primary-Aged ChildrenTeaching the Principles of Computer Science to Primary-Aged Children
Teaching the Principles of Computer Science to Primary-Aged ChildrenBarry O'Sullivan
 
Death of an Indie Studio
Death of an Indie StudioDeath of an Indie Studio
Death of an Indie StudioBoston Indes
 
SP Proposal Form (Edited)
SP Proposal Form (Edited)SP Proposal Form (Edited)
SP Proposal Form (Edited)gracenwright
 
Writing Scientific Paper
Writing Scientific PaperWriting Scientific Paper
Writing Scientific PaperMelissa Dudas
 
Word on the street
Word on the streetWord on the street
Word on the streetMarc Lewis
 
Build your creative know how march 2011
Build your creative know how march 2011Build your creative know how march 2011
Build your creative know how march 2011Lucidity
 
Everyone Is Terrible At Poker
Everyone Is Terrible At PokerEveryone Is Terrible At Poker
Everyone Is Terrible At PokerRed Chip Poker
 
Despicable by design - Turning Evil into Empathy - Leeds Digital Festival 2018
Despicable by design - Turning Evil into Empathy - Leeds Digital Festival 2018Despicable by design - Turning Evil into Empathy - Leeds Digital Festival 2018
Despicable by design - Turning Evil into Empathy - Leeds Digital Festival 2018Matt Gibson
 
What matters-now-2
What matters-now-2What matters-now-2
What matters-now-2Cangpt
 
What Matters Now
What Matters NowWhat Matters Now
What Matters Nowglennmanko
 
Ric Rodriguez - Why Knowledge Matters: A Fundamental Change In Search
Ric Rodriguez - Why Knowledge Matters: A Fundamental Change In SearchRic Rodriguez - Why Knowledge Matters: A Fundamental Change In Search
Ric Rodriguez - Why Knowledge Matters: A Fundamental Change In SearchRic Rodriguez
 
12 creative Hobbies For Adult and Creative Artists.pdf
12 creative Hobbies For Adult and Creative Artists.pdf12 creative Hobbies For Adult and Creative Artists.pdf
12 creative Hobbies For Adult and Creative Artists.pdfAwais Matloob
 

Similar a The Art of Ruby (20)

Sa we are all creative high school
Sa we are all creative high schoolSa we are all creative high school
Sa we are all creative high school
 
Sa we are all creative elementary
Sa we are all creative elementarySa we are all creative elementary
Sa we are all creative elementary
 
Teaching the Principles of Computer Science to Primary-Aged Children
Teaching the Principles of Computer Science to Primary-Aged ChildrenTeaching the Principles of Computer Science to Primary-Aged Children
Teaching the Principles of Computer Science to Primary-Aged Children
 
Death of an Indie Studio
Death of an Indie StudioDeath of an Indie Studio
Death of an Indie Studio
 
SP Proposal Form (Edited)
SP Proposal Form (Edited)SP Proposal Form (Edited)
SP Proposal Form (Edited)
 
1+1equalsmorethan2
1+1equalsmorethan21+1equalsmorethan2
1+1equalsmorethan2
 
Writing Scientific Paper
Writing Scientific PaperWriting Scientific Paper
Writing Scientific Paper
 
Word on the street
Word on the streetWord on the street
Word on the street
 
Build your creative know how march 2011
Build your creative know how march 2011Build your creative know how march 2011
Build your creative know how march 2011
 
Everyone Is Terrible At Poker
Everyone Is Terrible At PokerEveryone Is Terrible At Poker
Everyone Is Terrible At Poker
 
Despicable by design - Turning Evil into Empathy - Leeds Digital Festival 2018
Despicable by design - Turning Evil into Empathy - Leeds Digital Festival 2018Despicable by design - Turning Evil into Empathy - Leeds Digital Festival 2018
Despicable by design - Turning Evil into Empathy - Leeds Digital Festival 2018
 
what-matters-now
what-matters-nowwhat-matters-now
what-matters-now
 
What matters now
What matters nowWhat matters now
What matters now
 
What Matters Now
What Matters NowWhat Matters Now
What Matters Now
 
What matters now
What matters nowWhat matters now
What matters now
 
What Matters Now
What Matters NowWhat Matters Now
What Matters Now
 
What matters-now-2
What matters-now-2What matters-now-2
What matters-now-2
 
What Matters Now
What Matters NowWhat Matters Now
What Matters Now
 
Ric Rodriguez - Why Knowledge Matters: A Fundamental Change In Search
Ric Rodriguez - Why Knowledge Matters: A Fundamental Change In SearchRic Rodriguez - Why Knowledge Matters: A Fundamental Change In Search
Ric Rodriguez - Why Knowledge Matters: A Fundamental Change In Search
 
12 creative Hobbies For Adult and Creative Artists.pdf
12 creative Hobbies For Adult and Creative Artists.pdf12 creative Hobbies For Adult and Creative Artists.pdf
12 creative Hobbies For Adult and Creative Artists.pdf
 

Último

How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfhans926745
 
[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
 
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...Miguel Araújo
 
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
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
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
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
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
 
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...Martijn de Jong
 
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
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
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 MenDelhi Call girls
 
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?Antenna Manufacturer Coco
 
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...apidays
 
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
 
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
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 

Último (20)

How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.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
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
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...
 
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
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
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
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
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
 
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...
 
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
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
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
 
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?
 
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...
 
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...
 
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
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 

The Art of Ruby