Hatena::ブログ(Diary)

hamashun.hatena

2009-05-28

Template Toolkit 社内勉強会のレポート

あちこち間違ってるという指摘を受けたのであちこち直しました><

にぽたんさんによる、Template Toolkit(TT)の社内勉強会がありました。 という訳でOpen & Share


アジェンダ

変数展開について

TTはPerlなので、Perlに準拠する。

Perlは$とか@(シギル)で変数の型がわかるけど、TTにはそういうのがない。 しかし、型自体は持っている。

実際は複雑で、スカラーのなかに配列とかなんか色々あるらしい。

スカラー

実は業務ではあんまり使われない。 単一の値しか持たない文字列。 または数値。

配列

一つの変数の中に複数の値を持つ値

ちなみにコード中に登場する "=" と "in" に違いはない。 全く同じ動作をする。

ちなみにFOREACH中に登場する "=" と "in" に違いはない。 全く同じ動作をする。

ハッシュ

keyとvalueのペアの組み合わせを持つ変数。 順番という概念がない。

オブジェクト

実際の業務では最も使う事が多い。

Perlソースコードでセットされる。

Perlオブジェクトは、多くは高機能なハッシュ。 ハッシュに色んな機能を授けたものをオブジェクトと呼んでたり。 まあでも、必ずハッシュってわけじゃない。 ハッシュ的な使い方ができる別のもの、みたいな。

メソッド
[% IF article.is(hogehoge) %] ←こんな風に引数がある場合は確実にオブジェクト

一見するとハッシュぽいけど、実はDBからデータを引いてくるオブジェクト(メソッド)もある

[% article.id %] ←実はDBから引いてる
[% article.owner.nickname %] ←ここだけ見ても、メソッドなのかハッシュなのかは分からない
オブジェクトからの呼び出し

ハッシュ要素を持つオブジェクトは、同名のkey展開もメソッド呼び出しもできる場合がある。

例えば[% foo.bar %]で、bar が値とメソッドの両方で使われている場合(名前の重複)、メソッドが優先される。

意図的にハッシュを優先するには、item()メソッドを使う。

[% foo.bar #method %]
[% foo.item('bar') #hash %]
[% foo.item(3) #array %] ←配列形式でも呼び出せる

違う書き方にfoo.$num とかもあるけど、きもかったらitem()で。

あと、PGが設計ミスをして item っていうメソッドを定義しちゃってたら打つ手が無い。


意外と知られてない事

テンプレートを構成する要素

  • Directive
  • VMethod
  • Filter
Directive

大文字で書いてるやつ。 命令。

[% INCLUDES %]
[% IF hogehoge %]

ちなみにアパッチとかの命令も大文字。これもDirective.

TTは変数名を大文字にするとDirectiveと解釈する事があるので注意。

VMethod

Vはバーチャルの意味。 変数の後からドットで繋がれているメソッド。

[% IF array.size > 0 %]
[% hoge.item() %]
[% IF foo.match('-') %]

配列とかスカラーに必ず使えるメソッドをVMethodという

Filter

文字列に対してのフィルタリングを行う。 文字列の後からパイプで繋ぐ。

結構簡単に作れるので、案件ごとに作ってる物が存在する。

TT標準のフィルターもある。

[% hoge | html %]
[% hoge.truncate(10) %]

など。

uriフィルタはquery stringに変換してくれて便利。 だけど、TTのバージョンが2.16以降じゃないと使えない。

Directiveの紹介

DEFAULT

このDirectiveが登場した時点で、その変数の値が0または未定義だった場合に適用される

[% DEFAULT foo = '123' %]
[% foo %]

変数fooの中身が0かそもそも未定義だったら、fooに文字列123が代入されてそれを出力する。


UNLESS

IFの逆。ややこしいので、最初はUNLESSは無視して考えると良い。 最後に反転する。

UNLESSのorは絶対に通る。間違ってやっちゃわないように注意。


SWITCH / CASE

条件分岐が複雑な場合に使う。 ただしイコール判定しかできない。

[% SWITCH 'foo' %]
[% CASE foo %] ←fooなら
 hoge
[% CASE ['fooo', 'foooo'] %] ←foooかfoooo
 hogehoge
[% CASE %] ←どれにも適合しなければ
 orz
[% END %]

ちなみにIF ELSEとの使い分けは、書く人の好みだったり。


META

[% META
  title = 'foo'
  text = 'hoge'
 %]

みたいに定義すると、そのテンプレート内で使える。 使う際はtemplate変数で使う。

[% template.title %]

わざわざMETAとtemplate変数を使う理由

絶対に汚染されない変数だから。 予約されている。

予約されているのは他にもある。

  • template
  • compornent
  • loop
  • error
  • content

あと、Ver,2.19以前は tags が使えないバグがある。


loop

FOREACHとかWHILEの中で自動で設定される変数。 VMethod.

[% loop.last %]
[% loop.size %]
[% loop.count %]

など。


PROCESS

変数のスコープがグローバル。 全ての変数の値が上書きされる。

つまり、インクルードされるファイル側の変数htmlファイル側でも使える。


INCLUDE

変数のスコープがレキシカル。 参照はできるが、上書きはしない。

つまり、インクルードされるファイルの変数htmlファイル側では使えない

こっちのがまあ安全。


INSERT

そのまんま出す。 速度は一番速い。

TTの構文を解釈しない。

また、PROCESSやINCLUDEは、BLOCKの実行をする場合にも使う




Q&Aコーナー

Q viewの、とあるテンプレで使える変数を知るには、MとかC側のファイルを見るしかないですか?

A Yes.

Q 処理が重くなるテンプレート側の書き方ってありますか?

A 基本的にはシステム側のが影響が大きいけど、DBを引いてくるメソッドを何度も書くとロスはでる。 キャッシュ化すると良い。

Q テンプレートをさわる人に知っておいてほしいルールとかありますか?

A ユーザが入力できる内容を出力する変数にはhtmlフィルタを付ける事。 セキュリティホールになるので。

2009-04-23

ディレクターのためのUNIX勉強会(第二回)

Clouder先生による社内勉強会の第二回は!








pixivブログのリリースとかぶって参加できませんでしあ。



いじょう。

2009-04-09

ディレクターのためのUNIX勉強会(第一回)

社内勉強会で、Clouder先生による「ディレクターのためのUNIX勉強会」がありました。 僕はディレクターじゃないけどしれっと参加してきました!

と言うわけでそのまとめです。


UNIXって何?

WinMacと何が違うの?

OSが違う。


Linuxって何?

LinuxUNIXではなく、UNIXのようなもの。 UNIXみたいのをある人が作った。 それがLinux

本来はカーネルLinuxと呼ぶ。 カーネルはシステムの一番コアな部分。 本来はOSカーネルLinuxと呼ぶ。 が、最近はOS一群をLinuxと読んでいる。


ディストリビューションって何?

Linuxを一般の利用者が使えるようにまとめたもの(ほぼWikiペディアから引用)。 DebianRedhatがある。

UNIXの仲間はLinux以外にもあって、FreeBSDとかがそれ。 他にはOS10とかiPhoneOSなんかもそう。 ちなみにOS10のカーネルDarwinという。


ターミナルとかプロンプトって何?

ターミナル

CUIコンピュータを操作するための端末、がそもそもの意味。 ここではその機能をもったアプリケーションの事。

プロンプト

ターミナルの窓の中でちかちかしてるやつの左側の部分。 ちかちかしてるやつはカーソル。

プロンプトはカスタムできるので、いい感じにするとよい。

「それ変えてどうするの?」という質問に対しては「キミも壁紙とか変えるでしょ?」との事。

試しに、.bashrcに

export PS1="$ \W\n "

っていうのを追加してみたら、結構見やすくなった。


ログインについて

UNIXログインが必要。 Winも最近はログインが必要だったりするけど、UNIXは昔から。

電源を入れてそのまま使えると、セキュリティの観点で危険。 UNIXは昔から、ユーザーごとにログインできる。


シェルって何?

ログインした時に、操作をするためのベースのソフトウェア。 プロンプトは、正確にはシェルプロンプトと言う。

いろいろ種類があって、shとかbashとかcshとかzshとか。

このへんは宗教戦争もあって、「○○は小学生まで」とか、なんか色々あるらしい。 シェルが違うと、Tab補完が違ったりとか色々あるんだとか。


ディレクトリって何?

WinとかMacとかでいうフォルダの事。


感想とか

最初に「テクハラに負けないようになりましょう」みたいな言葉を賜ったのですが、見物に来ていたCTOをはじめエンジニアの人達の乱入が既にテクハラでした!

(乱入含め)勉強になったので次回も(乱入含め)とても楽しみです!

2009-02-23

CSSを書くときとかに(俺が)便利っぽいAHK

;Arrow
$^h::
Send, {left}
return

$^j::
Send, {down}
return

$^k::
Send, {up}
return

$^l::
Send, {right}
return


;END HOME
$^+h::
Send, {Home}
return

$^+l::
Send, {End}
return


;Delete
$^+x::
Send, {Delete}
return


;ESC
vkF3sc029::
Send, {Esc}
return

vkF4sc029::
Send, {Esc}
return


;CSS
$^`;::
Send, {:}
Send, {Space}
Send, {`;}
Send, {left}
return

$^[::
Send, {{}
Send, {Enter}
Send, {Enter}
Send, {}}
Send, {up}
Send, {Tab}
return

ダウンロードしたい人なんていないと思うけど一応置いてみたり(注意:exe直)

http://www.hamashun.com/blogfile/200902/ahk_02/key_02.exe


説明

  • Ctlr + hjkl で矢印キー
  • Ctlr + Shift + h か l(エル) でHOME・ENDキー
  • Ctlr + Shift + x でDeleteキー
  • 半角キーを押すとESCキー(IME起動はIME側の設定で変換/無変換にしてます)
  • Ctlr + ; で": ;"
  • Ctlr + [ で"{\n\t\n}"


もともとは「RealForceホームポジションを保ったまま矢印キーを使いたい」という用途だった気がします。

多分もっとスマートに書けると思うんですけど、よくわからないのでこんなんになってます。


vimrcっておいしいですか!

2008-09-04

LiveHTTPHeadersを使って今見ているサイトのMIMEタイプを調べようと思ったら、見かたが分からなかったので教えてもらったよ!メモ

メモです。


LiveHTTPHeadersの見かたが分からなかったのでid:hidedenさんに教えてもらいました。


  • Contentを含まないからContent-Typeがない
  • ちなみに、リダイレクトの時もContent-Typeはないとの事