Funny JS #2Alexander KonovalovFunny JS - Это серия встреч для фронтэнд-разработчиков и не только. Я не буду читать лекцию или проводить тренинг. Мы будем общаться в живом формате и разбирать интересные и необычные задачи из мира JS, которые помогут лучше разобраться в теме и повысить скиллы. На первом митапе обсудим, что круче: функциональное программирование или объектно-ориентированный подход, прототипное или классическое наследование, ES6 или ES5
8 встреча — Язык программирования Python (В. Ананьев)Smolensk Computer Science Club8 встреча Smolensk Computer Science Club
Презентация Владислава Ананьева про язык программирования Python
ВКонтакте: http://vk.com/scsc8
Лекция #5. Введение в язык программирования Python 3Яковенко КириллWeb-программирование
Лекция #5. Введение в язык программирования Python 3
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Как написать JIT компиляторAndrew AksyonoffНазвание для привлечение внимания. На самом деле, презентация о том, что а) писать парсеры это просто, б) писать всякие вычислялки это просто, в) делается это вот так, г) бояться этого не нужно, а нужно делать.
Профилирование и отладка DjangoVladimir RudnyhПри написании программы, разработчик примерно представляет себе, как должна работать его программа. Но не всегда его ожидания соответствуют действительности — приложения тормозят, потребляют много ресурсов и вообще ведут себя не так, как задумывалось, особенно под большой нагрузкой. В своём докладе я покажу, как заглянуть "под капот" ваших приложений на Python (и Django в частности): какие способы профилирования бывают и когда их можно использовать, расскажу об отладке приложений и различных инструментах, которые помогают разработчику при разработке.
Очень вкусный фрукт GuavaEgor ChernyshevGuava - open-source библиотека, разработанная в основном инженерами компании Google, в которой есть множество полезных утилит для написания эффективного и красивого кода. В Guava решено множество типичных задач, которые часто возникают при работе с примитивами, строками, коллекциями, параллельными вычислениями, кэшированием данных и многим другим. В докладе поговорим о возможностях, которые предоставляет Guava, рассмотрим примеры использования утилит библиотеки.
Объектно-ориентированное программирование. Лекция 5 и 6Dima DzubaНа лекциях рассказывается об основных приемах по работе с исключениями (exception). Даются базовые знания по работе с "умными указателями".
Лекция 10. Классы 2.Roman BrovkoДескрипторы: что-как-зачем. Конструктор __new__, класс type и метаклассы. Наследование встроенных типов. Модули abc и collections.abc.
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24MoscowJSПромисы прочно вошли в ES-стандарт и жизнь современных JS-разработчиков. Однако многие, используя их чуть ли не каждый день, не до конца понимают, как они устроены. Какие опасности и возможности в себе кроют. Доклад освежит знания о промисах, предостережёт о нюансах реализаций и подскажет парочку трюков.
Лекция #5. Введение в язык программирования Python 3Яковенко КириллWeb-программирование
Лекция #5. Введение в язык программирования Python 3
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Как написать JIT компиляторAndrew AksyonoffНазвание для привлечение внимания. На самом деле, презентация о том, что а) писать парсеры это просто, б) писать всякие вычислялки это просто, в) делается это вот так, г) бояться этого не нужно, а нужно делать.
Профилирование и отладка DjangoVladimir RudnyhПри написании программы, разработчик примерно представляет себе, как должна работать его программа. Но не всегда его ожидания соответствуют действительности — приложения тормозят, потребляют много ресурсов и вообще ведут себя не так, как задумывалось, особенно под большой нагрузкой. В своём докладе я покажу, как заглянуть "под капот" ваших приложений на Python (и Django в частности): какие способы профилирования бывают и когда их можно использовать, расскажу об отладке приложений и различных инструментах, которые помогают разработчику при разработке.
Очень вкусный фрукт GuavaEgor ChernyshevGuava - open-source библиотека, разработанная в основном инженерами компании Google, в которой есть множество полезных утилит для написания эффективного и красивого кода. В Guava решено множество типичных задач, которые часто возникают при работе с примитивами, строками, коллекциями, параллельными вычислениями, кэшированием данных и многим другим. В докладе поговорим о возможностях, которые предоставляет Guava, рассмотрим примеры использования утилит библиотеки.
Объектно-ориентированное программирование. Лекция 5 и 6Dima DzubaНа лекциях рассказывается об основных приемах по работе с исключениями (exception). Даются базовые знания по работе с "умными указателями".
Лекция 10. Классы 2.Roman BrovkoДескрипторы: что-как-зачем. Конструктор __new__, класс type и метаклассы. Наследование встроенных типов. Модули abc и collections.abc.
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24MoscowJSПромисы прочно вошли в ES-стандарт и жизнь современных JS-разработчиков. Однако многие, используя их чуть ли не каждый день, не до конца понимают, как они устроены. Какие опасности и возможности в себе кроют. Доклад освежит знания о промисах, предостережёт о нюансах реализаций и подскажет парочку трюков.
JavaScript-модули "из прошлого в будущее"oelifantievДоклад на первом Ярославском форнтэнд-митапе.
Рассказ об имеющихся методиках описания модулей в JavaScript а также о грядущем стандарте ES6 и, наконец-то, нативной поддержке модулей языком.
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6Dmitry SoshnikovThe document summarizes Dmitry Soshnikov's presentation on ECMAScript 6 features at the HelsinkiJS meetup on December 12, 2011. Key features discussed include default function parameters, modules system, quasi-literals for string templates, array comprehensions, maps and weak maps, destructuring assignment, rest operator for function arguments, proxy objects for meta programming, and struct types.
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)OnticoResponsive web design, HTML5, CSS3, IDE, API, React, Angular, веб-компоненты, БЭМ... Опытным фронтендерам эти слова давно знакомы. А как насчет таких классических архитектур как MVC, MVP или MVVM? Знаете ли вы, что такое MVP, и почему Angular.js построен на паттерне MVVM, а не MVC, хотя в этом фреймворке активно используется понятие "контроллер"? Чем эти три архитектуры отличаются друг от друга, и зачем, вообще, о них нужно знать фронтендеру?
В своем докладе я хочу рассмотреть эти три понятия как с теоретической (история, концепция, назначение), так и с практической точки зрения. На простых примерах я покажу, как можно организовать ту или иную архитектуру во фронтендовой части веб-приложения, а также рассмотрю некоторые архитектурные паттерны, которые позволяют увеличить читабельность и добавить модульность и переносимость кода.
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)OnticoВ последнее время тема пиринговых технологий становится очень популярной. Уже не первый день работают такие проекты как криптовалюта Bitcoin, микроблоги Twister и мессенджер Tox. Теперь дошло дело и до децентрализованного веба.
Доклад посвящен новому open-source проекту — base.network — распределенному независимому пиринговому вебу. Расскажу про общую схему работы сети, немного о работе с криптографией на JavaScript, о создании приложений на JavaScript без использования центральных серверов.
ECMAScript 6: A Better JavaScript for the Ambient Computing EraAllen Wirfs-BrockWe've entered the Ambient Computing Era and JavaScript is its dominant programing language, But a new computing era needs a new and better JavaScript. It's called ECMAScript 6 and it's about to become the new JavaScript standard. Why do we need it? Why did it take so long? What's in it? When can you use it? Answers will be given.
Александр Русаков - TypeScript 2 in actionMoscowJSВ докладе речь пойдет об основных нововведениях TypeScript 2.0 и 2.1 (literal types, discriminated unions, mapped types...) и их использовании в реальных проектах.
ES2015 / ES6: Basics of modern JavascriptWojciech DzikowskiPresentation I gave at a local MeetIT meetup in Toruń, Poland on 19th February 2016.
Polish slides available on my channel as well
ES6: The Awesome PartsDomenic DenicolaThe next version of JavaScript, ES6, is starting to arrive. Many of its features are simple enhancements to the language we already have: things like arrow functions, class syntax, and destructuring. But other features will change the way we program JavaScript, fundamentally expanding the capabilities of the language and reshaping our future codebases. In this talk we'll focus on two of these, discovering the the myriad possibilities of generators and the many tricks you can pull of with template strings.
ECMAScript 6 — будущее JavaScriptAlexey SimonenkoСпособы применения JavaScript сильно изменились за последнее время. Но сам язык начал меняться только сейчас. Я расскажу вам, что нового нас ожидает в ECMAScript 6. Вот несколько тезисов:
— новые методы базовых объектов,
— управление областью видимости,
— работа с коллекциями,
— мой любимый «…» префикс,
— генераторы,
— классы.
И, конечно, не забуду рассказать, что из этого можно использовать уже сейчас.
Михаил Давыдов - Транспорт, ajaxYandexКлиент-сайд изобилует кучей различных транспортов, и зачастую непонятно, какой взять для решения той или иной задачи. В данной лекции рассказывается об особенности каждого транспорта и области применимости.
Михаил Давыдов - JavaScript. Базовые знанияYandexВ лекции подробно рассмотрены тонкие моменты языка JavaScript, с которыми часто возникают основные проблемы. Наглядные примеры и рецепты помогают лучше понять его особенности.
Об особенностях использования значимых типов в .NETAndrey AkinshinДоклад со встречи барнаульского сообщества .NET разработчиков, состоявшейся 26 февраля в офисе компании Энтерра (www.enterra.ru)
3. Два вида свойств:
Обычные data-свойства
(явная ассоциация имени и значения)
Accessor-свойства (геттеры/сеттеры)
(неявная ассоциация имени с accessor-функциями)
5. Работа со свойствами
Object
// работа с атрибутами
.defineProperty
// сразу несколько свойств
.defineProperties
6. Работа со свойствами
Object
// работа с атрибутами
.defineProperty
// сразу несколько свойств
.defineProperties
// анализ атрибутов (дескриптор)
.getOwnPropertyDescriptor
7. Работа со свойствами
Object
// работа с атрибутами // статика
.defineProperty .preventExtensions / .isExtensible
// сразу несколько свойств // «опечатывание»
.defineProperties .seal / .isSealed
// анализ атрибутов (дескриптор) // «заморозка»
.getOwnPropertyDescriptor .freeze / .isFrozen
// список свойств // наследование; прототипы
.keys .getPrototypeOf
.getOwnPropertyNames .create
8. Дескриптор data-свойства
{
value: 10, // значение
writable: true, // только чтение?
enumerable: false, // перечислимо в for-in?
configurable: true // можно удалить?
}
12. enumerable: false
ES3 ES5
Object.prototype.x = 10; Object.defineProperty(
Object.prototype, “x”, {
var foo = {y: 20};
value: 10
}
);
for (var k in foo) { for (var k in foo) {
console.log(k); // y, x console.log(k); // y
} }
13. Дескриптор accessor-свойства
{
get: function () {...}, // чтение значения
set: function (v) {...}, // установка значения
enumerable: false, // перечислимо в for-in?
configurable: true // можно удалить?
}
16. Список свойств объекта
// только enumerable-свойства
Object.keys(foo); // *“y”, “z”+
// все родные свойства
Object. getOwnPropertyNames(foo); // *“x”, “y”, “z”+
17. Фиксация объектов
Статика: запрещает расширение объекта
var foo = {
Object.isExtensible(Object.preventExtensions(foo)); // false x: 10
foo.bar = 100; // false };
console.log(“bar” in foo); // false
18. Фиксация объектов
Статика: запрещает расширение объекта
var foo = {
Object.isExtensible(Object.preventExtensions(foo)); // false x: 10
foo.bar = 100; // false };
console.log(“bar” in foo); // false
Опечатывание (seal): + устанавливает всем свойствам configurable == false
Object.isSealed(Object.seal(foo)); // true
Object.getOwnPropertyDescriptor(foo, “x”).configurable; // false
19. Фиксация объектов
Статика: запрещает расширение объекта
var foo = {
Object.isExtensible(Object.preventExtensions(foo)); // false x: 10
foo.bar = 100; // false };
console.log(“bar” in foo); // false
Опечатывание (seal): + устанавливает всем свойствам configurable == false
Object.isSealed(Object.seal(foo)); // true
Object.getOwnPropertyDescriptor(foo, “x”).configurable; // false
Заморозка (freeze): + устанавливает всем свойствам writable == false
Object.isFrozen(Object. freeze(foo)); // true
foo.y = 100; // false
console.log(foo.y); // не изменилось, 20
24. Обычные hash-таблицы без
прототипа
var foo = Object.create(null);
alert(foo); // error
Нет метода toString. Объект foo
пустой и ни от кого не наследует.
28. Блочная область видимости
// ES3
var a; // = undefined;
if (false) { Все переменные создаются до
запуска кода – при входе в контекст.
a = 10;
Так называемое «поднятие»
} (hoisting) переменных.
alert(a); // undefined
See: http://dmitrysoshnikov.com/notes/note-4-two-words-about-hoisting/
30. Блочная область видимости
// ES3, ES5
var data = []; data[0](); // ?
data[1](); // ?
for (var k = 0; k < 3; k++) { data[2](); // ?
data[k] = function () {
alert(k);
};
}
31. Блочная область видимости
// ES3, ES5
var data = []; data[0](); // 3
var k; data[1](); // 3
for (k = 0; k < 3; k++) { data[2](); // 3
data[k] = function () {
alert(k);
};
}
32. let : блочная область видимости
ES3, ES5 ES6
for (var k = 0; k < 3; k++) { for (let k = 0; k < 3; k++) {
let x = k;
(function (x) {
data[x] = function () {
data[x] = function () {
alert(x);
alert(x);
};
}; }
})(k);
}
data[0](); // 0 data[0](); // 0
39. Объект arguments
// ES3, ES5
function foo(name, /* rest */) {
var rest = [].slice.call(arguments, 1);
var squares = rest.map(function (x) { return x * x});
return squares;
}
foo(“squares”, 1, 2, 3); // [1, 4, 9]
40. Прощай, arguments
// ES3, ES5
function foo(name, /* rest */) {
var rest = [].slice.call(arguments, 1); // сложно
var squares = rest.map(function (x) { return x * x});
return squares;
}
foo(“squares”, 1, 2, 3); // *1, 4, 9+
41. Привет, ”rest”
// ES6 aka Harmony
function foo(name, …rest) { // настоящий массив
var squares = rest.map(function (x) { return x * x});
return squares;
}
foo(“squares”, 1, 2, 3); // [1, 4, 9]
42. А также ”spread”
// ES6 aka Harmony
function bar(x, y, z) {
return x + y * z;
}
let args = [1, 2, 3];
bar(…args); // 7
bar.apply(null, args); // или так, 7
43. ”spread” в pattern-matching
// ES6 aka Harmony
let args = [“data”, 1, 2, 3];
let [name, ...values] = args;
console.log(name); // “data”
console.log(values); // [1, 2, 3]
45. Сокращения в
деструктуризации
// полная нотация
let {x: x, y: y, z: z} = {x: 10, y: 20, z: 30};
// сокращенная нотация
let {x, y, z} = {x: 10, y: 20, z: 30};
46. Короткий синтаксис функций.
#-функции
// обычные функции
[1, 2, 3].map(function (x) { return x * x; }); // [1, 4, 9]
// #-функции
[1, 2, 3].map(#(x) { x * x }); // [1, 4, 9]
Синтаксически:
• необязательный return;
• # вместо function
47. Семантика #-функций
// обычная функция Динамически
let object = { связываемый this
start: function () {
setTimeout(function () { this.continue(); }, 500);
},
continue: function () { ... }
}; Решения:
var that = this;
object.start(); // error
.bind(this)
48. Семантика #-функций
// #-функции this автоматом связан
let object = { с лексическим контекстом
start: function () {
setTimeout(#{ this.continue(); }, 500);
},
continue: function () { ... }
};
object.start(); // ok
49. Семантика #-функций
// #-функции Динамический this
let object = { в #-функциях
start: # (this) {
setTimeout(#{ this.continue(); }, 500);
},
continue: # (this) { ... }
};
object.start(); // ok
57. Модули в ES3, ES5
var Library = (function (global) {
/* save original */
var originalLibrary = global.Library;
function noConflict() {
global.Library = originalLibrary; 1. Создать локальный скоп
} 2. Функция восстановления
/* implementation */ 3. Имплементация
4. Публичный интерфейс
function query() { ... }
/* exports, public API */
return {
noConflict: noConflict,
query: query
};
})(this);
58. Модули в ES3, ES5
var Library = (function (global) {
/* save original */
var originalLibrary = global.Library;
function noConflict() {
global.Library = originalLibrary; 1. Создать локальный скоп
} 2. Функция восстановления
/* implementation */ 3. Имплементация
4. Публичный интерфейс
function query() { ... }
/* exports, public API */
Слишком много
return { синтаксического «шума».
noConflict: noConflict, Нужен «сахар».
query: query
};
})(this);
59. Модули в ES6
module Library {
export function query(s) { ... }
export function ajax(...args) { ... }
}
import Library.*; // импортировать все
import Library.{query, ajax: xhr}; // импортировать только нужное
query(“#my-element”).hide();
xhr(“/books/store”, {
onSuccess: # (response) { ... }
})
60. Модули в ES6
module Widgets {
var collection= [ ... ]; // приватное свойство
function registerWidget(name, ...params) { ... } // приватное ?
// внутренний приватный модуль
module Register { ... }
В дополнение:
// вложенный публичный модуль
export module Panel { // ошибка, нельзя присвоить export’у
export function create() { ... } Widgets.Panel = false;
} // ошибка, нет такого export’а
// множественный export let bar = Widget.Window
export { register: registerWidget }
}
let panel = Widgets.Panel.create({title: “Options”});
61. Внешние модули в ES6
// на файловой системе
module $ = “./library/selector.js”;
// глобально, из сети; сами определяем имя модуля
module CanvasLib = “http:// ... /js-modules/canvas.js”;
// используем напрямую
let rect = new CanvasLib.Rectangle({width: 30, height: 40, shadow: true});
// или импортируем нужные объекты
import CanvasLib.{Triangle, rotate};
rotate(-30, new Triangle($.query(...params)));
62. Спасибо за внимание
Дмитрий Сошников
dmitry.soshnikov@gmail.com
http://dmitrysoshnikov.com
@DmitrySoshnikov