Template Toolkit – зло?!


     Анатолий Шарифулин
Специально
для РИТ++ 2010
     вышел
   Perl 5.12!
Каждый год
на «May Perl»
Я рассказываю
  про «зло» :)
CGI
  «CGI.pm – зло?!», May Perl 2008
LWP
«Модули Net::*, использующие LWP::UserAgnet – зло?!», May Perl 2009
POE
 Такого блица не было, но это так :)
PHP
ой :)
TT
 «Template Toolkit – зло?!», May Perl 2010
– зло?!
– зло?!
Есть два типа
  шаблонизаторов:
простые и удобные :)
Есть два типа
шаблонизаторов:
   простые
Есть два типа
  шаблонизаторов:
простые и удобные :)
Удобные: позволяют
 писать быстро, но
 заставляют писать
   не оптимально
И из-за этого сложно
тестировать логику –
   всё в шаблонах
Да-да, но...
Template Toolkit
• Cамый популярный шаблонизатор для Perl
• Простой, гибкий и многофункциональный
• Большое количество пла...
Template Toolkit
• Cамый популярный шаблонизатор для Perl
• Простой, гибкий и многофункциональный
• Большое количество пла...
Template Toolkit
• Cамый популярный шаблонизатор для Perl
• Простой, гибкий и многофункциональный
• Большое количество пла...
Template Toolkit
• Cамый популярный шаблонизатор для Perl
• Простой, гибкий и многофункциональный
• Большое количество пла...
Template Toolkit
• Cамый популярный шаблонизатор для Perl
• Простой, гибкий и многофункциональный
• Большое количество пла...
Template Toolkit
• Cамый популярный шаблонизатор для Perl
• Простой, гибкий и многофункциональный
• Большое количество пла...
[% PROCESS '_design/header.tt' %]

<ul>
[% FOREACH item = list %]

 <li>[% item.title %]</li>
[% END %]
</ul>

[% PROCESS ...
Недостатки TT
• Очень медленный (на сайте написано «The TT is a fast» :)
Недостатки TT
• Очень медленный (на сайте написано «The TT is a fast» :)
• Тормозят фильтры
Недостатки TT
• Очень медленный (на сайте написано «The TT is a fast» :)
• Тормозят фильтры
• Макро-язык TT– зло, еще и ка...
Недостатки TT
• Очень медленный (на сайте написано «The TT is a fast» :)
• Тормозят фильтры
• Макро-язык TT– зло, еще и ка...
Недостатки TT
• Очень медленный (на сайте написано «The TT is a fast» :)
• Тормозят фильтры
• Макро-язык TT– зло, еще и ка...
Недостатки TT
• Очень медленный (на сайте написано «The TT is a fast» :)
• Тормозят фильтры
• Макро-язык TT– зло, еще и ка...
Недостатки TT
• Нет разницы между строкой и массивом, проверять .size >0
Недостатки TT
• Нет разницы между строкой и массивом, проверять .size >0
• Нет возможности создавать анонимные структуры, ...
Недостатки TT
• Нет разницы между строкой и массивом, проверять .size >0
• Нет возможности создавать анонимные структуры, ...
Недостатки TT
• Нет разницы между строкой и массивом, проверять .size >0
• Нет возможности создавать анонимные структуры, ...
Недостатки TT
• Нет разницы между строкой и массивом, проверять .size >0
• Нет возможности создавать анонимные структуры, ...
Template::Toolkit::Simple
    A Simple Interface to Template Toolkit
Многие вещи не
делаются, т.к. иногда лень
или долго писать сложный
        синтаксис
Мы привыкли
к удобному и красивому
        Perl :)
Существует ли идеальный
    шаблонизатор?
HTML::ChainParser
       Автор Павел Кудинов
 Чисто ростовский непередаваемый юмор :)
~~>[

 <ul>

 
 ~~>list~@@~[

 
 
 <li>~~>title~</li>

 
 ]~

 </ul>
]~[

 <design>

 
 ~~>

 </design>
]~
Mojo::Template EpRenderer
      Mojolicious. Веб в коробке!
% layout 'design';

<ul>
% for (@$list) {

 <li><%= $_->{title} %></li>
%}
</ul>
Сравнение
Template::Toolkit
     Сравнение
[% PROCESS '_design/header.tt' %]

<ul>
[% FOREACH item = list.nsort('id') %]

 <li>[% item.title %]</li>
[% END %]
</ul>
...
[% PROCESS '_design/header.tt' %]

<ul>
[% FOREACH item = list.mnsort('hash.id') %]

 <li>[% item.title %]</li>
[% END %]
...
$Template::Stash::LIST_OPS->{'mnsort'} = sub { ... };
    Нужно дописывать функции для сортировок
                    like...
[% PROCESS '_design/header.tt' %]

<ul>
[% FOREACH item = list %]

 <li>[% item.title %] [% my_round(item.count) %]</li>
[...
[% MACRO my_round(count) PERL %]

 print sprintf "%.0f", $stash->get('count');
[% END %]

<ul>
[% FOREACH item = list %]

...
[% USE Util %]

<ul>
[% FOREACH item = list %]

 <li>[% item.title %] [% Util.my_round(item.count) %]</li>
[% END %]
</ul>
Иногда получается очень
  жесткий код на TT :)
[% FOREACH l=region.locations %]
  [% NEXT IF region.metro.location_id==l.location_id %]
  [% NEXT IF l.room_type == 'pris...
HTML::ChainParser
     Сравнение
~~>[

 <ul>

 
 ~~>list~@sort~<D>(id)~@@~[

 
 
 <li>~~>title~</li>

 
 ]~

 </ul>
]~[

 <design>

 
 ~~>

 </design>
]~
~~>[

 <ul>

 
 ~~>list~@sort~<D>(hash~id)~@@~[

 
 
 <li>~~>title~</li>

 
 ]~

 </ul>
]~[

 <design>

 
 ~~>

 </design>...
~~>[

 <ul>

 
 ~~>list~@@~[

 
 
 <li>~~>title~ ~~>count~&~(PMath~Round)~</li>

 
 ]~

 </ul>
]~[

 <design>

 
 ~~>

 </...
push @ExParser,'Round';

sub MyRound {

 sprintf("%.0f", ${RSPR $_[0]});
};
Иногда получается очень
    жесткий код :)
~~>#~[:/.design/.lang.iphone]~[
~~>&~(Public~Video~Main)~main.new~video~[
~~>%~(

 ~title~
 
 
 ~(content~$~(::~LANG)~titl...
Mojo::Template EpRenderer
         Сравнение
% layout 'design';

<ul>
% for (sort { $a->{id} <=> $b->{id} } @$list) {

 <li><%= $_->{title} %></li>
%}
</ul>
% layout 'design';

<ul>
% for (@$list) {

 <li>
      <%= $_->{title} %>
      <%= sprintf "%.0f", $_->{count} %>
    </l...
Жесткость кода зависит
   от упоротости
   разработчика :)
Мои шаблоны на
  Mojolicious очень
простые и красивые! :)
Template Toolkit
Template Toolkit – зло!
Template Toolkit – зло!?
use Perl
  or die;
JFDI
Спасибо за внимание!
     Анатолий Шарифулин
    http://twitter.com/sharifulin
Upcoming SlideShare
Loading in...5
×

Template Toolkit – зло!?

3,171

Published on

РИТ++ 2010. Блиц-доклад

7 Comments
0 Likes
Statistics
Notes
  • Итак, упростил шабон и накидал более менее схожее (задача - забрать из бд и показать страницу со статьёй, тупой get/print):

    #$self->render(template => 'content/content_page', format => 'html', handler=>'tpl');
    TT: 116 r/s

    #$self->render(template => 'content/content_page', format => 'html', handler=>'ep');
    EP: 122 r/s

    $self->render(text => 'This is it') : 155 r/s
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Хм, я тут покоцал 7к строковый модуль на кусочки и получил speedup для TT в 5,66 раз и в 10,6 для render_text, итого 80 vs 152 req/second. осталось набросать похожий шаблон в Ep и сравнить окончательно.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • lol, bro, начал посматривать узкие места у MjNCMS, угадай разницу

    #В конце контроллера:
    #$self->render(text => 'This is it');
    $self->render('site_index', format => 'html');#TT2

    вообще никакой, десятые доли
    при
    ab -c 4 -n 100 'http://mojotest:82/justpage.html'
    14.27 requests/sec vs 14.36 r/s avg, а по абсолюту так TT переплюнул text прыгнув разок до 14.51 vs 14.48 (по 6 измерений каждый прогнал)

    Так что узкое место скорее контентный модуль 'всё в одном' на 7к срок (в данном случае) и прочие алгоритмайзы, а TT/EPL - какая нафиг разница, что удобнее тем и рулить :).

    Вообще думал набросать что похожее на сложный TT в epl, с инклудами и etc, но эти результаты отбили всякий интес тратить время на весьма неявную выжимку жалких долей скорости.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Any benchmarks?
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Эх Юра Юра! Из сухого текста презентации ты не понял смысл :) Надо было прямой эфир смотреть))
    Приеду в Минск или Киев и специально для тебя расскажу этот доклад.
    На каждый твой довод есть контр-довод: и про капс, и про греп, и про верстальщиков, и про все остальное. Про скорость я вообще молчу.

    Вкратце шаблонизатор либо простой как CTTP2 и он ни на что не претендует, он тупой, быстрый и любим верстаками, либо шаблонизатор удобен для перловики-верстальщика шаблонов и на нем не получаются монстры и нет убогого макро-языка :)
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

No Downloads
Views
Total Views
3,171
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
16
Comments
7
Likes
0
Embeds 0
No embeds

No notes for slide








































































  • Template Toolkit – зло!?

    1. 1. Template Toolkit – зло?! Анатолий Шарифулин
    2. 2. Специально для РИТ++ 2010 вышел Perl 5.12!
    3. 3. Каждый год на «May Perl»
    4. 4. Я рассказываю про «зло» :)
    5. 5. CGI «CGI.pm – зло?!», May Perl 2008
    6. 6. LWP «Модули Net::*, использующие LWP::UserAgnet – зло?!», May Perl 2009
    7. 7. POE Такого блица не было, но это так :)
    8. 8. PHP
    9. 9. ой :)
    10. 10. TT «Template Toolkit – зло?!», May Perl 2010
    11. 11. – зло?!
    12. 12. – зло?!
    13. 13. Есть два типа шаблонизаторов: простые и удобные :)
    14. 14. Есть два типа шаблонизаторов: простые
    15. 15. Есть два типа шаблонизаторов: простые и удобные :)
    16. 16. Удобные: позволяют писать быстро, но заставляют писать не оптимально
    17. 17. И из-за этого сложно тестировать логику – всё в шаблонах
    18. 18. Да-да, но...
    19. 19. Template Toolkit • Cамый популярный шаблонизатор для Perl • Простой, гибкий и многофункциональный • Большое количество плагинов (Filter, Dumper, CGI и даже DBI) • Верстальщик-френдли синтаксис и возможность use Perl :) • Хорошая и полная документация • Портирован на Python – Template-Python
    20. 20. Template Toolkit • Cамый популярный шаблонизатор для Perl • Простой, гибкий и многофункциональный • Большое количество плагинов (Filter, Dumper, CGI и даже DBI) • Верстальщик-френдли синтаксис и возможность use Perl :) • Хорошая и полная документация • Портирован на Python – Template-Python
    21. 21. Template Toolkit • Cамый популярный шаблонизатор для Perl • Простой, гибкий и многофункциональный • Большое количество плагинов (Filter, Dumper, CGI и даже DBI) • Верстальщик-френдли синтаксис и возможность use Perl :) • Хорошая и полная документация • Портирован на Python – Template-Python
    22. 22. Template Toolkit • Cамый популярный шаблонизатор для Perl • Простой, гибкий и многофункциональный • Большое количество плагинов (Filter, Dumper, CGI и даже DBI) • Верстальщик-френдли синтаксис и возможность use Perl :) • Хорошая и полная документация • Портирован на Python – Template-Python
    23. 23. Template Toolkit • Cамый популярный шаблонизатор для Perl • Простой, гибкий и многофункциональный • Большое количество плагинов (Filter, Dumper, CGI и даже DBI) • Верстальщик-френдли синтаксис и возможность use Perl :) • Хорошая и полная документация • Портирован на Python – Template-Python
    24. 24. Template Toolkit • Cамый популярный шаблонизатор для Perl • Простой, гибкий и многофункциональный • Большое количество плагинов (Filter, Dumper, CGI и даже DBI) • Верстальщик-френдли синтаксис и возможность use Perl :) • Хорошая и полная документация • Портирован на Python – Template-Python
    25. 25. [% PROCESS '_design/header.tt' %] <ul> [% FOREACH item = list %] <li>[% item.title %]</li> [% END %] </ul> [% PROCESS '_design/footer.tt' %]
    26. 26. Недостатки TT • Очень медленный (на сайте написано «The TT is a fast» :)
    27. 27. Недостатки TT • Очень медленный (на сайте написано «The TT is a fast» :) • Тормозят фильтры
    28. 28. Недостатки TT • Очень медленный (на сайте написано «The TT is a fast» :) • Тормозят фильтры • Макро-язык TT– зло, еще и капс :)
    29. 29. Недостатки TT • Очень медленный (на сайте написано «The TT is a fast» :) • Тормозят фильтры • Макро-язык TT– зло, еще и капс :) • ОО синтаксис вызова методов – not like Perl
    30. 30. Недостатки TT • Очень медленный (на сайте написано «The TT is a fast» :) • Тормозят фильтры • Макро-язык TT– зло, еще и капс :) • ОО синтаксис вызова методов – not like Perl • Нет разницы между вызовом метода и ключом хеша
    31. 31. Недостатки TT • Очень медленный (на сайте написано «The TT is a fast» :) • Тормозят фильтры • Макро-язык TT– зло, еще и капс :) • ОО синтаксис вызова методов – not like Perl • Нет разницы между вызовом метода и ключом хеша • Сортировка – это пипец, нет map и grep – ааааа
    32. 32. Недостатки TT • Нет разницы между строкой и массивом, проверять .size >0
    33. 33. Недостатки TT • Нет разницы между строкой и массивом, проверять .size >0 • Нет возможности создавать анонимные структуры, нужно всё именовать
    34. 34. Недостатки TT • Нет разницы между строкой и массивом, проверять .size >0 • Нет возможности создавать анонимные структуры, нужно всё именовать • В циклах нет переменной по умолчанию (верните $_)
    35. 35. Недостатки TT • Нет разницы между строкой и массивом, проверять .size >0 • Нет возможности создавать анонимные структуры, нужно всё именовать • В циклах нет переменной по умолчанию (верните $_) • Можно использовать $var, $var vs. jQuery – аааааа
    36. 36. Недостатки TT • Нет разницы между строкой и массивом, проверять .size >0 • Нет возможности создавать анонимные структуры, нужно всё именовать • В циклах нет переменной по умолчанию (верните $_) • Можно использовать $var, $var vs. jQuery – аааааа • Странное TTL кеширование шаблонов (почему 1 секунда?)
    37. 37. Template::Toolkit::Simple A Simple Interface to Template Toolkit
    38. 38. Многие вещи не делаются, т.к. иногда лень или долго писать сложный синтаксис
    39. 39. Мы привыкли к удобному и красивому Perl :)
    40. 40. Существует ли идеальный шаблонизатор?
    41. 41. HTML::ChainParser Автор Павел Кудинов Чисто ростовский непередаваемый юмор :)
    42. 42. ~~>[ <ul> ~~>list~@@~[ <li>~~>title~</li> ]~ </ul> ]~[ <design> ~~> </design> ]~
    43. 43. Mojo::Template EpRenderer Mojolicious. Веб в коробке!
    44. 44. % layout 'design'; <ul> % for (@$list) { <li><%= $_->{title} %></li> %} </ul>
    45. 45. Сравнение
    46. 46. Template::Toolkit Сравнение
    47. 47. [% PROCESS '_design/header.tt' %] <ul> [% FOREACH item = list.nsort('id') %] <li>[% item.title %]</li> [% END %] </ul> [% PROCESS '_design/footer.tt' %]
    48. 48. [% PROCESS '_design/header.tt' %] <ul> [% FOREACH item = list.mnsort('hash.id') %] <li>[% item.title %]</li> [% END %] </ul> [% PROCESS '_design/footer.tt' %]
    49. 49. $Template::Stash::LIST_OPS->{'mnsort'} = sub { ... }; Нужно дописывать функции для сортировок like PHP
    50. 50. [% PROCESS '_design/header.tt' %] <ul> [% FOREACH item = list %] <li>[% item.title %] [% my_round(item.count) %]</li> [% END %] </ul> [% PROCESS '_design/footer.tt' %]
    51. 51. [% MACRO my_round(count) PERL %] print sprintf "%.0f", $stash->get('count'); [% END %] <ul> [% FOREACH item = list %] <li>[% item.title %] [% my_round(item.count) %]</li> [% END %] </ul>
    52. 52. [% USE Util %] <ul> [% FOREACH item = list %] <li>[% item.title %] [% Util.my_round(item.count) %]</li> [% END %] </ul>
    53. 53. Иногда получается очень жесткий код на TT :)
    54. 54. [% FOREACH l=region.locations %] [% NEXT IF region.metro.location_id==l.location_id %] [% NEXT IF l.room_type == 'prison' %] [% NEXT UNLESS map.show_on_this_dusk_level( l.location_id,person) %] [% IF cut_name.${l.name} %][% cname = cut_name.${l.name} %] [% ELSE %][% cname = l.name %] [% END %] [% IF region.center.location_id == l.location_id %][% macro.0 = {...} %] [% ELSE %] [% macro.$i = {name=>l.name, id=>l.location_id}; i = i+1 %] [% END %] [% END %] [% IF region.metro && region.metro.size > 0 && location.location_id==region.center.location_id && person.dusk_level == 0 %] [% IF cut_name.${region.metro.name} %][% cname = cut_name.${region.metro.name} %]
    55. 55. HTML::ChainParser Сравнение
    56. 56. ~~>[ <ul> ~~>list~@sort~<D>(id)~@@~[ <li>~~>title~</li> ]~ </ul> ]~[ <design> ~~> </design> ]~
    57. 57. ~~>[ <ul> ~~>list~@sort~<D>(hash~id)~@@~[ <li>~~>title~</li> ]~ </ul> ]~[ <design> ~~> </design> ]~
    58. 58. ~~>[ <ul> ~~>list~@@~[ <li>~~>title~ ~~>count~&~(PMath~Round)~</li> ]~ </ul> ]~[ <design> ~~> </design> ]~
    59. 59. push @ExParser,'Round'; sub MyRound { sprintf("%.0f", ${RSPR $_[0]}); };
    60. 60. Иногда получается очень жесткий код :)
    61. 61. ~~>#~[:/.design/.lang.iphone]~[ ~~>&~(Public~Video~Main)~main.new~video~[ ~~>%~( ~title~ ~(content~$~(::~LANG)~title~&~(PT~Escape))~ ~content~ ~#[info]~ ~back~ ~(%~( ~title~ ~(..~menu~back)~ ~url~ ~[javascript: history.back();]~ ))~ ~menu~ ~(..~(::~COOKIE~menu~#~[../.menu]))~ )~#~[../.main]~ ]~ ]~
    62. 62. Mojo::Template EpRenderer Сравнение
    63. 63. % layout 'design'; <ul> % for (sort { $a->{id} <=> $b->{id} } @$list) { <li><%= $_->{title} %></li> %} </ul>
    64. 64. % layout 'design'; <ul> % for (@$list) { <li> <%= $_->{title} %> <%= sprintf "%.0f", $_->{count} %> </li> %} </ul>
    65. 65. Жесткость кода зависит от упоротости разработчика :)
    66. 66. Мои шаблоны на Mojolicious очень простые и красивые! :)
    67. 67. Template Toolkit
    68. 68. Template Toolkit – зло!
    69. 69. Template Toolkit – зло!?
    70. 70. use Perl or die;
    71. 71. JFDI
    72. 72. Спасибо за внимание! Анатолий Шарифулин http://twitter.com/sharifulin
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×