Introduction to new technologies present in MySQL which enable developing next gen applications. Technologies like JSON and document store, or microservices. Slides in Russian
Introduction to new technologies present in MySQL which enable developing next gen applications. Technologies like JSON and document store, or microservices. Slides in Russian
Двойное освобождение ресурсов. Недостижимый код. Некорректные операции сдвига. Неправильная работа с типами. Опечатки и copy-paste. Проблемы безопасности. Путаница с приоритетом операций.
Guava - open-source библиотека, разработанная в основном инженерами компании Google, в которой есть множество полезных утилит для написания эффективного и красивого кода. В Guava решено множество типичных задач, которые часто возникают при работе с примитивами, строками, коллекциями, параллельными вычислениями, кэшированием данных и многим другим. В докладе поговорим о возможностях, которые предоставляет Guava, рассмотрим примеры использования утилит библиотеки.
Вводная лекция в язык C#, для тех кто знает программирование и в особенности C++. В статье будет уделено внимание наиболее важным отличиям языков, будут обсуждаться вопросы производительности и эффективного кода.
Другие интересные статьи по C# ищите тут: http://itw66.ru/blog/c_sharp/
Написание компактного и эффективного кода в C#: http://itw66.ru/blog/c_sharp/520.html
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
Web-программирование
Лекция #5. Введение в язык программирования Python 3
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Roman Brovko
Синтаксис объявления функций. Упаковка и распаковка аргументов. Ключевые аргументы и аргументы по умолчанию. Распаковка и оператор присваивания. Области видимости, правило LEGB, операторы global и nonlocal. Функциональное программирование, анонимные функции. Функции map, filter и zip. Генераторы списков, множеств и словарей. Немного о PEP 8.
Двойное освобождение ресурсов. Недостижимый код. Некорректные операции сдвига. Неправильная работа с типами. Опечатки и copy-paste. Проблемы безопасности. Путаница с приоритетом операций.
Guava - open-source библиотека, разработанная в основном инженерами компании Google, в которой есть множество полезных утилит для написания эффективного и красивого кода. В Guava решено множество типичных задач, которые часто возникают при работе с примитивами, строками, коллекциями, параллельными вычислениями, кэшированием данных и многим другим. В докладе поговорим о возможностях, которые предоставляет Guava, рассмотрим примеры использования утилит библиотеки.
Вводная лекция в язык C#, для тех кто знает программирование и в особенности C++. В статье будет уделено внимание наиболее важным отличиям языков, будут обсуждаться вопросы производительности и эффективного кода.
Другие интересные статьи по C# ищите тут: http://itw66.ru/blog/c_sharp/
Написание компактного и эффективного кода в C#: http://itw66.ru/blog/c_sharp/520.html
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
Web-программирование
Лекция #5. Введение в язык программирования Python 3
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Roman Brovko
Синтаксис объявления функций. Упаковка и распаковка аргументов. Ключевые аргументы и аргументы по умолчанию. Распаковка и оператор присваивания. Области видимости, правило LEGB, операторы global и nonlocal. Функциональное программирование, анонимные функции. Функции map, filter и zip. Генераторы списков, множеств и словарей. Немного о PEP 8.
Oleg Bunin presented tips for testing JavaFX user interfaces from the JavaFX quality team. He discussed different approaches to UI testing including manual testing, record and replay automation, and coding tests. Coding tests can be more expensive to create initially but have lower maintenance costs. The Jemmy library was presented as a tool for automating UI tests in JavaFX. Following test-driven development principles and designing reusable test primitives and libraries can improve test automation effectiveness.
3. Что такое Perl 6?
Возьмем лучшее из Perl…
Практичность — акцент на решении задачи
Мультипарадигменность — потому что не
существует единственного подхода к решению
всех задач
Лингвистическое влияние — это же язык
программирования
Простые вещи просты, а сложные — возможны
4. Что такое Perl 6?
Построим новый Perl-подобный язык, который…
Более регулярен — меньше особых случаев
Более читаем и более поддерживаем
Более выразителен
Более ОО, более функциональный, более
декларативный, более параллельный…
Простое — просто
Сложное — еще более доступно
5. Одна спецификация, много реализаций
В отличие от Perl 5, для Perl 6 написана спецификация
языка
Нет «официальной» реализации
Как и в Perl 5, у Perl 6 есть набор тестов
Правильная реализация должна проходить набор
тестов
Это некая «исполняемая спецификация»
Сейчас около 40 000 тестов
7. Что такое Rakudo?
Наиболее активно разрабатываемый компилятор Perl 6
Реализует значительную часть спецификации Perl 6
(хотя еще есть, над чем работать)
Сегодня проходится более 30 000 тестов из набора
тестов Perl 6 (правда набор тестов растет )
Сейчас основан на виртуальной машине Parrot
В этом году мы планируем как минимум еще одну
платформу
8. Как работает Rakudo
Написан на…
NQP (минимальное подмножество Perl 6)
Ядро компилятора (грамматика и построение AST), некоторые
мета-модели, поиск и загрузка модулей)
Perl 6
Большинство встроенных функций и операторов
Parrot Intermediate Language
Некоторые низкоуровневые фукнции и «клей» (glue)
C
Диспетчеры, работа с сигнатурами, кастомизация VM и «клей»
9. Как работает Rakudo: парсинг
Сначала Rakudo разбирает программу
Парсер написан на регексах Perl 6
token statement_control:sym<if> {
<sym> :s
<xblock>
[ 'elsif's <xblock> ]*
[ 'else's <else=.pblock> ]?
}
Может находить новые операторы во время разбора
Должен сразу выполнять блоки BEGIN
10. Как работает Rakudo: построение AST
Когда заканчивается разбор чего-либо (например,
инструкции if), запускается action-метод
Он строит абстрактное синтаксическое дерево (Abstract
Syntax Tree, AST)
Это представление программы в абстрактом —
не зависимом от синтаксиса языка — виде
Большинство action-методов строят сложное AST
из маленьких фрагментов, которые уже разобраны
12. Как работает Rakudo: построение AST
if $x == 42 { say "The answer!"; }
PAST::Var.new(
:name('$x'),
:scope('lexical')
)
13. Как работает Rakudo: построение AST
if $x == 42 { say "The answer!"; }
PAST::Var.new( PAST::Val.new(
:name('$x'), :value(42)
:scope('lexical') )
)
14. Как работает Rakudo: построение AST
if $x == 42 { say "The answer!"; }
PAST::Op.new(
:pasttype('call'),
:name('&infix:<==>'),
…
)
PAST::Var.new( PAST::Val.new(
:name('$x'), :value(42)
:scope('lexical') )
)
15. Как работает Rakudo: построение AST
if $x == 42 { say "The answer!"; }
PAST::Op.new(
:pasttype('call'),
:name('&infix:<==>'),
…
)
PAST::Var.new( PAST::Val.new(
:name('$x'), :value(42)
:scope('lexical') )
) PAST::Val.new(
:value('The Answer!')
)
16. Как работает Rakudo: построение AST
if $x == 42 { say "The answer!"; }
PAST::Op.new(
:pasttype('call'),
:name('&infix:<==>'),
… PAST::Op.new(
) :pasttype('call'),
:name('&say'),
…
)
PAST::Var.new( PAST::Val.new(
:name('$x'), :value(42)
:scope('lexical') )
) PAST::Val.new(
:value('The Answer!')
)
17. Как работает Rakudo: построение AST
if $x == 42 { say "The answer!"; }
PAST::Op.new( PAST::Block.new( … )
:pasttype('call'),
:name('&infix:<==>'),
… PAST::Op.new(
) :pasttype('call'),
:name('&say'),
…
)
PAST::Var.new( PAST::Val.new(
:name('$x'), :value(42)
:scope('lexical') )
) PAST::Val.new(
:value('The Answer!')
)
18. Как работает Rakudo: построение AST
if $x == 42 { say "The answer!"; }
PAST::Op.new( :pasttype('if'), … )
PAST::Op.new( PAST::Block.new( … )
:pasttype('call'),
:name('&infix:<==>'),
… PAST::Op.new(
) :pasttype('call'),
:name('&say'),
…
)
PAST::Var.new( PAST::Val.new(
:name('$x'), :value(42)
:scope('lexical') )
) PAST::Val.new(
:value('The Answer!')
)
19. Как работает Rakudo: построение AST
if $x == 42 { say "The answer!"; }
PAST::Op.new( :pasttype('if'), … )
PAST::Op.new( PAST::Block.new( … )
:pasttype('call'),
:name('&infix:<==>'),
… PAST::Op.new(
) :pasttype('call'),
:name('&say'),
…
)
PAST::Var.new( PAST::Val.new(
:name('$x'), :value(42)
:scope('lexical') )
) PAST::Val.new(
:value('The Answer!')
)
20. Как работает Rakudo: генерация кода
Берем дерево AST и генерируем внутренний код под
целевую платформу
Сегодня на этом этапе мы делаем код только для
виртуальной машины Parrot
Акхитектура такова, что в будущем мы сможем
добавить другие бекенды
Кроме того, в этом месте последовательности
компиляции возможно выполнять фазы оптимизации и
анализа программы
22. Примеры
Рассмотрим набор небольших, посведневных
программистских задач и для каждой покажем…
код на Perl 6, решающий задачу
вывод после запуска
Надеюсь, это хорошее начало для того, чтобы понять
новый синтаксис и новые возможности
Покажу крутые фичи Perl 6
Все показанные сегодня примеры работают в Rakudo
24. Задача
Прочитать строку с консоли
Решение
print "Enter your name: ";
my $name = $*IN.get;
say "Hi $name!";
Вывод
Enter your name: Jonathan
Hi Jonathan!
25. Задача
Проверить, находится ли значение в данном диапазоне
Решение 1
loop {
print "Enter a number from 1 to 10: ";
my $num = $*IN.get;
unless 1 <= $num <= 10 { say "Fail!" }
}
Вывод
Enter a number between 1 and 10: 3
Enter a number between 1 and 10: 42
Fail!
26. Задача
Проверить, находится ли значение в данном диапазоне
Решение 2
loop {
print "Enter a number from 1 to 10: ";
my $num = $*IN.get;
unless $num ~~ 1..10 { say "Fail!" }
}
Вывод
Enter a number between 1 and 10: 3
Enter a number between 1 and 10: 42
Fail!
28. Задача
Проверить, отсортирован ли список
Решение
my @a = 1, 1, 2, 3, 5, 8;
my @b = 9, 4, 1, 16, 36, 25;
if [<=] @a { say '@a is sorted' }
if [<=] @b { say '@b is sorted' }
Вывод
@a is sorted
29. Задача
Пройтись по списку
Решение
my @cities = <Moscow Kazan Vladivostok>;
for @cities -> $city {
say "I've been to $city";
}
Вывод
I've been to Moscow
I've been to Kazan
I've been to Vladivostok
30. Задача
Пройтись по ключам и значениям хеша
Решение
my %distances = Bratislava => 1084, Stockholm => 442;
for %distances.kv -> $city, $distance {
say "$city is $distance km away";
}
Вывод
Bratislava is 1084 km away
Stockholm is 442 km away
31. Задача
Проверить, есть ли в списке результатов экзаменов хотя бы
один, превышающий порог
Решение
my @a = 75, 47, 90, 22, 80;
my @b = 61, 77, 94, 82, 60;
my @c = 45, 59, 33, 11, 19;
if any(@a) >= 60 { say "Some passes in A" }
if any(@b) >= 60 { say "Some passes in B" }
if any(@c) >= 60 { say "Some passes in C" }
Вывод
Some passes in A
Some passes in B
32. Задача
Проверить, все ли результаты экзаменов в списке
превышают порог
Решение
my @a = 75, 47, 90, 22, 80;
my @b = 61, 77, 94, 82, 60;
my @c = 45, 59, 33, 11, 19;
if all(@a) >= 60 { say "All passes in A" }
if all(@b) >= 60 { say "All passes in B" }
if all(@c) >= 60 { say "All passes in C" }
Вывод
All passes in B
33. Задача
Проверить, что ни один из результатов экзаменов в списке
не превышает порог
Решение
my @a = 75, 47, 90, 22, 80;
my @b = 61, 77, 94, 82, 60;
my @c = 45, 59, 33, 11, 19;
if none(@a) >= 60 { say "No passes in A" }
if none(@b) >= 60 { say "No passes in B" }
if none(@c) >= 60 { say "No passes in C" }
Вывод
No passes in C
34. Задача
Выбрать из списка случайный элемент
Решение
my @drinks = <wine beer vodka>;
say "Tonight I'll drink { @drinks.pick }";
Вывод (результат дожен меняться ;-))
Tonight I'll drink vodka
35. Задача
Перемешать список в случайном порядке
Решение
my @competitors = <Tina Lena Owen Peter>;
my @order = @competitors.pick(*);
for @order { .say }
Вывод (результат дожен меняться ;-))
Peter
Lena
Owen
Tina
36. Задача
Написать и вызвать подпрограмму с параметрами
Решение
sub greet($greeting, $name) {
say "$greeting, $name!";
}
greet("hello", "masak");
Вывод
hello, masak
37. Задача
Написать подпрограмму, принимающую только число
Решение
sub double(Num $n) { 2 * $n }
say double(21);
say double("oh no I'm not a number");
Вывод
42
Parameter type check failed; expected Num, but got Str
for $n in call to double
38. Задача
Вызвать нужную мульти-функцию в зависимости от типа
аргумента
Решение
multi double(Num $n) { 2 * $n }
multi double(Str $s) { $s x 2 }
say double(21);
say double("boo");
Вывод
42
booboo
41. Задача
Добавить новый оператор факториала (чтобы работало 10!)
Решение
sub postfix:<!>($n) { [*] 1..$n }
say 1!;
say 10!;
Вывод
1
3628800
42. Задача
Объявить класс с атрибутами и методами
Решение
class Product {
has $.name; # Атрибут + аксессор
has $!price; # Только атрибут
has $.discount is rw; # Атрибут + lvalue-аксессор
method get_price {
return $!price - $!discount;
}
}
43. Задача
Создать экземпляр класса и вызвать на нем метод
Решение
my $prod = Product.new(
name => "Beer",
price => 500,
discount => 60
);
say $prod.get_price;
Вывод
440
44. Задача
Прочитать/записать атрибут через аксессор
Решение
say $prod.name;
$prod.discount = 40;
say $prod.get_price;
$prod.name = 'Wine';
Вывод
Beer
460
Cannot assign to readonly variable.
45. Задача
Вызвать метод на каждом объекте из списка
Решение
my @products = Product.new(name => 'Beer', price => 500),
Product.new(name => 'Wine', price => 450),
Product.new(name => 'Vodka', price => 1600);
my @uc_names = @products>>.name>>.uc;
for @uc_names { .say }
Вывод
BEER
WINE
VODKA
46. Задача
Сделать интроспекцию, чтобы узнать методы класса
Решение
my @meths = Product.^methods(:local);
for @meths>>.name { .say }
Вывод
get_price
discount
name
47. Задача
Отсортировать список объектов с учетом вызова метода
Решение (пример 1)
my @products = Product.new(name => 'Beer', price => 500),
Product.new(name => 'Wine', price => 450),
Product.new(name => 'Vodka', price => 1600);
my @sorted = @products.sort(*.name);
for @sorted { .name.say }
Вывод (пример 1)
Beer
Vodka
Wine
48. Задача
Отсортировать список объектов с учетом вызова метода
Решение (пример 2)
my @products = Product.new(name => 'Beer', price => 500),
Product.new(name => 'Wine', price => 450),
Product.new(name => 'Vodka', price => 1600);
my @sorted = @products.sort(*.get_price);
for @sorted { .name.say }
Вывод (пример 2)
Wine
Beer
Vodka
49. Задача
Найти минимальное и максимальное значения в списке
Решение (пример 1)
my @temperatures = -3, 5, 7, 2, -1, -4, 0;
say "Minimum was " ~ @temperatures.min;
say "Maximum was " ~ @temperatures.max;
Вывод (решение 1)
Minimum was –4
Maximum was 7
50. Задача
Найти минимальное и максимальное значения в списке
Решение (пример 2)
my @products = Product.new(name => 'Beer', price => 500),
Product.new(name => 'Wine', price => 450),
Product.new(name => 'Vodka', price => 1600);
say "Cheapest: " ~ @products.min(*.get_price).name;
say "Costliest: " ~ @products.max(*.get_price).name;
Вывод (пример 2)
Cheapest: Wine
Costliest: Vodka
51. Задача
Реализовать игру «Камень, ножницы, бумага»
Решение (часть 1)
class Paper { }
class Scissor { }
class Stone { }
multi win(Paper, Stone) { "Выиграл" }
multi win(Scissor, Paper) { "Выиграл" }
multi win(Stone, Scissor) { "Выиграл" }
multi win(::T, T) { "Ничья" }
multi win(Any, Any) { "Проиграл" }
52. Задача
Реализовать игру «Камень, ножницы, бумага»
Решение (часть 2)
say win(Paper, Paper);
say win(Scissor, Stone);
say win(Stone, Scissor);
Вывод
Ничья
Проиграл
Выиграл
54. Что такое Rakudo *?
Заметный прогресс Rakudo
Постоянно реализуются новые части спецификации
Постоянно растет число пройденных тестов
Исправляется много багов
Растет число активных разработчиков
До сих пор мы фокусировались на процессе создания
Rakudo
Rakudo * — релиз, где мы фокусируемся на том, что
нужно первопроходцам
55. Что войдет в релиз?
Мы делаем релиз компилятора каждый месяц;
а Rakudo *, напротив, — дистрибутив, включающий:
Компилятор Rakudo, конечно же
Инструмент для загрузки, установки и обновления
модулей
Набор модулей Perl 6 для решения типовых задач
(например, HTTP-клиент и сервер, соединение с
базой данных, что-нибудь для веба, YAML…)
56. Что войдет в релиз?
Мы намереваемся включить пару других проектов…
Zavolaj! — модуль, позволяющих писать на Perl 6
обертки для библиотек C; на нем мы сделали
клиент MySQL
Blizkost — промежуточный слой Perl 5 Parrot,
котоырй позволит из Perl 6 использовать модули
Perl 5
57. Что Rakudo * будет делать хорошо
Rakudo хорошо покрывает большую часть
спецификации Perl 6…
Широкий выбор встроенных операторов, типов и функций
Подпрограммы, сигнатуры и множественная
диспетчеризация
ООП, включая классы, роли, интроспекцию и многое
другое
Perl 6 регексы и грамматики (именно ими мы делаем
разбор Perl 6!)
58. Слабые места
Rakudo * сможет многое предложить и окажется
полезным для многих задач
Однако, это не полный Perl 6, и, конечно, с
недостатками, например:
Отсутствие поддержки тредов
Отсутсвие поддержки нативных типов
Довольно медленный — еще не все оптимизировано,
и отсутствует оптимизатор
63. Как узнать больше?
Загрузите Rakudo Perl 6 с сайта
http://www.rakudo.org/
Много ссылок на ресурсы про Perl 6 собрано на сайте
http://www.perl6.org/
Присоединяйтесь к дружелюбному IRC-каналу
#perl6 on irc.freenode.org
Пишите модули, создавайте приложения,
включайтесь в развите сообщества Perl 6 и делайте
свой вклад в него