SlideShare a Scribd company logo
“O Muses, O high genius, aid me now!
O memory that engraved the things I saw,
Here shall your worth be manifest to all!”
Dante Alighieri
Saturday, November 8, 2008
Introductions and
Expense Reports
Saturday, November 8, 2008
John Barnette
jbarnette@rubyforge.org
github.com/jbarnette
twitter.com/jbarnette
Saturday, November 8, 2008
Aaron
Patterson
aaronp@rubyforge.org
tenderlovemaking.com
github.com/tenderlove
twitter.com/tenderlove
猫舌です
Saturday, November 8, 2008
(they totally paid)
Saturday, November 8, 2008
Saturday, November 8, 2008
Saturday, November 8, 2008
Saturday, November 8, 2008
Saturday, November 8, 2008
Saturday, November 8, 2008
Saturday, November 8, 2008
A Tale of Two Languages
Saturday, November 8, 2008
JavaScript
• Mocha! No, LiveScript! No! JAVASCRIPT!
• Brendan Eich’s fault
• Schemey, with Self’s prototypes and C’s
syntax
• But not really
Saturday, November 8, 2008
JavaScript objects are bags of slots.
obj = {}
obj["hello"] = "world"
obj.hello == obj["hello"]
// => true
Saturday, November 8, 2008
JavaScript functions are first-class.
hello = function(name) {
return "Hello, " + name + "!"
}
hello("internets")
// => "Hello, internets!"
Saturday, November 8, 2008
...but they can ‘belong’ to an object
aaron = { name: "Aaron" }
aaron.hello = function() {
return "Hello, " + this.name + "!"
}
aaron.hello()
// => "Hello, Aaron!"
Saturday, November 8, 2008
JavaScript doesn’t have classes.
function Greeter(name) {
this.name = name
}
Greeter.prototype.hello = function() {
return "Hello, " + this.name + "!"
}
aaron = new Greeter("Aaron")
aaron.hello()
// => "Hello, Aaron!"
Saturday, November 8, 2008
Whatever.
Why do I care?
Saturday, November 8, 2008
Because it’s freaking
EVERYWHERE.
Saturday, November 8, 2008
There’s JavaScript Here!
(this may be a lie)
Saturday, November 8, 2008
Ruby
• Invented in 1650 by Baruch Spinoza
• Mostly used to program industrial looms
• Half the sodium of the leading brand
• (this may be a lie)
Saturday, November 8, 2008
Whatever.
Why do I care?
Saturday, November 8, 2008
INTERNETS.
Saturday, November 8, 2008
WORLD WIDE
WEBTERNETS.
Saturday, November 8, 2008
Client / Server
JavaScript / Ruby
Prototype / Rails
jQuery / Merb
Saturday, November 8, 2008
“Two houses, both alike
in dignity...”
Saturday, November 8, 2008
For JavaScript, the
browser IS the runtime.
Saturday, November 8, 2008
Tight Coupling
Do the
dishes
But I
want to
watch TV
Saturday, November 8, 2008
Sweet STDLIB
• Modify DOM trees
Saturday, November 8, 2008
Excellent Code
Packagers
•
Saturday, November 8, 2008
Great CLI Test
Frameworks
•
Saturday, November 8, 2008
Continuous Integration
Systems
•
• (just hit refresh)
Saturday, November 8, 2008
EVERYTHING
depends on
THE BROWSER
Saturday, November 8, 2008
lame.
Saturday, November 8, 2008
Free the runtime!
• Browserless testing
• Access to the filesystem
• Easy extension
• Easy experimentation (where’s my IRB?)
Saturday, November 8, 2008
Johnson
Saturday, November 8, 2008
(this is not a juvenile
penis joke)
Saturday, November 8, 2008
(that’s what she said)
Saturday, November 8, 2008
Johnson bridges the
Great Divide.
Saturday, November 8, 2008
Use JavaScript in your Ruby!
doubler = Johnson.evaluate <<-END
function(x) { return x * 2 }
END
[1, 2, 3].collect(&doubler)
# => [2, 4, 6]
Saturday, November 8, 2008
Use Ruby in your JavaScript!
Ruby.require("open-uri")
function hasObamaWonYet() {
var page = Ruby.open(
"http://hasobamawonyet.com").read()
return page.match(/YES/)
}
Ruby.puts(hasObamaWonYet())
// => YES
Saturday, November 8, 2008
you just blew my mind.
Saturday, November 8, 2008
I love
you, Ruby!
Whatever.
Hold still.
Saturday, November 8, 2008
The Dynamic Internets
Saturday, November 8, 2008
AJAX
• Aaron’s
• JavaScript
• Aaron
• eXchange
Saturday, November 8, 2008
screen scraping isn’t
just for douchebags
Saturday, November 8, 2008
Innernets
Saturday, November 8, 2008
What Do We Do?
Saturday, November 8, 2008
Mechanize
Saturday, November 8, 2008
<html>
<body>
<p id='testing'>Hello world</p>
<script>
var p_tag = document.getElementById('testing');
p_tag.firstChild.textContent = 'Welcome to IHON!';
</script>
</body>
</html>
Client Side JavaScript
Saturday, November 8, 2008
It’s Wrong!
agent = WWW::Mechanize.new
page = agent.get('http://localhost/~aaron/some_html.html')
puts page.search('p').first.text # => Hello world
Saturday, November 8, 2008
But with Johnson....
agent = WWW::Mechanize.new
page = agent.get('http://localhost/~aaron/some_html.html')
puts page.search('p').first.text # => Welcome to IHON
Saturday, November 8, 2008
Using the Johnson Shell
Saturday, November 8, 2008
js> alert('hello world!')
alert is not defined at ((console)):1
@(console):1
js> rb
rb> js['alert'] = lambda { |msg| puts msg }
=> #<Proc:0x00475d24@bin/johnson:13>
rb> js
js> alert('hello world')
hello world
=> nil
Saturday, November 8, 2008
js> var iterator = function(x) { return x * x }
=> nil
js> rb
rb> js_iterator = js['iterator']
=> function (x) {
return x * x;
}
rb> [1,2,3,4].map(&js_iterator)
=> [1, 4, 9, 16]
Saturday, November 8, 2008
Johnson Proxies
Saturday, November 8, 2008
Everything is an Object
Saturday, November 8, 2008
Ruby
Object
JavaScript
Object
こんにちは
Hello!
Saturday, November 8, 2008
+9 Cloak of Invisibility
Saturday, November 8, 2008
Ruby Country JavaScript Country
You must have
a cape before
crossing!
JavaScript
Object
Ruby
Object
Saturday, November 8, 2008
Ruby Country
Ruby
Object
こんにちは
JavaScript
Object
こんにちは
Saturday, November 8, 2008
JavaScript Country
Hello!
JavaScript
Object
Hello!
Ruby
Object
Saturday, November 8, 2008
rb> some_object= Object.new
=> #<Object:0x477034>
rb> js[:cloaked_object] = some_object
=> #<Object:0x477034>
rb> js
js> cloaked_object.foo = "hello!"
=> "hello!"
js> cloaked_object.bar = function(x) { return x * 3 }
=> function (x) {
return x * 3;
}
js> rb
rb> some_object.foo
=> "hello!"
rb> some_object.bar(10)
=> 30
Saturday, November 8, 2008
Fancy Marshalling
rb> js[:matcher] = /internets/
=> /internets/
rb> js
js> matcher.constructor
=> function RegExp() {
[native code]
}
js> "internets!".match(matcher)
=> internets
Saturday, November 8, 2008
Attaching JS Functions
rb> blank = Object.new
=> #<Object:0x466bf8>
rb> js[:blank] = blank
=> #<Object:0x466bf8>
rb> js
js> blank.awesome = function()
{ return "Awesome!" }
=> function () {
return "Awesome!";
}
js> rb
rb> blank.awesome
=> "Awesome!"
Saturday, November 8, 2008
Attaching JS Functions EVERYWHERE
js> Ruby.String.prototype.embiggen =
function() { return this.toUpperCase() }
=> function () {
return this.toUpperCase();
}
js> rb
rb> "this is pure evil.".embiggen
=> "THIS IS PURE EVIL."
Saturday, November 8, 2008
Things that are Hard
Saturday, November 8, 2008
Garbage Collection
Saturday, November 8, 2008
Threading
Saturday, November 8, 2008
I’m Not Convinced
Saturday, November 8, 2008
Johnson Sounds Dumb
• You are wrong.
Saturday, November 8, 2008
Case In Point
Saturday, November 8, 2008
def fib n
return n if [0, 1].include?(n)
fib(n - 1) + fib(n - 2)
end
Saturday, November 8, 2008
rt = Johnson::Runtime.new
rt.evaluate(<<-eojs)
var fib = function(n) {
if(n == 0) return n;
if(n == 1) return n;
return fib(n - 1) + fib(n - 2);
}
eojs
Saturday, November 8, 2008
class TellA
def initialize
@rt = Johnson::Runtime.new
@rt.evaluate(<<-eojs)
var fib = function(n) {
if(n == 0) return n;
if(n == 1) return n;
return fib(n - 1) + fib(n - 2);
}
eojs
end
def fib n
return n if [0, 1].include?(n)
fib(n - 1) + fib(n - 2)
end
def second_fib n
@rt['fib'].call(n)
end
end
Saturday, November 8, 2008
class TestFib < Test::Unit::TestCase
def test_awesomeness
@tell_a = TellA.new
assert_equal @tell_a.fib(30), @tell_a.second_fib(30)
end
end
Saturday, November 8, 2008
Which One is Faster?
Saturday, November 8, 2008
We’re helpful!
(things you’ll probably need)
Saturday, November 8, 2008
Loading JS Files
// search Ruby's load path
Johnson.require("myjs")
Saturday, November 8, 2008
Gettin’ at Ruby Stuff
// everything's available!
hash = new Ruby.Hash()
// ...including kernel methods
Ruby.puts("I made a hash!")
// ...and nested stuff
mine = new Ruby.Thing.In.Namespace()
Saturday, November 8, 2008
Symbology
// we keep a cache of symbols
sym = Johnson.symbolize("monkey")
// ...and mix in to String.prototype
sym = "monkey".toSymbol()
Saturday, November 8, 2008
Where am I?
where = __FILE__
=> "cheese.js"
Saturday, November 8, 2008
Johnson
(the not so practical)
Saturday, November 8, 2008
Database Access
Saturday, November 8, 2008
[aaron@Jordan ar_js]$ ../johnson/bin/johnson
js> rb
rb> require 'config/environment'
=> true
rb> require 'user'
=> ["User"]
rb> js
js> var users = Ruby.User.find(Johnson.symbolize("all"))
=> nil
js> users.each(function(user) { Ruby.puts(user.name()) });
Aaron Patterson
John Barnette
=> [#<User id: 1, name: "Aaron Patterson", occupation:
"internetexpert", created_at: "2008-11-05 19:14:04",
updated_at: "2008-11-05 19:14:04">, #<User id: 2, name:
"John Barnette", occupation: "webinarchitect", created_at:
"2008-11-05 19:14:04", updated_at: "2008-11-05 19:14:04">]
js>
Saturday, November 8, 2008
[aaron@Jordan ar_js]$ ../johnson/bin/johnson
js> rb
rb> require 'config/environment'
=> true
rb> require 'user'
=> ["User"]
rb> js
js> var users = Ruby.User.find(Johnson.symbolize("all"))
=> nil
js> users.each(function(user) { Ruby.puts(user.name()) });
Aaron Patterson
John Barnette
=> [#<User id: 1, name: "Aaron Patterson", occupation:
"internetexpert", created_at: "2008-11-05 19:14:04",
updated_at: "2008-11-05 19:14:04">, #<User id: 2, name:
"John Barnette", occupation: "webinarchitect", created_at:
"2008-11-05 19:14:04", updated_at: "2008-11-05 19:14:04">]
js>
Saturday, November 8, 2008
EJS
Saturday, November 8, 2008
RailsViews in JS
class UsersController < ApplicationController
def index
@users = User.find(:all)
end
end
Traditional Ruby Controller
Saturday, November 8, 2008
RailsView in JS
EJS File (app/views/index.html.ejs)
<html>
<body>
<h1>こんにちは!</h1>
<ul>
<% for(var user in at.users) { %>
<li><%= user.name() %></li>
<% } %>
</ul>
</body>
</html>
Saturday, November 8, 2008
RailsView in JS
EJS File (app/views/index.html.ejs)
<html>
<body>
<h1>こんにちは!</h1>
<ul>
<% for(var user in at.users) { %>
<li><%= user.name() %></li>
<% } %>
</ul>
</body>
</html>
Saturday, November 8, 2008
Rails Plugin Available
with Johnson
johnson/lib/rails/init.rb
Saturday, November 8, 2008
Breakpoints
break it down
Saturday, November 8, 2008
require 'johnson'
runtime = Johnson::Runtime.new
# Compile our script
script = runtime.compile('var x = 0;
for(var i = 0; i < 10; i++) {
x += 2; // Line 3
}', "my_script")
# Set the breakpoint
runtime.break('my_script', 3) do
puts "i = #{runtime['i']}, x = #{runtime['x']}"
end
# Evaluate the compiled script
runtime.evaluate_compiled_script(script)
Saturday, November 8, 2008
[aaron@Jordan demos]$ ruby breakpoints.rb
i = 0, x = 0
i = 1, x = 2
i = 2, x = 4
i = 3, x = 6
i = 4, x = 8
i = 5, x = 10
i = 6, x = 12
i = 7, x = 14
i = 8, x = 16
i = 9, x = 18
[aaron@Jordan demos]$
Saturday, November 8, 2008
HotRuby.js
Saturday, November 8, 2008
The Ruby Code
puts “Hello World”
Saturday, November 8, 2008
The Byte Code
"["YARVInstructionSequence/SimpleDataFormat
",1,1,1,{"arg_size":0,"local_size":
1,"stack_max":2},"<compiled>","src","top
",[],0,[],[1,["trace",1],["putnil"],
["putstring","Hello World"],["send","puts
",1,null,8,null],["leave"]]]"
Yuck!
Saturday, November 8, 2008
[aaron@Jordan rubyconf (master)]$ ~/git/
johnson/bin/johnson
js> Johnson.require('HotRuby')
=> true
js> var hr = new HotRuby();
=> nil
js> hr.run(eval("(" +
"["YARVInstructionSequence/SimpleDataFormat
",1,1,1,{"arg_size":0,"local_size":
1,"stack_max":2},"<compiled>","src","top
",[],0,[],[1,["trace",1],["putnil"],
["putstring","Hello World"],["send",
"puts",1,null,8,null],["leave"]]]" + ")"));
Hello World
=> nil
js> exit
Saturday, November 8, 2008
Ruby
Saturday, November 8, 2008
on JavaScript
Saturday, November 8, 2008
on Ruby
Saturday, November 8, 2008
on Rails
just kidding (or am I?)
Saturday, November 8, 2008
One More Thing
Saturday, November 8, 2008
JS Parse Tree
Saturday, November 8, 2008
tree = Johnson::Parser.parse(<<-eojs)
var foo = function(x) {
return x * 10;
}
foo.call(10);
eojs
Saturday, November 8, 2008
AST Provides
• Directed Graph Representation (DOT)
• SEXP For easy reading
• #each for easy manipulation
• #to_js for easy generation
Saturday, November 8, 2008
tree.each do |node|
case node
when Johnson::Nodes::Name
node.value = 'hello' if node.value == 'foo'
end
end
puts tree.to_js
Given the Earlier Tree
Saturday, November 8, 2008
Parse This!
rt = Johnson::Runtime.new
rt.evaluate(<<-eoecma)
// Parse the javascript
var tree = Ruby.Johnson.Parser.parse("alert('hello world')");
// Change alert to Ruby.puts
tree.each(function(node) {
if(node.value == 'alert') {
node.value = 'Ruby.puts';
}
});
// Eval the result
eval(tree.to_js());
eoecma
Saturday, November 8, 2008
So.
• 1.0 is good to go
• Ruby 1.8.6, unixish and Windows
• Stability? Okay.
Saturday, November 8, 2008
Thanks!
• Yehuda Katz
• Matthew Draper
• John Resig
Saturday, November 8, 2008
github.com/jbarnette/johnson
Saturday, November 8, 2008

More Related Content

Similar to Johnson at RubyConf 2008

Reef - ESUG 2010
Reef - ESUG 2010Reef - ESUG 2010
Reef - ESUG 2010
Esteban Lorenzano
 
Java SE 7 - The Platform Evolves, Dalibor Topić (Oracle)
Java SE 7 - The Platform Evolves, Dalibor Topić (Oracle)Java SE 7 - The Platform Evolves, Dalibor Topić (Oracle)
Java SE 7 - The Platform Evolves, Dalibor Topić (Oracle)
OpenBlend society
 
JavaSE 7
JavaSE 7JavaSE 7
JavaSE 7
eug3n_cojocaru
 
2009, o ano do Ruby on Rails no Brasil - CaelumDay 2009
2009, o ano do Ruby on Rails no Brasil - CaelumDay 20092009, o ano do Ruby on Rails no Brasil - CaelumDay 2009
2009, o ano do Ruby on Rails no Brasil - CaelumDay 2009
Caue Guerra
 
In depth with html5 java2days 2010
In depth with html5 java2days 2010In depth with html5 java2days 2010
In depth with html5 java2days 2010
Mystic Coders, LLC
 
JSUG - Java FX by Christoph Pickl
JSUG - Java FX by Christoph PicklJSUG - Java FX by Christoph Pickl
JSUG - Java FX by Christoph Pickl
Christoph Pickl
 
Oxente on Rails 2009
Oxente on Rails 2009Oxente on Rails 2009
Oxente on Rails 2009
Fabio Akita
 
Oo java script class construction
Oo java script class constructionOo java script class construction
Oo java script class construction
Ken Collins
 
Is these a bug
Is these a bugIs these a bug
Is these a bug
Mike Taylor
 
High Performance JavaScript
High Performance JavaScriptHigh Performance JavaScript
High Performance JavaScript
greenwop
 
TorqueBox - When Java meets Ruby
TorqueBox - When Java meets RubyTorqueBox - When Java meets Ruby
TorqueBox - When Java meets Ruby
Bruno Oliveira
 
How I stopped worrying about and loved DumpRenderTree
How I stopped worrying about and loved DumpRenderTreeHow I stopped worrying about and loved DumpRenderTree
How I stopped worrying about and loved DumpRenderTree
Hajime Morrita
 
Javascript, Do you speak it!
Javascript, Do you speak it!Javascript, Do you speak it!
Javascript, Do you speak it!
Victor Porof
 
Macruby - RubyConf Presentation 2010
Macruby - RubyConf Presentation 2010Macruby - RubyConf Presentation 2010
Macruby - RubyConf Presentation 2010
Matt Aimonetti
 
Mongo db
Mongo dbMongo db
Mongo db
Antonio Terreno
 
Пак ли този Rails?
Пак ли този Rails?Пак ли този Rails?
Пак ли този Rails?
Stefan Kanev
 
Torquebox - O melhor dos dois mundos
Torquebox - O melhor dos dois mundosTorquebox - O melhor dos dois mundos
Torquebox - O melhor dos dois mundos
Bruno Oliveira
 
Play 2 pip
Play 2 pipPlay 2 pip
Play 2 pip
Matteo Depalo
 
Scalable JavaScript
Scalable JavaScriptScalable JavaScript
Scalable JavaScript
Ynon Perek
 
node.js for front-end developers
node.js for front-end developersnode.js for front-end developers
node.js for front-end developers
Garann Means
 

Similar to Johnson at RubyConf 2008 (20)

Reef - ESUG 2010
Reef - ESUG 2010Reef - ESUG 2010
Reef - ESUG 2010
 
Java SE 7 - The Platform Evolves, Dalibor Topić (Oracle)
Java SE 7 - The Platform Evolves, Dalibor Topić (Oracle)Java SE 7 - The Platform Evolves, Dalibor Topić (Oracle)
Java SE 7 - The Platform Evolves, Dalibor Topić (Oracle)
 
JavaSE 7
JavaSE 7JavaSE 7
JavaSE 7
 
2009, o ano do Ruby on Rails no Brasil - CaelumDay 2009
2009, o ano do Ruby on Rails no Brasil - CaelumDay 20092009, o ano do Ruby on Rails no Brasil - CaelumDay 2009
2009, o ano do Ruby on Rails no Brasil - CaelumDay 2009
 
In depth with html5 java2days 2010
In depth with html5 java2days 2010In depth with html5 java2days 2010
In depth with html5 java2days 2010
 
JSUG - Java FX by Christoph Pickl
JSUG - Java FX by Christoph PicklJSUG - Java FX by Christoph Pickl
JSUG - Java FX by Christoph Pickl
 
Oxente on Rails 2009
Oxente on Rails 2009Oxente on Rails 2009
Oxente on Rails 2009
 
Oo java script class construction
Oo java script class constructionOo java script class construction
Oo java script class construction
 
Is these a bug
Is these a bugIs these a bug
Is these a bug
 
High Performance JavaScript
High Performance JavaScriptHigh Performance JavaScript
High Performance JavaScript
 
TorqueBox - When Java meets Ruby
TorqueBox - When Java meets RubyTorqueBox - When Java meets Ruby
TorqueBox - When Java meets Ruby
 
How I stopped worrying about and loved DumpRenderTree
How I stopped worrying about and loved DumpRenderTreeHow I stopped worrying about and loved DumpRenderTree
How I stopped worrying about and loved DumpRenderTree
 
Javascript, Do you speak it!
Javascript, Do you speak it!Javascript, Do you speak it!
Javascript, Do you speak it!
 
Macruby - RubyConf Presentation 2010
Macruby - RubyConf Presentation 2010Macruby - RubyConf Presentation 2010
Macruby - RubyConf Presentation 2010
 
Mongo db
Mongo dbMongo db
Mongo db
 
Пак ли този Rails?
Пак ли този Rails?Пак ли този Rails?
Пак ли този Rails?
 
Torquebox - O melhor dos dois mundos
Torquebox - O melhor dos dois mundosTorquebox - O melhor dos dois mundos
Torquebox - O melhor dos dois mundos
 
Play 2 pip
Play 2 pipPlay 2 pip
Play 2 pip
 
Scalable JavaScript
Scalable JavaScriptScalable JavaScript
Scalable JavaScript
 
node.js for front-end developers
node.js for front-end developersnode.js for front-end developers
node.js for front-end developers
 

Recently uploaded

spot a liar (Haiqa 146).pptx Technical writhing and presentation skills
spot a liar (Haiqa 146).pptx Technical writhing and presentation skillsspot a liar (Haiqa 146).pptx Technical writhing and presentation skills
spot a liar (Haiqa 146).pptx Technical writhing and presentation skills
haiqairshad
 
BÀI TẬP BỔ TRỢ TIẾNG ANH LỚP 9 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2024-2025 - ...
BÀI TẬP BỔ TRỢ TIẾNG ANH LỚP 9 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2024-2025 - ...BÀI TẬP BỔ TRỢ TIẾNG ANH LỚP 9 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2024-2025 - ...
BÀI TẬP BỔ TRỢ TIẾNG ANH LỚP 9 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2024-2025 - ...
Nguyen Thanh Tu Collection
 
BIOLOGY NATIONAL EXAMINATION COUNCIL (NECO) 2024 PRACTICAL MANUAL.pptx
BIOLOGY NATIONAL EXAMINATION COUNCIL (NECO) 2024 PRACTICAL MANUAL.pptxBIOLOGY NATIONAL EXAMINATION COUNCIL (NECO) 2024 PRACTICAL MANUAL.pptx
BIOLOGY NATIONAL EXAMINATION COUNCIL (NECO) 2024 PRACTICAL MANUAL.pptx
RidwanHassanYusuf
 
Jemison, MacLaughlin, and Majumder "Broadening Pathways for Editors and Authors"
Jemison, MacLaughlin, and Majumder "Broadening Pathways for Editors and Authors"Jemison, MacLaughlin, and Majumder "Broadening Pathways for Editors and Authors"
Jemison, MacLaughlin, and Majumder "Broadening Pathways for Editors and Authors"
National Information Standards Organization (NISO)
 
BÀI TẬP DẠY THÊM TIẾNG ANH LỚP 7 CẢ NĂM FRIENDS PLUS SÁCH CHÂN TRỜI SÁNG TẠO ...
BÀI TẬP DẠY THÊM TIẾNG ANH LỚP 7 CẢ NĂM FRIENDS PLUS SÁCH CHÂN TRỜI SÁNG TẠO ...BÀI TẬP DẠY THÊM TIẾNG ANH LỚP 7 CẢ NĂM FRIENDS PLUS SÁCH CHÂN TRỜI SÁNG TẠO ...
BÀI TẬP DẠY THÊM TIẾNG ANH LỚP 7 CẢ NĂM FRIENDS PLUS SÁCH CHÂN TRỜI SÁNG TẠO ...
Nguyen Thanh Tu Collection
 
writing about opinions about Australia the movie
writing about opinions about Australia the moviewriting about opinions about Australia the movie
writing about opinions about Australia the movie
Nicholas Montgomery
 
Stack Memory Organization of 8086 Microprocessor
Stack Memory Organization of 8086 MicroprocessorStack Memory Organization of 8086 Microprocessor
Stack Memory Organization of 8086 Microprocessor
JomonJoseph58
 
Film vocab for eal 3 students: Australia the movie
Film vocab for eal 3 students: Australia the movieFilm vocab for eal 3 students: Australia the movie
Film vocab for eal 3 students: Australia the movie
Nicholas Montgomery
 
How to Make a Field Mandatory in Odoo 17
How to Make a Field Mandatory in Odoo 17How to Make a Field Mandatory in Odoo 17
How to Make a Field Mandatory in Odoo 17
Celine George
 
REASIGNACION 2024 UGEL CHUPACA 2024 UGEL CHUPACA.pdf
REASIGNACION 2024 UGEL CHUPACA 2024 UGEL CHUPACA.pdfREASIGNACION 2024 UGEL CHUPACA 2024 UGEL CHUPACA.pdf
REASIGNACION 2024 UGEL CHUPACA 2024 UGEL CHUPACA.pdf
giancarloi8888
 
Walmart Business+ and Spark Good for Nonprofits.pdf
Walmart Business+ and Spark Good for Nonprofits.pdfWalmart Business+ and Spark Good for Nonprofits.pdf
Walmart Business+ and Spark Good for Nonprofits.pdf
TechSoup
 
Benner "Expanding Pathways to Publishing Careers"
Benner "Expanding Pathways to Publishing Careers"Benner "Expanding Pathways to Publishing Careers"
Benner "Expanding Pathways to Publishing Careers"
National Information Standards Organization (NISO)
 
Temple of Asclepius in Thrace. Excavation results
Temple of Asclepius in Thrace. Excavation resultsTemple of Asclepius in Thrace. Excavation results
Temple of Asclepius in Thrace. Excavation results
Krassimira Luka
 
SWOT analysis in the project Keeping the Memory @live.pptx
SWOT analysis in the project Keeping the Memory @live.pptxSWOT analysis in the project Keeping the Memory @live.pptx
SWOT analysis in the project Keeping the Memory @live.pptx
zuzanka
 
LAND USE LAND COVER AND NDVI OF MIRZAPUR DISTRICT, UP
LAND USE LAND COVER AND NDVI OF MIRZAPUR DISTRICT, UPLAND USE LAND COVER AND NDVI OF MIRZAPUR DISTRICT, UP
LAND USE LAND COVER AND NDVI OF MIRZAPUR DISTRICT, UP
RAHUL
 
Nutrition Inc FY 2024, 4 - Hour Training
Nutrition Inc FY 2024, 4 - Hour TrainingNutrition Inc FY 2024, 4 - Hour Training
Nutrition Inc FY 2024, 4 - Hour Training
melliereed
 
What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...
What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...
What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...
GeorgeMilliken2
 
Mule event processing models | MuleSoft Mysore Meetup #47
Mule event processing models | MuleSoft Mysore Meetup #47Mule event processing models | MuleSoft Mysore Meetup #47
Mule event processing models | MuleSoft Mysore Meetup #47
MysoreMuleSoftMeetup
 
NEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptx
NEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptxNEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptx
NEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptx
iammrhaywood
 
A Visual Guide to 1 Samuel | A Tale of Two Hearts
A Visual Guide to 1 Samuel | A Tale of Two HeartsA Visual Guide to 1 Samuel | A Tale of Two Hearts
A Visual Guide to 1 Samuel | A Tale of Two Hearts
Steve Thomason
 

Recently uploaded (20)

spot a liar (Haiqa 146).pptx Technical writhing and presentation skills
spot a liar (Haiqa 146).pptx Technical writhing and presentation skillsspot a liar (Haiqa 146).pptx Technical writhing and presentation skills
spot a liar (Haiqa 146).pptx Technical writhing and presentation skills
 
BÀI TẬP BỔ TRỢ TIẾNG ANH LỚP 9 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2024-2025 - ...
BÀI TẬP BỔ TRỢ TIẾNG ANH LỚP 9 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2024-2025 - ...BÀI TẬP BỔ TRỢ TIẾNG ANH LỚP 9 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2024-2025 - ...
BÀI TẬP BỔ TRỢ TIẾNG ANH LỚP 9 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2024-2025 - ...
 
BIOLOGY NATIONAL EXAMINATION COUNCIL (NECO) 2024 PRACTICAL MANUAL.pptx
BIOLOGY NATIONAL EXAMINATION COUNCIL (NECO) 2024 PRACTICAL MANUAL.pptxBIOLOGY NATIONAL EXAMINATION COUNCIL (NECO) 2024 PRACTICAL MANUAL.pptx
BIOLOGY NATIONAL EXAMINATION COUNCIL (NECO) 2024 PRACTICAL MANUAL.pptx
 
Jemison, MacLaughlin, and Majumder "Broadening Pathways for Editors and Authors"
Jemison, MacLaughlin, and Majumder "Broadening Pathways for Editors and Authors"Jemison, MacLaughlin, and Majumder "Broadening Pathways for Editors and Authors"
Jemison, MacLaughlin, and Majumder "Broadening Pathways for Editors and Authors"
 
BÀI TẬP DẠY THÊM TIẾNG ANH LỚP 7 CẢ NĂM FRIENDS PLUS SÁCH CHÂN TRỜI SÁNG TẠO ...
BÀI TẬP DẠY THÊM TIẾNG ANH LỚP 7 CẢ NĂM FRIENDS PLUS SÁCH CHÂN TRỜI SÁNG TẠO ...BÀI TẬP DẠY THÊM TIẾNG ANH LỚP 7 CẢ NĂM FRIENDS PLUS SÁCH CHÂN TRỜI SÁNG TẠO ...
BÀI TẬP DẠY THÊM TIẾNG ANH LỚP 7 CẢ NĂM FRIENDS PLUS SÁCH CHÂN TRỜI SÁNG TẠO ...
 
writing about opinions about Australia the movie
writing about opinions about Australia the moviewriting about opinions about Australia the movie
writing about opinions about Australia the movie
 
Stack Memory Organization of 8086 Microprocessor
Stack Memory Organization of 8086 MicroprocessorStack Memory Organization of 8086 Microprocessor
Stack Memory Organization of 8086 Microprocessor
 
Film vocab for eal 3 students: Australia the movie
Film vocab for eal 3 students: Australia the movieFilm vocab for eal 3 students: Australia the movie
Film vocab for eal 3 students: Australia the movie
 
How to Make a Field Mandatory in Odoo 17
How to Make a Field Mandatory in Odoo 17How to Make a Field Mandatory in Odoo 17
How to Make a Field Mandatory in Odoo 17
 
REASIGNACION 2024 UGEL CHUPACA 2024 UGEL CHUPACA.pdf
REASIGNACION 2024 UGEL CHUPACA 2024 UGEL CHUPACA.pdfREASIGNACION 2024 UGEL CHUPACA 2024 UGEL CHUPACA.pdf
REASIGNACION 2024 UGEL CHUPACA 2024 UGEL CHUPACA.pdf
 
Walmart Business+ and Spark Good for Nonprofits.pdf
Walmart Business+ and Spark Good for Nonprofits.pdfWalmart Business+ and Spark Good for Nonprofits.pdf
Walmart Business+ and Spark Good for Nonprofits.pdf
 
Benner "Expanding Pathways to Publishing Careers"
Benner "Expanding Pathways to Publishing Careers"Benner "Expanding Pathways to Publishing Careers"
Benner "Expanding Pathways to Publishing Careers"
 
Temple of Asclepius in Thrace. Excavation results
Temple of Asclepius in Thrace. Excavation resultsTemple of Asclepius in Thrace. Excavation results
Temple of Asclepius in Thrace. Excavation results
 
SWOT analysis in the project Keeping the Memory @live.pptx
SWOT analysis in the project Keeping the Memory @live.pptxSWOT analysis in the project Keeping the Memory @live.pptx
SWOT analysis in the project Keeping the Memory @live.pptx
 
LAND USE LAND COVER AND NDVI OF MIRZAPUR DISTRICT, UP
LAND USE LAND COVER AND NDVI OF MIRZAPUR DISTRICT, UPLAND USE LAND COVER AND NDVI OF MIRZAPUR DISTRICT, UP
LAND USE LAND COVER AND NDVI OF MIRZAPUR DISTRICT, UP
 
Nutrition Inc FY 2024, 4 - Hour Training
Nutrition Inc FY 2024, 4 - Hour TrainingNutrition Inc FY 2024, 4 - Hour Training
Nutrition Inc FY 2024, 4 - Hour Training
 
What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...
What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...
What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...
 
Mule event processing models | MuleSoft Mysore Meetup #47
Mule event processing models | MuleSoft Mysore Meetup #47Mule event processing models | MuleSoft Mysore Meetup #47
Mule event processing models | MuleSoft Mysore Meetup #47
 
NEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptx
NEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptxNEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptx
NEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptx
 
A Visual Guide to 1 Samuel | A Tale of Two Hearts
A Visual Guide to 1 Samuel | A Tale of Two HeartsA Visual Guide to 1 Samuel | A Tale of Two Hearts
A Visual Guide to 1 Samuel | A Tale of Two Hearts
 

Johnson at RubyConf 2008