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

ES6, 잘 쓰고 계시죠?
ES6, 잘 쓰고 계시죠?ES6, 잘 쓰고 계시죠?
ES6, 잘 쓰고 계시죠?장현 한
 
Workshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte IIWorkshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte IIVisual Engineering
 
React, Redux, ES2015 by Max Petruck
React, Redux, ES2015   by Max PetruckReact, Redux, ES2015   by Max Petruck
React, Redux, ES2015 by Max PetruckMaksym Petruk
 
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...Codemotion
 
React, Redux and es6/7
React, Redux and es6/7React, Redux and es6/7
React, Redux and es6/7Dongho Cho
 
React JS and Redux
React JS and ReduxReact JS and Redux
React JS and ReduxGlib Kechyn
 
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 JAXERBrian Moschel
 
React Native: JS MVC Meetup #15
React Native: JS MVC Meetup #15React Native: JS MVC Meetup #15
React Native: JS MVC Meetup #15Rob Gietema
 
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...Codemotion
 
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 2017Codemotion
 
Academy PRO: React JS. Redux & Tooling
Academy PRO: React JS. Redux & ToolingAcademy PRO: React JS. Redux & Tooling
Academy PRO: React JS. Redux & ToolingBinary Studio
 
React state managmenet with Redux
React state managmenet with ReduxReact state managmenet with Redux
React state managmenet with ReduxVedran Blaženka
 
Redux training
Redux trainingRedux training
Redux trainingdasersoft
 
Reactive, component 그리고 angular2
Reactive, component 그리고  angular2Reactive, component 그리고  angular2
Reactive, component 그리고 angular2Jeado Ko
 
[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?Srijan Technologies
 
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 SideVisual Engineering
 

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 «От экспериментов с инфраструктурой до внедрения в продакшен»​

Modern frontend development with VueJs
Modern frontend development with VueJsModern frontend development with VueJs
Modern frontend development with VueJsTudor Barbu
 
Custom gutenberg block development in react
Custom gutenberg block development in reactCustom gutenberg block development in react
Custom gutenberg block development in reactImran Sayed
 
! 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.docxMARRY7
 
Building and deploying React applications
Building and deploying React applicationsBuilding and deploying React applications
Building and deploying React applicationsAstrails
 
case3h231diamond.gifcase3h231energy.jpgcase3h231moder.docx
case3h231diamond.gifcase3h231energy.jpgcase3h231moder.docxcase3h231diamond.gifcase3h231energy.jpgcase3h231moder.docx
case3h231diamond.gifcase3h231energy.jpgcase3h231moder.docxtidwellveronique
 
Javascript ui for rest services
Javascript ui for rest servicesJavascript ui for rest services
Javascript ui for rest servicesIoan Eugen Stan
 
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 2016Wiredcraft
 
Desbravando Web Components
Desbravando Web ComponentsDesbravando Web Components
Desbravando Web ComponentsMateus Ortiz
 
How to Webpack your Django!
How to Webpack your Django!How to Webpack your Django!
How to Webpack your Django!David Gibbons
 
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 Componentscagataycivici
 
Private slideshow
Private slideshowPrivate slideshow
Private slideshowsblackman
 
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
 
The new static resources framework
The new static resources frameworkThe new static resources framework
The new static resources frameworkmarcplmer
 
Custom gutenberg block development with React
Custom gutenberg block development with ReactCustom gutenberg block development with React
Custom gutenberg block development with ReactImran Sayed
 

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
 
Илья Климов - Reason: маргиналы против хайпа
Илья Климов - Reason: маргиналы против хайпаИлья Климов - Reason: маргиналы против хайпа
Илья Климов - Reason: маргиналы против хайпаFDConf
 
Максим Щепелин - Доставляя веб-контент в игру
Максим Щепелин - Доставляя веб-контент в игруМаксим Щепелин - Доставляя веб-контент в игру
Максим Щепелин - Доставляя веб-контент в игруFDConf
 
Александр Черноокий - Как правило "победитель получает все" работает и не раб...
Александр Черноокий - Как правило "победитель получает все" работает и не раб...Александр Черноокий - Как правило "победитель получает все" работает и не раб...
Александр Черноокий - Как правило "победитель получает все" работает и не раб...FDConf
 
Михаил Волчек - Что такое Цифровая мастерская?
Михаил Волчек - Что такое Цифровая мастерская?Михаил Волчек - Что такое Цифровая мастерская?
Михаил Волчек - Что такое Цифровая мастерская?FDConf
 
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 ApolloFDConf
 
Виктор Русакович - Выборы, выборы, все фреймворки… приторны
Виктор Русакович - Выборы, выборы, все фреймворки… приторныВиктор Русакович - Выборы, выборы, все фреймворки… приторны
Виктор Русакович - Выборы, выборы, все фреймворки… приторныFDConf
 
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 FDConf
 
Тимофей Лавренюк - Почему мне зашел PWA?
Тимофей Лавренюк - Почему мне зашел PWA?Тимофей Лавренюк - Почему мне зашел PWA?
Тимофей Лавренюк - Почему мне зашел PWA?FDConf
 
В погоне за производительностью
В погоне за производительностьюВ погоне за производительностью
В погоне за производительностьюFDConf
 
Если у вас нету тестов...
Если у вас нету тестов...Если у вас нету тестов...
Если у вас нету тестов...FDConf
 
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 ReduxFDConf
 
Dart: питание и сила для вашего проекта
Dart: питание и сила для вашего проектаDart: питание и сила для вашего проекта
Dart: питание и сила для вашего проектаFDConf
 
Scalable Angular 2 Application Architecture
Scalable Angular 2 Application ArchitectureScalable Angular 2 Application Architecture
Scalable Angular 2 Application ArchitectureFDConf
 
JavaScript: прошлое, настоящее и будущее.
JavaScript: прошлое, настоящее и будущее.JavaScript: прошлое, настоящее и будущее.
JavaScript: прошлое, настоящее и будущее.FDConf
 
CSSO — сжимаем CSS
CSSO — сжимаем CSSCSSO — сжимаем CSS
CSSO — сжимаем CSSFDConf
 
Будь первым
Будь первымБудь первым
Будь первымFDConf
 
"Пиринговый веб на JavaScript"
"Пиринговый веб на JavaScript""Пиринговый веб на JavaScript"
"Пиринговый веб на JavaScript"FDConf
 
«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»​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

OC Streetcar Final Presentation-Downtown Santa Ana
OC Streetcar Final Presentation-Downtown Santa AnaOC Streetcar Final Presentation-Downtown Santa Ana
OC Streetcar Final Presentation-Downtown Santa AnaRahsaan L. Browne
 
ServiceNow CIS-Discovery Exam Dumps 2024
ServiceNow CIS-Discovery Exam Dumps 2024ServiceNow CIS-Discovery Exam Dumps 2024
ServiceNow CIS-Discovery Exam Dumps 2024SkillCertProExams
 
05232024 Joint Meeting - Community Networking
05232024 Joint Meeting - Community Networking05232024 Joint Meeting - Community Networking
05232024 Joint Meeting - Community NetworkingMichael Orias
 
The Canoga Gardens Development Project. PDF
The Canoga Gardens Development Project. PDFThe Canoga Gardens Development Project. PDF
The Canoga Gardens Development Project. PDFRahsaan L. Browne
 
527598851-ppc-due-to-various-govt-policies.pdf
527598851-ppc-due-to-various-govt-policies.pdf527598851-ppc-due-to-various-govt-policies.pdf
527598851-ppc-due-to-various-govt-policies.pdfrajpreetkaur75080
 
art integrated project of computer applications
art integrated project of computer applicationsart integrated project of computer applications
art integrated project of computer applicationsmarvelpwian65
 
The Influence and Evolution of Mogul Press in Contemporary Public Relations.docx
The Influence and Evolution of Mogul Press in Contemporary Public Relations.docxThe Influence and Evolution of Mogul Press in Contemporary Public Relations.docx
The Influence and Evolution of Mogul Press in Contemporary Public Relations.docxMogul Press
 
Oracle Database Administration I (1Z0-082) Exam Dumps 2024.pdf
Oracle Database Administration I (1Z0-082) Exam Dumps 2024.pdfOracle Database Administration I (1Z0-082) Exam Dumps 2024.pdf
Oracle Database Administration I (1Z0-082) Exam Dumps 2024.pdfSkillCertProExams
 
Writing Sample 2 -Bridging the Divide: Enhancing Public Engagement in Urban D...
Writing Sample 2 -Bridging the Divide: Enhancing Public Engagement in Urban D...Writing Sample 2 -Bridging the Divide: Enhancing Public Engagement in Urban D...
Writing Sample 2 -Bridging the Divide: Enhancing Public Engagement in Urban D...Rahsaan L. Browne
 
Breathing in New Life_ Part 3 05 22 2024.pptx
Breathing in New Life_ Part 3 05 22 2024.pptxBreathing in New Life_ Part 3 05 22 2024.pptx
Breathing in New Life_ Part 3 05 22 2024.pptxFamilyWorshipCenterD
 
ACM CHT Best Inspection Practices Kinben Innovation MIC Slideshare.pdf
ACM CHT Best Inspection Practices Kinben Innovation MIC Slideshare.pdfACM CHT Best Inspection Practices Kinben Innovation MIC Slideshare.pdf
ACM CHT Best Inspection Practices Kinben Innovation MIC Slideshare.pdfKinben Innovation Private Limited
 
Understanding Poverty: A Community Questionnaire
Understanding Poverty: A Community QuestionnaireUnderstanding Poverty: A Community Questionnaire
Understanding Poverty: A Community Questionnairebazilnaeem7
 
Cymulate (Breach and Attack Simulation).
Cymulate (Breach and Attack Simulation).Cymulate (Breach and Attack Simulation).
Cymulate (Breach and Attack Simulation).luckyk1575
 
Deciding The Topic of our Magazine.pptx.
Deciding The Topic of our Magazine.pptx.Deciding The Topic of our Magazine.pptx.
Deciding The Topic of our Magazine.pptx.bazilnaeem7
 

Recently uploaded (14)

OC Streetcar Final Presentation-Downtown Santa Ana
OC Streetcar Final Presentation-Downtown Santa AnaOC Streetcar Final Presentation-Downtown Santa Ana
OC Streetcar Final Presentation-Downtown Santa Ana
 
ServiceNow CIS-Discovery Exam Dumps 2024
ServiceNow CIS-Discovery Exam Dumps 2024ServiceNow CIS-Discovery Exam Dumps 2024
ServiceNow CIS-Discovery Exam Dumps 2024
 
05232024 Joint Meeting - Community Networking
05232024 Joint Meeting - Community Networking05232024 Joint Meeting - Community Networking
05232024 Joint Meeting - Community Networking
 
The Canoga Gardens Development Project. PDF
The Canoga Gardens Development Project. PDFThe Canoga Gardens Development Project. PDF
The Canoga Gardens Development Project. PDF
 
527598851-ppc-due-to-various-govt-policies.pdf
527598851-ppc-due-to-various-govt-policies.pdf527598851-ppc-due-to-various-govt-policies.pdf
527598851-ppc-due-to-various-govt-policies.pdf
 
art integrated project of computer applications
art integrated project of computer applicationsart integrated project of computer applications
art integrated project of computer applications
 
The Influence and Evolution of Mogul Press in Contemporary Public Relations.docx
The Influence and Evolution of Mogul Press in Contemporary Public Relations.docxThe Influence and Evolution of Mogul Press in Contemporary Public Relations.docx
The Influence and Evolution of Mogul Press in Contemporary Public Relations.docx
 
Oracle Database Administration I (1Z0-082) Exam Dumps 2024.pdf
Oracle Database Administration I (1Z0-082) Exam Dumps 2024.pdfOracle Database Administration I (1Z0-082) Exam Dumps 2024.pdf
Oracle Database Administration I (1Z0-082) Exam Dumps 2024.pdf
 
Writing Sample 2 -Bridging the Divide: Enhancing Public Engagement in Urban D...
Writing Sample 2 -Bridging the Divide: Enhancing Public Engagement in Urban D...Writing Sample 2 -Bridging the Divide: Enhancing Public Engagement in Urban D...
Writing Sample 2 -Bridging the Divide: Enhancing Public Engagement in Urban D...
 
Breathing in New Life_ Part 3 05 22 2024.pptx
Breathing in New Life_ Part 3 05 22 2024.pptxBreathing in New Life_ Part 3 05 22 2024.pptx
Breathing in New Life_ Part 3 05 22 2024.pptx
 
ACM CHT Best Inspection Practices Kinben Innovation MIC Slideshare.pdf
ACM CHT Best Inspection Practices Kinben Innovation MIC Slideshare.pdfACM CHT Best Inspection Practices Kinben Innovation MIC Slideshare.pdf
ACM CHT Best Inspection Practices Kinben Innovation MIC Slideshare.pdf
 
Understanding Poverty: A Community Questionnaire
Understanding Poverty: A Community QuestionnaireUnderstanding Poverty: A Community Questionnaire
Understanding Poverty: A Community Questionnaire
 
Cymulate (Breach and Attack Simulation).
Cymulate (Breach and Attack Simulation).Cymulate (Breach and Attack Simulation).
Cymulate (Breach and Attack Simulation).
 
Deciding The Topic of our Magazine.pptx.
Deciding The Topic of our Magazine.pptx.Deciding The Topic of our Magazine.pptx.
Deciding The Topic of our Magazine.pptx.
 

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