SlideShare une entreprise Scribd logo
1  sur  71
The black magic of
Ruby
metaprogramming
I am Cristian…
Gawyn

@cristianplanas
… and this is the story of
how I fell in love with
Ruby
It was 2011, when I read
this awesome book

(the smart part of this talk is based on it)
I was so excited that I
created my first gem just to
play with metaprogramming.
Easyregexp
http://github.com/Gawyn/easyregexp
Easyregexp
It was a regular expressions generator.
It relied heavily in metaprogramming.

It was never much useful.
Anyway, I felt like this
I mean, people who use
metaprogramming do have
superpowers.
They even know mysterious,
incomprehensible spells!
Repeat with me
The superclass of the eigenclass of an
object is the object’s class.
The superclass of the eigenclass of a
class is the eigenclass of the class’s
superclass.
Sorry, today we won’t talk
about eigenclasses.
We will focus on the most
down to earth part of
metaprogramming.
When I started using
metaprogramming in my
production code, I
remembered an old movie.
In it, Mickey Mouse is the hard-working
apprentice of a powerful sorcerer.
One day, the sorcerer leaves,
and Mickey can play with
magic…
So let’s learn some tricks!
Monkey patching
Monkey patching
Adding code to an already defined
class.
An example

class String
def say_hello
p “hello”
end
end
“an string”. say_hello
=> “hello”
This means that we can
extend any class with our
own methods.
You can also redefine an
already existing method!
Dynamic methods
Dynamic methods
Define methods with an algorythm in
runtime.
A typical example

Imagine a class full of boring,
repeating methods.
A typical example
class User
ROLES = [“user”, “admin”]
# scopes for each role
scope :user, where(role: “user”)
scope :admin, where(role: “admin”)
# Identifying methods for each role
def user?
role == “user”
end

def admin?
role == “admin”
end
end
A typical example

Now let’s add some more roles:
ROLES = [“guest”, “user”,
“confirmed_user”, “moderator”,
“manager”, “admin”, “superadmin”]
Damn!
A typical example

Metaprogramming to the rescue!
A typical example
class User
ROLES = [“guest”, “user”, “confirmed_user”, “moderator”,
“manager”, “admin”, “superadmin”]
ROLES.each do |user_role|
scope user_role.to_sym, where(role: user_role)
define_method “#{user_role}?” do
role == user_role
end
end
end
Great!
Evaluating strings
as code
It does just that: run a string as if it was
code.
class_eval and instance_eval do the
same, just changing the context.
We can also use it on an object using
send.
An example

class Movie
attr_reader :title_en, :title_es, :title_it, :title_pt
def title
send(“title_#{I18n.locale}”)
end
end
An example
class Movie
translate :title, :overview
def translate(*attributes)
attributes.each do |attr|
define_method attr do
send(“#{attr}_#{I18n.locale}”)
end
end
end
end
You can even define
new methods like this!

String.class_eval(“def say_hello; puts „hello‟; end”)
“a string”.say_hello
#=> “hello”
method_missing
method_missing
It’s the method that gets executed
when the called method it’s not found.
We can monkey patch it!
An example
class MetalDetector
def method_missing(method, *args, &block)
if method =~ /metal/
puts “Metal detected!”
else
super
end
end
end
metal_detector = MetalDetector.new
metal_detector.bringing_some_metal_with_me
# => “Metal detected!”
A pretty exemplary use of
method_missing use are
Rails’ dynamic finders
(deprecated in Rails 4)
Calling finding methods with any
combination of attributes will work.

User.find_by_name_and_surname(“Mickey”, “Mouse”)
User.find_by_surname_and_movie(“Mouse”, “Fantasia”)
User.find_by_movie_and_job_and_name(“Fantasia”, “sorcerer”, “Mickey”)
So metaprogramming is
pretty cool, isn’t it?
It can get cooler
Let’s check how
ActiveRecord defines its
setter methods
(in an abbreviated version)
Defining setters
def method_missing(method, *args, &block)
unless self.class.attribute_methods_generated?
self.class.define_attribute_methods
if respond_to_without_attributes?(method)
send(method, *args, &block)
else
super
end
else

super
end
end
Finally it gets to something like this:
def define_write_method(attr_name)
method_definition = “def #{attr_name}=(new_value);
write_attribute(„#{attr_name}‟, new_value); end”
class_eval(method_definition, __FILE__, __LINE)
end

(as told, it’s a pretty abbreviated version)
To know more
Episode 8 of Metaprogramming Ruby: Inside ActiveRecord
https://github.com/rails/rails/blob/master/activerecord/lib/active_r
ecord/attribute_methods.rb

https://github.com/rails/rails/blob/master/activemodel/lib/active_
model/attribute_methods.rb
https://github.com/rails/rails/blob/master/activerecord/lib/active_r
ecord/attribute_methods/write.rb
But in the end of the movie, all the
magic backslashes…
Metaprogramming has its dangers
Unexpected
method override
It happens when you rewrite an
existing method changing its behavior
without checking the consequences.
That means all the code that rely in the
old method behavior will fail.
class Fixnum
alias :old_minus :alias :- :+
alias :+ :old_minus
end

4+3
#=> 1
5–2
#=> 7
Dynamic methods like the ones of the
example can also accidentally monkey
patch critical methods!
Code injection
through evaluation
If you use any kind of eval, remember to
think in all possible cases, specially if
users are involved.
You don’t want to evaluate
“User.destroy_all” on your own
application!
Even if users should be able to evaluate
code in your server, there are ways to
protect you:

Clean Rooms
Ghost methods
Methods working from inside
method_missing don’t “really” exist for
Ruby.
class MetalDetector
def method_missing(method, *args)
if method =~ /metal/
puts “Metal detected!”
else
super
end
end
end
metal_detector = MetalDetector.new
metal_detector.metal
# => “Metal detected!”

metal_detector.respond_to?(:metal)
#=> false
There is a work-around: to monkey
patch the respond_to? method.
Feels kinda hacky.
And still, it can be hard to maintain.
If you want to know more about the dangers of
method_missing, Paolo Perrotta (the author of
Metaprogramming Ruby) has a full presentation
about it: The revenge of method_missing()
Some final
thoughts
1. I look pretty cool with Superman trunks.
2. Metaprogramming is a name
for different techniques: you
can use some and avoid others.
Personally, I use plenty of
dynamic methods and avoid
method_missing.
3. Just be sure of what you do
when you use it.
The sorcerer won’t come to save you!
Thanks!

Contenu connexe

En vedette

Witch Hunts
Witch HuntsWitch Hunts
Witch Huntsdrloewen
 
The lapith and centaur metopes on the parthenon
The lapith and centaur metopes on the parthenonThe lapith and centaur metopes on the parthenon
The lapith and centaur metopes on the parthenonCalum Rogers
 
THE LITTLE WITCH
THE LITTLE WITCHTHE LITTLE WITCH
THE LITTLE WITCHgoldenguapo
 
The Lucky 7 GameWorkshop Presentation
The Lucky 7 GameWorkshop PresentationThe Lucky 7 GameWorkshop Presentation
The Lucky 7 GameWorkshop PresentationDavid Silverlight
 
MongoDB - Ruby document store that doesn't rhyme with ouch
MongoDB - Ruby document store that doesn't rhyme with ouchMongoDB - Ruby document store that doesn't rhyme with ouch
MongoDB - Ruby document store that doesn't rhyme with ouchWynn Netherland
 
Black Magic & Fake Pir in Pakistan.
Black Magic & Fake Pir in Pakistan.Black Magic & Fake Pir in Pakistan.
Black Magic & Fake Pir in Pakistan.diaryinc
 
HTML Lecture Part 1 of 2
HTML Lecture Part 1 of 2HTML Lecture Part 1 of 2
HTML Lecture Part 1 of 2Sharon Wasden
 
Salem witch trials
Salem witch trialsSalem witch trials
Salem witch trialsSaraBates
 
The Black Cat Intro
The  Black  Cat IntroThe  Black  Cat Intro
The Black Cat Introtranceking
 
Black magic presentation
Black magic presentationBlack magic presentation
Black magic presentationZarnigar Altaf
 

En vedette (16)

Witch Hunts
Witch HuntsWitch Hunts
Witch Hunts
 
The lapith and centaur metopes on the parthenon
The lapith and centaur metopes on the parthenonThe lapith and centaur metopes on the parthenon
The lapith and centaur metopes on the parthenon
 
THE LITTLE WITCH
THE LITTLE WITCHTHE LITTLE WITCH
THE LITTLE WITCH
 
Designing Ruby APIs
Designing Ruby APIsDesigning Ruby APIs
Designing Ruby APIs
 
The Lucky 7 GameWorkshop Presentation
The Lucky 7 GameWorkshop PresentationThe Lucky 7 GameWorkshop Presentation
The Lucky 7 GameWorkshop Presentation
 
Witch Kitchen
Witch KitchenWitch Kitchen
Witch Kitchen
 
The Witch
The WitchThe Witch
The Witch
 
MongoDB - Ruby document store that doesn't rhyme with ouch
MongoDB - Ruby document store that doesn't rhyme with ouchMongoDB - Ruby document store that doesn't rhyme with ouch
MongoDB - Ruby document store that doesn't rhyme with ouch
 
Black Magic & Fake Pir in Pakistan.
Black Magic & Fake Pir in Pakistan.Black Magic & Fake Pir in Pakistan.
Black Magic & Fake Pir in Pakistan.
 
HTML Lecture Part 1 of 2
HTML Lecture Part 1 of 2HTML Lecture Part 1 of 2
HTML Lecture Part 1 of 2
 
Ruby object model
Ruby object modelRuby object model
Ruby object model
 
Salem witch trials
Salem witch trialsSalem witch trials
Salem witch trials
 
Superstition
SuperstitionSuperstition
Superstition
 
The Black Cat Intro
The  Black  Cat IntroThe  Black  Cat Intro
The Black Cat Intro
 
Black magic
Black magicBlack magic
Black magic
 
Black magic presentation
Black magic presentationBlack magic presentation
Black magic presentation
 

Similaire à The black magic of Ruby metaprogramming

How to not suck at JavaScript
How to not suck at JavaScriptHow to not suck at JavaScript
How to not suck at JavaScripttmont
 
Exception Handling: Designing Robust Software in Ruby (with presentation note)
Exception Handling: Designing Robust Software in Ruby (with presentation note)Exception Handling: Designing Robust Software in Ruby (with presentation note)
Exception Handling: Designing Robust Software in Ruby (with presentation note)Wen-Tien Chang
 
How to make fewer errors at the stage of code writing. Part N1.
How to make fewer errors at the stage of code writing. Part N1.How to make fewer errors at the stage of code writing. Part N1.
How to make fewer errors at the stage of code writing. Part N1.PVS-Studio
 
How to make fewer errors at the stage of code writing. Part N1
How to make fewer errors at the stage of code writing. Part N1How to make fewer errors at the stage of code writing. Part N1
How to make fewer errors at the stage of code writing. Part N1Andrey Karpov
 
Exception Handling: Designing Robust Software in Ruby
Exception Handling: Designing Robust Software in RubyException Handling: Designing Robust Software in Ruby
Exception Handling: Designing Robust Software in RubyWen-Tien Chang
 
Beyond the Style Guides
Beyond the Style GuidesBeyond the Style Guides
Beyond the Style GuidesMosky Liu
 
The Good, the Bad and the Ugly things to do with android
The Good, the Bad and the Ugly things to do with androidThe Good, the Bad and the Ugly things to do with android
The Good, the Bad and the Ugly things to do with androidStanojko Markovik
 
Ruby for .NET developers
Ruby for .NET developersRuby for .NET developers
Ruby for .NET developersMax Titov
 
JavaScript Best Pratices
JavaScript Best PraticesJavaScript Best Pratices
JavaScript Best PraticesChengHui Weng
 
Ruby's metaclass
Ruby's metaclassRuby's metaclass
Ruby's metaclassxds2000
 
Metaprogramming Rails
Metaprogramming RailsMetaprogramming Rails
Metaprogramming RailsJustus Eapen
 
Ruby codebases in an entropic universe
Ruby codebases in an entropic universeRuby codebases in an entropic universe
Ruby codebases in an entropic universeNiranjan Paranjape
 
Writing Readable Code
Writing Readable CodeWriting Readable Code
Writing Readable Codeeddiehaber
 
Overcoming The Impedance Mismatch Between Source Code And Architecture
Overcoming The Impedance Mismatch Between Source Code And ArchitectureOvercoming The Impedance Mismatch Between Source Code And Architecture
Overcoming The Impedance Mismatch Between Source Code And ArchitecturePeter Friese
 
Automating Tinder w/ Eigenfaces and StanfordNLP
Automating Tinder w/ Eigenfaces and StanfordNLPAutomating Tinder w/ Eigenfaces and StanfordNLP
Automating Tinder w/ Eigenfaces and StanfordNLPJustin Long
 
Monkeybars in the Manor
Monkeybars in the ManorMonkeybars in the Manor
Monkeybars in the Manormartinbtt
 

Similaire à The black magic of Ruby metaprogramming (20)

All of Javascript
All of JavascriptAll of Javascript
All of Javascript
 
Deciphering the Ruby Object Model
Deciphering the Ruby Object ModelDeciphering the Ruby Object Model
Deciphering the Ruby Object Model
 
How to not suck at JavaScript
How to not suck at JavaScriptHow to not suck at JavaScript
How to not suck at JavaScript
 
Exception Handling: Designing Robust Software in Ruby (with presentation note)
Exception Handling: Designing Robust Software in Ruby (with presentation note)Exception Handling: Designing Robust Software in Ruby (with presentation note)
Exception Handling: Designing Robust Software in Ruby (with presentation note)
 
Metaprogramming
MetaprogrammingMetaprogramming
Metaprogramming
 
All of javascript
All of javascriptAll of javascript
All of javascript
 
How to make fewer errors at the stage of code writing. Part N1.
How to make fewer errors at the stage of code writing. Part N1.How to make fewer errors at the stage of code writing. Part N1.
How to make fewer errors at the stage of code writing. Part N1.
 
How to make fewer errors at the stage of code writing. Part N1
How to make fewer errors at the stage of code writing. Part N1How to make fewer errors at the stage of code writing. Part N1
How to make fewer errors at the stage of code writing. Part N1
 
Exception Handling: Designing Robust Software in Ruby
Exception Handling: Designing Robust Software in RubyException Handling: Designing Robust Software in Ruby
Exception Handling: Designing Robust Software in Ruby
 
Beyond the Style Guides
Beyond the Style GuidesBeyond the Style Guides
Beyond the Style Guides
 
The Good, the Bad and the Ugly things to do with android
The Good, the Bad and the Ugly things to do with androidThe Good, the Bad and the Ugly things to do with android
The Good, the Bad and the Ugly things to do with android
 
Ruby for .NET developers
Ruby for .NET developersRuby for .NET developers
Ruby for .NET developers
 
JavaScript Best Pratices
JavaScript Best PraticesJavaScript Best Pratices
JavaScript Best Pratices
 
Ruby's metaclass
Ruby's metaclassRuby's metaclass
Ruby's metaclass
 
Metaprogramming Rails
Metaprogramming RailsMetaprogramming Rails
Metaprogramming Rails
 
Ruby codebases in an entropic universe
Ruby codebases in an entropic universeRuby codebases in an entropic universe
Ruby codebases in an entropic universe
 
Writing Readable Code
Writing Readable CodeWriting Readable Code
Writing Readable Code
 
Overcoming The Impedance Mismatch Between Source Code And Architecture
Overcoming The Impedance Mismatch Between Source Code And ArchitectureOvercoming The Impedance Mismatch Between Source Code And Architecture
Overcoming The Impedance Mismatch Between Source Code And Architecture
 
Automating Tinder w/ Eigenfaces and StanfordNLP
Automating Tinder w/ Eigenfaces and StanfordNLPAutomating Tinder w/ Eigenfaces and StanfordNLP
Automating Tinder w/ Eigenfaces and StanfordNLP
 
Monkeybars in the Manor
Monkeybars in the ManorMonkeybars in the Manor
Monkeybars in the Manor
 

Plus de itnig

Presentation of the project "Startups Made in Spain" · On Friday, January 9 a...
Presentation of the project "Startups Made in Spain" · On Friday, January 9 a...Presentation of the project "Startups Made in Spain" · On Friday, January 9 a...
Presentation of the project "Startups Made in Spain" · On Friday, January 9 a...itnig
 
Web Scraping for Non Programmers
Web Scraping for Non ProgrammersWeb Scraping for Non Programmers
Web Scraping for Non Programmersitnig
 
Hands-On Prototyping Without Code
Hands-On Prototyping Without CodeHands-On Prototyping Without Code
Hands-On Prototyping Without Codeitnig
 
Essentials Every Non-Technical Person Need To Know To Build The Best Tech-Tea...
Essentials Every Non-Technical Person Need To Know To Build The Best Tech-Tea...Essentials Every Non-Technical Person Need To Know To Build The Best Tech-Tea...
Essentials Every Non-Technical Person Need To Know To Build The Best Tech-Tea...itnig
 
Die Another Day: Scaling from 0 to 4 million daily requests as a lone develop...
Die Another Day: Scaling from 0 to 4 million daily requests as a lone develop...Die Another Day: Scaling from 0 to 4 million daily requests as a lone develop...
Die Another Day: Scaling from 0 to 4 million daily requests as a lone develop...itnig
 
Data Tools cosystem_for_non_programmers
Data Tools cosystem_for_non_programmersData Tools cosystem_for_non_programmers
Data Tools cosystem_for_non_programmersitnig
 
Futurology For Entrepreneurs: 7 Ways To Spot The Opportunities Of Tomorrow
Futurology For Entrepreneurs: 7 Ways To Spot The Opportunities Of TomorrowFuturology For Entrepreneurs: 7 Ways To Spot The Opportunities Of Tomorrow
Futurology For Entrepreneurs: 7 Ways To Spot The Opportunities Of Tomorrowitnig
 
Visualizing large datasets (BIG DATA itnig friday)
Visualizing large datasets (BIG DATA itnig friday)Visualizing large datasets (BIG DATA itnig friday)
Visualizing large datasets (BIG DATA itnig friday)itnig
 
Make your own Open Source transition with CocoaPods
Make your own Open Source transition with CocoaPodsMake your own Open Source transition with CocoaPods
Make your own Open Source transition with CocoaPodsitnig
 
"El boom del Consumo Colaborativo" by Albert Cañigueral
"El boom del Consumo Colaborativo" by Albert Cañigueral"El boom del Consumo Colaborativo" by Albert Cañigueral
"El boom del Consumo Colaborativo" by Albert Cañigueralitnig
 
Control Your Life - The Startup Way
Control Your Life - The Startup WayControl Your Life - The Startup Way
Control Your Life - The Startup Wayitnig
 
Analítica Ágil - De la Sobrecarga a la Evidencia de los Datos
Analítica Ágil - De la Sobrecarga a la Evidencia de los DatosAnalítica Ágil - De la Sobrecarga a la Evidencia de los Datos
Analítica Ágil - De la Sobrecarga a la Evidencia de los Datositnig
 
Ser público en internet lo es todo.
Ser público en internet lo es todo.Ser público en internet lo es todo.
Ser público en internet lo es todo.itnig
 
Performance marketingonline enterategratis_
Performance marketingonline enterategratis_Performance marketingonline enterategratis_
Performance marketingonline enterategratis_itnig
 
SEO para ecommerce by Alfonso Moure
SEO para ecommerce by Alfonso MoureSEO para ecommerce by Alfonso Moure
SEO para ecommerce by Alfonso Moureitnig
 
Hablar en Público by Marion Chevalier
Hablar en Público by Marion ChevalierHablar en Público by Marion Chevalier
Hablar en Público by Marion Chevalieritnig
 
Collecting metrics with Graphite and StatsD
Collecting metrics with Graphite and StatsDCollecting metrics with Graphite and StatsD
Collecting metrics with Graphite and StatsDitnig
 
La burbuja publicitaria
La burbuja publicitariaLa burbuja publicitaria
La burbuja publicitariaitnig
 
Analisis de las empresas del Ibex35
Analisis de las empresas del Ibex35Analisis de las empresas del Ibex35
Analisis de las empresas del Ibex35itnig
 
QR-Codes 101 - Convirtiendo la tinta en bits
QR-Codes 101 - Convirtiendo la tinta en bitsQR-Codes 101 - Convirtiendo la tinta en bits
QR-Codes 101 - Convirtiendo la tinta en bitsitnig
 

Plus de itnig (20)

Presentation of the project "Startups Made in Spain" · On Friday, January 9 a...
Presentation of the project "Startups Made in Spain" · On Friday, January 9 a...Presentation of the project "Startups Made in Spain" · On Friday, January 9 a...
Presentation of the project "Startups Made in Spain" · On Friday, January 9 a...
 
Web Scraping for Non Programmers
Web Scraping for Non ProgrammersWeb Scraping for Non Programmers
Web Scraping for Non Programmers
 
Hands-On Prototyping Without Code
Hands-On Prototyping Without CodeHands-On Prototyping Without Code
Hands-On Prototyping Without Code
 
Essentials Every Non-Technical Person Need To Know To Build The Best Tech-Tea...
Essentials Every Non-Technical Person Need To Know To Build The Best Tech-Tea...Essentials Every Non-Technical Person Need To Know To Build The Best Tech-Tea...
Essentials Every Non-Technical Person Need To Know To Build The Best Tech-Tea...
 
Die Another Day: Scaling from 0 to 4 million daily requests as a lone develop...
Die Another Day: Scaling from 0 to 4 million daily requests as a lone develop...Die Another Day: Scaling from 0 to 4 million daily requests as a lone develop...
Die Another Day: Scaling from 0 to 4 million daily requests as a lone develop...
 
Data Tools cosystem_for_non_programmers
Data Tools cosystem_for_non_programmersData Tools cosystem_for_non_programmers
Data Tools cosystem_for_non_programmers
 
Futurology For Entrepreneurs: 7 Ways To Spot The Opportunities Of Tomorrow
Futurology For Entrepreneurs: 7 Ways To Spot The Opportunities Of TomorrowFuturology For Entrepreneurs: 7 Ways To Spot The Opportunities Of Tomorrow
Futurology For Entrepreneurs: 7 Ways To Spot The Opportunities Of Tomorrow
 
Visualizing large datasets (BIG DATA itnig friday)
Visualizing large datasets (BIG DATA itnig friday)Visualizing large datasets (BIG DATA itnig friday)
Visualizing large datasets (BIG DATA itnig friday)
 
Make your own Open Source transition with CocoaPods
Make your own Open Source transition with CocoaPodsMake your own Open Source transition with CocoaPods
Make your own Open Source transition with CocoaPods
 
"El boom del Consumo Colaborativo" by Albert Cañigueral
"El boom del Consumo Colaborativo" by Albert Cañigueral"El boom del Consumo Colaborativo" by Albert Cañigueral
"El boom del Consumo Colaborativo" by Albert Cañigueral
 
Control Your Life - The Startup Way
Control Your Life - The Startup WayControl Your Life - The Startup Way
Control Your Life - The Startup Way
 
Analítica Ágil - De la Sobrecarga a la Evidencia de los Datos
Analítica Ágil - De la Sobrecarga a la Evidencia de los DatosAnalítica Ágil - De la Sobrecarga a la Evidencia de los Datos
Analítica Ágil - De la Sobrecarga a la Evidencia de los Datos
 
Ser público en internet lo es todo.
Ser público en internet lo es todo.Ser público en internet lo es todo.
Ser público en internet lo es todo.
 
Performance marketingonline enterategratis_
Performance marketingonline enterategratis_Performance marketingonline enterategratis_
Performance marketingonline enterategratis_
 
SEO para ecommerce by Alfonso Moure
SEO para ecommerce by Alfonso MoureSEO para ecommerce by Alfonso Moure
SEO para ecommerce by Alfonso Moure
 
Hablar en Público by Marion Chevalier
Hablar en Público by Marion ChevalierHablar en Público by Marion Chevalier
Hablar en Público by Marion Chevalier
 
Collecting metrics with Graphite and StatsD
Collecting metrics with Graphite and StatsDCollecting metrics with Graphite and StatsD
Collecting metrics with Graphite and StatsD
 
La burbuja publicitaria
La burbuja publicitariaLa burbuja publicitaria
La burbuja publicitaria
 
Analisis de las empresas del Ibex35
Analisis de las empresas del Ibex35Analisis de las empresas del Ibex35
Analisis de las empresas del Ibex35
 
QR-Codes 101 - Convirtiendo la tinta en bits
QR-Codes 101 - Convirtiendo la tinta en bitsQR-Codes 101 - Convirtiendo la tinta en bits
QR-Codes 101 - Convirtiendo la tinta en bits
 

Dernier

Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
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
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 

Dernier (20)

Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
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...
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 

The black magic of Ruby metaprogramming