SlideShare a Scribd company logo
1 of 84
Download to read offline
От экспериментов с инфраструктурой
до внедрения в продакшен
Дмитрий Махнёв
Работаю в ok.ru
Делаю m.ok.ru
О себе
Автоматизация
Концентрация на новых задачах
Снижение порога входа
Улучшение стабильности
.sidebar {

...

}

.sidebar.__active {

...

}



.sidebar_item {

...

}

.sidebar_item.__selected {

...

}
∞
∞
∞
∞
/*



sidebar __active

sidebar_item (__selected)



*/
CSSG
.sidebar {

...

}

.sidebar.__active {

...

}



.sidebar_item {

...

}

.sidebar_item.__selected {

...

}
/*



sidebar __active

sidebar_item (__selected)



*/
HTML Parse
CSSG Tree
CSSG Render
HTML Parse
CSSG Tree
CSSG Render
CSS Parse …
Write in File
HTML Parse
<div class="sidebar __active">

<div class="sidebar_item">Item 1</div>

<div class="sidebar_item __selected">Item 2</div>

<div class="sidebar_item">Item 3</div>
<div class="sidebar_item">Item 4</div>
<div class="sidebar_item">Item 5</div>

</div>
Testing
describe('math test', function () {


it('sum works correct', function () {

expect(sum(1, 1)).toBe(2);

});


it('difference works correct', function () {

expect(difference(1, 1)).toBe(0);

});


});


describe('tests types', function () {



it('sync', function () {

expect(true).toBeTruthy();

});



it('async', function (done) {

setTimeout(function () {

expect(true).toBeTruthy();

done();

}, 100);

});


});
Link coming soon…
Unit Testing
Test Driven Development (TDD)
Black Box Testing
✓ Testing
describe('password security level', function () {



it('50%', function () {



expect(passwordSecurityLevel('qwerty')).toBe(50);



});



});
Testing Private Methods
Black
Box
Input Output
describe('one div with attributes', function () {



var simpleDOMResult = parse(
'<div class="block" data-foo="bar"></div>'
);


var div = simpleDOMResult.childNodes[0];



defaultDivTests(div);



});
Testing Private Methods
/**

*

* @param {ContextOfParse} contextOfParse

* @param {String} char

*/

processings[TEXT] = function (contextOfParse, char) {

addCharForBuffer(contextOfParse, char);



switch (char) {

case '<':

contextOfParse.state = TAG_START;

break;

default:

contextOfParse.textBuffer += char;

}

};
/*@defaultTesting.exports*/


processingsExport.processingText = processings[TEXT];

/*@/defaultTesting.exports*/
/**

*

* @param {String} xml

* @return {Object} simpleDOM

*/

module.exports = function (xml) {

var contextOfParse = new ContextOfParse(),

i = 0,

iMax = xml.length,

result;



for (; i < iMax; i += 1) {

processings[contextOfParse.state](contextOfParse, xml.charAt(i));

}



processingResultState(contextOfParse);



result = contextOfParse.result;

contextOfParse.destructor();



return result;

};
Tests Runners
✓ Testing
✓ Black Box Testing
Karma — Test Runner for JavaScript
Link coming soon…
Runner Workflow
var config = readConfig();



config.browsers.each(function(browser){



var result = startBrowser(browser, config.code);



console.output(processingResult(result));



});
Dependency manager
✓ Testing
✓ Black Box Testing
✓ Tests Runners
require('module');
Package Managers
Front-endBack-end & Console
require('../../../../src/default-lib');
Link coming soon…
var cycle = require('default-lib').cycle;
var webpack = require('webpack');



module.exports = {

entry: './entry.js',

output: {

path: __dirname,

filename: 'bundle.js'

}

};
webpack.config.js
var defaultLib = {};



defaultLib.getGlobal = require('./utils/getGlobal');

defaultLib.typesDetection = require('./utils/typesDetection');

defaultLib.getObjectKeys = require('./utils/getObjectKeys');

defaultLib.getObjectLength = require('./utils/getObjectLength');

defaultLib.cycleKeys = require('./utils/cycle/cycleKeys');

defaultLib.cycle = require('./utils/cycle/cycle');

defaultLib.reversiveCycle = require('./utils/cycle/reversiveCycle');

defaultLib.getObjectSafely = require('./utils/getObjectSafely');

defaultLib.onload = require('./utils/onload');



module.exports = defaultLib;
Entry Point
/* 0 */

/***/ function(module, exports, __webpack_require__) {



document.write(__webpack_require__(1));

document.body.addEventListener('click', function () {

});



/***/ },

/* 1 */

/***/ function(module, exports, __webpack_require__) {



module.exports = 'It works from content.js';



/***/ }
Part of webpack Bundle
webpack: {

resolve: {

root: [

path.join(__dirname, 'bower_components'),

path.join(__dirname, 'src')

]

},

plugins: [

new webpack.ResolverPlugin(

new webpack.ResolverPlugin.DirectoryDescriptionFilePlugin(
'bower.json',
['main']
)

)

]

}
webpack for karma.config.js
files: [

'tests/specs/simple-dom.js',

'tests/specs/modules/nodes.js',

'tests/specs/modules/parse/defaultTesting.exports.simpleDOM.parse/'

+ 'defaultTesting.exports.simpleDOM.parse.js',

'tests/specs/modules/parse/defaultTesting.exports.simpleDOM.parse/'

+ 'contextOfParse.js',

'tests/specs/modules/parse/defaultTesting.exports.simpleDOM.parse/'

+ 'microhelpers/**/*.js',

'tests/specs/modules/parse/defaultTesting.exports.simpleDOM.parse/'

+ 'builders/**/*.js',

'tests/specs/modules/parse/defaultTesting.exports.simpleDOM.parse/'

+ 'processings/**/*.js',

'tests/specs/modules/parse/parse.js',

'tests/specs/modules/selectors/parseSelector.js'

]
var path = require('path');

var webpack = require('webpack');

var bowerConfig = require('./bower');



module.exports = {



entry: path.resolve(bowerConfig.main),



output: {

path: path.resolve(bowerConfig.dist),

filename: bowerConfig.umdName + '.js',

libraryTarget: 'umd',

library: bowerConfig.umdName

},



plugins: [

new webpack.ResolverPlugin(

new webpack.ResolverPlugin.DirectoryDescriptionFilePlugin(

'bower.json',

['main']

)

),

new webpack.optimize.UglifyJsPlugin()

]

};
webpack.config.js
/*@defaultTesting.exports*/

processingsExport.processingText = processings[TEXT];

/*@/defaultTesting.exports*/
/**

*

* @param {ContextOfParse} contextOfParse

* @param {String} char

*/

processings[TEXT] = function (contextOfParse, char) {

addCharForBuffer(contextOfParse, char);



switch (char) {

case '<':

contextOfParse.state = TAG_START;

break;

default:

contextOfParse.textBuffer += char;

}

};



/*@defaultTesting.exports*/

processingsExport.processingText = processings[TEXT];

/*@/defaultTesting.exports*/
/* 0 */

/***/ function(module, exports, __webpack_require__) {



document.write(__webpack_require__(1));

document.body.addEventListener('click', function () {

});



/***/ },

/* 1 */

/***/ function(module, exports, __webpack_require__) {



module.exports = 'It works from content.js';



/***/ }
Part of webpack Bundle
webpack Workflow
var config = readConfig();

var files = [config.entry];

var bundleParts = [];



while (files.length !== 0) {



var file = loadFile(files.shift());



var ast = parseToASR(

file, 

function (linkOnFile) {

files.push(linkOnFile)

}

);



bundleParts.push(ast);



}



createBundle(bundleParts);
module: {

loaders: [

//loader removes code for testing

{

test: /^.*$/,

loader: 'regexp',

rules: [

{

'for': /regExpRule/g,

'do': ''

}

]

}

]

}
webpack.config.js loader
/*@defaultTesting.{{mode}}*/



/*@/defaultTesting.{{mode}}*/
Tasks Runner
✓ Testing
✓ Black Box Testing
✓ Tests Runners
✓ Dependency manager
Tasks Runners
Synchronously
I/Oⁿ
Streams
JS
Run Tests
Build bundle
JS
Run Tests
Build bundle Generate Doc
Commit Publish Publish × 2
gulp-run-sequence
var runSequence = require('gulp-run-sequence');



gulp.task('default', function () {

runSequence(

'build:test',

['build:dist', 'build:commit', 'build:docs'],

'build:publish'

);

});
Environment
✓ Testing
✓ Black Box Testing
✓ Tests Runners
✓ Dependency manager
✓ Tasks Runner
npm i
it('key input add 2 symbols ', function (done) {

define('',

[

'/res/js/modules/dom/domTraverse.js',

'/res/js/modules/inputWithCounter.js'

],

function (traverse, inputWithCounter) {

var initedInput = initInputWithCounterFor(

inputWithCounter,

tmpl2CountersAndWrapper

);

var counterTextNode = findCounter(initedInput, 0, traverse.getTextNode);

var counter2TextNode = findCounter(initedInput, 1, traverse.getTextNode);

var instance = initedInput.instance;

var input = instance.input;

var startValueLength = instance.valueLength;

var valueLength;



effroi.mouse.focus(input);

effroi.keyboard.hit('1', '1');



valueLength = instance.valueLength;

expect(valueLength - startValueLength).toBe(2);

expect(valueLength).toBe(+counterTextNode.nodeValue);

expect(valueLength).toBe(+counter2TextNode.nodeValue);



done();

}

);

});
inputWithCounter Test From m.ok.ru
var keyboard = require('effroi').keyboard;



keyboard.focus(element);



keyboard.hit('a'); 

keyboard.hit('b','c','d');



keyboard.combine(keyboard.CTRL, 'v');
describe('angularjs homepage todo list', function () {

it('should add a todo', function () {

browser.get('http://www.angularjs.org');



element(by.model('todoText')).sendKeys('write a protractor test');

element(by.css('[value="add"]')).click();



var todoList = element.all(by.repeater('todo in todos'));

expect(todoList.count()).toEqual(3);

expect(todoList.get(2).getText()).toEqual('write a protractor test');

});

});
wallaby.js
Ссылки
http://bit.ly/fdc_dm

More Related Content

What's hot

What's hot (20)

ES6, 잘 쓰고 계시죠?
ES6, 잘 쓰고 계시죠?ES6, 잘 쓰고 계시죠?
ES6, 잘 쓰고 계시죠?
 
Workshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte IIWorkshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte II
 
React, Redux, ES2015 by Max Petruck
React, Redux, ES2015   by Max PetruckReact, Redux, ES2015   by Max Petruck
React, Redux, ES2015 by Max Petruck
 
Building multi lingual and empatic bots - Sander van den Hoven - Codemotion A...
Building multi lingual and empatic bots - Sander van den Hoven - Codemotion A...Building multi lingual and empatic bots - Sander van den Hoven - Codemotion A...
Building multi lingual and empatic bots - Sander van den Hoven - Codemotion A...
 
React, Redux and es6/7
React, Redux and es6/7React, Redux and es6/7
React, Redux and es6/7
 
React JS and Redux
React JS and ReduxReact JS and Redux
React JS and Redux
 
Building an App with jQuery and JAXER
Building an App with jQuery and JAXERBuilding an App with jQuery and JAXER
Building an App with jQuery and JAXER
 
Svelte JS introduction
Svelte JS introductionSvelte JS introduction
Svelte JS introduction
 
React Native: JS MVC Meetup #15
React Native: JS MVC Meetup #15React Native: JS MVC Meetup #15
React Native: JS MVC Meetup #15
 
React и redux
React и reduxReact и redux
React и redux
 
A real-world Relay application in production - Stefano Masini - Codemotion Am...
A real-world Relay application in production - Stefano Masini - Codemotion Am...A real-world Relay application in production - Stefano Masini - Codemotion Am...
A real-world Relay application in production - Stefano Masini - Codemotion Am...
 
The hitchhiker's guide to the Webpack - Sara Vieira - Codemotion Amsterdam 2017
The hitchhiker's guide to the Webpack - Sara Vieira - Codemotion Amsterdam 2017The hitchhiker's guide to the Webpack - Sara Vieira - Codemotion Amsterdam 2017
The hitchhiker's guide to the Webpack - Sara Vieira - Codemotion Amsterdam 2017
 
Academy PRO: React JS. Redux & Tooling
Academy PRO: React JS. Redux & ToolingAcademy PRO: React JS. Redux & Tooling
Academy PRO: React JS. Redux & Tooling
 
React state managmenet with Redux
React state managmenet with ReduxReact state managmenet with Redux
React state managmenet with Redux
 
Redux training
Redux trainingRedux training
Redux training
 
Reactive, component 그리고 angular2
Reactive, component 그리고  angular2Reactive, component 그리고  angular2
Reactive, component 그리고 angular2
 
[Srijan Wednesday Webinar] Rails 5: What's in It for Me?
[Srijan Wednesday Webinar] Rails 5: What's in It for Me?[Srijan Wednesday Webinar] Rails 5: What's in It for Me?
[Srijan Wednesday Webinar] Rails 5: What's in It for Me?
 
Vuejs testing
Vuejs testingVuejs testing
Vuejs testing
 
Advanced redux
Advanced reduxAdvanced redux
Advanced redux
 
Workshop 26: React Native - The Native Side
Workshop 26: React Native - The Native SideWorkshop 26: React Native - The Native Side
Workshop 26: React Native - The Native Side
 

Similar to «От экспериментов с инфраструктурой до внедрения в продакшен»​

! Modernizr v2.0.6 httpwww.modernizr.com Copyri.docx
!  Modernizr v2.0.6  httpwww.modernizr.com   Copyri.docx!  Modernizr v2.0.6  httpwww.modernizr.com   Copyri.docx
! Modernizr v2.0.6 httpwww.modernizr.com Copyri.docx
MARRY7
 
case3h231diamond.gifcase3h231energy.jpgcase3h231moder.docx
case3h231diamond.gifcase3h231energy.jpgcase3h231moder.docxcase3h231diamond.gifcase3h231energy.jpgcase3h231moder.docx
case3h231diamond.gifcase3h231energy.jpgcase3h231moder.docx
tidwellveronique
 
Private slideshow
Private slideshowPrivate slideshow
Private slideshow
sblackman
 
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
Andy Peterson
 

Similar to «От экспериментов с инфраструктурой до внедрения в продакшен»​ (20)

Modern frontend development with VueJs
Modern frontend development with VueJsModern frontend development with VueJs
Modern frontend development with VueJs
 
Lecture: Webpack 4
Lecture: Webpack 4Lecture: Webpack 4
Lecture: Webpack 4
 
Custom gutenberg block development in react
Custom gutenberg block development in reactCustom gutenberg block development in react
Custom gutenberg block development in react
 
! Modernizr v2.0.6 httpwww.modernizr.com Copyri.docx
!  Modernizr v2.0.6  httpwww.modernizr.com   Copyri.docx!  Modernizr v2.0.6  httpwww.modernizr.com   Copyri.docx
! Modernizr v2.0.6 httpwww.modernizr.com Copyri.docx
 
Building and deploying React applications
Building and deploying React applicationsBuilding and deploying React applications
Building and deploying React applications
 
case3h231diamond.gifcase3h231energy.jpgcase3h231moder.docx
case3h231diamond.gifcase3h231energy.jpgcase3h231moder.docxcase3h231diamond.gifcase3h231energy.jpgcase3h231moder.docx
case3h231diamond.gifcase3h231energy.jpgcase3h231moder.docx
 
Javascript ui for rest services
Javascript ui for rest servicesJavascript ui for rest services
Javascript ui for rest services
 
Code Splitting in Practice - Shanghai JS Meetup May 2016
Code Splitting in Practice - Shanghai JS Meetup May 2016Code Splitting in Practice - Shanghai JS Meetup May 2016
Code Splitting in Practice - Shanghai JS Meetup May 2016
 
Desbravando Web Components
Desbravando Web ComponentsDesbravando Web Components
Desbravando Web Components
 
How to Webpack your Django!
How to Webpack your Django!How to Webpack your Django!
How to Webpack your Django!
 
How to Mess Up Your Angular UI Components
How to Mess Up Your Angular UI ComponentsHow to Mess Up Your Angular UI Components
How to Mess Up Your Angular UI Components
 
Private slideshow
Private slideshowPrivate slideshow
Private slideshow
 
Django at the Disco
Django at the DiscoDjango at the Disco
Django at the Disco
 
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
 
The new static resources framework
The new static resources frameworkThe new static resources framework
The new static resources framework
 
Custom gutenberg block development with React
Custom gutenberg block development with ReactCustom gutenberg block development with React
Custom gutenberg block development with React
 
Django at the Disco
Django at the DiscoDjango at the Disco
Django at the Disco
 
Django at the Disco
Django at the DiscoDjango at the Disco
Django at the Disco
 
Django at the Disco
Django at the DiscoDjango at the Disco
Django at the Disco
 
Django at the Disco
Django at the DiscoDjango at the Disco
Django at the Disco
 

More from FDConf

Антон Киршанов - «Квант изменения. Реактивные реакции на React.
Антон Киршанов - «Квант изменения. Реактивные реакции на React.Антон Киршанов - «Квант изменения. Реактивные реакции на React.
Антон Киршанов - «Квант изменения. Реактивные реакции на React.
FDConf
 
В погоне за производительностью
В погоне за производительностьюВ погоне за производительностью
В погоне за производительностью
FDConf
 

More from FDConf (20)

Антон Киршанов - «Квант изменения. Реактивные реакции на React.
Антон Киршанов - «Квант изменения. Реактивные реакции на React.Антон Киршанов - «Квант изменения. Реактивные реакции на React.
Антон Киршанов - «Квант изменения. Реактивные реакции на React.
 
Игорь Еростенко - Создаем виртуальный тур
Игорь Еростенко - Создаем виртуальный турИгорь Еростенко - Создаем виртуальный тур
Игорь Еростенко - Создаем виртуальный тур
 
Илья Климов - Reason: маргиналы против хайпа
Илья Климов - Reason: маргиналы против хайпаИлья Климов - Reason: маргиналы против хайпа
Илья Климов - Reason: маргиналы против хайпа
 
Максим Щепелин - Доставляя веб-контент в игру
Максим Щепелин - Доставляя веб-контент в игруМаксим Щепелин - Доставляя веб-контент в игру
Максим Щепелин - Доставляя веб-контент в игру
 
Александр Черноокий - Как правило "победитель получает все" работает и не раб...
Александр Черноокий - Как правило "победитель получает все" работает и не раб...Александр Черноокий - Как правило "победитель получает все" работает и не раб...
Александр Черноокий - Как правило "победитель получает все" работает и не раб...
 
Михаил Волчек - Что такое Цифровая мастерская?
Михаил Волчек - Что такое Цифровая мастерская?Михаил Волчек - Что такое Цифровая мастерская?
Михаил Волчек - Что такое Цифровая мастерская?
 
Radoslav Stankov - Handling GraphQL with React and Apollo
Radoslav Stankov - Handling GraphQL with React and ApolloRadoslav Stankov - Handling GraphQL with React and Apollo
Radoslav Stankov - Handling GraphQL with React and Apollo
 
Виктор Русакович - Выборы, выборы, все фреймворки… приторны
Виктор Русакович - Выборы, выборы, все фреймворки… приторныВиктор Русакович - Выборы, выборы, все фреймворки… приторны
Виктор Русакович - Выборы, выборы, все фреймворки… приторны
 
Slobodan Stojanovic - 8 1/2 things about serverless
Slobodan Stojanovic - 8 1/2 things about serverless Slobodan Stojanovic - 8 1/2 things about serverless
Slobodan Stojanovic - 8 1/2 things about serverless
 
Тимофей Лавренюк - Почему мне зашел PWA?
Тимофей Лавренюк - Почему мне зашел PWA?Тимофей Лавренюк - Почему мне зашел PWA?
Тимофей Лавренюк - Почему мне зашел PWA?
 
В погоне за производительностью
В погоне за производительностьюВ погоне за производительностью
В погоне за производительностью
 
Если у вас нету тестов...
Если у вас нету тестов...Если у вас нету тестов...
Если у вас нету тестов...
 
Migrate your React.js application from (m)Observable to Redux
Migrate your React.js application from (m)Observable to ReduxMigrate your React.js application from (m)Observable to Redux
Migrate your React.js application from (m)Observable to Redux
 
Dart: питание и сила для вашего проекта
Dart: питание и сила для вашего проектаDart: питание и сила для вашего проекта
Dart: питание и сила для вашего проекта
 
Scalable Angular 2 Application Architecture
Scalable Angular 2 Application ArchitectureScalable Angular 2 Application Architecture
Scalable Angular 2 Application Architecture
 
JavaScript: прошлое, настоящее и будущее.
JavaScript: прошлое, настоящее и будущее.JavaScript: прошлое, настоящее и будущее.
JavaScript: прошлое, настоящее и будущее.
 
CSSO — сжимаем CSS
CSSO — сжимаем CSSCSSO — сжимаем CSS
CSSO — сжимаем CSS
 
Будь первым
Будь первымБудь первым
Будь первым
 
"Пиринговый веб на JavaScript"
"Пиринговый веб на JavaScript""Пиринговый веб на JavaScript"
"Пиринговый веб на JavaScript"
 
«I knew there had to be a better way to build mobile app»​
«I knew there had to be a better way to build mobile app»​«I knew there had to be a better way to build mobile app»​
«I knew there had to be a better way to build mobile app»​
 

Recently uploaded

If this Giant Must Walk: A Manifesto for a New Nigeria
If this Giant Must Walk: A Manifesto for a New NigeriaIf this Giant Must Walk: A Manifesto for a New Nigeria
If this Giant Must Walk: A Manifesto for a New Nigeria
Kayode Fayemi
 
Uncommon Grace The Autobiography of Isaac Folorunso
Uncommon Grace The Autobiography of Isaac FolorunsoUncommon Grace The Autobiography of Isaac Folorunso
Uncommon Grace The Autobiography of Isaac Folorunso
Kayode Fayemi
 
No Advance 8868886958 Chandigarh Call Girls , Indian Call Girls For Full Nigh...
No Advance 8868886958 Chandigarh Call Girls , Indian Call Girls For Full Nigh...No Advance 8868886958 Chandigarh Call Girls , Indian Call Girls For Full Nigh...
No Advance 8868886958 Chandigarh Call Girls , Indian Call Girls For Full Nigh...
Sheetaleventcompany
 
Chiulli_Aurora_Oman_Raffaele_Beowulf.pptx
Chiulli_Aurora_Oman_Raffaele_Beowulf.pptxChiulli_Aurora_Oman_Raffaele_Beowulf.pptx
Chiulli_Aurora_Oman_Raffaele_Beowulf.pptx
raffaeleoman
 
Bring back lost lover in USA, Canada ,Uk ,Australia ,London Lost Love Spell C...
Bring back lost lover in USA, Canada ,Uk ,Australia ,London Lost Love Spell C...Bring back lost lover in USA, Canada ,Uk ,Australia ,London Lost Love Spell C...
Bring back lost lover in USA, Canada ,Uk ,Australia ,London Lost Love Spell C...
amilabibi1
 

Recently uploaded (20)

BDSM⚡Call Girls in Sector 93 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 93 Noida Escorts >༒8448380779 Escort ServiceBDSM⚡Call Girls in Sector 93 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 93 Noida Escorts >༒8448380779 Escort Service
 
If this Giant Must Walk: A Manifesto for a New Nigeria
If this Giant Must Walk: A Manifesto for a New NigeriaIf this Giant Must Walk: A Manifesto for a New Nigeria
If this Giant Must Walk: A Manifesto for a New Nigeria
 
Uncommon Grace The Autobiography of Isaac Folorunso
Uncommon Grace The Autobiography of Isaac FolorunsoUncommon Grace The Autobiography of Isaac Folorunso
Uncommon Grace The Autobiography of Isaac Folorunso
 
Dreaming Marissa Sánchez Music Video Treatment
Dreaming Marissa Sánchez Music Video TreatmentDreaming Marissa Sánchez Music Video Treatment
Dreaming Marissa Sánchez Music Video Treatment
 
Causes of poverty in France presentation.pptx
Causes of poverty in France presentation.pptxCauses of poverty in France presentation.pptx
Causes of poverty in France presentation.pptx
 
No Advance 8868886958 Chandigarh Call Girls , Indian Call Girls For Full Nigh...
No Advance 8868886958 Chandigarh Call Girls , Indian Call Girls For Full Nigh...No Advance 8868886958 Chandigarh Call Girls , Indian Call Girls For Full Nigh...
No Advance 8868886958 Chandigarh Call Girls , Indian Call Girls For Full Nigh...
 
Busty Desi⚡Call Girls in Sector 51 Noida Escorts >༒8448380779 Escort Service-...
Busty Desi⚡Call Girls in Sector 51 Noida Escorts >༒8448380779 Escort Service-...Busty Desi⚡Call Girls in Sector 51 Noida Escorts >༒8448380779 Escort Service-...
Busty Desi⚡Call Girls in Sector 51 Noida Escorts >༒8448380779 Escort Service-...
 
Introduction to Prompt Engineering (Focusing on ChatGPT)
Introduction to Prompt Engineering (Focusing on ChatGPT)Introduction to Prompt Engineering (Focusing on ChatGPT)
Introduction to Prompt Engineering (Focusing on ChatGPT)
 
Presentation on Engagement in Book Clubs
Presentation on Engagement in Book ClubsPresentation on Engagement in Book Clubs
Presentation on Engagement in Book Clubs
 
Aesthetic Colaba Mumbai Cst Call girls 📞 7738631006 Grant road Call Girls ❤️-...
Aesthetic Colaba Mumbai Cst Call girls 📞 7738631006 Grant road Call Girls ❤️-...Aesthetic Colaba Mumbai Cst Call girls 📞 7738631006 Grant road Call Girls ❤️-...
Aesthetic Colaba Mumbai Cst Call girls 📞 7738631006 Grant road Call Girls ❤️-...
 
Sector 62, Noida Call girls :8448380779 Noida Escorts | 100% verified
Sector 62, Noida Call girls :8448380779 Noida Escorts | 100% verifiedSector 62, Noida Call girls :8448380779 Noida Escorts | 100% verified
Sector 62, Noida Call girls :8448380779 Noida Escorts | 100% verified
 
The workplace ecosystem of the future 24.4.2024 Fabritius_share ii.pdf
The workplace ecosystem of the future 24.4.2024 Fabritius_share ii.pdfThe workplace ecosystem of the future 24.4.2024 Fabritius_share ii.pdf
The workplace ecosystem of the future 24.4.2024 Fabritius_share ii.pdf
 
BDSM⚡Call Girls in Sector 97 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 97 Noida Escorts >༒8448380779 Escort ServiceBDSM⚡Call Girls in Sector 97 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 97 Noida Escorts >༒8448380779 Escort Service
 
Chiulli_Aurora_Oman_Raffaele_Beowulf.pptx
Chiulli_Aurora_Oman_Raffaele_Beowulf.pptxChiulli_Aurora_Oman_Raffaele_Beowulf.pptx
Chiulli_Aurora_Oman_Raffaele_Beowulf.pptx
 
SaaStr Workshop Wednesday w/ Lucas Price, Yardstick
SaaStr Workshop Wednesday w/ Lucas Price, YardstickSaaStr Workshop Wednesday w/ Lucas Price, Yardstick
SaaStr Workshop Wednesday w/ Lucas Price, Yardstick
 
lONG QUESTION ANSWER PAKISTAN STUDIES10.
lONG QUESTION ANSWER PAKISTAN STUDIES10.lONG QUESTION ANSWER PAKISTAN STUDIES10.
lONG QUESTION ANSWER PAKISTAN STUDIES10.
 
Air breathing and respiratory adaptations in diver animals
Air breathing and respiratory adaptations in diver animalsAir breathing and respiratory adaptations in diver animals
Air breathing and respiratory adaptations in diver animals
 
AWS Data Engineer Associate (DEA-C01) Exam Dumps 2024.pdf
AWS Data Engineer Associate (DEA-C01) Exam Dumps 2024.pdfAWS Data Engineer Associate (DEA-C01) Exam Dumps 2024.pdf
AWS Data Engineer Associate (DEA-C01) Exam Dumps 2024.pdf
 
Bring back lost lover in USA, Canada ,Uk ,Australia ,London Lost Love Spell C...
Bring back lost lover in USA, Canada ,Uk ,Australia ,London Lost Love Spell C...Bring back lost lover in USA, Canada ,Uk ,Australia ,London Lost Love Spell C...
Bring back lost lover in USA, Canada ,Uk ,Australia ,London Lost Love Spell C...
 
My Presentation "In Your Hands" by Halle Bailey
My Presentation "In Your Hands" by Halle BaileyMy Presentation "In Your Hands" by Halle Bailey
My Presentation "In Your Hands" by Halle Bailey
 

«От экспериментов с инфраструктурой до внедрения в продакшен»​