SlideShare a Scribd company logo
1 of 76
Download to read offline
BUILDING RELIABLE WEB
APPS
A Guide to Client Side
Testing
GLENN STOVALL
MOVING TO THE CLIENT SIDE
More applications are moving more code from the server side to the
client side.
▸ Greater decoupling of rendering & business logic.
▸ More responsive UX.
▸ More Devices = More API-centric approach.
JAVASCRIPT IS A 1ST CLASS CITIZEN
This means we should treat it the same way we treat our server side
languages, and that means it needs to be tested.
WHO AM I?
AND WHY SHOULD YOU CARE?
▸ Glenn Stovall
▸ Technical Consultant
▸ Have worked on large scale front end applications.
▸ Worked with multiple tech companies to improve their internal
practices.
WHAT THIS TALK IS
▸ Overview of the challenges we face.
▸ Tools and techniques to overcome them.
▸ As platform agnostic as possible
▸ 3 Examples using the user story > test > code cycle (BDD)
4 CHALLENGES
OF FRONT END TESTING
a.k.a excuses
1.NOT IN THE TERMINAL
▸ The client side feels 'separate' from our usual tool chain.
▸ Doesn't integrate with other CI tools.
2. THE DOM
▸ Difficult to simulate browser behavior.
3. APIS
▸ Client-side applications are rarely self contained.
▸ Still dependant on Server-Side and 3rd party applications
4. ASYNC
▸ How can you test code when you don't know when it's going to be
done?
OUR 3 STORIES
1. Testing a simple string manipulation function.
2. Testing a "read more" button (DOM Manipulation).
3. Testing code reliant on a 3rd party API.
THE TOOLS
1. NODEJSSERVER SIDE JAVASCRIPT.
2. GRUNTJAVASCRIPT TASK RUNNER.
3. JASMINEJAVASCRIPT TESTING FRAMEWORK.
4. JQUERYDOM MANIPULATION, SIMULATION, AND
SELECTION.
5. PHANTOMJSBROWSER SIMULATION.
SETTING UP OUR
ENVIRONMENT
STEP 0: INSTALL NODEJS
http://nodejs.org/
download/
STEP 1: DOWNLOAD JASMINE STANDALONE
▸ https://github.com/jasmine/jasmine/tree/
master/dist
▸ Can open SpecRunner.html in a browser to see tests.
▸ Remove example tests if you want.
STEP 2: INSTALL GRUNT + GRUNT-JASMINE
From the project root directory:
▸ npm install grunt
▸ npm install grunt-jasmine
STEP 3: WRITE YOUR GRUNTFILE.JS
module.exports = function(grunt) {
grunt.initConfig({
jasmine : {
src : 'src/*.js',
options: {
specs : 'spec/*Spec.js',
helpers: 'spec/*Helper.js'
}
}
});
grunt.loadNpmTasks('grunt-contrib-jasmine');
};
You can now run your front end tests on the back end by calling grunt
jasmine.
And we are done with setting up our environment.
FEATURE #1
STRING REVERSE
FUNCTION
"As a developer, I should be able to
reverse a string, so that I can learn
about testing"
spec/ReverseSpec.js
describe('strReverse function', function() {
it('should return the inverse of a string', function() {
var result = strReverse('hello');
expect(result).toBe('olleh');
});
});
FAIL
/src/Util.js
function strReverse(str) {
return str.split("").reverse().join("");
}
PASS
FEATURE #2
READ MORE
BUTTON
"As a user, I should be able to click a
button labeled“read more”in order to
view the content of an article, so I can
read it."
BUT FIRST...
JASMINE-JQUERY
▸ Add on library that gives us additional tools for testing HTML & CSS
related functionality.
▸ Download this file and place it in /vendor directory.
▸ We'll load jQuery from a CDN (because we can)
Gruntfile.js
grunt.initConfig({
jasmine:
...
vendor: [
"http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js",
"https://raw.githubusercontent.com/velesin/jasmine-jquery/master/lib/jasmine-jquery.js"
],
...
});
Vendor scripts are loaded first.
FIXTURES
▸ HTML Template files you can use in your tests.
▸ Add this line to spec/SpecHelper.js and create the
directory:
jasmine.getFixtures().fixturesPath = 'spec/fixtures/html';
spec/fixtures/html/post.html
<section class='post'>
This is a summary.
<button class='read-more'>read more</button>
<article>This is the full article.</article>
</section>
SET UP + TEAR DOWN
▸ beforeAll() : runs once at the beginning of the suite.
▸ beforeEach(): runs before every test.
▸ afterEach(): runs after every test.
▸ afterAll() : runs once at the end of the suite.
/spec/PostSpec.js
describe('article', function() {
var content = null;
beforeEach(function() {
content = $(readFixtures("post.html"));
$('body').append(content);
});
afterEach(function() {
$('body').remove(".post");
});
});
/spec/PostSpec.js
it('should not display the content by default', function() {
expect(content.find("article")).toBeHidden();
});
FAIL
STYLE FIXTURES
▸ CSS files you can use in your tests.
▸ Add this line to spec/SpecHelper.js and create the
directory:
jasmine.getStyleFixtures().fixturesPath = 'spec/fixtures/css';
/spec/fixtures/css/post.css
.post > article {
display: none;
}
/spec/PostSpec.js
beforeEach(function() {
loadStyleFixtures("post.css");
...
});
PASS
TESTING THE 'READ MORE' BUTTON
/spec/PostSpec.js
it('should display the article when you click "read more"', function() {
content.find(".read-more").click();
expect(content.find("article")).toBeVisible();
});
FAIL
/src/Post.js
$(document).ready(function() {
$("body").on("click", ".post > .read-more", function(e) {
$(this).siblings("article").show();
});
});
PASS
FEATURE #3
REDDIT API +
AJAX
“As a user, I would like to see the cutest
animal of the month according to
Reddit, so that I can bring some joy
into an other wise listless and dreary
existance."
PRO TIP
You can change any URL on Reddit to an API call by adding .json to
the end of the URL.
http://www.reddit.com/r/aww/top.json?sort=top&t=month
BUT FIRST...
JSON FIXTURES
▸ JSON Files you can use in your tests.
▸ Add this line to spec/SpecHelper.js and create the
directory:
jasmine.getJSONFixtures().fixturesPath = 'spec/fixtures/json';`
/spec/fixtures/json/aww.json
{
"kind" : "listing",
"data" : {
"children" : [
{
"data" : {
"title" : "Our indoor cat moved from a gray apartment block view to this",
"url" : "http://i.imgur.com/3rYHhEu.jpg"
}
}
]
}
}
SPIES
▸ Can track when functions are called.
▸ Can be called before or After functions.
▸ Can be called instead of functions and return values.
We can use spies to mock Service objects, so that we can test other
code that relies on these objects without being dependant on them.
src/AwwService.js
var AwwService = {};
AwwService.query = function() {
return null;
}
spec/AwwServiceSpec.js
beforeEach(function() {
spyOn(AwwService, 'query').and.callFake( function(params) {
return getJSONFixture('aww.json');
});
});
PROBLEMS WITH THIS APPROACH
▸ Functions can't return values from async calls
▸ We could use async: false, but this approach is slow.
▸ Instead, query() should take a callback, and we can test against
that.
src/AwwService.js
AwwService.query = function(callback) {
$.ajax({
url: "http://www.reddit.com/r/aww/top.json",
data : {
"sort" : "top",
"t" : "month"
},
success: callback
});
}
TIMING AJAX CALLS
▸ beforeEach() and it() have an optional done paramater.
▸ Tests will not run until done() is called.
▸ By adding done() to our callbacks, we can test async behavior
src/AwwSerivce.js
AwwService.displayTopResult = function(listings) {
var img = $("<img>").attr("src",listings.data.children[0].data.url);
$("body").append(img);
}
By placing the logic in a separate function we achieve the following:
▸ Test this functionality on its own (using our JSON fixture).
▸ Use this callback in the app itself.
▸ Create our own callback for testing, which will call done().
spec/AwwService.js
describe('AwwService', function() {
describe('query Function', function() {
beforeEach(function(done) {
AwwService.query(function(results) {
AwwService.displayTopResult(results);
done();
});
});
afterEach(function(done) {
$("body").remove("img");
done();
});
});
});
NOW WE CAN WRITE OUR FIRST TEST
(FINALLY).
spec/AwwService.js
it('should run the callback provided', function() {
var imgs = $("body").find("img");
var firstImg = img.first();
expect(imgs.length).toBe(1);
expect(firstImg.attr("src")).toEqual("http://i.imgur.com/3rYHhEu.jpg");
});
PASSBUT...
PROBLEMS WITH THIS APPROACH
▸ This test is dependant on the Reddit API.
▸ The first assertion will fail if the API is ever unavailable.
▸ The second assertion will fail if the result changes.
▸ We need to mock the result of HTTP request.
JASMINE-AJAX
▸ Jasmine provides a library that can intercept calls.
▸ Allows us to control when they are called, and how they respond.
▸ Need to download the file, add it to our vendor directory.
▸ Let's add this to our test, and create a mock response.
spec/AwwServiceSpec.js
beforeEach(function() {
jasmine.Ajax.install();
});
afterEach(function() {
jasmine.Ajax.uninstall();
});
FAIL
spec/AwwSerivce.js
beforeEach(function() {
// ...our original AJAX call...
var responseText = JSON.stringify({ ... });
jasmine.Ajax.requests.mostRecent().respondWith({
'status': 200,
'content/type': 'application/javascript',
'responseText': responseText
});
});
PASS
PROBLEM WITH THIS APPROACH
▸ jasmine-jquery uses AJAX calls to load fixtures.
▸ jasmine-ajax intercepts and breaks these calls.
▸ You can use preloadFixtures() before the
jasmine.Ajax.install() call to load HTML fixtures into
the cache.
▸ There is currently no preloading for CSS/JSON.
CONCLUSION
▸ This should be more than enough to get you started on client side
testing.
▸ Any tests are better than no tests.
▸ Client side applications aren't going to get any less complicated.
FURTHER INFORMATION
▸ http://glennstovall.com
▸ glenn@concordantsolutions.com
▸ @GSto
- LINK TO SHOW NOTES
ANY QUESTIONS

More Related Content

What's hot

Backbone js
Backbone jsBackbone js
Backbone jsrstankov
 
Workshop 1: Good practices in JavaScript
Workshop 1: Good practices in JavaScriptWorkshop 1: Good practices in JavaScript
Workshop 1: Good practices in JavaScriptVisual Engineering
 
Ember and containers
Ember and containersEmber and containers
Ember and containersMatthew Beale
 
Ruby/Rails
Ruby/RailsRuby/Rails
Ruby/Railsrstankov
 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the FinishYehuda Katz
 
AngularJS Directives
AngularJS DirectivesAngularJS Directives
AngularJS DirectivesEyal Vardi
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e bigAndy Peterson
 
ReactJs presentation
ReactJs presentationReactJs presentation
ReactJs presentationnishasowdri
 
Introduction to Protractor
Introduction to ProtractorIntroduction to Protractor
Introduction to ProtractorJie-Wei Wu
 
2013 - Nate Abele: HTTP ALL THE THINGS: Simplificando aplicaciones respetando...
2013 - Nate Abele: HTTP ALL THE THINGS: Simplificando aplicaciones respetando...2013 - Nate Abele: HTTP ALL THE THINGS: Simplificando aplicaciones respetando...
2013 - Nate Abele: HTTP ALL THE THINGS: Simplificando aplicaciones respetando...PHP Conference Argentina
 
Workshop 14: AngularJS Parte III
Workshop 14: AngularJS Parte IIIWorkshop 14: AngularJS Parte III
Workshop 14: AngularJS Parte IIIVisual Engineering
 

What's hot (20)

Redux vs Alt
Redux vs AltRedux vs Alt
Redux vs Alt
 
Backbone js
Backbone jsBackbone js
Backbone js
 
Vuejs testing
Vuejs testingVuejs testing
Vuejs testing
 
Workshop 1: Good practices in JavaScript
Workshop 1: Good practices in JavaScriptWorkshop 1: Good practices in JavaScript
Workshop 1: Good practices in JavaScript
 
Ember and containers
Ember and containersEmber and containers
Ember and containers
 
Basics of AngularJS
Basics of AngularJSBasics of AngularJS
Basics of AngularJS
 
Angularjs Performance
Angularjs PerformanceAngularjs Performance
Angularjs Performance
 
Dan Webb Presentation
Dan Webb PresentationDan Webb Presentation
Dan Webb Presentation
 
AngularJs
AngularJsAngularJs
AngularJs
 
Why ruby
Why rubyWhy ruby
Why ruby
 
Ruby/Rails
Ruby/RailsRuby/Rails
Ruby/Rails
 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the Finish
 
AngularJS Directives
AngularJS DirectivesAngularJS Directives
AngularJS Directives
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
 
ReactJs presentation
ReactJs presentationReactJs presentation
ReactJs presentation
 
Introduction to Protractor
Introduction to ProtractorIntroduction to Protractor
Introduction to Protractor
 
2013 - Nate Abele: HTTP ALL THE THINGS: Simplificando aplicaciones respetando...
2013 - Nate Abele: HTTP ALL THE THINGS: Simplificando aplicaciones respetando...2013 - Nate Abele: HTTP ALL THE THINGS: Simplificando aplicaciones respetando...
2013 - Nate Abele: HTTP ALL THE THINGS: Simplificando aplicaciones respetando...
 
Workshop 14: AngularJS Parte III
Workshop 14: AngularJS Parte IIIWorkshop 14: AngularJS Parte III
Workshop 14: AngularJS Parte III
 
AngularJS Basics with Example
AngularJS Basics with ExampleAngularJS Basics with Example
AngularJS Basics with Example
 
Step objects
Step objectsStep objects
Step objects
 

Similar to Reliable Javascript

Building Progressive Web Apps for Windows devices
Building Progressive Web Apps for Windows devicesBuilding Progressive Web Apps for Windows devices
Building Progressive Web Apps for Windows devicesWindows Developer
 
Testing in AngularJS
Testing in AngularJSTesting in AngularJS
Testing in AngularJSPeter Drinnan
 
How and why i roll my own node.js framework
How and why i roll my own node.js frameworkHow and why i roll my own node.js framework
How and why i roll my own node.js frameworkBen Lin
 
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)Igor Bronovskyy
 
Jeroen Vloothuis Bend Kss To Your Will
Jeroen Vloothuis   Bend Kss To Your WillJeroen Vloothuis   Bend Kss To Your Will
Jeroen Vloothuis Bend Kss To Your WillVincenzo Barone
 
Build Web Apps using Node.js
Build Web Apps using Node.jsBuild Web Apps using Node.js
Build Web Apps using Node.jsdavidchubbs
 
A few good JavaScript development tools
A few good JavaScript development toolsA few good JavaScript development tools
A few good JavaScript development toolsSimon Kim
 
Writing Maintainable JavaScript
Writing Maintainable JavaScriptWriting Maintainable JavaScript
Writing Maintainable JavaScriptAndrew Dupont
 
Bonnes pratiques de développement avec Node js
Bonnes pratiques de développement avec Node jsBonnes pratiques de développement avec Node js
Bonnes pratiques de développement avec Node jsFrancois Zaninotto
 
Protractor framework architecture with example
Protractor framework architecture with exampleProtractor framework architecture with example
Protractor framework architecture with exampleshadabgilani
 
Unit Testing and Coverage for AngularJS
Unit Testing and Coverage for AngularJSUnit Testing and Coverage for AngularJS
Unit Testing and Coverage for AngularJSKnoldus Inc.
 
JavaScript and UI Architecture Best Practices
JavaScript and UI Architecture Best PracticesJavaScript and UI Architecture Best Practices
JavaScript and UI Architecture Best PracticesSiarhei Barysiuk
 
Workshop 23: ReactJS, React & Redux testing
Workshop 23: ReactJS, React & Redux testingWorkshop 23: ReactJS, React & Redux testing
Workshop 23: ReactJS, React & Redux testingVisual Engineering
 
Continuous Integration for front-end JavaScript
Continuous Integration for front-end JavaScriptContinuous Integration for front-end JavaScript
Continuous Integration for front-end JavaScriptLars Thorup
 
Building Large jQuery Applications
Building Large jQuery ApplicationsBuilding Large jQuery Applications
Building Large jQuery ApplicationsRebecca Murphey
 
Developing web-apps like it's 2013
Developing web-apps like it's 2013Developing web-apps like it's 2013
Developing web-apps like it's 2013Laurent_VB
 
How to perform debounce in react
How to perform debounce in reactHow to perform debounce in react
How to perform debounce in reactBOSC Tech Labs
 
jQuery & 10,000 Global Functions: Working with Legacy JavaScript
jQuery & 10,000 Global Functions: Working with Legacy JavaScriptjQuery & 10,000 Global Functions: Working with Legacy JavaScript
jQuery & 10,000 Global Functions: Working with Legacy JavaScriptGuy Royse
 
Get Grulping with JavaScript Task Runners (Matt Gifford)
Get Grulping with JavaScript Task Runners (Matt Gifford)Get Grulping with JavaScript Task Runners (Matt Gifford)
Get Grulping with JavaScript Task Runners (Matt Gifford)Future Insights
 

Similar to Reliable Javascript (20)

Building Progressive Web Apps for Windows devices
Building Progressive Web Apps for Windows devicesBuilding Progressive Web Apps for Windows devices
Building Progressive Web Apps for Windows devices
 
Testing in AngularJS
Testing in AngularJSTesting in AngularJS
Testing in AngularJS
 
How and why i roll my own node.js framework
How and why i roll my own node.js frameworkHow and why i roll my own node.js framework
How and why i roll my own node.js framework
 
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
 
Jeroen Vloothuis Bend Kss To Your Will
Jeroen Vloothuis   Bend Kss To Your WillJeroen Vloothuis   Bend Kss To Your Will
Jeroen Vloothuis Bend Kss To Your Will
 
Build Web Apps using Node.js
Build Web Apps using Node.jsBuild Web Apps using Node.js
Build Web Apps using Node.js
 
A few good JavaScript development tools
A few good JavaScript development toolsA few good JavaScript development tools
A few good JavaScript development tools
 
Writing Maintainable JavaScript
Writing Maintainable JavaScriptWriting Maintainable JavaScript
Writing Maintainable JavaScript
 
Bonnes pratiques de développement avec Node js
Bonnes pratiques de développement avec Node jsBonnes pratiques de développement avec Node js
Bonnes pratiques de développement avec Node js
 
Protractor framework architecture with example
Protractor framework architecture with exampleProtractor framework architecture with example
Protractor framework architecture with example
 
Unit Testing and Coverage for AngularJS
Unit Testing and Coverage for AngularJSUnit Testing and Coverage for AngularJS
Unit Testing and Coverage for AngularJS
 
JavaScript and UI Architecture Best Practices
JavaScript and UI Architecture Best PracticesJavaScript and UI Architecture Best Practices
JavaScript and UI Architecture Best Practices
 
Workshop 23: ReactJS, React & Redux testing
Workshop 23: ReactJS, React & Redux testingWorkshop 23: ReactJS, React & Redux testing
Workshop 23: ReactJS, React & Redux testing
 
Continuous Integration for front-end JavaScript
Continuous Integration for front-end JavaScriptContinuous Integration for front-end JavaScript
Continuous Integration for front-end JavaScript
 
Building Large jQuery Applications
Building Large jQuery ApplicationsBuilding Large jQuery Applications
Building Large jQuery Applications
 
Developing web-apps like it's 2013
Developing web-apps like it's 2013Developing web-apps like it's 2013
Developing web-apps like it's 2013
 
DrupalCon jQuery
DrupalCon jQueryDrupalCon jQuery
DrupalCon jQuery
 
How to perform debounce in react
How to perform debounce in reactHow to perform debounce in react
How to perform debounce in react
 
jQuery & 10,000 Global Functions: Working with Legacy JavaScript
jQuery & 10,000 Global Functions: Working with Legacy JavaScriptjQuery & 10,000 Global Functions: Working with Legacy JavaScript
jQuery & 10,000 Global Functions: Working with Legacy JavaScript
 
Get Grulping with JavaScript Task Runners (Matt Gifford)
Get Grulping with JavaScript Task Runners (Matt Gifford)Get Grulping with JavaScript Task Runners (Matt Gifford)
Get Grulping with JavaScript Task Runners (Matt Gifford)
 

Recently uploaded

Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Zilliz
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityWSO2
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxRemote DBA Services
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistandanishmna97
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...apidays
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Angeliki Cooney
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusZilliz
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Victor Rentea
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...apidays
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelDeepika Singh
 

Recently uploaded (20)

Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 

Reliable Javascript