SlideShare uma empresa Scribd logo
1 de 120
Baixar para ler offline
Opal: The Journey
from JavaScript to
Ruby
by Bozhidar I. Batsov
(@bbatsov)
Божидар
Sofia, Bulgaria
Bug
Few important things
you need to know
about me
I’m an Emacs fanatic
bbatsov
I love Ruby
I don’t like
JavaScript
wtfjs.com
Why am I here?
4%
96%
Web Development Other
10%
90%
Rails Other
Ruby 2.2 includes many new features and improvements
for the increasingly diverse and expanding demands for
Ruby.
For example, Ruby’s Garbage Collector is now able to
collect Symbol type objects. This reduces memory
usage of Symbols; because GC was previously unable
to collect them before 2.2. Since Rails 5.0 will require
Symbol GC, it will support only Ruby 2.2 or later. (See
Rails 4.2 release post for details.)
Also, a reduced pause time thanks to the new
Incremental Garbage Collector will be helpful for running
Rails applications. Recent developments mentioned on
the Rails blog suggest that Rails 5.0 will take advantage
of Incremental GC as well as Symbol GC.
Ruby 2.2 includes many new features and improvements
for the increasingly diverse and expanding demands for
Ruby.
For example, Ruby’s Garbage Collector is now able to
collect Symbol type objects. This reduces memory
usage of Symbols; because GC was previously unable
to collect them before 2.2. Since Rails 5.0 will require
Symbol GC, it will support only Ruby 2.2 or later. (See
Rails 4.2 release post for details.)
Also, a reduced pause time thanks to the new
Incremental Garbage Collector will be helpful for running
Rails applications. Recent developments mentioned on
the Rails blog suggest that Rails 5.0 will take advantage
of Incremental GC as well as Symbol GC.
Ruby 2.2 includes many new features and improvements
for the increasingly diverse and expanding demands for
Ruby.
For example, Ruby’s Garbage Collector is now able to
collect Symbol type objects. This reduces memory
usage of Symbols; because GC was previously unable
to collect them before 2.2. Since Rails 5.0 will require
Symbol GC, it will support only Ruby 2.2 or later. (See
Rails 4.2 release post for details.)
Also, a reduced pause time thanks to the new
Incremental Garbage Collector will be helpful for running
Rails applications. Recent developments mentioned on
the Rails blog suggest that Rails 5.0 will take advantage
of Incremental GC as well as Symbol GC.
Ruby 2.2 includes many new features and improvements
for the increasingly diverse and expanding demands for
Ruby.
For example, Ruby’s Garbage Collector is now able to
collect Symbol type objects. This reduces memory
usage of Symbols; because GC was previously unable
to collect them before 2.2. Since Rails 5.0 will require
Symbol GC, it will support only Ruby 2.2 or later. (See
Rails 4.2 release post for details.)
Also, a reduced pause time thanks to the new
Incremental Garbage Collector will be helpful for running
Rails applications. Recent developments mentioned on
the Rails blog suggest that Rails 5.0 will take advantage
of Incremental GC as well as Symbol GC.
Ruby 2.2 includes many new features and improvements
for the increasingly diverse and expanding demands for
Ruby.
For example, Ruby’s Garbage Collector is now able to
collect Symbol type objects. This reduces memory
usage of Symbols; because GC was previously unable
to collect them before 2.2. Since Rails 5.0 will require
Symbol GC, it will support only Ruby 2.2 or later. (See
Rails 4.2 release post for details.)
Also, a reduced pause time thanks to the new
Incremental Garbage Collector will be helpful for running
Rails applications. Recent developments mentioned on
the Rails blog suggest that Rails 5.0 will take advantage
of Incremental GC as well as Symbol GC.
Ruby 2.2 includes many new features and improvements
for the increasingly diverse and expanding demands for
Ruby.
For example, Ruby’s Garbage Collector is now able to
collect Symbol type objects. This reduces memory
usage of Symbols; because GC was previously unable
to collect them before 2.2. Since Rails 5.0 will require
Symbol GC, it will support only Ruby 2.2 or later. (See
Rails 4.2 release post for details.)
Also, a reduced pause time thanks to the new
Incremental Garbage Collector will be helpful for running
Rails applications. Recent developments mentioned on
the Rails blog suggest that Rails 5.0 will take advantage
of Incremental GC as well as Symbol GC.
Nooooooo
JRuby
RubyMotion
Rails, Rails, Rails
And what about
JavaScript?
Things people are doing
with JavaScript
• Client-side apps
• Server-side apps - Node.js (& io.js)
• iOS & Android apps (using React Native)
• Windows Phone apps
• Desktop app (e.g. for Windows & GNOME)
The possibilities are
infinite with
JavaScript
If only there was some
nice alternative to
JavaScript…
CoffeeScript
PureScript
Dart
Elmlegit
Scala.js
ClojureScriptlegit
Why are we doing this
(ClojureScript)? Because Clojure
rocks, and JavaScript reaches…
— Rich Hickey
(creator of Clojure)
Ruby also rocks!
Ruby is better than
JavaScript
Ruby’s advantages
• Doesn’t have this
• Sane boolean semantics
• No need for a book called “Ruby: The Good Parts”
• No wtfruby.com
• Solid core library
• Extensive standard library
• Do you really need more?
Opal.rbhttp://opalrb.org/
A brief history of time
Opal
• Initial release - 22.01.2010
• Used in production by 2013
• Popularity spikes in 2014 after the launch of
the Volt web framework
• Latest version (0.8.0) was released on
16.07.2015
The Value Proposition
Ruby to JavaScript
source-to-source
compiler
Ruby
Opal
JavaScript
No new VM
No bytecode
No translation layers
An implementation of
Ruby’s corelib and
stdlib
But we already have
CoffeeScript!
CoffeeScript’s shortfalls
• Same (spartan) core library
• No standard library
• It’s not Ruby
A basic example
def hello(name)
puts "Hello, #{name.capitalize}!"
end
hello("bruce")
/* Generated by Opal 0.7.0 */
(function(Opal) {
Opal.dynamic_require_severity = "error";
var self = Opal.top, $scope = Opal, nil = Opal.nil, $breaker = Opal.breaker, $slice = Opal.slice;
Opal.add_stubs(['$puts', '$capitalize', '$hello']);
Opal.Object.$$proto.$hello = function(name) {
var self = this;
return self.$puts("Hello, " + (name.$capitalize()) + "!");
};
return self.$hello("bruce");
})(Opal);
Opal.Object.$$proto.$hello = function(name) {
var self = this;
return self.$puts("Hello, " + (name.$capitalize()) + "!");
};
return self.$hello("bruce");
The magic happens in
Opal.compile
Opal.compile(
"puts 'Hi, eurucamp!’"
)
"/* Generated by Opal 0.7.2 */
n(function(Opal) {n
Opal.dynamic_require_severity = "error";n
var self = Opal.top, $scope = Opal, nil =
Opal.nil, $breaker = Opal.breaker, $slice =
Opal.slice;nn Opal.add_stubs(['$puts']);n
return self.$puts("Hi, eurucamp!")n})
(Opal);n"
/* Generated by Opal 0.7.2 */
(function(Opal) {
Opal.dynamic_require_severity = "error";
var self = Opal.top, $scope = Opal, nil = Opal.nil,
$breaker = Opal.breaker, $slice = Opal.slice;
Opal.add_stubs(['$puts']);
return self.$puts("Hi, eurucamp!")
})(Opal);
Ruby to JS mapping
• self -> this (mostly)
• Ruby method/block -> JS function
• Ruby string -> JS string
• Ruby number -> JS number
• Ruby array -> JS array
• Ruby hash -> custom JS type
JavaScript interop
>> `"bozhidar".toUpperCase()`
=> "BOZHIDAR"
class Array
def length
`this.length`
end
end
`window.title`
# => "Opal: Ruby to JavaScript compiler"
%x{
console.log("Opal version is:");
console.log(#{RUBY_ENGINE_VERSION});
}
# => Opal version is:
# => 0.8.0
require 'native'
window = Native(`window`)
window[:location][:href]
# => “http://opalrb.org/docs/“
window[:location][:href] = "http://opalrb.org/"
# will bring you to opalrb.org
window.alert('Hey campers!')
Alternative JS interop
(coming in Opal 0.9)
# JavaScript: foo.bar(1, "a")
foo.JS.bar(1, :a)
foo.JS.bar 1, :a
# JavaScript:
# ($a = foo)
# .bar
# .apply($a, [1].concat([2, 3]))
foo.JS.bar(1, *[2, 3])
foo.JS.bar 1, *[2, 3]
# JavaScript:
# ($a = (TMP_1 = function(arg){
# var self = TMP_1.$$s || this;
# if (arg == null) arg = nil;
# return "" + (arg.method()) + " " + (self.$baz(3))
# },
# TMP_1.$$s = self, TMP_1),
# foo.bar)(1, 2, $a);
foo.JS.bar(1, 2) { |arg| arg.JS.method + baz(3) }
# JavaScript: foo["bar"]
foo.JS[:bar]
# JavaScript: foo[2]
foo.JS[2]
# JavaScript: foo["bar"] = 1
foo.JS[:bar] = 1
# JavaScript: foo[2] = "a"
foo.JS[2] = :a
require 'js'
# new foo(bar)
JS.new(foo, bar)
# delete foo["bar"]
JS.delete(foo, :bar)
# "bar" in foo
JS.in(:bar, foo)
# foo instanceof bar
JS.instanceof(foo, bar)
# typeof foo
JS.typeof(foo)
require 'js'
# parseFloat("1.1")
JS.call(:parseFloat, '1.1')
JS.parseFloat('1.1')
Ruby from
JavaScript
class Foo
def bar
puts 'Called Foo#bar'
end
end
Opal.Foo.$new().$bar();
// => “Called Foo#bar”
Is Opal any good?
Very basic corelib
No stdlib
Semicolons
Misc WTFs
JavaScript Complexity
Performance
Debugging
Ruby Compatibility
Ruby WTFs
Opal’s Perceived Complexity
File Size
Very basic corelib
No stdlib
Semicolons
Misc WTFs
JavaScript
Performance
Debugging
Ruby Compatibility
Ruby WTFs
Opal
File Size
Performance
File Size
opal.min.js =~ 259 kb
opal.min.js.gz =~ 49 kb
Debugging
It’s just JavaScript
Opal has source
maps
Ruby Compatibility
Ruby compatibility
• Mostly compatible with Ruby 2.0
• Tested against RubySpec
• Implements most of the Ruby corelib
• Implements some of the stdlib (e.g. Set)
Notable differences
• true and false are translated to JavaScript’s booleans
• All numbers are JavaScript floats
• Strings are immutable
• Symbols are strings
• No dynamic requires
• No threads
• No frozen objects
• All methods are public
Performance is key
Performance
Debugging
Ruby Compatibility
Ruby WTFs
Opal Complexity
Very basic corelib
No stdlib
Semicolons
Misc WTFs
JavaScript Complexity
Performance
Debugging
Ruby Compatibility
Ruby WTFs
Opal Complexity
Epic!!!
Diving in
opal-irb
opal-rails
opal-browser
$document.ready do
alert 'yo folks, I'm all loaded up in here'
end
$document.body.style.apply {
background color: 'black'
color 'white'
font family: 'Verdana'
}
Browser::HTTP.get '/something.json' do
on :success do |res|
alert res.json.inspect
end
end
opal-jquery
Element.find('#header')
Element.find('#navigation li:last')
Document.ready? do
alert 'document is ready to go!'
end
Element.find('#header').on :click do
puts 'The header was clicked!'
end
opal-react
opal-native
opal-
activesupport
Looking forward
Implement the
missing things
Better
documentation
A book on Opal
More Opal wrappers
of popular JS libs
WebAssembly
Contribute to Opal!
github.com/opalrb
Opal Resources
• http://opalrb.org/docs/
• http://opalrb.org/try/
• https://opalist.curated.co/
• http://datamelon.io/blog/
• http://fkchang.github.io/opal-playground/
Felina

Mais conteúdo relacionado

Semelhante a Opal,The Journey from Javascript to Ruby at Ruby Conf Kenya 2017 by Bozhidar Batzov

20140425 ruby conftaiwan2014
20140425 ruby conftaiwan201420140425 ruby conftaiwan2014
20140425 ruby conftaiwan2014
Hiroshi SHIBATA
 
MacRuby & HotCocoa
MacRuby & HotCocoaMacRuby & HotCocoa
MacRuby & HotCocoa
Thilo Utke
 
Introduction to Ruby on Rails
Introduction to Ruby on RailsIntroduction to Ruby on Rails
Introduction to Ruby on Rails
Manoj Kumar
 

Semelhante a Opal,The Journey from Javascript to Ruby at Ruby Conf Kenya 2017 by Bozhidar Batzov (20)

What's new in RubyGems3
What's new in RubyGems3What's new in RubyGems3
What's new in RubyGems3
 
20140425 ruby conftaiwan2014
20140425 ruby conftaiwan201420140425 ruby conftaiwan2014
20140425 ruby conftaiwan2014
 
Gems on Ruby
Gems on RubyGems on Ruby
Gems on Ruby
 
New features in Rails 6 - Nihad Abbasov (RUS) | Ruby Meditation 26
New features in Rails 6 -  Nihad Abbasov (RUS) | Ruby Meditation 26New features in Rails 6 -  Nihad Abbasov (RUS) | Ruby Meditation 26
New features in Rails 6 - Nihad Abbasov (RUS) | Ruby Meditation 26
 
MacRuby & HotCocoa
MacRuby & HotCocoaMacRuby & HotCocoa
MacRuby & HotCocoa
 
What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...
What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...
What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...
 
Speedy TDD with Rails
Speedy TDD with RailsSpeedy TDD with Rails
Speedy TDD with Rails
 
The Future of library dependency manageement of Ruby
The Future of library dependency manageement of RubyThe Future of library dependency manageement of Ruby
The Future of library dependency manageement of Ruby
 
RubyMotion Introduction
RubyMotion IntroductionRubyMotion Introduction
RubyMotion Introduction
 
Introduction to Ruby on Rails
Introduction to Ruby on RailsIntroduction to Ruby on Rails
Introduction to Ruby on Rails
 
From 'Legacy' to 'Edge'
From 'Legacy' to 'Edge'From 'Legacy' to 'Edge'
From 'Legacy' to 'Edge'
 
Wider than rails
Wider than railsWider than rails
Wider than rails
 
How DSL works on Ruby
How DSL works on RubyHow DSL works on Ruby
How DSL works on Ruby
 
Introduction to Rails - presented by Arman Ortega
Introduction to Rails - presented by Arman OrtegaIntroduction to Rails - presented by Arman Ortega
Introduction to Rails - presented by Arman Ortega
 
Ruby on Rails survival guide of an aged Java developer
Ruby on Rails survival guide of an aged Java developerRuby on Rails survival guide of an aged Java developer
Ruby on Rails survival guide of an aged Java developer
 
The Future of Dependency Management for Ruby
The Future of Dependency Management for RubyThe Future of Dependency Management for Ruby
The Future of Dependency Management for Ruby
 
Web application intro
Web application introWeb application intro
Web application intro
 
Ecossistema Ruby - versão SCTI UNF 2013
Ecossistema Ruby - versão SCTI UNF 2013Ecossistema Ruby - versão SCTI UNF 2013
Ecossistema Ruby - versão SCTI UNF 2013
 
TorqueBox
TorqueBoxTorqueBox
TorqueBox
 
The Future of Bundled Bundler
The Future of Bundled BundlerThe Future of Bundled Bundler
The Future of Bundled Bundler
 

Mais de Michael Kimathi

Mais de Michael Kimathi (13)

Soni pi at rubycongkenya2017 by rishi jain
Soni pi at rubycongkenya2017 by rishi jainSoni pi at rubycongkenya2017 by rishi jain
Soni pi at rubycongkenya2017 by rishi jain
 
Coopetition slides at ruby conference kenya 2017 by james corey
Coopetition slides at ruby conference kenya 2017 by james coreyCoopetition slides at ruby conference kenya 2017 by james corey
Coopetition slides at ruby conference kenya 2017 by james corey
 
Gis and Ruby 101 at Ruby Conf Kenya 2017 by Kamal Ogudah
Gis and Ruby 101 at Ruby Conf Kenya 2017 by Kamal OgudahGis and Ruby 101 at Ruby Conf Kenya 2017 by Kamal Ogudah
Gis and Ruby 101 at Ruby Conf Kenya 2017 by Kamal Ogudah
 
How GitHub Builds Software at Ruby Conference Kenya 2017 by Mike McQuaid
How GitHub Builds Software at Ruby Conference Kenya 2017 by Mike McQuaidHow GitHub Builds Software at Ruby Conference Kenya 2017 by Mike McQuaid
How GitHub Builds Software at Ruby Conference Kenya 2017 by Mike McQuaid
 
Helping Yourself With_Open_Source_Software at Ruby Conference Kenya 2017 by M...
Helping Yourself With_Open_Source_Software at Ruby Conference Kenya 2017 by M...Helping Yourself With_Open_Source_Software at Ruby Conference Kenya 2017 by M...
Helping Yourself With_Open_Source_Software at Ruby Conference Kenya 2017 by M...
 
Metaprogamming the Ruby Way by Joannah Nanjekye at Ruby ConfKE2017
Metaprogamming the Ruby Way by Joannah Nanjekye at  Ruby ConfKE2017Metaprogamming the Ruby Way by Joannah Nanjekye at  Ruby ConfKE2017
Metaprogamming the Ruby Way by Joannah Nanjekye at Ruby ConfKE2017
 
Scaling Rails with Ruby-prof -- Ruby Conf Kenya 2017 by Ben Hughes
Scaling Rails with Ruby-prof -- Ruby Conf Kenya 2017 by Ben Hughes Scaling Rails with Ruby-prof -- Ruby Conf Kenya 2017 by Ben Hughes
Scaling Rails with Ruby-prof -- Ruby Conf Kenya 2017 by Ben Hughes
 
Techpreneurship Triathon at Ruby Conference Kenya 2017 by Bernard Banta
Techpreneurship Triathon at Ruby Conference Kenya 2017 by Bernard BantaTechpreneurship Triathon at Ruby Conference Kenya 2017 by Bernard Banta
Techpreneurship Triathon at Ruby Conference Kenya 2017 by Bernard Banta
 
The Curious Case of Wikipedia Parsing at Ruby Conference Kenya 2017 by victor...
The Curious Case of Wikipedia Parsing at Ruby Conference Kenya 2017 by victor...The Curious Case of Wikipedia Parsing at Ruby Conference Kenya 2017 by victor...
The Curious Case of Wikipedia Parsing at Ruby Conference Kenya 2017 by victor...
 
When The Whole World is Your Database at Ruby Conference Kenya by Victor Shep...
When The Whole World is Your Database at Ruby Conference Kenya by Victor Shep...When The Whole World is Your Database at Ruby Conference Kenya by Victor Shep...
When The Whole World is Your Database at Ruby Conference Kenya by Victor Shep...
 
Building Communities by Michael Kimathi Ruby Conference Kenya 2017
Building Communities by Michael Kimathi Ruby Conference Kenya 2017Building Communities by Michael Kimathi Ruby Conference Kenya 2017
Building Communities by Michael Kimathi Ruby Conference Kenya 2017
 
Leveling Up Through OSS by William Wanyama Ruby ConfKKE 2017
Leveling Up Through OSS by William Wanyama Ruby ConfKKE 2017Leveling Up Through OSS by William Wanyama Ruby ConfKKE 2017
Leveling Up Through OSS by William Wanyama Ruby ConfKKE 2017
 
Education shaping innovation ecosystem by prof. felix musau
Education shaping innovation ecosystem by prof. felix musauEducation shaping innovation ecosystem by prof. felix musau
Education shaping innovation ecosystem by prof. felix musau
 

Último

+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
Health
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
masabamasaba
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
masabamasaba
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
VictorSzoltysek
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
VishalKumarJha10
 

Último (20)

%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare
 
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
 
%in Durban+277-882-255-28 abortion pills for sale in Durban
%in Durban+277-882-255-28 abortion pills for sale in Durban%in Durban+277-882-255-28 abortion pills for sale in Durban
%in Durban+277-882-255-28 abortion pills for sale in Durban
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
 

Opal,The Journey from Javascript to Ruby at Ruby Conf Kenya 2017 by Bozhidar Batzov