Пластилиновый код: как перестать кодить и начать житьMoscow.pm
Елена Шишкина, ведущий программист Деньги Mail.Ru. Она покажет практический пример лени как двигателя прогресса в отдельно взятом веб-проекте:
- Надоело писать код? Будем думать, как его не писать!
- Боремся с однотипным кодом. Боремся с неоднотипным кодом.
- Код, которого не существует, и код, который существует.
- Следите за руками: программируем на конфигах!
- Как жить дальше?
Пластилиновый код: как перестать кодить и начать житьMoscow.pm
Елена Шишкина, ведущий программист Деньги Mail.Ru. Она покажет практический пример лени как двигателя прогресса в отдельно взятом веб-проекте:
- Надоело писать код? Будем думать, как его не писать!
- Боремся с однотипным кодом. Боремся с неоднотипным кодом.
- Код, которого не существует, и код, который существует.
- Следите за руками: программируем на конфигах!
- Как жить дальше?
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Moscow.pm
Видео: http://video.mail.ru/corp/p.scherbinin/6/11.html
— Знай свою среду. Почему нужно изучать язык, на котором пишешь.
— Магии нет. Есть непонимание процессов.
— Не верь предрассудкам. Они сложились при других обстоятельствах.
— Доверяй, но проверяй. Прежде, чем использовать решение, проверь.
— Не используй не изучив. Не используй не понимая.
— Код можно менять. Как делать это с умом.
— Можно ли доверять синтетике? Синтетические тесты и реальная нагрузка.
— Немного примеров. Плохих и хороших.
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Moscow.pm
Видео: http://video.mail.ru/corp/p.scherbinin/6/7.html
Tаблица символов — это только небольшой шаг в мир внутреннего устройства Perl, но и он открывает программисту огромные возможности:
— Runtime-кодогенерация.
— Генерация по запросу.
— Изменение кода сторонних модулей на лету и многое другое.
Доклад о разработке (а главное - оптимизации) программы на Perl под Raspberry PI.
Наглядно показывает, что в Perl есть немало возможностей, а также инструментов, которые позволяют делать программы быстрее и эффективнее - используя как преимущества самого языка, так и оптимизацию алгоритма программы.
Anton Shabouta "Implementing async binary clients in pure PHP" Fwdays
- Have you ever think how PDO work under the hood?
- What if tomorrow you need to write own DB driver from scratch?
- How to approach such tasks and get around the pitfalls?
- Is it possible to achieve in pure PHP performance comparable to the C extension?
In this talk I will try to answer these and other questions related to the development of clients for various binary protocols. We also analyze the nuances of the asynchronous driver implementation and dive into the world of low-level and not-so-optimizations.
My talk is about DSLs, their kinds and when it’s worth to be using them. I’ll also demonstrate different approaches to developing internal and external DSLs in Python and will try to give the comparative analysis of those.
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Moscow.pm
Видео: http://video.mail.ru/corp/p.scherbinin/6/11.html
— Знай свою среду. Почему нужно изучать язык, на котором пишешь.
— Магии нет. Есть непонимание процессов.
— Не верь предрассудкам. Они сложились при других обстоятельствах.
— Доверяй, но проверяй. Прежде, чем использовать решение, проверь.
— Не используй не изучив. Не используй не понимая.
— Код можно менять. Как делать это с умом.
— Можно ли доверять синтетике? Синтетические тесты и реальная нагрузка.
— Немного примеров. Плохих и хороших.
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Moscow.pm
Видео: http://video.mail.ru/corp/p.scherbinin/6/7.html
Tаблица символов — это только небольшой шаг в мир внутреннего устройства Perl, но и он открывает программисту огромные возможности:
— Runtime-кодогенерация.
— Генерация по запросу.
— Изменение кода сторонних модулей на лету и многое другое.
Доклад о разработке (а главное - оптимизации) программы на Perl под Raspberry PI.
Наглядно показывает, что в Perl есть немало возможностей, а также инструментов, которые позволяют делать программы быстрее и эффективнее - используя как преимущества самого языка, так и оптимизацию алгоритма программы.
Anton Shabouta "Implementing async binary clients in pure PHP" Fwdays
- Have you ever think how PDO work under the hood?
- What if tomorrow you need to write own DB driver from scratch?
- How to approach such tasks and get around the pitfalls?
- Is it possible to achieve in pure PHP performance comparable to the C extension?
In this talk I will try to answer these and other questions related to the development of clients for various binary protocols. We also analyze the nuances of the asynchronous driver implementation and dive into the world of low-level and not-so-optimizations.
My talk is about DSLs, their kinds and when it’s worth to be using them. I’ll also demonstrate different approaches to developing internal and external DSLs in Python and will try to give the comparative analysis of those.
10 Best Books Finance and Capital MarketsJohn Cousins
These books discuss most recent events and recede back to episodes in the past. They help us gain an understanding of how we got to now, what we have learned from past debacles, and how history repeats itself.
То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...Anatoly Sharifulin
Доклад с Codefest, Новосибирск, 27 марта 2016 года
Поделюсь опытом прохождения акселерации во ФРИИ и Startup Sauna (Хельсинки, Финляндия) на примере стартапа, которым сейчас занимаюсь.
- Зачем проходить акселерацию стартапу?
- Есть ли в ней смысл?
- Если есть, то зачем вторая-третья-... акселерации?
- Разница подхода к стартапам в России и Финляндии, сравнение "без купюр"
Примеры решения типичных задач за рамками ядра Yii2Paul Klimov
Рассмотрим сравнительно сложные, и в то же время, часто возникающие, задачи, для которых ядро Yii не дает готового решения. Посмотрим как из отдельных моделей ActiveRecord собирать единые сущности, и как разбивать большие модели на составляющие. Разберем как правильно сохранять файлы и как сэкономить на обработчиках событий и поведениях
- Интернационализация сущностей в базе данных;
- Обработка “ролей” в реляционных базах данных;
- Работа с файлами;
- Вложенные модели;
- Trait вместо Behavior.
Доклад с WordCamp Moscow 2017 посвящен распространенным ошибкам у разработчиков плагинов и тем в WordPress. Советы и рекомендации, как можно сделать свой продукт лучше и удобнее для пользователей и разработчиков.
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...DevPoint Kyiv
– Основные критерии оценки качества кода;
– Хардкод или Ad-hoc решение? Когда хардкод оправдан;
– Инструменты для профилактики хардкодных заболеваний;
– Бизнес VS качество кода;
-------------------------------------------------------------------------------------------------------
Сайт: http://devpoint.com.ua
FB: http://bit.ly/25Aytad
SlideShare :http://bit.ly/1SGi8d0
This presentation is about PHP7, its innovations’ overview with practical examples. You will learn how to move to PHP7 and see performance сomparison between PHP 5.6 and PHP7.
This presentation by Dmytro Nazarenko (Senior PHP Developer / Tech Lead) was delivered at GlobalLogic Kharkiv PHP Meetup #1 on September 14, 2016.
Миша Рудрастых: Введение в HTTP API WordPressRuslan Begaliev
Всё чаще и чаще в реальной жизни нам приходится взаимодействовать со сторонними сервисами через API — от получения количества лайков до подключения к платёжным шлюзам, а значит мы не можем игнорировать встроенный в WordPress механизм, предназначенный специально для этого.
Ещё один способ привлекать и удерживать пользователей в играхAnatoly Sharifulin
Речь пройдёт про пользовательский фидбек, а именно — про влияние рейтингов и отзывов на Customer Support, User Acquisition и Game Development. Выступление Анатолия Шарифулина, CEO & Co-founder в AppFollow, на White Nights 2019.
Аналитика мобильных приложений: как настроить аналитику в приложении, какие инструменты выбрать (Flurry, Google Analytics, Fabric Answers, AppsFlyer), на что обращать внимание
http://light.mdday.ru
Доклад с Online MDDay 2014. http://online2014.mdday.ru
Расскажу о том, что делать, когда вам «кажется», что приложение готово и его пора начать рекламировать.
Обычно это обманчивое чувство :-) Как устроены сторы (App Store и Google Play), какие существуют типы трафика, как устроен топ и что можно или даже нужно сделать для продвижения самостоятельно. Зачем и почему стОит сделать ASO и «разобраться» с конкурентами. Когда всё-таки можно начинать платное продвижение и какие каналы выбрать.
15. Лучше сообщения
об ошибках
$str = “Привет, $name. Последний
визит был $last. Сейчас $time.”;
perldiag
16. Лучше сообщения
об ошибках
$str = “Привет, $name. Последний
визит был $last. Сейчас $time.”;
Use of uninitialized value in
concatenation (.) or string at hello.plx line 9.
perldiag
17. Лучше сообщения
об ошибках
$str = “Привет, $name. Последний
визит был $last. Сейчас $time.”;
Use of uninitialized value $time in
concatenation (.) or string at hello.plx line 9.
perldiag
43. Рекурсия!
sub fact {
my ($x) = @_; # must be +int
return $x if $x == 1;
return $x * fact($x - 1);
}
44. Рекурсия!
sub fact {
my ($x) = @_; # must be +int
return $x if $x == 1;
return $x * fact($x - 1);
}
45. Рекурсия!
my $fact = sub {
my ($x) = @_; # must be +int
return $x if $x == 1;
return $x * $fact->($x - 1);
};
46. Рекурсия!
my $fact = sub {
my ($x) = @_; # must be +int
return $x if $x == 1;
return $x * $fact->($x - 1);
};
47. Рекурсия!
my $fact; $fact = sub {
my ($x) = @_; # must be +int
return $x if $x == 1;
return $x * $fact->($x - 1);
};
48. Рекурсия!
my $fact; $fact = sub {
my ($x) = @_; # must be +int
return $x if $x == 1;
return $x * $fact->($x - 1);
};
49. Рекурсия!
use Scalar::Util qw(weaken);
my $fact = do {
my $f1; my $f2 = $f1 = sub {
my ($x) = @_;
return $x if $x == 1;
return $x * $f1->($x - 1);
};
weaken($f1);
$f1;
};
50. Рекурсия!
use 5.16.0; # current sub
my $fact = sub {
my ($x) = @_; # must be +int
return $x if $x == 1;
return $x * __SUB__->($x - 1);
};
53. autodie
open my $fh, ‘<‘, $filename
or die “couldn’t open $filename: $!”;
while (<$fh>) {
...
}
close $fh
or die “couldn’t close $filename: $!”;
autodie
55. autodie
use autodie;
open my $fh, ‘<‘, $filename;
while (<$fh>) {
no autodie;
rmdir or warn “couldn’t remove $_: $!”;
}
close $fh;
autodie
56. autodie
use autodie;
sub foo {
my $filename = shift;
open my $fh, ‘<‘, $filename;
while (<$fh>) {
...
}
} # неявный вызов close БЕЗ autodie
autodie
57. IO::File
sub stream_to_fh {
my ($self, $fh) = @_;
fileno $fh
or die “can’t stream to closed fh”;
while (my $hunk = $self->next_hunk) {
print {$fh} $hunk;
}
close $fh or die “error closing: $!”;
}
perlopentut
58. IO::File
sub stream_to_fh {
my ($self, $fh) = @_;
$fh->fileno
or die “can’t stream to closed fh”;
while (my $hunk = $self->next_hunk) {
$fh->print($hunk);
}
$fh->close or die “error closing: $!”;
}
perlopentut
59. IO::File
sub stream_to_fh {
...
$fh->print($hunk);
...
$fh->close or die “error closing: $!”;
}
open my $target, ‘>’, ‘/dev/null’
or die “can’t open bit bucket:$!”;
stream_to_fh($target);
perlopentut
60. IO::File
use IO::File;
sub stream_to_fh {
...
$fh->print($hunk);
...
$fh->close or die “error closing: $!”;
}
open my $target, ‘>’, ‘/dev/null’
or die “can’t open bit bucket:$!”;
stream_to_fh($target);
perlopentut
61. IO::File
use 5.14.0;
sub stream_to_fh {
...
$fh->print($hunk);
...
$fh->close or die “error closing: $!”;
}
open my $target, ‘>’, ‘/dev/null’
or die “can’t open bit bucket:$!”;
stream_to_fh($target);
perlopentut
62. IO::File
use 5.14.0; use autodie;
sub stream_to_fh {
...
$fh->print($hunk);
...
$fh->close or die “error closing: $!”;
}
open my $target, ‘>’, ‘/dev/null’
or die “can’t open bit bucket:$!”;
stream_to_fh($target);
perlopentut
72. «Умное» сравнение
• если $x и $y неизвестны, то существует
23 возможные вариации
• и некоторые из них — рекурсивные
• нет, вы не будет помнить их все
• ... и они не интуитивные
perldoc
73. «Умное» сравнение
• если $x и $y неизвестны, то существует
23 возможные вариации
• и некоторые из них — рекурсивные
• нет, вы не будет помнить их все
• ... и они не интуитивные
perldoc
74. «Умное» сравнение
• если $x и $y неизвестны, то существует
23 возможные вариации
• и некоторые из них — рекурсивные
• нет, вы не будет помнить их все
• ... и они не интуитивные
perldoc
75. «Умное» сравнение
• если $x и $y неизвестны, то существует
23 возможные вариации
• и некоторые из них — рекурсивные
• нет, вы не будет помнить их все
• ... и они не интуитивные
perldoc
103. $@
• Ну, на самом деле, вы используете
Try::Tiny, верно?
• И это тоже делает Try::Tiny более
надёжным!
• Вы видите, что eval и $@ — полностью
ужасны
Try::Tiny
104. $@
• Ну, на самом деле, вы используете
Try::Tiny, верно?
• И это тоже делает Try::Tiny более
надёжным!
• Вы видите, что eval и $@ — полностью
ужасны
Try::Tiny
105. $@
• Ну, на самом деле, вы используете
Try::Tiny, верно?
• И это тоже делает Try::Tiny более
надёжным!
• Вы видите, что eval и $@ — полностью
ужасны
Try::Tiny
106. use 5.12.0;
{
package X;
sub DESTROY {
eval { }
}
}
eval {
my $x = bless {} => ‘X’;
die “DEATH!!”;
};
warn “ERROR: $@”;
$ perl5.12.4 test.pl
ERROR:
perlfunc
107. use 5.12.0;
{
package X;
sub DESTROY {
eval { }
}
}
eval {
my $x = bless {} => ‘X’;
die “DEATH!!”;
};
warn “ERROR: $@”;
$ perl5.12.4 test.pl
ERROR:
perlfunc
108. use 5.14.0;
{
package X;
sub DESTROY {
eval { }
}
}
eval {
my $x = bless {} => ‘X’;
die “DEATH!!”;
};
warn “ERROR: $@”;
$ perl5.12.4 test.pl
ERROR:
perlfunc
109. use 5.14.0;
{
package X;
sub DESTROY {
eval { }
}
}
eval {
my $x = bless {} => ‘X’;
die “DEATH!!”;
};
warn “ERROR: $@”;
$ perl5.14.1 test.pl
ERROR: DEATH!!
perlfunc
124. «Unicode-баг»
• строка не всегда рассматриваются
как Unicode
• это вызывает странные ошибки, для
поиска которых требуется время
• use feature ‘unicode_strings’;
•
perlunicode
125. «Unicode-баг»
• строка не всегда рассматриваются
как Unicode
• это вызывает странные ошибки, для
поиска которых требуется время
• use feature ‘unicode_strings’;
•
perlunicode
126. «Unicode-баг»
• строка не всегда рассматриваются
как Unicode
• это вызывает странные ошибки, для
поиска которых требуется время
• use feature ‘unicode_strings’;
• или use 5.12.0
perlunicode
127. «Unicode-баг»
• строка не всегда рассматриваются
как Unicode
• это вызывает странные ошибки, для
поиска которых требуется время
• use feature ‘unicode_strings’;
• или use 5.12.0
perlunicode
128. Unicode eval
• eval $str
• это октеты или символы?
• что будет, если это включает в себя
«use utf8»
• или вы работаете под «use utf8»
perldoc
190. Новые модификаторы
# Только ASCII-символы:
die “Забавные неамериканские символы”
if $str =~ /P{ASCII}/;
$str =~ /...регулярное выражение.../;
perlre
192. study
my $re = qr{...выражение...};
my $str = q{...long complex...};
$str =~ $re; # slow!!
study $str; # does stuff
$str =~ $re; # fast!!
perldoc
193. study
my $re = qr{...выражение...};
my $str = q{...длинная строка...};
$str =~ $re; # slow!!
study $str; # does stuff
$str =~ $re; # fast!!
perldoc
194. study
my $re = qr{...выражение...};
my $str = q{...длинная строка...};
$str =~ $re; # медленно!!
study $str; # does stuff
$str =~ $re; # fast!!
perldoc
195. study
my $re = qr{...выражение...};
my $str = q{...длинная строка...};
$str =~ $re; # медленно!!
study $str; # используем
$str =~ $re; # fast!!
perldoc
196. study
my $re = qr{...выражение...};
my $str = q{...длинная строка...};
$str =~ $re; # медленно!!
study $str; # используем
$str =~ $re; # быстро!!
perldoc
197. study
my $re = qr{...выражение...};
my $str = q{...длинная строка...};
$str =~ $re; # медленно, но верно!!
study $str; # используем
$str =~ $re; # кто знает!!
perldoc
198. study
my $re = qr{...выражение...};
my $str = q{...длинная строка...};
$str =~ $re; # медленно, но верно!!
study $str; # используем
$str =~ $re; # медленно, но верно!!
perldoc
206. $[ — индекс первого
элемента в массиве
• можно сделать так, чтобы $array[1]
возвращал первый элемент массива
• разве это не круто?
• это так же круто, как и шрифт Comic Sans
perlvar
207. $[ — индекс первого
элемента в массиве
• можно сделать так, чтобы $array[1]
возвращал первый элемент массива
• разве это не круто?
• это так же круто, как и шрифт Comic Sans
perlvar
208. $[ — индекс первого
элемента в массиве
• можно сделать так, чтобы $array[1]
возвращал первый элемент массива
• разве это не круто?
• это так же круто, как и шрифт Comic Sans
perlvar
209. $[ — индекс первого
элемента в массиве
• можно сделать так, чтобы $array[1]
возвращал первый элемент массива
• разве это не круто?
• это так же круто, как и шрифт Comic Sans
perlvar