![Page 1: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/1.jpg)
仕事の手離れを良くする手段としての、
静的検査のあるテンプレートエンジン
@hkoba
![Page 2: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/2.jpg)
自己紹介: @hkoba
小林弘明個人事業主(2003〜)
さんの Web のお仕事Perl, Tcl/Tk, Zsh, EmacsLisp
テンプレートエンジンYATT::Lite 作ってます
SSRI.com
github.com/hkoba/yatt_lite
![Page 3: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/3.jpg)
Perl 関連〜1996. Perl/Tk 日本語化 (学生時代)
1998.
YAPC::Asia 2000.
他の仕事1997-2000
MMO サーバー用 俺々スクリプトエンジンpthreadで NuMA対応, ちょっと Erlang っぽいやつ
2001-2002
組込Linux 移植, ドライバー受託開発
Perl Conference Japan speaker
YATT -- Yet Another Template Toolkit,Designed for WebDesigners
![Page 4: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/4.jpg)
話の概要
1. hkobaの言う仕事の手離れとは?
2. テンプレートエンジン yatt の紹介3. なぜ、この仕様にしたか(=昔話. 開発動機)
4. FAQ (時間が余れば)
![Page 5: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/5.jpg)
(hkobaの言う)
1. 仕事の手離れとは?仮にプログラマーを2層に分けるとして:
インフラ層ビジネス層(プロダクト・受注案件層)
(どちらが偉いとかじゃないです。念の為)
![Page 6: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/6.jpg)
インフラ層PGにとっての「手離れ」
リリース後に案件毎の事情で追加作業が発生しない, or
減っていくこと
![Page 7: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/7.jpg)
(お断り)ウチの 今の精一杯の
現実解の話です
![Page 8: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/8.jpg)
皆さんにとって
良い解か… ⇒?
![Page 9: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/9.jpg)
Ex. 誰が template を 書くか で
最適解は変化
![Page 10: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/10.jpg)
誰がテンプレートを書くか
自分が(=PGが)書くデザイナーさんに書いてもらうお客様が書く
![Page 11: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/11.jpg)
ウチはお客様
(の雇ったスタッフさん)が
template(=ビジネス層) を書く
hkoba はインフラ層作りとスタッフさんの訓練
![Page 12: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/12.jpg)
2. yatt とはYet Another Template Toolkit
Pure Perl
↓テンプレートの例:
<!yatt:args TITLE CLASS body=code><div class="&yatt:CLASS;"><h2>&yatt:TITLE;</h2>&yatt:body();</div>
(TITLE, CLASS, body が引数。普段は lower case)
![Page 13: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/13.jpg)
注. yatt は 2つ あります!on CPAN
YATT (2006-2010)
YATT::Lite (2010-)
![Page 14: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/14.jpg)
(古い) YATT (2006-2010)
ほぼ全案件(年間500本以上)で稼働実装, APIが 不満無視して!
![Page 15: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/15.jpg)
YATT::Lite (2010-)
改訂版構文互換API を整理実装も大分マシに
こちらを 使って下さい
ご意見お待ちしてます!マジで!github.com/hkoba/yatt_lite
![Page 16: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/16.jpg)
インストールcpanm YATT::Lite
スグに使えるインストーラcurl https://raw.github.com/hkoba/yatt_lite/dev/scripts/skels/min/install.sh | bash
(手でやるのも簡単)
git clone(cpanm --installdeps .)
.psgi をコピーmkdir htmlplackup!
![Page 17: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/17.jpg)
スグに plackup 出来る psgi$ git clone git://github.com/hkoba/yatt_lite.git lib/YATT$ (cd lib/YATT && cpanm --installdeps .)$ cp lib/YATT/samples/minimum.psgi app.psgi$ mkdir html$ echo hello > html/index.yatt$ plackup
samples/minimum.psgi の中身use strict;use FindBin;use lib "$FindBin::Bin/lib";use YATT::Lite::WebMVC0::SiteApp -as_base;{ my $site = __PACKAGE__->new(app_root => $FindBin::Bin, doc_root => "$FindBin::Bin/html"); $site->to_app;}
![Page 19: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/19.jpg)
マニュアルテンプレート(yatt:widget) の構文
-- yatt 構文マニュアル
(未完成ですが><)
開発チュートリアル
- Perl Monger のための yatt ガイド
(全然書けてません><)
yatt_manual
yatt_guides_for_pm
![Page 20: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/20.jpg)
yatt は HTML に似せました(意図的)<タグ> を "widget 呼び出し" に<yatt:部品名 引数... />
<yatt:部品名 引数...> ..</yatt:部品名>
![Page 21: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/21.jpg)
&実体参照; を "変数や関数の埋め込み" に
&yatt:変数名;
&yatt:関数名(引数,...);
![Page 22: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/22.jpg)
<!doctype> を "widgetの宣言" 兼 "multipartの区切り" に
<!yatt:widget FOO 仮引数...> ...FOOの定義本体...
<!yatt:widget BAR 仮引数...> ...BARの定義本体...
![Page 23: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/23.jpg)
一ファイルに複数 widget 定義可能<!yatt:args 仮引数...> ...デフォルト widget の定義...
<!yatt:widget FOO 仮引数...> <h2>FOOの定義本体</h2>
<!yatt:widget BAR 仮引数...> <h2>BARの定義本体<h2>
<yatt:FILE:NAME> で呼べる<yatt:layout:FOO>...</yatt:layout:FOO><yatt:layout:BAR>...</yatt:layout:BAR>
![Page 24: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/24.jpg)
<yatt:DIR:FILE> でデフォルト widget呼び出し
<yatt:mydir:layout>...
<yatt:DIR:FILE:NAME> でサブwidget
<yatt:mydir:layout:FOO>...
DIR も FILE も
widget の コンテナ として抽象化
![Page 25: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/25.jpg)
書いてみるEx. こんな↓定形レイアウトを widget化 するには?
<div class="●"><h2>△△</h2>■■■</div>
穴埋め付きで●△△■■■
<yatt:layout> って呼びたい
![Page 26: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/26.jpg)
layout.yatt という名前で保存<!yatt:args TITLE CLASS body=code><div class="&yatt:CLASS;"><h2>&yatt:TITLE;</h2>&yatt:body();</div>
拡張子を除いたファイル名=widget 名
![Page 27: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/27.jpg)
layout.yatt を呼び出す側 (index.yatt)<yatt:layout TITLE="△△" CLASS="●">■■■</yatt:layout>
⇒ 出力 HTML<div class="●"><h2>△△</h2>■■■</div>
![Page 28: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/28.jpg)
ex. TITLE を Hello world! に変えてみる<yatt:layout TITLE="Hello world!" CLASS="content">It's show time!</yatt:layout>
⇒ 出力 HTML<div class="content"><h2>Hello world!</h2>It's show time!</div>
![Page 29: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/29.jpg)
動的に変換され Perl のコードへpackage MyApp::INST1::EntNS::layout;use strict;use warnings;use 5.010;our @ISA = qw(MyApp::INST1::EntNS);#line 1 "/home/hkoba/db/monthly/201409/tenight/app1/html/layout.yatt"sub render_ { my ($this, $CON) = splice @_, 0, 2; my $TITLE = $_[0]; my $CLASS = $_[1]; my $body = $_[2]; print $CON (q|<div class="|, YATT::Lite::Util::escape($CLASS), q|">|, "\n"); print $CON (q|<h2>|, YATT::Lite::Util::escape($TITLE), q|</h2>|, "\n"); $body && $body->(); print $CON (q|</div>|); print $CON ("\n");}
(yatt genperl html/layout.yatt の出力)
![Page 30: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/30.jpg)
(参考) layout を呼ぶ側の生成コードpackage MyApp::INST1::EntNS::index; use strict; use warnings; use 5.010; our @ISA = qw(MyApp::INST1::EntNS); #line 1 "/home/hkoba/db/monthly/201409/tenight/app1/html/index.yatt"sub render_ { my ($this, $CON) = splice @_, 0, 2; my $body = $_[0]; MyApp::INST1::EntNS::layout->render_($CON, (undef, q|Hello world!|, q|content|, sub { print $CON (q|It's show time!|);})[1, 2, 3]); print $CON ("\n");}
(yatt genperl html/index.yatt の出力)
![Page 31: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/31.jpg)
3. なぜ,この仕様に? (=昔話. 開発動機)
![Page 32: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/32.jpg)
理由
雇い主 が HTML ネィティブ!(だった)
![Page 33: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/33.jpg)
最初の上司(1996)
自分で HTML を書けたWebデザイン自分で勉強してたドメインも自力で取ってた
(後に渡米したり起業したり)
![Page 34: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/34.jpg)
当時から hkoba は
小さな部品 信者単機能な部品の組み合わせ、サイコー!
![Page 35: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/35.jpg)
SSIモドキ の仕組みを作って納品してた<hr><!--#listSink *.html --><hr>
SSI 風の部品が html を作って返す# in listSink.sub:foreach ($sink->glob($pattern)) { $sink->add(<<END);<tr align=left> <td><input type=checkbox name=path value="$_"></td> <th>$dir/$file</th> <td>$url</td> <!-- $name --></tr>END}
綺麗に部品に切り分けた,つもりだったリリース!
![Page 36: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/36.jpg)
「こばち〜ん」
![Page 37: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/37.jpg)
「部品の返す html
変えてくんない?」
![Page 38: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/38.jpg)
…手離れしてない…
![Page 39: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/39.jpg)
隅々まで template にしないと
手が掛かり続ける
![Page 40: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/40.jpg)
「コメントで書くの(SSI) って、ダサいよね」「タグで書けたらいいのに〜(チラッ)」
![Page 41: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/41.jpg)
デスヨネー
![Page 42: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/42.jpg)
次の上司(1997〜2003)
も, HTML を自分で書く人
![Page 43: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/43.jpg)
今度は部品から返す html も
テンプレートで作るようにした
![Page 44: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/44.jpg)
html の中に perl の処理を埋め込んだ</td></tr><!--#begin eval--> my ($cgi, $self) = @_; ... push @survey, qq(<tr><td>$handle</td>...); ...<!--#end--><tr>...
納品した!
![Page 45: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/45.jpg)
「こばち〜ん」
![Page 46: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/46.jpg)
「ここのタグ、ちょっと変えたら
動かなくなった (てへっ)
直してくんない?」
![Page 47: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/47.jpg)
…手離れしてない…
![Page 48: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/48.jpg)
壊したらスグに知らせるべき
さもないと手離れしない
![Page 49: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/49.jpg)
故に!次のエンジンでは
perl -wc 的な静的検査のコマンド
を作ることを決意!
![Page 50: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/50.jpg)
次の上司(2003〜2008)
元 PHPer
デザイナー気質デザインセンスあり
![Page 51: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/51.jpg)
2005年版は大分 HTML っぽいテンプレートに.
<ssri:foreach my=value selected="p11/q12-2a-1" file=q12 except=10> <li>$$value[1]</li></ssri:foreach><td width="300" bgcolor="#ebf0f3" rowspan="10" ><ul style='padding-left: 0px; list-style: none;'><ssri:foreach my=value selected="p11/q12-2a-1" file=q12 except=10> <li>$$value[1]</li></ssri:foreach>
![Page 52: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/52.jpg)
「小林さ〜ん」「ここをまとめて、部品にできませんかね〜?」
![Page 53: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/53.jpg)
部品 化 (抽象化)の機能が無いと
デザイナーは満足しない(繰り返しが ダルい のは、デザイナーも同じ)
![Page 54: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/54.jpg)
=> 後付けした
![Page 55: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/55.jpg)
2005 版テンプレートでの、部品定義の例<!--#perl simple my $args = shift; ...--><ssri:foreach my='label' list='@list'><tr><?perl my $item = _label($PAGE, $CGI, {%$args, 'row', $label});?><td>$name--$$label[0]</td><td>$item</td>...
部品名: simple
![Page 56: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/56.jpg)
「PHP と比べても、別に綺麗じゃないっすよね?」「もっと簡単に、 HTML ぽく書けないっすかね〜」
「タグで書けると、いいんすけどね〜」
![Page 57: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/57.jpg)
ぐぬぬ…
![Page 58: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/58.jpg)
そして何より
部品づくりが
難しすぎた!
![Page 59: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/59.jpg)
難しいから、部品にしない代わりに abbrev/snippet (emacs の 短縮辞書 ) に頼る
Write Only! (後で修正が来ると死ぬ)
属人化!
![Page 60: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/60.jpg)
静的検査のコマンドも
滅多に 呼んでくれない
相変わらず、アクセスしてエラーに気づく(引数が hash表渡しなので、引数間違いを静的に検出出来ない問題も)
![Page 61: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/61.jpg)
エラー見ても壊れまくった後だから
「どこ直せば良いのか分からないんすよね〜」
![Page 62: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/62.jpg)
壊したらスグに 知らせないと
手に負えなくなる!
![Page 63: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/63.jpg)
HTMLネィティブが
雇い主!
![Page 64: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/64.jpg)
タグで部品を呼ばせろ!
俺のタグを作らせろ!
![Page 65: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/65.jpg)
やっと出来たのが、今の yatt<!ssri:widget simple type=! name=! value_col="value/0" base=[delegate:ssri:common:table] label=[delegate:ssri:common:label]><ssri:base> <ssri:my id="&ssri:name;--&ssri:row[:value_col];"/> <td><input type="&ssri:type;" name="&ssri:name;" value="&ssri:row[:value_col];" <td><ssri:label row id class=label_class style=label_style/></td></ssri:base>
![Page 66: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/66.jpg)
HTML に似せた利点
![Page 67: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/67.jpg)
(利点.1) HTML 用の構文着色を流用可
github (highlight.js)
emacs, vim
bracket.io?, atom?, sublime?
![Page 68: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/68.jpg)
(利点.2) 採用、教育が比較的楽
HTML の分かる人なら容易(採用で不利な)中小企業には重要
![Page 69: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/69.jpg)
デザイナや非プログラマで
大丈夫なの?
手続き的側面は、隠せる宣言的な widget として教えられるコピペして組み合わせるだけ
(間違いは 保存時に検出 するので)
![Page 70: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/70.jpg)
yatt は typo 検査を頑張ります<yatt:layoout TITLEE="Hello world!" CLASS="content">It's show time!</yatt:layoutt>
<yatt:layoout>TITLEE=..</yatt:layoutt>
![Page 71: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/71.jpg)
保存時に lintエラー箇所に
強制ジャンプ(emacs)
![Page 72: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/72.jpg)
壊れたらスグに気づくように
でないと、すぐに諦めてしまう
![Page 73: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/73.jpg)
他にも
emacsclient + tcltk で IDE ぽくしたり
![Page 74: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/74.jpg)
参考: さんの事業
医療従事者向け、アンケート質問内容が専門的40ページ程
![Page 75: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/75.jpg)
規模
年間500本以上の案件フルカスタム(基本、 全部違う )
7人の、アンケート・プログラマーhkoba がトレーナー
![Page 76: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/76.jpg)
スケジュールの感覚
開発: 一週間運用: 一週間そして捨てる
![Page 77: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/77.jpg)
一週間で捨てるコードに
テストを書く?
ペイしない静的検査を頑張るしか
![Page 78: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/78.jpg)
4. FAQ何で yatt: ?
ログイン処理とかDBアクセスは?何で doc_root 直下に template 置くの?何でコード生成?<yatt:foo>...</yatt:foo> みたく囲む意味は?引数への入れ子は?Mojolicious/Amon2/Dancer... から使うには?1ファイルアプリを作りたいときは?今さら Perl?
今さらサーバー側テンプレート?
![Page 79: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/79.jpg)
Q. 何で yatt: ? 冗長では?
![Page 80: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/80.jpg)
メタプログラミング(多段テンプレート)への備えparser も楽(namespace => [qw/yatt perl/]) 設定可能チーム固有の部品が一目で (ex. ssri:〜) 区別出来る
![Page 81: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/81.jpg)
Q. ログイン処理とか DB アクセスとか、どすんの?
![Page 82: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/82.jpg)
キャッシュ文脈($CON)の ->prop->{stash} に入れ
Entity 関数で取り出す# in app.psgi: use Otogiri; Entity otogiri => sub { my ($this) = @_; $CON->prop->{stash}->{otogiri} //= do { Otogiri->new(connect_info => ["dbi:SQLite:dbname=$app_root/var/db/site.db"]); }; };
View calls models.<h2>&yatt:otogiri():single(user,{login,:user}){email};</h2><ul><yatt:foreach my=user list="&yatt:otogiri():select(user);"> <li>login=&yatt:user{login};</li></yatt:foreach></ul>
![Page 83: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/83.jpg)
Q. なんで doc_root 直下に
template 置くの?
![Page 84: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/84.jpg)
Direct Mapping(?) 指向WAF の doc_root の下に, 拡張子 *.yatt で置くだけ
ex. html/index.yatt
http://0:5000/index.yatt
http://0:5000/index
http://0:5000/
(PHP みたいに! PHP みたいに!)
![Page 85: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/85.jpg)
理由1. 前段でさばき易くしたい
try_files ... @upstream ... への疑問Not found が WAF を叩くのは、良いことなの?
理由2. マッピングに関わりたくない
マッピングは ビジネスロジック !ビジネスロジックの変化に付き合いたくない!
ファイルの追加で呼び出されるのは勘弁
![Page 86: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/86.jpg)
理由3. url 抽象化は yatt でも出来るし(yatt はルータも内蔵)
<!yatt:args "/:user"> ... &yatt:user; ...
<!yatt:page "/authors/:id"> ... &yatt:id; ...<!yatt:page "/authors/:id/edit"> ...
![Page 87: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/87.jpg)
隠したい部品は?
拡張子を *.ytmpl に(e.g. layout.ytmpl)
又は doc_root 外に継承先(app_base) を加え、そこに逃がす(app_base => "$app_root/ytmpl")テンプレートは Perl のクラスになるので、継承出来る
![Page 88: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/88.jpg)
Q. 何でコード生成?
![Page 89: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/89.jpg)
後で表現力の不足に悩むのが嫌だからグリーンスパンの第11法則
![Page 90: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/90.jpg)
Q. <yatt:foo>...</yatt:foo> みたく
囲む意味は?
![Page 91: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/91.jpg)
ruby の do ... end ブロックみたいなもの
<yatt:mytag> ...ここが (body という名前の) callback, クロージャ引数として mytag に渡される...</yatt:mytag>
mytag の側で呼び出して使う。&yatt:body();
又は<yatt:body/>
(⇒ruby の yield みたいなもの)
![Page 92: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/92.jpg)
Q. 入れ子はどうするの?引数内に html タグや widget 呼び出しを書きたくなったら?
<yatt:foo bar="<em>なんとか</em><i>かんとか</i>"/>
とは書きたくないので、どうするか…
![Page 93: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/93.jpg)
⇒ lisp や ruby のキーワード引数風に頭に : を付けたタグで囲む<:yatt:NAME>〜</:yatt:NAME>
<yatt:foo> <:yatt:bar> <em>なんとか</em><i>かんとか</i> </:yatt:bar></yatt:foo>
又は <:yatt:NAME/>〜<yatt:foo> <:yatt:bar/> <em>なんとか</em><i>かんとか</i></yatt:foo>
![Page 94: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/94.jpg)
Q. Mojolicious/Amon2/Dancer... から使うには?
![Page 95: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/95.jpg)
要望があれば!取り組みます
![Page 96: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/96.jpg)
Q. 1ファイルアプリを作るには?
![Page 97: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/97.jpg)
普通の作りじゃ
静的検査が効かないmy $yatt = YATT::Lite->new(vfs => [data => q{<!yatt:widget foo><h2>foo</h2><!yatt:widget bar><h2>bar</h2>}]);
$yatt->render(foo => {});
(yatt を使う意味が無くなる)
![Page 98: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/98.jpg)
use YATT::Lite::Embed (experimental)
__DATA__ ブロックのテンプレートを静的に検査use YATT::Lite::Embed; # This exports $YATT instance.
sub render { my ($page, $args) = @_; $YATT->render($page, $args);}
__DATA__<!yatt:args user><h2>Hello! &yatt:user;</h2>
<!yatt:page foo user>This is foo, &yatt:user;
See: gist: hkoba / mojoyatttest.pl
![Page 99: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/99.jpg)
Q. 今さら Perl?
![Page 100: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/100.jpg)
yatt 自体は
言語中立(原理的上は)
![Page 101: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/101.jpg)
保存時 typo 検査 を高速にこなせる言語が
他に有れば、考えますuse strict!
use fields!
?nodejs? ?OCaml?
![Page 102: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/102.jpg)
Q. 今さらサーバー側テンプレート?
![Page 103: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/103.jpg)
yatt から JS とかyatt から Web Components とか
やりたいですね〜
![Page 104: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/104.jpg)
Q. ほんとに手離れ良くなった?
![Page 105: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/105.jpg)
hkoba がスタッフさんに
呼ばれる回数は
ちょっと減った
![Page 106: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/106.jpg)
皆さんモリモリ
widget 自作してます部品化の要求には応えられた
![Page 107: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/107.jpg)
何より
離職率が下がった! \(^^)/
![Page 108: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/108.jpg)
でも hkoba は別プロジェクトでビジネス層に巻き込まれて
忙しいままorz...
![Page 109: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/109.jpg)
は ssri.com Perl 書きたい人、募集中 です!
フリーランスの人でも応相談!(アンケート作成スタッフはプログラミング未経験者も歓迎!)
![Page 110: 仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)](https://reader034.vdocuments.net/reader034/viewer/2022052307/559419b81a28ab7a0d8b4653/html5/thumbnails/110.jpg)
まとめHTML ネィティブへの直接支援、大事「保存時にtypo箇所にジャンプ」は沼を避ける武器
ご意見待ってます!github.com/hkoba/yatt_lite